From d976abdb84269d986935b730a1e562611efe48ed Mon Sep 17 00:00:00 2001 From: lishuang Date: Sat, 13 May 2023 17:18:01 +0800 Subject: [PATCH] feat: add the member page api. --- code/rest/space_controller.go | 2 +- code/rest/space_member_controller.go | 72 ++++++++++++++++++++++++++-- code/rest/space_member_dao.go | 10 ++-- code/rest/space_member_model.go | 1 + 4 files changed, 76 insertions(+), 9 deletions(-) diff --git a/code/rest/space_controller.go b/code/rest/space_controller.go index 867d738..5dd95fd 100644 --- a/code/rest/space_controller.go +++ b/code/rest/space_controller.go @@ -184,7 +184,7 @@ func (this *SpaceController) Page(writer http.ResponseWriter, request *http.Requ pager = this.spaceDao.Page(page, pageSize, sortArray) } - //fill the space's user. + //fill the space's user. FIXME: user better way to get User. if pager != nil { for _, space := range pager.Data.([]*Space) { space.User = this.userDao.FindByUuid(space.UserUuid) diff --git a/code/rest/space_member_controller.go b/code/rest/space_member_controller.go index 362d263..e4a2fea 100644 --- a/code/rest/space_member_controller.go +++ b/code/rest/space_member_controller.go @@ -143,8 +143,7 @@ func (this *SpaceMemberController) Page(writer http.ResponseWriter, request *htt pageStr := request.FormValue("page") pageSizeStr := request.FormValue("pageSize") orderCreateTime := request.FormValue("orderCreateTime") - - user := this.checkUser(request) + spaceUuid := request.FormValue("spaceUuid") var page int if pageStr != "" { @@ -159,6 +158,16 @@ func (this *SpaceMemberController) Page(writer http.ResponseWriter, request *htt } } + if spaceUuid == "" { + panic(result.BadRequest("spaceUuid cannot be null")) + } + + user := this.checkUser(request) + canRead := this.canRead(user, spaceUuid) + if !canRead { + panic(result.BadRequestI18n(request, i18n.PermissionDenied)) + } + sortArray := []builder.OrderPair{ { Key: "create_time", @@ -166,7 +175,14 @@ func (this *SpaceMemberController) Page(writer http.ResponseWriter, request *htt }, } - pager := this.spaceMemberDao.Page(page, pageSize, user.Uuid, sortArray) + pager := this.spaceMemberDao.Page(page, pageSize, spaceUuid, sortArray) + + //fill the space's user. FIXME: user better way to get User. + if pager != nil { + for _, spaceMember := range pager.Data.([]*SpaceMember) { + spaceMember.User = this.userDao.FindByUuid(spaceMember.UserUuid) + } + } return this.Success(pager) } @@ -182,6 +198,28 @@ func (this *SpaceMemberController) canManage(user *User, spaceUuid string) bool return this.canManageBySpaceMember(user, spaceMember) } +// 当前用户对于此空间,是否有可读权限。 +func (this *SpaceMemberController) canRead(user *User, spaceUuid string) bool { + if user.Role == USER_ROLE_ADMINISTRATOR { + return true + } + + //only space's admin can add member. + spaceMember := this.spaceMemberDao.FindBySpaceUuidAndUserUuid(spaceUuid, user.Uuid) + return this.canReadBySpaceMember(user, spaceMember) +} + +// 当前用户对于此空间,是否有可写权限。 +func (this *SpaceMemberController) canWrite(user *User, spaceUuid string) bool { + if user.Role == USER_ROLE_ADMINISTRATOR { + return true + } + + //only space's admin can add member. + spaceMember := this.spaceMemberDao.FindBySpaceUuidAndUserUuid(spaceUuid, user.Uuid) + return this.canWriteBySpaceMember(user, spaceMember) +} + // 当前用户对于此空间,是否有管理权限。 func (this *SpaceMemberController) canManageBySpaceMember(user *User, member *SpaceMember) bool { if user.Role == USER_ROLE_ADMINISTRATOR { @@ -195,3 +233,31 @@ func (this *SpaceMemberController) canManageBySpaceMember(user *User, member *Sp return false } + +// 当前用户对于此空间,是否有可读权限。 +func (this *SpaceMemberController) canReadBySpaceMember(user *User, member *SpaceMember) bool { + if user.Role == USER_ROLE_ADMINISTRATOR { + return true + } + + //only space's admin can add member. + if member != nil { + return true + } + + return false +} + +// 当前用户对于此空间,是否有科协权限。 +func (this *SpaceMemberController) canWriteBySpaceMember(user *User, member *SpaceMember) bool { + if user.Role == USER_ROLE_ADMINISTRATOR { + return true + } + + //only space's admin can add member. + if member != nil && (member.Role == SPACE_MEMBER_ROLE_ADMIN || member.Role == SPACE_MEMBER_ROLE_READ_WRITE) { + return true + } + + return false +} diff --git a/code/rest/space_member_dao.go b/code/rest/space_member_dao.go index e510dc6..8025745 100644 --- a/code/rest/space_member_dao.go +++ b/code/rest/space_member_dao.go @@ -52,20 +52,20 @@ func (this *SpaceMemberDao) FindBySpaceUuidAndUserUuid(spaceUuid string, userUui return entity } -func (this *SpaceMemberDao) Page(page int, pageSize int, userUuid string, sortArray []builder.OrderPair) *Pager { +func (this *SpaceMemberDao) Page(page int, pageSize int, spaceUuid string, sortArray []builder.OrderPair) *Pager { - count, spaceMembers := this.PlainPage(page, pageSize, userUuid, sortArray) + count, spaceMembers := this.PlainPage(page, pageSize, spaceUuid, sortArray) pager := NewPager(page, pageSize, count, spaceMembers) return pager } -func (this *SpaceMemberDao) PlainPage(page int, pageSize int, userUuid string, sortArray []builder.OrderPair) (int, []*SpaceMember) { +func (this *SpaceMemberDao) PlainPage(page int, pageSize int, spaceUuid string, sortArray []builder.OrderPair) (int, []*SpaceMember) { var wp = &builder.WherePair{} - if userUuid != "" { - wp = wp.And(&builder.WherePair{Query: "user_uuid = ?", Args: []interface{}{userUuid}}) + if spaceUuid != "" { + wp = wp.And(&builder.WherePair{Query: "space_uuid = ?", Args: []interface{}{spaceUuid}}) } var conditionDB *gorm.DB diff --git a/code/rest/space_member_model.go b/code/rest/space_member_model.go index 88a8214..b65693c 100644 --- a/code/rest/space_member_model.go +++ b/code/rest/space_member_model.go @@ -24,4 +24,5 @@ type SpaceMember struct { SpaceUuid string `json:"spaceUuid" gorm:"type:char(36);index:idx_space_uuid"` UserUuid string `json:"userUuid" gorm:"type:char(36);index:idx_user_uuid"` Role string `json:"role" gorm:"type:varchar(45)"` + User *User `json:"user" gorm:"-"` }