package api import ( "github.com/gofiber/fiber/v2" "penahub.gitlab.yandexcloud.net/backend/penahub_disk/dal" ) // 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()) } err = client.SetBucketQuota(100 << 20) if err != nil { return fiber.NewError(fiber.StatusInternalServerError, err.Error()) } } info, err := client.GetBucketInfoWithStats() if err != nil { return fiber.NewError(fiber.StatusInternalServerError, err.Error()) } 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) }