penadisk/api/bucket.go

138 lines
4.8 KiB
Go
Raw Normal View History

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())
}
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)
}