475 lines
9.1 KiB
Go
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
|
|
}
|