Files
workspace/code/allapp/allapp-go2/biz/handler/space/space_service.go
T
2026-02-25 17:31:09 +08:00

475 lines
9.1 KiB
Go

// Code generated by hertz generator.
package space
import (
"allapp/biz/router/middleware"
"allapp/db"
"allapp/db/repo"
"allapp/utils"
"allapp/utils/errorx"
"allapp/utils/idgen"
"allapp/utils/pgtypex"
"allapp/utils/response"
"context"
space "allapp/biz/model/space"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
// CreateSpace .
// @router /space/create [POST]
func CreateSpace(ctx context.Context, c *app.RequestContext) {
var err error
var req space.CreateSpaceParams
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(space.CreateSpaceResult)
userID := middleware.GetUserID(ctx)
_, err = db.Queries.GetSpaceMember(ctx, userID)
var isExist = true
if err != nil {
if errorx.IsNotFound(err) {
isExist = false
} else {
errorx.AddError(c, err)
return
}
}
if isExist {
response.Fail(c).Message("请先退出所在空间").Send()
return
}
// 生成邀请码
var inviteCode string
for {
// 生成邀请码
code := utils.GenerateCode(6)
// 检查数据库是否存在
_, err = db.Queries.FindSpaceByInviteCode(ctx, code)
if err != nil {
if errorx.IsNotFound(err) {
// 不存在,唯一,直接使用
inviteCode = code
break
} else {
// 系统错误
errorx.AddError(c, err)
return
}
}
// 如果存在,继续循环重新生成
}
spaceId := idgen.NextId()
// 创建空间
err = db.WithTx(ctx, func(q *repo.Queries) error {
// 创建空间
params := repo.InsertSpaceParams{
ID: spaceId,
Name: pgtypex.StringToText(req.Name),
InviteCode: inviteCode,
}
err = q.InsertSpace(ctx, params)
if err != nil {
return err
}
// 将创建用户默认添加到该空间内
userParams := repo.InsertSpaceMemberParams{
ID: idgen.NextId(),
SpaceID: spaceId,
UserID: userID,
Role: 0,
}
err := q.InsertSpaceMember(ctx, userParams)
if err != nil {
return err
}
return nil
})
if err != nil {
errorx.AddError(c, err)
return
}
resp.SpaceId = spaceId
resp.InviteCode = inviteCode
response.Success(c).Data(resp).Send()
}
// DissolveSpace .
// @router /space/dissolve [POST]
func DissolveSpace(ctx context.Context, c *app.RequestContext) {
var err error
var req space.DissolveSpaceParams
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(space.DissolveSpaceResult)
spaceID := req.GetSpaceId()
userID := middleware.GetUserID(ctx)
// 检查权限
hasPermission, err := hasSpacePermission(ctx, userID, spaceID)
if err != nil {
errorx.AddError(c, err)
return
}
if !hasPermission {
response.Fail(c).Message("无权限操作该空间").Send()
return
}
// 解散空间
err = db.WithTx(ctx, func(q *repo.Queries) error {
err2 := q.DeleteSpace(ctx, spaceID)
if err2 != nil {
return err2
}
err2 = q.DeleteSpaceMembersBySpaceID(ctx, spaceID)
if err2 != nil {
return err2
}
return nil
})
if err != nil {
errorx.AddError(c, err)
return
}
response.Success(c).Data(resp).Send()
}
// ExitSpace .
// @router /space/exit [POST]
func ExitSpace(ctx context.Context, c *app.RequestContext) {
var err error
var req space.ExitSpaceParams
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(space.ExitSpaceResult)
exitSpaceId := req.SpaceId
userID := middleware.GetUserID(ctx)
spaceUser, err := db.Queries.GetSpaceMember(ctx, userID)
if err != nil {
if errorx.IsNotFound(err) {
response.Success(c).Data(resp).Send()
} else {
errorx.AddError(c, err)
return
}
}
if spaceUser.SpaceID != exitSpaceId {
response.Success(c).Data(resp).Send()
return
}
if spaceUser.Role == 0 {
response.Fail(c).Message("请选择解散空间").Send()
return
}
err = db.WithTx(ctx, func(q *repo.Queries) error {
err2 := q.DeleteSpaceMemberByUserID(ctx, userID)
if err2 != nil {
return err2
}
return nil
})
if err != nil {
errorx.AddError(c, err)
return
}
response.Success(c).Data(resp).Send()
}
// JoinSpace .
// @router /space/join [POST]
func JoinSpace(ctx context.Context, c *app.RequestContext) {
var err error
var req space.JoinSpaceParams
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(space.JoinSpaceResult)
userID := middleware.GetUserID(ctx)
_, err = db.Queries.GetSpaceMember(ctx, userID)
if err != nil {
if errorx.IsNotFound(err) {
} else {
errorx.AddError(c, err)
return
}
} else {
response.Fail(c).Message("请先退出已加入的空间").Send()
return
}
inviteCode := req.GetInviteCode()
spaceByInviteCode, err := db.Queries.FindSpaceByInviteCode(ctx, inviteCode)
if err != nil {
if errorx.IsNotFound(err) {
response.Fail(c).Message("邀请码无效或过期").Send()
return
} else {
errorx.AddError(c, err)
return
}
}
err = db.WithTx(ctx, func(q *repo.Queries) error {
err2 := q.InsertSpaceMember(ctx, repo.InsertSpaceMemberParams{
ID: idgen.NextId(),
UserID: userID,
SpaceID: spaceByInviteCode.ID,
Role: 1,
})
if err2 != nil {
return err2
}
return nil
})
if err != nil {
errorx.AddError(c, err)
return
}
resp.SpaceId = spaceByInviteCode.ID
resp.SpaceName = spaceByInviteCode.Name.String
response.Success(c).Data(resp).Send()
}
// ListSpaceMembers .
// @router /space/members [POST]
func ListSpaceMembers(ctx context.Context, c *app.RequestContext) {
var err error
var req space.ListSpaceMembersParams
if err = c.BindAndValidate(&req); err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(space.ListSpaceMembersResult)
members, err := db.Queries.ListSpaceMembers(ctx, req.SpaceId)
if err != nil {
c.String(consts.StatusInternalServerError, err.Error())
return
}
resp.Members = make([]*space.SpaceMember, 0, len(members))
for _, u := range members {
resp.Members = append(resp.Members, &space.SpaceMember{
Id: u.UserID,
Username: u.UserName,
Avatar: u.UserAvatar,
Role: u.Role,
LastLoginTime: pgtypex.TimestamptzToMillis(u.LastLoginTime),
})
}
response.Success(c).Data(resp).Send()
}
// RemoveSpaceMember .
// @router /space/remove [POST]
func RemoveSpaceMember(ctx context.Context, c *app.RequestContext) {
var err error
var req space.RemoveSpaceMemberParams
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(space.RemoveSpaceMemberResult)
userID := middleware.GetUserID(ctx)
spaceID := req.SpaceId
// 检查权限
hasPermission, err := hasSpacePermission(ctx, userID, spaceID)
if err != nil {
errorx.AddError(c, err)
return
}
if !hasPermission {
response.Fail(c).Message("无权限操作该空间").Send()
return
}
// 移除
err = db.WithTx(ctx, func(q *repo.Queries) error {
err2 := q.DeleteSpaceMemberBySpaceIDAndUserID(ctx, repo.DeleteSpaceMemberBySpaceIDAndUserIDParams{
SpaceID: spaceID,
UserID: req.UserId,
})
if err2 != nil {
return err2
}
return nil
})
if err != nil {
errorx.AddError(c, err)
return
}
response.Success(c).Data(resp).Send()
}
// UpdateSpaceMemberRole .
// @router /space/updateRole [POST]
func UpdateSpaceMemberRole(ctx context.Context, c *app.RequestContext) {
var err error
var req space.UpdateSpaceMemberRoleParams
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(space.UpdateSpaceMemberRoleResult)
userID := middleware.GetUserID(ctx)
spaceID := req.SpaceId
updateUserID := req.UserId
hasPermission, err := hasSpacePermission(ctx, userID, spaceID)
if err != nil {
errorx.AddError(c, err)
return
}
if !hasPermission {
response.Fail(c).Message("无权限操作该空间").Send()
return
}
// 检查是否在该空间
updateSpaceUser, err := db.Queries.GetSpaceMember(ctx, updateUserID)
if err != nil {
if errorx.IsNotFound(err) {
response.Fail(c).Message("授权失败,该用户不在该空间").Send()
return
}
errorx.AddError(c, err)
return
}
if updateSpaceUser.SpaceID != spaceID {
response.Fail(c).Message("授权失败,该用户不在该空间").Send()
return
}
// 更新
err = db.WithTx(ctx, func(q *repo.Queries) error {
err2 := q.UpdateSpaceMemberRole(ctx, repo.UpdateSpaceMemberRoleParams{
Role: 1,
SpaceID: spaceID,
UserID: userID,
})
if err2 != nil {
return err2
}
err2 = q.UpdateSpaceMemberRole(ctx, repo.UpdateSpaceMemberRoleParams{
Role: 0,
SpaceID: spaceID,
UserID: updateUserID,
})
if err2 != nil {
return err2
}
return nil
})
if err != nil {
errorx.AddError(c, err)
return
}
response.Success(c).Data(resp).Send()
}
func hasSpacePermission(ctx context.Context, userID int64, spaceID int64) (bool, error) {
user, err := db.Queries.GetSpaceMember(ctx, userID)
if err != nil {
if errorx.IsNotFound(err) {
return false, nil
}
return false, err
}
if user.SpaceID != spaceID {
return false, nil
}
return user.Role == 0, nil
}