165 lines
4.6 KiB
Go
165 lines
4.6 KiB
Go
package endpoints
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"rag/file-system/internal/api/handlers"
|
|
"rag/file-system/internal/api/requests"
|
|
"rag/file-system/internal/api/validators"
|
|
"rag/file-system/internal/domain/model"
|
|
"rag/file-system/internal/infrastructure/mediator"
|
|
"rag/file-system/internal/middleware"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type FolderEndpoint struct {
|
|
Mediator *mediator.Mediator
|
|
FolderValidator *validators.FolderValidator
|
|
}
|
|
|
|
func NewFolderEndpoint(m *mediator.Mediator, fv *validators.FolderValidator) *FolderEndpoint {
|
|
return &FolderEndpoint{Mediator: m, FolderValidator: fv}
|
|
}
|
|
|
|
func (e *FolderEndpoint) CreateFolder(c *gin.Context) {
|
|
var req requests.CreateFolderRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
if err := e.FolderValidator.ValidateCreate(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
ownerID := c.GetString(middleware.ContextKeyUserID)
|
|
cmd := handlers.CreateFolderCommand{
|
|
Name: req.Name,
|
|
ParentID: req.ParentID,
|
|
OwnerID: ownerID,
|
|
}
|
|
|
|
result, err := mediator.Send[handlers.CreateFolderCommand, *model.Folder](e.Mediator, c.Request.Context(), cmd)
|
|
if err != nil {
|
|
handleError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"data": result})
|
|
}
|
|
|
|
func (e *FolderEndpoint) GetFolder(c *gin.Context) {
|
|
folderID := c.Param("id")
|
|
ownerID := c.GetString(middleware.ContextKeyUserID)
|
|
|
|
query := handlers.GetFolderQuery{FolderID: folderID, OwnerID: ownerID}
|
|
result, err := mediator.Send[handlers.GetFolderQuery, *model.FolderWithChildren](e.Mediator, c.Request.Context(), query)
|
|
if err != nil {
|
|
handleError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"data": result})
|
|
}
|
|
|
|
func (e *FolderEndpoint) GetFolderTree(c *gin.Context) {
|
|
ownerID := c.GetString(middleware.ContextKeyUserID)
|
|
|
|
query := handlers.GetFolderTreeQuery{OwnerID: ownerID}
|
|
result, err := mediator.Send[handlers.GetFolderTreeQuery, []model.Folder](e.Mediator, c.Request.Context(), query)
|
|
if err != nil {
|
|
handleError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"data": result})
|
|
}
|
|
|
|
func (e *FolderEndpoint) RenameFolder(c *gin.Context) {
|
|
folderID := c.Param("id")
|
|
var req requests.RenameFolderRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
if err := e.FolderValidator.ValidateRename(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
ownerID := c.GetString(middleware.ContextKeyUserID)
|
|
cmd := handlers.RenameFolderCommand{FolderID: folderID, Name: req.Name, OwnerID: ownerID}
|
|
|
|
result, err := mediator.Send[handlers.RenameFolderCommand, *model.Folder](e.Mediator, c.Request.Context(), cmd)
|
|
if err != nil {
|
|
handleError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"data": result})
|
|
}
|
|
|
|
func (e *FolderEndpoint) DeleteFolder(c *gin.Context) {
|
|
folderID := c.Param("id")
|
|
ownerID := c.GetString(middleware.ContextKeyUserID)
|
|
|
|
cmd := handlers.DeleteFolderCommand{FolderID: folderID, OwnerID: ownerID}
|
|
result, err := mediator.Send[handlers.DeleteFolderCommand, string](e.Mediator, c.Request.Context(), cmd)
|
|
if err != nil {
|
|
handleError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"message": result})
|
|
}
|
|
|
|
func (e *FolderEndpoint) UploadToFolder(c *gin.Context) {
|
|
folderID := c.Param("folderId")
|
|
ownerID := c.GetString(middleware.ContextKeyUserID)
|
|
|
|
file, header, err := c.Request.FormFile("file")
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "请选择文件"})
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
s3Bucket := c.DefaultPostForm("bucket", "default")
|
|
|
|
cmd := handlers.UploadToFolderCommand{
|
|
FolderID: folderID,
|
|
FileName: header.Filename,
|
|
Data: file,
|
|
S3Bucket: s3Bucket,
|
|
OwnerID: ownerID,
|
|
Size: header.Size,
|
|
ContentType: header.Header.Get("Content-Type"),
|
|
}
|
|
|
|
result, err := mediator.Send[handlers.UploadToFolderCommand, *model.FileMeta](e.Mediator, c.Request.Context(), cmd)
|
|
if err != nil {
|
|
handleError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"data": result})
|
|
}
|
|
|
|
func (e *FolderEndpoint) MoveFile(c *gin.Context) {
|
|
fileID := c.Param("id")
|
|
var req requests.MoveFileRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
ownerID := c.GetString(middleware.ContextKeyUserID)
|
|
cmd := handlers.MoveFileCommand{
|
|
FileID: fileID,
|
|
TargetFolderID: req.TargetFolderID,
|
|
OwnerID: ownerID,
|
|
}
|
|
|
|
result, err := mediator.Send[handlers.MoveFileCommand, string](e.Mediator, c.Request.Context(), cmd)
|
|
if err != nil {
|
|
handleError(c, err)
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"message": result})
|
|
}
|