penadisk/api/bucket.go

138 lines
4.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package api
import (
"gitea.pena/PenaSide/penadisk/dal"
"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())
}
}
info, err := client.GetBucketInfoWithStats()
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
//return c.SendStatus(fiber.StatusOK)
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)
}