u
This commit is contained in:
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)
|
||||
|
||||
Reference in new issue
Block a user