package controller import ( "github.com/gofiber/fiber/v2" _ "leafdev.top/Leaf/leaf-library-3/internal/entity" "leafdev.top/Leaf/leaf-library-3/internal/pkg/validator" "leafdev.top/Leaf/leaf-library-3/internal/services/auth" "leafdev.top/Leaf/leaf-library-3/internal/services/collection" "leafdev.top/Leaf/leaf-library-3/internal/services/workspace" "leafdev.top/Leaf/leaf-library-3/internal/types/dto" "leafdev.top/Leaf/leaf-library-3/internal/types/errs" ) type CollectionController struct { collectionService *collection.Service workspaceService *workspace.Service authService *auth.Service } func NewCollectionController( collectionService *collection.Service, workspaceService *workspace.Service, authService *auth.Service, ) *CollectionController { return &CollectionController{ collectionService: collectionService, workspaceService: workspaceService, authService: authService, } } // CreateCollection 创建集合 // @Summary 创建集合 // @Description 在工作空间下创建新的集合 // @Tags Collection // @Accept json // @Produce json // @Param request body dto.CreateCollectionRequest true "创建集合请求" // @Success 200 {object} dto.Response{data=entity.Collection} // @Failure 400 {object} dto.Response{data=[]dto.ValidateError} "参数验证失败" // @Failure 404 {object} dto.Response "工作空间不存在" // @Router /collections [post] func (c *CollectionController) CreateCollection(ctx *fiber.Ctx) error { var req dto.CreateCollectionRequest if err := ctx.BodyParser(&req); err != nil { return err } if validationErrors, ok, err := validator.Struct(req); !ok { if err != nil { return err } return dto.Ctx(ctx).Message((*validationErrors)[0].Message).Status(fiber.StatusBadRequest).Send() } // 检查工作空间是否存在 exists, err := c.workspaceService.Exists(ctx.Context(), req.WorkspaceID) if err != nil { return err } if !exists { return dto.Ctx(ctx).Error(errs.ErrWorkspaceNotExists).Status(fiber.StatusNotFound).Send() } collection, err := c.collectionService.Create(ctx.Context(), req.WorkspaceID, req.Name) if err != nil { return err } return dto.Ctx(ctx).Success(collection).Send() } // GetCollection 获取集合 // @Summary 获取集合 // @Description 根据集合ID获取集合详情 // @Tags Collection // @Accept json // @Produce json // @Param id path int true "集合ID" // @Success 200 {object} dto.Response{data=entity.Collection} // @Failure 404 {object} dto.Response "集合不存在" // @Router /collections/{id} [get] func (c *CollectionController) GetCollection(ctx *fiber.Ctx) error { var req dto.GetCollectionRequest if err := ctx.ParamsParser(&req); err != nil { return err } exists, err := c.collectionService.Exists(ctx.Context(), req.ID) if err != nil { return err } if !exists { return dto.Ctx(ctx).Error(errs.ErrCollectionNotExists).Status(fiber.StatusNotFound).Send() } collection, err := c.collectionService.Get(ctx.Context(), req.ID) if err != nil { return err } return dto.Ctx(ctx).Success(collection).Send() } // ListCollections 列出工作空间下的所有集合 // @Summary 列出集合列表 // @Description 获取指定工作空间下的所有集合 // @Tags Collection // @Accept json // @Produce json // @Param workspace_id path int true "工作空间ID" // @Success 200 {object} dto.Response{data=[]entity.Collection} // @Failure 404 {object} dto.Response "工作空间不存在" // @Router /workspaces/{workspace_id}/collections [get] func (c *CollectionController) ListCollections(ctx *fiber.Ctx) error { var req dto.ListCollectionsRequest if err := ctx.ParamsParser(&req); err != nil { return err } // 检查工作空间是否存在 exists, err := c.workspaceService.Exists(ctx.Context(), req.WorkspaceID) if err != nil { return err } if !exists { return dto.Ctx(ctx).Error(errs.ErrWorkspaceNotExists).Status(fiber.StatusNotFound).Send() } collections, err := c.collectionService.List(ctx.Context(), req.WorkspaceID) if err != nil { return err } return dto.Ctx(ctx).Success(collections).Send() } // DeleteCollection 删除集合 // @Summary 删除集合 // @Description 删除指定的集合 // @Tags Collection // @Accept json // @Produce json // @Param id path int true "集合ID" // @Success 200 {object} dto.Response // @Failure 404 {object} dto.Response "集合不存在" // @Router /collections/{id} [delete] func (c *CollectionController) DeleteCollection(ctx *fiber.Ctx) error { var req dto.DeleteCollectionRequest if err := ctx.ParamsParser(&req); err != nil { return err } exists, err := c.collectionService.Exists(ctx.Context(), req.ID) if err != nil { return err } if !exists { return dto.Ctx(ctx).Error(errs.ErrCollectionNotExists).Status(fiber.StatusNotFound).Send() } err = c.collectionService.Delete(ctx.Context(), req.ID) if err != nil { return err } return dto.Ctx(ctx).Success(nil).Send() }