2023-03-27 15:15:03 +00:00
|
|
|
|
package api
|
|
|
|
|
|
|
|
|
|
import (
|
2024-12-16 08:59:11 +00:00
|
|
|
|
"gitea.pena/PenaSide/penadisk/dal"
|
2023-03-27 15:15:03 +00:00
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// GetBucket - получить информацию по хранилищу.
|
|
|
|
|
//
|
|
|
|
|
// Если хранилища не существует, то оно будет создано с жестким ограничением размером 100МБ.
|
|
|
|
|
func (a *API) GetBucket(c *fiber.Ctx) error {
|
|
|
|
|
client, err := dal.NewClient(c.Context(), a.logger, c.Locals("userID").(string), a.minio)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return c.Status(fiber.StatusInternalServerError).SendString(err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
isExist, err := client.IsBucketExists(c.Context())
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if !isExist {
|
|
|
|
|
err = client.CreateBucket(c.Context())
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
2023-04-08 13:12:00 +00:00
|
|
|
|
err = client.SetBucketQuota(100 << 20)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
2023-03-27 15:15:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-12-30 23:11:48 +00:00
|
|
|
|
|
2023-03-27 15:15:03 +00:00
|
|
|
|
info, err := client.GetBucketInfoWithStats()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-30 23:11:48 +00:00
|
|
|
|
//return c.SendStatus(fiber.StatusOK)
|
2023-03-27 15:15:03 +00:00
|
|
|
|
return c.Status(fiber.StatusOK).JSON(info)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ReqSetBucketQuota struct {
|
|
|
|
|
Size uint64 `query:"size" validate:"required"` // Максимальный размер в байтах
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SetBucketQuota - устанавливает жесткое ограничение на размер хранилища.
|
|
|
|
|
//
|
|
|
|
|
// Таким образом, при попытке превысить квоту будет получена ошибка "Bucket quota exceeded".
|
|
|
|
|
func (a *API) SetBucketQuota(c *fiber.Ctx) error {
|
|
|
|
|
var req ReqSetBucketQuota
|
|
|
|
|
|
|
|
|
|
err := c.QueryParser(&req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
errValidate := ValidateStruct(c.Context(), &req)
|
|
|
|
|
if errValidate != nil {
|
|
|
|
|
return c.Status(fiber.StatusBadRequest).JSON(errValidate)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
client, err := dal.NewClient(c.Context(), a.logger, c.Locals("userID").(string), a.minio)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = client.SetBucketQuota(req.Size)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c.SendStatus(fiber.StatusOK)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// UnsetBucketQuota - снять ограничение на размер хранилища.
|
|
|
|
|
func (a *API) UnsetBucketQuota(c *fiber.Ctx) error {
|
|
|
|
|
client, err := dal.NewClient(c.Context(), a.logger, c.Locals("userID").(string), a.minio)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = client.UnsetBucketQuota()
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c.SendStatus(fiber.StatusOK)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// EnableBucketVersioning - включает управление версиями файлов
|
|
|
|
|
//
|
|
|
|
|
// Тонкости после включения:
|
|
|
|
|
// - Для удаления пустой папки, которая была создана вручную, должен ставиться флаг permanently.
|
|
|
|
|
// - Без флага permanently файлы не удаляются, им ставится новая нулевая версия с флагом IsDeleteMarker.
|
|
|
|
|
// Чтобы увидеть все версии, в том числе с флагом IsDeleteMarker надо ставить флаг withVersions.
|
|
|
|
|
// Чтобы удалить файл/папку вместе с версиями надо установить флаг permanently.
|
|
|
|
|
// - Приостановка управления версиями автоматически не удаляет все неиспользуемые версии
|
|
|
|
|
func (a *API) EnableBucketVersioning(c *fiber.Ctx) error {
|
|
|
|
|
client, err := dal.NewClient(c.Context(), a.logger, c.Locals("userID").(string), a.minio)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = client.EnableBucketVersioning(c.Context())
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c.SendStatus(fiber.StatusOK)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SuspendBucketVersioning - приостанавливает управление версиями файлов.
|
|
|
|
|
//
|
|
|
|
|
// Приостановка управления версиями автоматически не удаляет все неиспользуемые версии.
|
|
|
|
|
func (a *API) SuspendBucketVersioning(c *fiber.Ctx) error {
|
|
|
|
|
client, err := dal.NewClient(c.Context(), a.logger, c.Locals("userID").(string), a.minio)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = client.SuspendBucketVersioning(c.Context())
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c.SendStatus(fiber.StatusOK)
|
|
|
|
|
}
|