penadisk/api/resources.go

388 lines
11 KiB
Go
Raw Permalink Normal View History

2023-03-27 15:15:03 +00:00
package api
import (
"fmt"
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"
"strings"
)
type ReqGetResources struct {
Path string `query:"path"`
Recursive bool `query:"recursive"`
WithVersions bool `query:"with_versions"`
}
// GetResources - получить информацию о папке или файле по пути
func (a *API) GetResources(c *fiber.Ctx) error {
var req ReqGetResources
err := c.QueryParser(&req)
if err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.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())
}
result := client.GetResourcesList(c.Context(), req.Path, req.Recursive, req.WithVersions)
if len(result) == 0 {
return fiber.NewError(fiber.StatusNotFound, "resource not found")
}
return c.Status(fiber.StatusOK).JSON(result)
}
type ReqPutResources struct {
Path string `query:"path" validate:"required"`
}
// PutResources - создать папку
func (a *API) PutResources(c *fiber.Ctx) error {
var req ReqPutResources
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.PutResources(c.Context(), req.Path)
if err != nil {
return err
}
return c.SendStatus(fiber.StatusCreated)
}
type ReqUploadResources struct {
Path string `json:"path" validate:"required" `
Overwrite bool `json:"overwrite"`
}
// UploadResources - загрузить ресурс в хранилище.
// Ограничение на загрузку 50МБ установлено в fiber.Config.BodyLimit
func (a *API) UploadResources(c *fiber.Ctx) error {
var req ReqUploadResources
err := c.BodyParser(&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)
}
formFile, err := c.FormFile("file")
if err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
}
// make vars for upload
contentType := formFile.Header.Get("Content-Type")
size := formFile.Size
var fullPath string
if !strings.HasSuffix(req.Path, "/") {
fullPath = fmt.Sprintf("%v/%v", req.Path, formFile.Filename)
} else {
fullPath = req.Path + formFile.Filename
}
file, err := formFile.Open()
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
// connect to minio
client, err := dal.NewClient(c.Context(), a.logger, c.Locals("userID").(string), a.minio)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
2023-09-11 20:06:38 +00:00
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())
}
}
2024-12-16 08:59:11 +00:00
fmt.Println("VAAAAALUEABLE", file, size, fullPath, contentType)
2023-03-27 15:15:03 +00:00
// upload file
err = client.UploadResources(c.Context(), file, size, fullPath, contentType)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
return c.SendStatus(fiber.StatusCreated)
}
type ReqDownloadResources struct {
Path string `query:"path" validate:"required"`
}
type RespDownloadResources struct {
Href string `json:"href"`
}
// DownloadResources - получить ссылку на скачивание файла
func (a *API) DownloadResources(c *fiber.Ctx) error {
var req ReqDownloadResources
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)
}
// connect to minio
client, err := dal.NewClient(c.Context(), a.logger, c.Locals("userID").(string), a.minio)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
result, err := client.DownloadResources(c.Context(), req.Path)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
return c.Status(fiber.StatusOK).JSON(&RespDownloadResources{Href: result})
}
type ReqCopyResources struct {
From string `query:"from" validate:"required"` // Путь к копируемому ресурсу
Path string `query:"path" validate:"required"` // Путь к создаваемому ресурсу
Overwrite bool `query:"overwrite"` // Перезаписать существующий ресурс
}
// CopyResources - скопировать ресурс
func (a *API) CopyResources(c *fiber.Ctx) error {
var req ReqCopyResources
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)
}
// connect to minio
client, err := dal.NewClient(c.Context(), a.logger, c.Locals("userID").(string), a.minio)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
if !req.Overwrite {
list := client.GetResourcesList(c.Context(), req.Path, false, false)
if list != nil {
return fiber.NewError(fiber.StatusLocked, "file already exist")
}
}
err = client.CopyResources(c.Context(), req.From, req.Path)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
return c.SendStatus(fiber.StatusCreated)
}
type ReqMoveResources struct {
From string `query:"from" validate:"required"` // Путь к перемещаемому ресурсу
Path string `query:"path" validate:"required"` // Путь к создаваемому ресурсу
Overwrite bool `query:"overwrite"` // Перезаписать существующий ресурс
}
// MoveResources - переместить ресурс
func (a *API) MoveResources(c *fiber.Ctx) error {
var req ReqMoveResources
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())
}
if !req.Overwrite {
list := client.GetResourcesList(c.Context(), req.Path, false, false)
if list != nil {
return fiber.NewError(fiber.StatusLocked, "file already exist")
}
}
err = client.MoveResources(c.Context(), req.From, req.Path)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
return c.SendStatus(fiber.StatusCreated)
}
type ReqDeleteResources struct {
Path string `query:"path" validate:"required"` // Путь к удаляемому ресурсу
Permanently bool `query:"permanently"` // Удалить все версии
}
// DeleteResources - удалить ресурс
func (a *API) DeleteResources(c *fiber.Ctx) error {
var req ReqDeleteResources
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.DeleteResources(c.Context(), req.Path, req.Permanently)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
return c.SendStatus(fiber.StatusNoContent)
}
type ReqPublishResources struct {
Path string `query:"path" validate:"required"` // Путь публикуемого ресурса
}
type RespPublishResources struct {
Href string `json:"href"`
}
// PublishResources - опубликовать ресурс
func (a *API) PublishResources(c *fiber.Ctx) error {
var req ReqDeleteResources
err := c.QueryParser(&req)
if err != nil {
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())
}
href, err := client.PublishResources(c.Context(), req.Path)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
return c.Status(fiber.StatusOK).JSON(&RespPublishResources{Href: href})
}
type ReqUnpublishResources struct {
Path string `query:"path" validate:"required"`
}
// UnpublishResources - отменить публикацию ресурса
func (a *API) UnpublishResources(c *fiber.Ctx) error {
var req ReqUnpublishResources
err := c.QueryParser(&req)
if err != nil {
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.UnpublishResources(c.Context(), req.Path)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
return c.SendStatus(fiber.StatusOK)
}
// GetPublicResources - получить список опубликованных ресурсов
func (a *API) GetPublicResources(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())
}
result, err := client.GetPublicResources(c.Context())
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
return c.Status(fiber.StatusOK).JSON(result)
}