This commit is contained in:
oneao committed 2026-03-03 17:28:56 +08:00
1 parent 2efeb7cee2
commit c0531c1d0a
35 files changed
+1817 -984

No files matched your search

@@ -7,6 +7,8 @@ import (
"allapp/db/repo"
"allapp/utils"
"allapp/utils/errorx"
"allapp/utils/pgtypex"
"allapp/utils/redisx"
"allapp/utils/requestx"
"allapp/utils/responsex"
"allapp/utils/uniqueid"
@@ -180,6 +182,12 @@ func DissolveSpace(c fiber.Ctx) error {
return err
}
err = redisx.SpaceDelete(spaceId)
if err != nil {
return err
}
return responsex.OK(c, "空间已成功解散")
}
@@ -212,6 +220,11 @@ func ExitSpace(c fiber.Ctx) error {
return err
}
err = redisx.SpaceRemoveMember(spaceId, userId)
if err != nil {
return err
}
return responsex.OK(c, "空间已成功退出")
}
@@ -409,6 +422,395 @@ func UpdateSpaceSortNumber(c fiber.Ctx) error {
return responsex.OK(c, "更新成功")
}
func ListSpaceMembers(c fiber.Ctx) error {
dto := new(types.ListSpaceMembersDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
members, err := db.Queries.ListSpaceMembers(c.Context(), dto.SpaceId)
if err != nil {
return err
}
spaceMembers := make([]types.SpaceMember, 0, len(members))
for _, member := range members {
spaceMembers = append(spaceMembers, types.SpaceMember{
SpaceId: member.SpaceID,
UserId: member.UserID,
Role: member.Role,
MemberName: member.MemberName,
MemberStatus: member.MemberStatus,
MemberUpdateTime: pgtypex.TimestamptzToMillis(member.MemberUpdateTime),
JoinTime: pgtypex.TimestamptzToMillis(member.JoinTime),
Avatar: pgtypex.TextToString(member.Avatar),
UserStatus: pgtypex.Int2ToInt16(member.UserStatus),
LastLoginTime: pgtypex.TimestamptzToMillis(member.LastLoginTime),
})
}
vo := new(types.ListSpaceMembersVO)
vo.Members = spaceMembers
return responsex.OK(c, vo)
}
// KickoutSpaceMember 踢出空间
func KickoutSpaceMember(c fiber.Ctx) error {
dto := new(types.KickoutSpaceMemberDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
spaceId := dto.SpaceId
space, err := db.Queries.GetSpaceById(c.Context(), spaceId)
if err != nil {
if errorx.IsNotFound(err) {
return responsex.Error(c, "空间不存在或已解散")
}
return err
}
if userId != space.OwnerID {
return responsex.Error(c, "您不是该空间的拥有者")
}
_, err = db.Queries.GetSpaceByUserIdAndSpaceId(c.Context(), repo.GetSpaceByUserIdAndSpaceIdParams{
ID: spaceId,
UserID: dto.MemberId,
})
if err != nil {
if errorx.IsNotFound(err) {
return responsex.Error(c, "该用户已不再该空间内")
}
return err
}
if err := db.Queries.UpdateSpaceMemberExit(c.Context(), repo.UpdateSpaceMemberExitParams{
SpaceID: spaceId,
UserID: dto.MemberId,
}); err != nil {
return err
}
err = redisx.SpaceRemoveMember(spaceId, dto.MemberId)
if err != nil {
return err
}
return responsex.OK(c, "已踢出该空间")
}
// TransferSpace 转让空间
func TransferSpace(c fiber.Ctx) error {
dto := new(types.TransferSpaceDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
spaceId := dto.SpaceId
space, err := db.Queries.GetSpaceById(c.Context(), spaceId)
if err != nil {
if errorx.IsNotFound(err) {
return responsex.Error(c, "空间不存在或已解散")
}
return err
}
if userId != space.OwnerID {
return responsex.Error(c, "您不是该空间的拥有者")
}
_, err = db.Queries.GetSpaceByUserIdAndSpaceId(c.Context(), repo.GetSpaceByUserIdAndSpaceIdParams{
ID: spaceId,
UserID: dto.MemberId,
})
if err != nil {
if errorx.IsNotFound(err) {
return responsex.Error(c, "用户已不再该空间内")
}
return err
}
// 转让
err = db.WithTx(c.Context(), func(q *repo.Queries) error {
err2 := q.UpdateSpaceOwnerId(c.Context(), repo.UpdateSpaceOwnerIdParams{
OwnerID: dto.MemberId,
ID: spaceId,
})
if err2 != nil {
return err2
}
err2 = q.UpdateSpaceMemberRole(c.Context(), repo.UpdateSpaceMemberRoleParams{
SpaceID: spaceId,
Role: 0,
UserID: dto.MemberId,
})
if err2 != nil {
return err2
}
err2 = q.UpdateSpaceMemberRole(c.Context(), repo.UpdateSpaceMemberRoleParams{
SpaceID: spaceId,
Role: 2,
UserID: userId,
})
if err2 != nil {
return err2
}
return nil
})
if err != nil {
return err
}
err = redisx.SpaceAddOrUpdateMember(spaceId, dto.MemberId, 0)
if err != nil {
return err
}
err = redisx.SpaceAddOrUpdateMember(spaceId, userId, 2)
if err != nil {
return err
}
return responsex.OK(c, nil)
}
func UpdateSpaceInviteCode(c fiber.Ctx) error {
dto := new(types.UpdateSpaceInviteCodeDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
spaceId := dto.SpaceId
space, err := db.Queries.GetSpaceById(c.Context(), spaceId)
if err != nil {
if errorx.IsNotFound(err) {
return responsex.Error(c, "空间不存在或已解散")
}
return err
}
if userId != space.OwnerID {
return responsex.Error(c, "您不是该空间的拥有者")
}
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
}
}
}
err = db.Queries.UpdateSpaceInviteCode(c.Context(), repo.UpdateSpaceInviteCodeParams{
ID: spaceId,
InviteCode: inviteCode,
})
if err != nil {
return err
}
vo := new(types.UpdateSpaceInviteCodeVO)
vo.InviteCode = inviteCode
return responsex.OK(c, vo)
}
// JoinSpace 加入空间
func JoinSpace(c fiber.Ctx) error {
dto := new(types.JoinSpaceDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
space, err := db.Queries.GetSpaceByInviteCode(c.Context(), dto.InviteCode)
if err != nil {
if errorx.IsNotFound(err) {
return responsex.Error(c, "邀请码无效")
}
return err
}
if space.Status == 2 {
return responsex.Error(c, "邀请码无效")
}
spaceMember, err := db.Queries.GetSpaceMember(c.Context(), repo.GetSpaceMemberParams{
SpaceID: space.ID,
UserID: userId,
})
isNew := false
if err != nil {
if errorx.IsNotFound(err) {
isNew = true
} else {
return err
}
}
if isNew {
err = db.Queries.InsertSpaceMember(c.Context(), repo.InsertSpaceMemberParams{
ID: uniqueid.NextId(),
SpaceID: space.ID,
UserID: userId,
Role: 2,
IsDefault: int16(0),
MemberName: dto.MemberName,
SortNumber: 0,
})
} else {
if spaceMember.Status != 2 {
return responsex.Error(c, "已在该空间内,不用重新加入")
}
err = db.Queries.UpdateSpaceMemberJoin(c.Context(), repo.UpdateSpaceMemberJoinParams{
SpaceID: space.ID,
UserID: userId,
})
}
if err != nil {
return err
}
return responsex.OK(c, nil)
}
// EnterSpace 进入空间
func EnterSpace(c fiber.Ctx) error {
dto := new(types.EnterSpaceDTO)
if err := requestx.BindAndValidate(c, dto); err != nil {
return err
}
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
space, err := db.Queries.GetSpaceById(c.Context(), dto.SpaceId)
if err != nil {
if errorx.IsNotFound(err) {
return responsex.Error(c, "不在该空间内")
}
return err
}
if space.Status == 2 {
return responsex.Error(c, "不在该空间内")
}
spaceMember, err := db.Queries.GetSpaceMember(c.Context(), repo.GetSpaceMemberParams{
SpaceID: dto.SpaceId,
UserID: userId,
})
if err != nil {
if errorx.IsNotFound(err) {
return responsex.Error(c, "不在该空间内")
}
return err
}
if spaceMember.Status == 2 {
return responsex.Error(c, "不在该空间内")
}
err = redisx.SpaceAddOrUpdateMember(dto.SpaceId, userId, spaceMember.Role)
if err != nil {
return err
}
return responsex.OK(c, nil)
}
// EnterDefaultSpace 默认进入空间,登录用
func EnterDefaultSpace(c fiber.Ctx) error {
userId, err := middleware.GetUserID(c)
if err != nil {
return err
}
vo := new(types.EnterSpaceDefaultVO)
spaceMember, err := db.Queries.GetSpaceMemberByDefault(c.Context(), userId)
if err != nil {
if errorx.IsNotFound(err) {
return responsex.OK(c, vo)
}
return err
}
err = redisx.SpaceAddOrUpdateMember(spaceMember.SpaceID, userId, spaceMember.Role)
if err != nil {
return err
}
vo.SpaceId = spaceMember.SpaceID
vo.Role = spaceMember.Role
return responsex.OK(c, vo)
}
// 初始化记账分类
func initFinanceCategory(ctx context.Context, q *repo.Queries, spaceId int64, userId int64) error {
categoryDefaults, err := q.ListFinanceCategoryDefault(ctx)