From a0869708aa75a8f7ff33b35634a7f80642eb0555 Mon Sep 17 00:00:00 2001 From: lishuang Date: Sat, 13 May 2023 16:12:37 +0800 Subject: [PATCH] feat: add the spaceMember operations. --- code/rest/space_controller.go | 4 ++ code/rest/space_member_controller.go | 55 ++++++++++++++++++++++++++-- code/rest/space_member_dao.go | 15 ++++++++ code/rest/space_member_service.go | 15 ++++++++ code/tool/i18n/i18n.go | 2 + 5 files changed, 87 insertions(+), 4 deletions(-) diff --git a/code/rest/space_controller.go b/code/rest/space_controller.go index c27690f..867d738 100644 --- a/code/rest/space_controller.go +++ b/code/rest/space_controller.go @@ -67,6 +67,10 @@ func (this *SpaceController) Create(writer http.ResponseWriter, request *http.Re sizeLimitStr := request.FormValue("sizeLimit") totalSizeLimitStr := request.FormValue("totalSizeLimit") + if name == "" { + panic("name is required") + } + //only admin can edit user's sizeLimit var sizeLimit int64 = 0 if sizeLimitStr == "" { diff --git a/code/rest/space_member_controller.go b/code/rest/space_member_controller.go index 28579fe..e372a05 100644 --- a/code/rest/space_member_controller.go +++ b/code/rest/space_member_controller.go @@ -3,6 +3,7 @@ package rest import ( "github.com/eyebluecn/tank/code/core" "github.com/eyebluecn/tank/code/tool/builder" + "github.com/eyebluecn/tank/code/tool/i18n" "github.com/eyebluecn/tank/code/tool/result" "net/http" "strconv" @@ -52,14 +53,45 @@ func (this *SpaceMemberController) RegisterRoutes() map[string]func(writer http. routeMap := make(map[string]func(writer http.ResponseWriter, request *http.Request)) - routeMap["/api/spaceMember/delete/batch"] = this.Wrap(this.DeleteBatch, USER_ROLE_USER) - routeMap["/api/spaceMember/detail"] = this.Wrap(this.Detail, USER_ROLE_USER) - routeMap["/api/spaceMember/page"] = this.Wrap(this.Page, USER_ROLE_USER) + routeMap["/api/space/member/create"] = this.Wrap(this.Create, USER_ROLE_USER) + routeMap["/api/space/member/delete"] = this.Wrap(this.Delete, USER_ROLE_USER) + routeMap["/api/space/member/detail"] = this.Wrap(this.Detail, USER_ROLE_USER) + routeMap["/api/space/member/page"] = this.Wrap(this.Page, USER_ROLE_USER) return routeMap } -func (this *SpaceMemberController) DeleteBatch(writer http.ResponseWriter, request *http.Request) *result.WebResult { +func (this *SpaceMemberController) Create(writer http.ResponseWriter, request *http.Request) *result.WebResult { + spaceUuid := request.FormValue("spaceUuid") + userUuid := request.FormValue("userUuid") + spaceRole := request.FormValue("spaceRole") + + if spaceUuid == "" { + panic("spaceUuid is required") + } + + if spaceRole != SPACE_MEMBER_ROLE_READ_ONLY && spaceRole != SPACE_MEMBER_ROLE_READ_WRITE && spaceRole != SPACE_MEMBER_ROLE_ADMIN { + panic("spaceRole is not correct") + } + + currentUser := this.checkUser(request) + canManage := this.canManage(currentUser, spaceUuid) + if !canManage { + panic(result.BadRequestI18n(request, i18n.PermissionDenied)) + } + + //check whether exists. + spaceMember := this.spaceMemberDao.FindBySpaceUuidAndUserUuid(spaceUuid, userUuid) + if spaceMember != nil { + panic(result.BadRequestI18n(request, i18n.SpaceMemberExist)) + } + + spaceMember = this.spaceMemberService.CreateMember(spaceUuid, userUuid, spaceRole) + + return this.Success(spaceMember) +} + +func (this *SpaceMemberController) Delete(writer http.ResponseWriter, request *http.Request) *result.WebResult { uuids := request.FormValue("uuids") if uuids == "" { @@ -134,3 +166,18 @@ func (this *SpaceMemberController) Page(writer http.ResponseWriter, request *htt return this.Success(pager) } + +// 当前用户对于此空间,是否有管理权限。 +func (this *SpaceMemberController) canManage(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) + if spaceMember != nil && spaceMember.Role == SPACE_MEMBER_ROLE_ADMIN { + return true + } + + return false +} diff --git a/code/rest/space_member_dao.go b/code/rest/space_member_dao.go index 000d778..e510dc6 100644 --- a/code/rest/space_member_dao.go +++ b/code/rest/space_member_dao.go @@ -37,6 +37,21 @@ func (this *SpaceMemberDao) CheckByUuid(uuid string) *SpaceMember { return entity } +// find by spaceUuid and userUuid. if not found return nil. +func (this *SpaceMemberDao) FindBySpaceUuidAndUserUuid(spaceUuid string, userUuid string) *SpaceMember { + var entity = &SpaceMember{} + db := core.CONTEXT.GetDB().Where("space_uuid = ? AND user_uuid = ?", spaceUuid, userUuid).First(entity) + + if db.Error != nil { + if db.Error.Error() == result.DB_ERROR_NOT_FOUND { + return nil + } else { + panic(db.Error) + } + } + return entity +} + func (this *SpaceMemberDao) Page(page int, pageSize int, userUuid string, sortArray []builder.OrderPair) *Pager { count, spaceMembers := this.PlainPage(page, pageSize, userUuid, sortArray) diff --git a/code/rest/space_member_service.go b/code/rest/space_member_service.go index 77145f2..a4815a5 100644 --- a/code/rest/space_member_service.go +++ b/code/rest/space_member_service.go @@ -44,3 +44,18 @@ func (this *SpaceMemberService) Detail(uuid string) *SpaceMember { return spaceMember } + +// create space +func (this *SpaceMemberService) CreateMember(spaceUuid string, userUuid string, spaceRole string) *SpaceMember { + + spaceMember := &SpaceMember{ + SpaceUuid: spaceUuid, + UserUuid: userUuid, + Role: spaceRole, + } + + spaceMember = this.spaceMemberDao.Create(spaceMember) + + return spaceMember + +} diff --git a/code/tool/i18n/i18n.go b/code/tool/i18n/i18n.go index ad9c7d2..c3c1871 100644 --- a/code/tool/i18n/i18n.go +++ b/code/tool/i18n/i18n.go @@ -49,6 +49,8 @@ var ( CronValidateError = &Item{English: `cron error. five fields needed. eg: 1 * * * *`, Chinese: `Cron表达式错误,必须为5位。例如:1 * * * *`} SpaceNameError = &Item{English: `space's name can only be letters, numbers or _`, Chinese: `共享空间名称必填,且只能包含中文,字母,数字和'_'`} SpaceNameExist = &Item{English: `space's name "%s" exists`, Chinese: `共享空间名称"%s"已存在`} + SpaceMemberExist = &Item{English: `space member exists`, Chinese: `该用于已经是空间的成员`} + PermissionDenied = &Item{English: `permission denied.`, Chinese: `没有操作权限`} ) func (this *Item) Message(request *http.Request) string {