rebuilt storage
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.ma-al.com/goc_daniel/b2b/app/config"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||
@@ -133,6 +135,72 @@ func RequireAdmin() fiber.Handler {
|
||||
}
|
||||
}
|
||||
|
||||
// Webdav
|
||||
func Webdav() fiber.Handler {
|
||||
authService := authService.NewAuthService()
|
||||
|
||||
return func(c fiber.Ctx) error {
|
||||
authHeader := c.Get("Authorization")
|
||||
if authHeader == "" {
|
||||
c.Set("WWW-Authenticate", `Basic realm="webdav"`)
|
||||
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||
"error": "authorization token required",
|
||||
})
|
||||
}
|
||||
|
||||
if !strings.HasPrefix(authHeader, "Basic ") {
|
||||
c.Set("WWW-Authenticate", `Basic realm="webdav"`)
|
||||
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||
"error": "invalid authorization token",
|
||||
})
|
||||
}
|
||||
|
||||
encoded := strings.TrimPrefix(authHeader, "Basic ")
|
||||
decoded, err := base64.StdEncoding.DecodeString(encoded)
|
||||
if err != nil {
|
||||
c.Set("WWW-Authenticate", `Basic realm="webdav"`)
|
||||
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||
"error": "invalid authorization token",
|
||||
})
|
||||
}
|
||||
|
||||
credentials := strings.SplitN(string(decoded), ":", 2)
|
||||
rawToken := ""
|
||||
if len(credentials) == 1 {
|
||||
rawToken = credentials[0]
|
||||
} else if len(credentials) == 2 {
|
||||
rawToken = credentials[1]
|
||||
}
|
||||
if len(rawToken) != constdata.NBYTES_IN_WEBDAV_TOKEN*2 {
|
||||
c.Set("WWW-Authenticate", `Basic realm="webdav"`)
|
||||
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||
"error": "invalid authorization token",
|
||||
})
|
||||
}
|
||||
|
||||
// we identify user based on this token.
|
||||
user, err := authService.GetUserByWebdavToken(rawToken)
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||
"error": "user not found",
|
||||
})
|
||||
}
|
||||
|
||||
if user.WebdavExpires != nil && user.WebdavExpires.Before(time.Now()) {
|
||||
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
|
||||
"error": "invalid or expired token",
|
||||
})
|
||||
}
|
||||
|
||||
var userLocale model.UserLocale
|
||||
userLocale.OriginalUser = user
|
||||
userLocale.User = user
|
||||
c.Locals(constdata.USER_LOCALE, &userLocale)
|
||||
|
||||
return c.Next()
|
||||
}
|
||||
}
|
||||
|
||||
// GetConfig returns the app config
|
||||
func GetConfig() *config.Config {
|
||||
return config.Get()
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"strconv"
|
||||
|
||||
"git.ma-al.com/goc_daniel/b2b/app/config"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/service/productTranslationService"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
|
||||
@@ -79,6 +80,12 @@ func (h *ProductTranslationHandler) SaveProductDescription(c fiber.Ctx) error {
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
|
||||
}
|
||||
|
||||
userRole, ok := localeExtractor.GetOriginalUserRole(c)
|
||||
if !ok || userRole != model.RoleAdmin {
|
||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrAdminAccessRequired)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrAdminAccessRequired)))
|
||||
}
|
||||
|
||||
productID_attribute := c.Query("productID")
|
||||
productID, err := strconv.Atoi(productID_attribute)
|
||||
if err != nil {
|
||||
@@ -116,6 +123,12 @@ func (h *ProductTranslationHandler) TranslateProductDescription(c fiber.Ctx) err
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
|
||||
}
|
||||
|
||||
userRole, ok := localeExtractor.GetOriginalUserRole(c)
|
||||
if !ok || userRole != model.RoleAdmin {
|
||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrAdminAccessRequired)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrAdminAccessRequired)))
|
||||
}
|
||||
|
||||
productID_attribute := c.Query("productID")
|
||||
productID, err := strconv.Atoi(productID_attribute)
|
||||
if err != nil {
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/service/meiliService"
|
||||
searchservice "git.ma-al.com/goc_daniel/b2b/app/service/searchService"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
||||
@@ -43,6 +44,12 @@ func (h *MeiliSearchHandler) CreateIndex(c fiber.Ctx) error {
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
||||
}
|
||||
|
||||
userRole, ok := localeExtractor.GetOriginalUserRole(c)
|
||||
if !ok || userRole != model.RoleAdmin {
|
||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrAdminAccessRequired)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrAdminAccessRequired)))
|
||||
}
|
||||
|
||||
err := h.meiliService.CreateIndex(id_lang)
|
||||
if err != nil {
|
||||
fmt.Printf("CreateIndex error: %v\n", err)
|
||||
|
||||
@@ -4,8 +4,10 @@ import (
|
||||
"strconv"
|
||||
|
||||
"git.ma-al.com/goc_daniel/b2b/app/config"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/service/storageService"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
||||
@@ -27,63 +29,16 @@ func NewStorageHandler() *StorageHandler {
|
||||
func StorageHandlerRoutes(r fiber.Router) fiber.Router {
|
||||
handler := NewStorageHandler()
|
||||
|
||||
// for all users
|
||||
r.Get("/list-content/*", handler.ListContent)
|
||||
r.Get("/download-file/*", handler.DownloadFile)
|
||||
|
||||
r.Get("/move/*", handler.Move)
|
||||
r.Get("/copy/*", handler.Copy)
|
||||
r.Post("/upload-file/*", handler.UploadFile)
|
||||
r.Get("/create-folder/*", handler.CreateFolder)
|
||||
r.Delete("/delete-file/*", handler.DeleteFile)
|
||||
r.Delete("/delete-folder/*", handler.DeleteFolder)
|
||||
// for admins only
|
||||
r.Get("/create-new-webdav-token", handler.CreateNewWebdavToken)
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
func (h *StorageHandler) Move(c fiber.Ctx) error {
|
||||
src_abs_path, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
dest_abs_path, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Query("dest_path"))
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
err = h.storageService.Move(src_abs_path, dest_abs_path)
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
|
||||
}
|
||||
|
||||
func (h *StorageHandler) Copy(c fiber.Ctx) error {
|
||||
src_abs_path, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
dest_abs_path, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Query("dest_path"))
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
err = h.storageService.Copy(src_abs_path, dest_abs_path)
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
|
||||
}
|
||||
|
||||
// accepted path looks like e.g. "/folder1/" or "folder1"
|
||||
func (h *StorageHandler) ListContent(c fiber.Ctx) error {
|
||||
// relative path defaults to root directory
|
||||
@@ -122,72 +77,24 @@ func (h *StorageHandler) DownloadFile(c fiber.Ctx) error {
|
||||
return c.SendStream(f, int(filesize))
|
||||
}
|
||||
|
||||
func (h *StorageHandler) UploadFile(c fiber.Ctx) error {
|
||||
abs_path, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
func (h *StorageHandler) CreateNewWebdavToken(c fiber.Ctx) error {
|
||||
userID, ok := localeExtractor.GetUserID(c)
|
||||
if !ok {
|
||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
|
||||
}
|
||||
|
||||
userRole, ok := localeExtractor.GetOriginalUserRole(c)
|
||||
if !ok || userRole != model.RoleAdmin {
|
||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrAdminAccessRequired)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrAdminAccessRequired)))
|
||||
}
|
||||
|
||||
new_token, err := h.storageService.NewWebdavToken(userID)
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
f, err := c.FormFile("document")
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrMissingFileFieldDocument)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrMissingFileFieldDocument)))
|
||||
}
|
||||
|
||||
err = h.storageService.UploadFile(c, abs_path, f)
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
|
||||
}
|
||||
|
||||
func (h *StorageHandler) CreateFolder(c fiber.Ctx) error {
|
||||
abs_path, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
err = h.storageService.CreateFolder(abs_path, c.Query("name"))
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
|
||||
}
|
||||
|
||||
func (h *StorageHandler) DeleteFile(c fiber.Ctx) error {
|
||||
abs_path, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
err = h.storageService.DeleteFile(abs_path)
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
|
||||
}
|
||||
|
||||
func (h *StorageHandler) DeleteFolder(c fiber.Ctx) error {
|
||||
abs_path, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
err = h.storageService.DeleteFolder(abs_path)
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
|
||||
return c.JSON(response.Make(&new_token, 0, i18n.T_(c, response.Message_OK)))
|
||||
}
|
||||
|
||||
198
app/delivery/web/api/webdav/storage.go
Normal file
198
app/delivery/web/api/webdav/storage.go
Normal file
@@ -0,0 +1,198 @@
|
||||
package webdav
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"git.ma-al.com/goc_daniel/b2b/app/config"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/service/storageService"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
||||
"github.com/gofiber/fiber/v3"
|
||||
)
|
||||
|
||||
type StorageHandler struct {
|
||||
storageService *storageService.StorageService
|
||||
config *config.Config
|
||||
}
|
||||
|
||||
func NewStorageHandler() *StorageHandler {
|
||||
return &StorageHandler{
|
||||
storageService: storageService.New(),
|
||||
config: config.Get(),
|
||||
}
|
||||
}
|
||||
|
||||
func StorageHandlerRoutes(r fiber.Router) fiber.Router {
|
||||
handler := NewStorageHandler()
|
||||
|
||||
// for webdav use only
|
||||
r.Get("/*", handler.Get)
|
||||
r.Head("/*", handler.Get)
|
||||
r.Put("/*", handler.Put)
|
||||
r.Delete("/*", handler.Delete)
|
||||
r.Add([]string{"MKCOL"}, "/*", handler.Mkcol)
|
||||
r.Add([]string{"PROPFIND"}, "/*", handler.Propfind)
|
||||
r.Add([]string{"PROPPATCH"}, "/*", handler.Proppatch)
|
||||
r.Add([]string{"MOVE"}, "/*", handler.Move)
|
||||
r.Add([]string{"COPY"}, "/*", handler.Copy)
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
func (h *StorageHandler) Get(c fiber.Ctx) error {
|
||||
// fmt.Println("GET")
|
||||
absPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
info, err := h.storageService.EntryInfo(absPath)
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
if info.IsDir() {
|
||||
xml, err := h.storageService.Propfind(h.config.Storage.RootFolder, absPath, "1")
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
c.Set("Content-Type", `application/xml; charset="utf-8"`)
|
||||
return c.Status(http.StatusMultiStatus).SendString(xml)
|
||||
|
||||
} else {
|
||||
f, filename, filesize, err := h.storageService.DownloadFilePrep(absPath)
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
c.Attachment(filename)
|
||||
c.Set("Content-Length", strconv.FormatInt(filesize, 10))
|
||||
c.Set("Content-Type", "application/octet-stream")
|
||||
return c.SendStream(f, int(filesize))
|
||||
}
|
||||
}
|
||||
|
||||
func (h *StorageHandler) Put(c fiber.Ctx) error {
|
||||
// fmt.Println("PUT")
|
||||
absPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
var src io.Reader
|
||||
if bodyStream := c.Request().BodyStream(); bodyStream != nil {
|
||||
defer c.Request().CloseBodyStream()
|
||||
src = bodyStream
|
||||
} else {
|
||||
src = bytes.NewReader(c.Body())
|
||||
}
|
||||
|
||||
err = h.storageService.Put(absPath, src)
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
return c.SendStatus(http.StatusCreated)
|
||||
}
|
||||
|
||||
func (h *StorageHandler) Delete(c fiber.Ctx) error {
|
||||
// fmt.Println("DELETE")
|
||||
absPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
if absPath == h.config.Storage.RootFolder {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(responseErrors.ErrAccessDenied))
|
||||
}
|
||||
|
||||
err = h.storageService.Delete(absPath)
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
return c.SendStatus(http.StatusNoContent)
|
||||
}
|
||||
|
||||
func (h *StorageHandler) Mkcol(c fiber.Ctx) error {
|
||||
// fmt.Println("Mkcol")
|
||||
absPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
err = h.storageService.Mkcol(absPath)
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
return c.SendStatus(http.StatusCreated)
|
||||
}
|
||||
|
||||
func (h *StorageHandler) Propfind(c fiber.Ctx) error {
|
||||
// fmt.Println("PROPFIND")
|
||||
absPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
xml, err := h.storageService.Propfind(h.config.Storage.RootFolder, absPath, "1")
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
c.Set("Content-Type", `application/xml; charset="utf-8"`)
|
||||
return c.Status(http.StatusMultiStatus).SendString(xml)
|
||||
}
|
||||
|
||||
func (h *StorageHandler) Proppatch(c fiber.Ctx) error {
|
||||
return c.SendStatus(http.StatusNotImplemented) // 501
|
||||
}
|
||||
|
||||
func (h *StorageHandler) Move(c fiber.Ctx) error {
|
||||
// fmt.Println("MOVE")
|
||||
srcAbsPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
dest := c.Get("Destination")
|
||||
if dest == "" {
|
||||
return c.SendStatus(http.StatusBadRequest)
|
||||
}
|
||||
destAbsPath, err := h.storageService.ObtainDestPath(h.config.Storage.RootFolder, dest)
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
err = h.storageService.Move(srcAbsPath, destAbsPath)
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
return c.SendStatus(http.StatusCreated)
|
||||
}
|
||||
|
||||
func (h *StorageHandler) Copy(c fiber.Ctx) error {
|
||||
// fmt.Println("COPY")
|
||||
srcAbsPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
dest := c.Get("Destination")
|
||||
if dest == "" {
|
||||
return c.SendStatus(http.StatusBadRequest)
|
||||
}
|
||||
destAbsPath, err := h.storageService.ObtainDestPath(h.config.Storage.RootFolder, dest)
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
|
||||
err = h.storageService.Copy(srcAbsPath, destAbsPath)
|
||||
if err != nil {
|
||||
return c.SendStatus(responseErrors.GetErrorStatus(err))
|
||||
}
|
||||
return c.SendStatus(http.StatusCreated)
|
||||
}
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/web/api"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/web/api/public"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/web/api/restricted"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/web/api/webdav"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/web/general"
|
||||
|
||||
"github.com/gofiber/fiber/v3"
|
||||
@@ -25,6 +26,7 @@ import (
|
||||
type Server struct {
|
||||
app *fiber.App
|
||||
cfg *config.Config
|
||||
webdav fiber.Router
|
||||
api fiber.Router
|
||||
public fiber.Router
|
||||
restricted fiber.Router
|
||||
@@ -42,12 +44,23 @@ func (s *Server) Cfg() *config.Config {
|
||||
|
||||
// New creates a new server instance
|
||||
func New() *Server {
|
||||
return &Server{
|
||||
app: fiber.New(fiber.Config{
|
||||
ErrorHandler: customErrorHandler,
|
||||
}),
|
||||
cfg: config.Get(),
|
||||
}
|
||||
var s Server
|
||||
|
||||
app :=
|
||||
fiber.New(fiber.Config{
|
||||
ErrorHandler: customErrorHandler,
|
||||
BodyLimit: 50 * 1024 * 1024, // 50 MB
|
||||
StreamRequestBody: true,
|
||||
RequestMethods: []string{
|
||||
fiber.MethodGet, fiber.MethodHead, fiber.MethodPost, fiber.MethodPut,
|
||||
fiber.MethodDelete, fiber.MethodConnect, fiber.MethodOptions,
|
||||
fiber.MethodTrace, fiber.MethodPatch, "MKCOL", "PROPFIND", "PROPPATCH", "MOVE", "COPY",
|
||||
},
|
||||
})
|
||||
|
||||
s.app = app
|
||||
s.cfg = config.Get()
|
||||
return &s
|
||||
}
|
||||
|
||||
// Setup configures the server with routes and middleware
|
||||
@@ -76,6 +89,8 @@ func (s *Server) Setup() error {
|
||||
s.public = s.api.Group("/public")
|
||||
s.restricted = s.api.Group("/restricted")
|
||||
s.restricted.Use(middleware.AuthMiddleware())
|
||||
s.webdav = s.api.Group("/webdav")
|
||||
s.webdav.Use(middleware.Webdav())
|
||||
|
||||
// initialize language endpoints (general)
|
||||
api.NewLangHandler().InitLanguage(s.api, s.cfg)
|
||||
@@ -115,9 +130,11 @@ func (s *Server) Setup() error {
|
||||
carts := s.restricted.Group("/carts")
|
||||
restricted.CartsHandlerRoutes(carts)
|
||||
|
||||
// storage (restricted)
|
||||
storage := s.restricted.Group("/storage")
|
||||
restricted.StorageHandlerRoutes(storage)
|
||||
// storage (uses various authorization means)
|
||||
restrictedStorage := s.restricted.Group("/storage")
|
||||
webdavStorage := s.webdav.Group("/storage")
|
||||
restricted.StorageHandlerRoutes(restrictedStorage)
|
||||
webdav.StorageHandlerRoutes(webdavStorage)
|
||||
|
||||
s.api.All("*", func(c fiber.Ctx) error {
|
||||
return c.SendStatus(fiber.StatusNotFound)
|
||||
|
||||
Reference in New Issue
Block a user