131 lines
2.5 KiB
Go
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
|
|
}
|