add permissions route

This commit is contained in:
2026-07-07 00:46:55 +07:00
parent 612c3a6f86
commit 377dd26e3e
8 changed files with 342 additions and 19 deletions
+15
View File
@@ -4,6 +4,7 @@ import (
"context"
"evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/modules/roles"
"evening_detective_server/internal/services/ui_service"
"evening_detective_server/internal/services/users_service"
proto "evening_detective_server/proto"
@@ -15,13 +16,16 @@ type server struct {
proto.UnsafeEveningDetectiveServerServer
usersService *users_service.UsersService
uiService *ui_service.UiService
}
func NewServer(
usersService *users_service.UsersService,
uiService *ui_service.UiService,
) proto.EveningDetectiveServerServer {
return &server{
usersService: usersService,
uiService: uiService,
}
}
@@ -152,3 +156,14 @@ func (s *server) DeleteUserRole(ctx context.Context, req *proto.DeleteUserRoleRe
}
return &proto.DeleteUserRoleRsp{}, nil
}
func (s *server) GetPermissions(
ctx context.Context,
req *proto.GetPermissionsReq,
) (*proto.GetPermissionsRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims)
permissions := s.uiService.GetPermissions(claims.Roles)
return &proto.GetPermissionsRsp{
Permissions: permissions,
}, nil
}
+61
View File
@@ -0,0 +1,61 @@
package ui_service
import (
rolesModule "evening_detective_server/internal/modules/roles"
"slices"
)
var (
permissions = map[string][]string{
rolesModule.Admin: {
"users_page",
},
rolesModule.Author: {
"scenarios_page",
"scenario_editor_page",
},
rolesModule.Organizer: {
"scenarios_page",
"games_page",
"game_panel_page",
},
rolesModule.User: {
"games_page",
},
}
)
type UiService struct{}
func NewUiService() *UiService {
return &UiService{}
}
func (s *UiService) GetPermissions(roles []string) []string {
resMap := s.getPermissionsMap(roles)
res := make([]string, 0, len(resMap))
for permission := range resMap {
res = append(res, permission)
}
return res
}
func (s *UiService) getPermissionsMap(roles []string) map[string]any {
resMap := make(map[string]any, 100)
if slices.Contains(roles, rolesModule.Admin) {
for _, permissionsList := range permissions {
for _, permission := range permissionsList {
resMap[permission] = struct{}{}
}
}
return resMap
}
for _, role := range roles {
for _, permission := range permissions[role] {
resMap[permission] = struct{}{}
}
}
return resMap
}