package space import ( "allapp/api/router/middleware" "allapp/api/types" "allapp/db" "allapp/db/repo" "allapp/utils" "allapp/utils/errorx" "allapp/utils/requestx" "allapp/utils/responsex" "allapp/utils/uniqueid" "context" "github.com/gofiber/fiber/v3" ) // CreateSpace 创建空间 func CreateSpace(c fiber.Ctx) error { dto := new(types.CreateSpaceDTO) vo := new(types.CreateSpaceVO) if err := requestx.BindAndValidate(c, dto); err != nil { return err } userID, err2 := middleware.GetUserID(c) if err2 != nil { return err2 } var inviteCode string for { // 生成邀请码 code := utils.GenerateCode(6) // 检查数据库是否存在 _, err := db.Queries.GetSpaceByInviteCode(c.Context(), code) if err != nil { if errorx.IsNotFound(err) { inviteCode = code break } else { return err } } } spaceId := uniqueid.NextId() err := db.WithTx(c.Context(), func(q *repo.Queries) error { // 创建空间 params := repo.InsertSpaceParams{ ID: spaceId, Name: dto.Name, InviteCode: inviteCode, } err := q.InsertSpace(c.Context(), params) if err != nil { return err } // 将创建用户默认添加到该空间内 spaceMemberParams := repo.InsertSpaceMemberParams{ ID: uniqueid.NextId(), SpaceID: spaceId, UserID: userID, Role: 0, } err = q.InsertSpaceMember(c.Context(), spaceMemberParams) if err != nil { return err } // 初始化记账 err = initFinanceCategory(c.Context(), q, spaceId, userID) if err != nil { return err } return nil }) if err != nil { return err } vo.SpaceId = spaceId vo.InviteCode = inviteCode return responsex.OK(c, vo) } func initFinanceCategory(ctx context.Context, q *repo.Queries, spaceId int64, userId int64) error { categoryDefaults, err := q.ListFinanceCategoryDefault(ctx) if err != nil { return err } if len(categoryDefaults) == 0 { return nil } categorySpaces := make([]repo.BatchInsertFinanceCategorySpaceParams, 0, len(categoryDefaults)) for _, sysCat := range categoryDefaults { categorySpaces = append(categorySpaces, repo.BatchInsertFinanceCategorySpaceParams{ ID: uniqueid.NextId(), SpaceID: spaceId, Name: sysCat.Name, Icon: sysCat.Icon, Type: sysCat.Type, SortNumber: sysCat.SortNumber, CreateBy: userId, UpdateBy: userId, }) } if _, err := q.BatchInsertFinanceCategorySpace(ctx, categorySpaces); err != nil { return err } return nil }