Files
workspace/code/allapp/allapp-go/api/handler/space/index.go
T
2026-02-27 17:29:28 +08:00

131 lines
2.5 KiB
Go

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
}