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/workspace" "leafdev.top/Leaf/leaf-library-3/internal/types/dto" "leafdev.top/Leaf/leaf-library-3/internal/types/errs" "leafdev.top/Leaf/leaf-library-3/internal/types/user" ) type WorkspaceController struct { workspaceService *workspace.Service authService *auth.Service } func NewWorkspaceController(workspaceService *workspace.Service, authService *auth.Service) *WorkspaceController { return &WorkspaceController{ workspaceService: workspaceService, authService: authService, } } // CreateWorkspace 创建工作空间 // @Summary 创建工作空间 // @Description 创建一个新的工作空间 // @Tags Workspace // @Accept json // @Produce json // @Param request body dto.CreateWorkspaceRequest true "创建工作空间请求" // @Success 200 {object} dto.Response{data=entity.Workspace} // @Failure 400 {object} dto.Response{data=[]dto.ValidateError} "参数验证失败" // @Router /workspaces [post] func (c *WorkspaceController) CreateWorkspace(ctx *fiber.Ctx) error { var req dto.CreateWorkspaceRequest 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).Data(validationErrors).Status(fiber.StatusBadRequest).Send() } // 从上下文获取用户ID user := c.authService.GetUser(ctx) userId := user.ID workspace, err := c.workspaceService.Create(ctx.Context(), userId, req.Name) if err != nil { return err } return dto.Ctx(ctx).Success(workspace).Send() } // GetWorkspace 获取工作空间 // @Summary 获取工作空间 // @Description 根据工作空间ID获取工作空间详情 // @Tags Workspace // @Accept json // @Produce json // @Param id path int true "工作空间ID" // @Success 200 {object} dto.Response{data=entity.Workspace} // @Failure 404 {object} dto.Response "工作空间不存在" // @Router /workspaces/{id} [get] func (c *WorkspaceController) GetWorkspace(ctx *fiber.Ctx) error { var params dto.WorkspaceIDParam if err := ctx.ParamsParser(¶ms); err != nil { return err } exists, err := c.workspaceService.Exists(ctx.Context(), params.ID) if err != nil { return err } if !exists { return dto.Ctx(ctx).Error(errs.ErrWorkspaceNotExists).Status(fiber.StatusNotFound).Send() } workspace, err := c.workspaceService.Get(ctx.Context(), params.ID) if err != nil { return err } return dto.Ctx(ctx).Success(workspace).Send() } // ListWorkspaces 列出用户的所有工作空间 // @Summary 列出工作空间列表 // @Description 获取当前用户的所有工作空间 // @Tags Workspace // @Accept json // @Produce json // @Success 200 {object} dto.Response{data=[]entity.Workspace} // @Router /workspaces [get] func (c *WorkspaceController) ListWorkspaces(ctx *fiber.Ctx) error { // 从上下文获取用户ID user := c.authService.GetUser(ctx) userId := user.ID workspaces, err := c.workspaceService.List(ctx.Context(), userId) if err != nil { return err } return dto.Ctx(ctx).Success(workspaces).Send() } // DeleteWorkspace 删除工作空间 // @Summary 删除工作空间 // @Description 删除指定的工作空间 // @Tags Workspace // @Accept json // @Produce json // @Param id path int true "工作空间ID" // @Success 200 {object} dto.Response // @Failure 404 {object} dto.Response "工作空间不存在" // @Router /workspaces/{id} [delete] func (c *WorkspaceController) DeleteWorkspace(ctx *fiber.Ctx) error { var params dto.WorkspaceIDParam if err := ctx.ParamsParser(¶ms); err != nil { return err } exists, err := c.workspaceService.Exists(ctx.Context(), params.ID) if err != nil { return err } if !exists { return dto.Ctx(ctx).Error(errs.ErrWorkspaceNotExists).Status(fiber.StatusNotFound).Send() } err = c.workspaceService.DeleteWorkspace(ctx.Context(), params.ID) if err != nil { return err } return dto.Ctx(ctx).Success(nil).Send() } // AddMember 添加工作空间成员 // @Summary 添加工作空间成员 // @Description 向工作空间添加新成员 // @Tags Workspace // @Accept json // @Produce json // @Param id path int true "工作空间ID" // @Param request body dto.AddWorkspaceMemberRequest true "添加成员请求" // @Success 200 {object} dto.Response{data=entity.WorkspaceMember} // @Failure 400 {object} dto.Response{data=[]dto.ValidateError} "参数验证失败" // @Failure 404 {object} dto.Response "工作空间不存在" // @Failure 409 {object} dto.Response "成员已存在" // @Router /workspaces/{id}/members [post] func (c *WorkspaceController) AddMember(ctx *fiber.Ctx) error { var params dto.WorkspaceIDParam if err := ctx.ParamsParser(¶ms); err != nil { return err } exists, err := c.workspaceService.Exists(ctx.Context(), params.ID) if err != nil { return err } if !exists { return dto.Ctx(ctx).Error(errs.ErrWorkspaceNotExists).Status(fiber.StatusNotFound).Send() } var req dto.AddWorkspaceMemberRequest 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).Data(validationErrors).Status(fiber.StatusBadRequest).Send() } workspace, err := c.workspaceService.Get(ctx.Context(), params.ID) if err != nil { return err } member, err := c.workspaceService.AddMember(ctx.Context(), req.UserID, workspace) if err != nil { if err == errs.ErrMemberAlreadyExists { return dto.Ctx(ctx).Error(err).Status(fiber.StatusConflict).Send() } return err } return dto.Ctx(ctx).Success(member).Send() } // RemoveMember 移除工作空间成员 // @Summary 移除工作空间成员 // @Description 从工作空间移除成员 // @Tags Workspace // @Accept json // @Produce json // @Param id path int true "工作空间ID" // @Param user_id path string true "用户ID" // @Success 200 {object} dto.Response // @Failure 404 {object} dto.Response "工作空间不存在或成员不存在" // @Router /workspaces/{id}/members/{user_id} [delete] func (c *WorkspaceController) RemoveMember(ctx *fiber.Ctx) error { var params dto.WorkspaceMemberParam if err := ctx.ParamsParser(¶ms); err != nil { return err } exists, err := c.workspaceService.Exists(ctx.Context(), params.WorkspaceID) if err != nil { return err } if !exists { return dto.Ctx(ctx).Error(errs.ErrWorkspaceNotExists).Status(fiber.StatusNotFound).Send() } workspace, err := c.workspaceService.Get(ctx.Context(), params.WorkspaceID) if err != nil { return err } err = c.workspaceService.RemoveMember(ctx.Context(), user.ID(params.UserID), workspace) if err != nil { if err == errs.ErrMemberNotExists { return dto.Ctx(ctx).Error(err).Status(fiber.StatusNotFound).Send() } return err } return dto.Ctx(ctx).Success(nil).Send() }