138 lines
4.8 KiB
Go
138 lines
4.8 KiB
Go
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)
|
||
}
|