enforces user admin role requirement for - creating / deleting / setting role for organization users - creating / deleting / setting role for project users - updating project name - deleting project hides action elements based on role for - admin console - team settings if team is only visible through project membership - add project tile if not team admin - project name text editor if not team / project admin - add redirect from team page if settings only visible through project membership - add redirect from admin console if not org admin role enforcement is handled on the api side through a custom GraphQL directive `hasRole`. on the client side, role information is fetched in the TopNavbar's `me` query and stored in the `UserContext`. there is a custom hook, `useCurrentUser`, that provides a user object with two functions, `isVisibile` & `isAdmin` which is used to check roles in order to render/hide relevant UI elements.
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			GraphQL
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			GraphQL
		
	
	
	
	
	
| enum RoleLevel {
 | |
|   ADMIN
 | |
|   MEMBER
 | |
| }
 | |
| 
 | |
| enum ActionLevel {
 | |
|   ORG
 | |
|   TEAM
 | |
|   PROJECT
 | |
| }
 | |
| 
 | |
| enum ObjectType {
 | |
|   ORG
 | |
|   TEAM
 | |
|   PROJECT
 | |
|   TASK
 | |
| }
 | |
| 
 | |
| directive @hasRole(roles: [RoleLevel!]!, level: ActionLevel!, type: ObjectType!) on FIELD_DEFINITION
 | |
| 
 | |
| type Query {
 | |
|   organizations: [Organization!]!
 | |
|   users: [UserAccount!]!
 | |
|   findUser(input: FindUser!): UserAccount!
 | |
|   findProject(input: FindProject!): Project!
 | |
|   findTask(input: FindTask!): Task!
 | |
|   projects(input: ProjectsFilter): [Project!]!
 | |
|   findTeam(input: FindTeam!): Team!
 | |
|   teams: [Team!]!
 | |
|   labelColors: [LabelColor!]!
 | |
|   taskGroups: [TaskGroup!]!
 | |
|   me: MePayload! 
 | |
| }
 | |
| 
 | |
| type Mutation
 | |
| 
 | |
| type TeamRole {
 | |
|   teamID: UUID!
 | |
|   roleCode: RoleCode!
 | |
| }
 | |
| 
 | |
| type ProjectRole {
 | |
|   projectID: UUID!
 | |
|   roleCode: RoleCode!
 | |
| }
 | |
| 
 | |
| type MePayload {
 | |
|   user: UserAccount!
 | |
|   teamRoles: [TeamRole!]!
 | |
|   projectRoles: [ProjectRole!]!
 | |
| }
 | |
| 
 | |
| input ProjectsFilter {
 | |
|   teamID: UUID
 | |
| }
 | |
| 
 | |
| input FindUser {
 | |
|   userId: String!
 | |
| }
 | |
| 
 | |
| input FindProject {
 | |
|   projectID: UUID!
 | |
| }
 | |
| 
 | |
| input FindTask {
 | |
|   taskID: UUID!
 | |
| }
 | |
| 
 | |
| input FindTeam {
 | |
|   teamID: UUID!
 | |
| }
 |