refactor: rename enum TeamMemberRole to TeamAccessRole (#5053)

Co-authored-by: mirarifhasan <arif.ishan05@gmail.com>
Co-authored-by: Anwarul Islam <anwaarulislaam@gmail.com>
This commit is contained in:
Akhil 2025-05-07 17:56:10 +05:30 committed by GitHub
parent 609aaa4070
commit f26d32c4e4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
43 changed files with 329 additions and 327 deletions

View file

@ -0,0 +1,2 @@
-- Alter the enum type "TeamMemberRole" to "TeamAccessRole"
ALTER TYPE "TeamMemberRole" RENAME TO "TeamAccessRole";

View file

@ -20,7 +20,7 @@ model Team {
model TeamMember { model TeamMember {
id String @id @default(uuid()) // Membership ID id String @id @default(uuid()) // Membership ID
role TeamMemberRole role TeamAccessRole
userUid String userUid String
teamID String teamID String
team Team @relation(fields: [teamID], references: [id], onDelete: Cascade) team Team @relation(fields: [teamID], references: [id], onDelete: Cascade)
@ -34,7 +34,7 @@ model TeamInvitation {
team Team @relation(fields: [teamID], references: [id], onDelete: Cascade) team Team @relation(fields: [teamID], references: [id], onDelete: Cascade)
creatorUid String creatorUid String
inviteeEmail String inviteeEmail String
inviteeRole TeamMemberRole inviteeRole TeamAccessRole
@@unique([teamID, inviteeEmail]) @@unique([teamID, inviteeEmail])
@@index([teamID]) @@index([teamID])
@ -207,7 +207,7 @@ model UserCollection {
updatedOn DateTime @updatedAt @db.Timestamp(3) updatedOn DateTime @updatedAt @db.Timestamp(3)
} }
enum TeamMemberRole { enum TeamAccessRole {
OWNER OWNER
VIEWER VIEWER
EDITOR EDITOR

View file

@ -26,7 +26,7 @@ import { TeamCollectionService } from '../team-collection/team-collection.servic
import { TeamRequestService } from '../team-request/team-request.service'; import { TeamRequestService } from '../team-request/team-request.service';
import { TeamEnvironmentsService } from '../team-environments/team-environments.service'; import { TeamEnvironmentsService } from '../team-environments/team-environments.service';
import { TeamInvitationService } from '../team-invitation/team-invitation.service'; import { TeamInvitationService } from '../team-invitation/team-invitation.service';
import { TeamMemberRole } from '../team/team.model'; import { TeamAccessRole } from '../team/team.model';
import { ShortcodeService } from 'src/shortcode/shortcode.service'; import { ShortcodeService } from 'src/shortcode/shortcode.service';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { OffsetPaginationArgs } from 'src/types/input-types.args'; import { OffsetPaginationArgs } from 'src/types/input-types.args';
@ -292,9 +292,9 @@ export class AdminService {
async changeRoleOfUserTeam( async changeRoleOfUserTeam(
userUid: string, userUid: string,
teamID: string, teamID: string,
newRole: TeamMemberRole, newRole: TeamAccessRole,
) { ) {
const updatedTeamMember = await this.teamService.updateTeamMemberRole( const updatedTeamMember = await this.teamService.updateTeamAccessRole(
teamID, teamID,
userUid, userUid,
newRole, newRole,
@ -325,7 +325,7 @@ export class AdminService {
* @param role team member role for the user * @param role team member role for the user
* @returns an Either of boolean or error * @returns an Either of boolean or error
*/ */
async addUserToTeam(teamID: string, userEmail: string, role: TeamMemberRole) { async addUserToTeam(teamID: string, userEmail: string, role: TeamAccessRole) {
if (!validateEmail(userEmail)) return E.left(INVALID_EMAIL); if (!validateEmail(userEmail)) return E.left(INVALID_EMAIL);
const user = await this.userService.findUserByEmail(userEmail); const user = await this.userService.findUserByEmail(userEmail);

View file

@ -1,5 +1,5 @@
import { Field, ID, ArgsType } from '@nestjs/graphql'; import { Field, ID, ArgsType } from '@nestjs/graphql';
import { TeamMemberRole } from '../team/team.model'; import { TeamAccessRole } from '../team/team.model';
@ArgsType() @ArgsType()
export class ChangeUserRoleInTeamArgs { export class ChangeUserRoleInTeamArgs {
@ -14,11 +14,11 @@ export class ChangeUserRoleInTeamArgs {
}) })
teamID: string; teamID: string;
@Field(() => TeamMemberRole, { @Field(() => TeamAccessRole, {
name: 'newRole', name: 'newRole',
description: 'updated team role', description: 'updated team role',
}) })
newRole: TeamMemberRole; newRole: TeamAccessRole;
} }
@ArgsType() @ArgsType()
@ -29,11 +29,11 @@ export class AddUserToTeamArgs {
}) })
teamID: string; teamID: string;
@Field(() => TeamMemberRole, { @Field(() => TeamAccessRole, {
name: 'role', name: 'role',
description: 'The role of the user to add in the team', description: 'The role of the user to add in the team',
}) })
role: TeamMemberRole; role: TeamAccessRole;
@Field({ @Field({
name: 'userEmail', name: 'userEmail',

View file

@ -10,7 +10,7 @@ import {
IsString, IsString,
MinLength, MinLength,
} from 'class-validator'; } from 'class-validator';
import { TeamMemberRole } from 'src/team/team.model'; import { TeamAccessRole } from 'src/team/team.model';
import { OffsetPaginationArgs } from 'src/types/input-types.args'; import { OffsetPaginationArgs } from 'src/types/input-types.args';
// POST v1/infra/user-invitations // POST v1/infra/user-invitations
@ -140,7 +140,7 @@ export class GetUserWorkspacesResponse {
@Expose() @Expose()
name: string; name: string;
@ApiProperty({ enum: TeamMemberRole }) @ApiProperty({ enum: TeamAccessRole })
@Expose() @Expose()
role: string; role: string;

View file

@ -3,7 +3,7 @@ import { Reflector } from '@nestjs/core';
import { GqlExecutionContext } from '@nestjs/graphql'; import { GqlExecutionContext } from '@nestjs/graphql';
import { TeamCollectionService } from '../team-collection.service'; import { TeamCollectionService } from '../team-collection.service';
import { TeamService } from '../../team/team.service'; import { TeamService } from '../../team/team.service';
import { TeamMemberRole } from '../../team/team.model'; import { TeamAccessRole } from '../../team/team.model';
import { import {
BUG_TEAM_NO_REQUIRE_TEAM_ROLE, BUG_TEAM_NO_REQUIRE_TEAM_ROLE,
BUG_AUTH_NO_USER_CTX, BUG_AUTH_NO_USER_CTX,
@ -22,7 +22,7 @@ export class GqlCollectionTeamMemberGuard implements CanActivate {
) {} ) {}
async canActivate(context: ExecutionContext): Promise<boolean> { async canActivate(context: ExecutionContext): Promise<boolean> {
const requireRoles = this.reflector.get<TeamMemberRole[]>( const requireRoles = this.reflector.get<TeamAccessRole[]>(
'requiresTeamRole', 'requiresTeamRole',
context.getHandler(), context.getHandler(),
); );

View file

@ -11,7 +11,7 @@ import * as E from 'fp-ts/Either';
import { ThrottlerBehindProxyGuard } from 'src/guards/throttler-behind-proxy.guard'; import { ThrottlerBehindProxyGuard } from 'src/guards/throttler-behind-proxy.guard';
import { JwtAuthGuard } from 'src/auth/guards/jwt-auth.guard'; import { JwtAuthGuard } from 'src/auth/guards/jwt-auth.guard';
import { RequiresTeamRole } from 'src/team/decorators/requires-team-role.decorator'; import { RequiresTeamRole } from 'src/team/decorators/requires-team-role.decorator';
import { TeamMemberRole } from '@prisma/client'; import { TeamAccessRole } from '@prisma/client';
import { RESTTeamMemberGuard } from 'src/team/guards/rest-team-member.guard'; import { RESTTeamMemberGuard } from 'src/team/guards/rest-team-member.guard';
import { throwHTTPErr } from 'src/utils'; import { throwHTTPErr } from 'src/utils';
import { RESTError } from 'src/types/RESTError'; import { RESTError } from 'src/types/RESTError';
@ -24,9 +24,9 @@ export class TeamCollectionController {
@Get('search/:teamID') @Get('search/:teamID')
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
@UseGuards(JwtAuthGuard, RESTTeamMemberGuard) @UseGuards(JwtAuthGuard, RESTTeamMemberGuard)
async searchByTitle( async searchByTitle(

View file

@ -9,7 +9,7 @@ import {
ID, ID,
} from '@nestjs/graphql'; } from '@nestjs/graphql';
import { CollectionReorderData, TeamCollection } from './team-collection.model'; import { CollectionReorderData, TeamCollection } from './team-collection.model';
import { Team, TeamMemberRole } from '../team/team.model'; import { Team, TeamAccessRole } from '../team/team.model';
import { TeamCollectionService } from './team-collection.service'; import { TeamCollectionService } from './team-collection.service';
import { GqlAuthGuard } from '../guards/gql-auth.guard'; import { GqlAuthGuard } from '../guards/gql-auth.guard';
import { GqlTeamMemberGuard } from '../team/guards/gql-team-member.guard'; import { GqlTeamMemberGuard } from '../team/guards/gql-team-member.guard';
@ -86,9 +86,9 @@ export class TeamCollectionResolver {
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
async exportCollectionsToJSON( async exportCollectionsToJSON(
@Args({ name: 'teamID', description: 'ID of the team', type: () => ID }) @Args({ name: 'teamID', description: 'ID of the team', type: () => ID })
@ -108,9 +108,9 @@ export class TeamCollectionResolver {
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
async exportCollectionToJSON( async exportCollectionToJSON(
@Args({ name: 'teamID', description: 'ID of the team', type: () => ID }) @Args({ name: 'teamID', description: 'ID of the team', type: () => ID })
@ -137,9 +137,9 @@ export class TeamCollectionResolver {
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
async rootCollectionsOfTeam(@Args() args: GetRootTeamCollectionsArgs) { async rootCollectionsOfTeam(@Args() args: GetRootTeamCollectionsArgs) {
return this.teamCollectionService.getTeamRootCollections( return this.teamCollectionService.getTeamRootCollections(
@ -155,9 +155,9 @@ export class TeamCollectionResolver {
}) })
@UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
async collection( async collection(
@Args({ @Args({
@ -188,7 +188,7 @@ export class TeamCollectionResolver {
'Creates a collection at the root of the team hierarchy (no parent collection)', 'Creates a collection at the root of the team hierarchy (no parent collection)',
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async createRootCollection(@Args() args: CreateRootTeamCollectionArgs) { async createRootCollection(@Args() args: CreateRootTeamCollectionArgs) {
const teamCollection = await this.teamCollectionService.createCollection( const teamCollection = await this.teamCollectionService.createCollection(
args.teamID, args.teamID,
@ -205,7 +205,7 @@ export class TeamCollectionResolver {
description: 'Import collections from JSON string to the specified Team', description: 'Import collections from JSON string to the specified Team',
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async importCollectionsFromJSON( async importCollectionsFromJSON(
@Args({ @Args({
name: 'teamID', name: 'teamID',
@ -242,7 +242,7 @@ export class TeamCollectionResolver {
'Replace existing collections of a specific team with collections in JSON string', 'Replace existing collections of a specific team with collections in JSON string',
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async replaceCollectionsWithJSON(@Args() args: ReplaceTeamCollectionArgs) { async replaceCollectionsWithJSON(@Args() args: ReplaceTeamCollectionArgs) {
const teamCollection = const teamCollection =
await this.teamCollectionService.replaceCollectionsWithJSON( await this.teamCollectionService.replaceCollectionsWithJSON(
@ -259,7 +259,7 @@ export class TeamCollectionResolver {
description: 'Create a collection that has a parent collection', description: 'Create a collection that has a parent collection',
}) })
@UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async createChildCollection(@Args() args: CreateChildTeamCollectionArgs) { async createChildCollection(@Args() args: CreateChildTeamCollectionArgs) {
const team = await this.teamCollectionService.getTeamOfCollection( const team = await this.teamCollectionService.getTeamOfCollection(
args.collectionID, args.collectionID,
@ -282,7 +282,7 @@ export class TeamCollectionResolver {
deprecationReason: 'Switch to updateTeamCollection mutation instead', deprecationReason: 'Switch to updateTeamCollection mutation instead',
}) })
@UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async renameCollection(@Args() args: RenameTeamCollectionArgs) { async renameCollection(@Args() args: RenameTeamCollectionArgs) {
const updatedTeamCollection = const updatedTeamCollection =
await this.teamCollectionService.renameCollection( await this.teamCollectionService.renameCollection(
@ -298,7 +298,7 @@ export class TeamCollectionResolver {
description: 'Delete a collection', description: 'Delete a collection',
}) })
@UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async deleteCollection( async deleteCollection(
@Args({ @Args({
name: 'collectionID', name: 'collectionID',
@ -320,7 +320,7 @@ export class TeamCollectionResolver {
'Move a collection into a new parent collection or the root of the team', 'Move a collection into a new parent collection or the root of the team',
}) })
@UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async moveCollection(@Args() args: MoveTeamCollectionArgs) { async moveCollection(@Args() args: MoveTeamCollectionArgs) {
const res = await this.teamCollectionService.moveCollection( const res = await this.teamCollectionService.moveCollection(
args.collectionID, args.collectionID,
@ -334,7 +334,7 @@ export class TeamCollectionResolver {
description: 'Update the order of collections', description: 'Update the order of collections',
}) })
@UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async updateCollectionOrder(@Args() args: UpdateTeamCollectionOrderArgs) { async updateCollectionOrder(@Args() args: UpdateTeamCollectionOrderArgs) {
const request = await this.teamCollectionService.updateCollectionOrder( const request = await this.teamCollectionService.updateCollectionOrder(
args.collectionID, args.collectionID,
@ -348,7 +348,7 @@ export class TeamCollectionResolver {
description: 'Update Team Collection details', description: 'Update Team Collection details',
}) })
@UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async updateTeamCollection(@Args() args: UpdateTeamCollectionArgs) { async updateTeamCollection(@Args() args: UpdateTeamCollectionArgs) {
const updatedTeamCollection = const updatedTeamCollection =
await this.teamCollectionService.updateTeamCollection( await this.teamCollectionService.updateTeamCollection(
@ -365,7 +365,7 @@ export class TeamCollectionResolver {
description: 'Duplicate a Team Collection', description: 'Duplicate a Team Collection',
}) })
@UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async duplicateTeamCollection( async duplicateTeamCollection(
@Args({ @Args({
name: 'collectionID', name: 'collectionID',
@ -389,9 +389,9 @@ export class TeamCollectionResolver {
resolve: (value) => value, resolve: (value) => value,
}) })
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@ -411,9 +411,9 @@ export class TeamCollectionResolver {
resolve: (value) => value, resolve: (value) => value,
}) })
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@ -433,9 +433,9 @@ export class TeamCollectionResolver {
resolve: (value) => value, resolve: (value) => value,
}) })
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@ -455,9 +455,9 @@ export class TeamCollectionResolver {
resolve: (value) => value, resolve: (value) => value,
}) })
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@ -477,9 +477,9 @@ export class TeamCollectionResolver {
resolve: (value) => value, resolve: (value) => value,
}) })
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)

View file

@ -1778,7 +1778,7 @@ describe('getCollectionForCLI', () => {
// mockTeamService.getTeamMember.mockResolvedValue({ // mockTeamService.getTeamMember.mockResolvedValue({
// membershipID: 'sdc3sfdv', // membershipID: 'sdc3sfdv',
// userUid: user.uid, // userUid: user.uid,
// role: TeamMemberRole.OWNER, // role: TeamAccessRole.OWNER,
// }); // });
// const result = await teamCollectionService.getCollectionForCLI( // const result = await teamCollectionService.getCollectionForCLI(

View file

@ -11,7 +11,7 @@ import {
import { TeamService } from 'src/team/team.service'; import { TeamService } from 'src/team/team.service';
import { GqlExecutionContext } from '@nestjs/graphql'; import { GqlExecutionContext } from '@nestjs/graphql';
import * as E from 'fp-ts/Either'; import * as E from 'fp-ts/Either';
import { TeamMemberRole } from '@prisma/client'; import { TeamAccessRole } from '@prisma/client';
import { throwErr } from 'src/utils'; import { throwErr } from 'src/utils';
/** /**
@ -28,7 +28,7 @@ export class GqlTeamEnvTeamGuard implements CanActivate {
) {} ) {}
async canActivate(context: ExecutionContext): Promise<boolean> { async canActivate(context: ExecutionContext): Promise<boolean> {
const requireRoles = this.reflector.get<TeamMemberRole[]>( const requireRoles = this.reflector.get<TeamAccessRole[]>(
'requiresTeamRole', 'requiresTeamRole',
context.getHandler(), context.getHandler(),
); );

View file

@ -8,7 +8,7 @@ import { GqlThrottlerGuard } from 'src/guards/gql-throttler.guard';
import { PubSubService } from 'src/pubsub/pubsub.service'; import { PubSubService } from 'src/pubsub/pubsub.service';
import { RequiresTeamRole } from 'src/team/decorators/requires-team-role.decorator'; import { RequiresTeamRole } from 'src/team/decorators/requires-team-role.decorator';
import { GqlTeamMemberGuard } from 'src/team/guards/gql-team-member.guard'; import { GqlTeamMemberGuard } from 'src/team/guards/gql-team-member.guard';
import { TeamMemberRole } from 'src/team/team.model'; import { TeamAccessRole } from 'src/team/team.model';
import { throwErr } from 'src/utils'; import { throwErr } from 'src/utils';
import { GqlTeamEnvTeamGuard } from './gql-team-env-team.guard'; import { GqlTeamEnvTeamGuard } from './gql-team-env-team.guard';
import { TeamEnvironment } from './team-environments.model'; import { TeamEnvironment } from './team-environments.model';
@ -33,7 +33,7 @@ export class TeamEnvironmentsResolver {
description: 'Create a new Team Environment for given Team ID', description: 'Create a new Team Environment for given Team ID',
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async createTeamEnvironment( async createTeamEnvironment(
@Args() args: CreateTeamEnvironmentArgs, @Args() args: CreateTeamEnvironmentArgs,
): Promise<TeamEnvironment> { ): Promise<TeamEnvironment> {
@ -52,7 +52,7 @@ export class TeamEnvironmentsResolver {
description: 'Delete a Team Environment for given Team ID', description: 'Delete a Team Environment for given Team ID',
}) })
@UseGuards(GqlAuthGuard, GqlTeamEnvTeamGuard) @UseGuards(GqlAuthGuard, GqlTeamEnvTeamGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async deleteTeamEnvironment( async deleteTeamEnvironment(
@Args({ @Args({
name: 'id', name: 'id',
@ -74,7 +74,7 @@ export class TeamEnvironmentsResolver {
'Add/Edit a single environment variable or variables to a Team Environment', 'Add/Edit a single environment variable or variables to a Team Environment',
}) })
@UseGuards(GqlAuthGuard, GqlTeamEnvTeamGuard) @UseGuards(GqlAuthGuard, GqlTeamEnvTeamGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async updateTeamEnvironment( async updateTeamEnvironment(
@Args() @Args()
args: UpdateTeamEnvironmentArgs, args: UpdateTeamEnvironmentArgs,
@ -94,7 +94,7 @@ export class TeamEnvironmentsResolver {
description: 'Delete all variables from a Team Environment', description: 'Delete all variables from a Team Environment',
}) })
@UseGuards(GqlAuthGuard, GqlTeamEnvTeamGuard) @UseGuards(GqlAuthGuard, GqlTeamEnvTeamGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async deleteAllVariablesFromTeamEnvironment( async deleteAllVariablesFromTeamEnvironment(
@Args({ @Args({
name: 'id', name: 'id',
@ -116,7 +116,7 @@ export class TeamEnvironmentsResolver {
description: 'Create a duplicate of an existing environment', description: 'Create a duplicate of an existing environment',
}) })
@UseGuards(GqlAuthGuard, GqlTeamEnvTeamGuard) @UseGuards(GqlAuthGuard, GqlTeamEnvTeamGuard)
@RequiresTeamRole(TeamMemberRole.OWNER, TeamMemberRole.EDITOR) @RequiresTeamRole(TeamAccessRole.OWNER, TeamAccessRole.EDITOR)
async createDuplicateEnvironment( async createDuplicateEnvironment(
@Args({ @Args({
name: 'id', name: 'id',
@ -142,9 +142,9 @@ export class TeamEnvironmentsResolver {
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
teamEnvironmentUpdated( teamEnvironmentUpdated(
@Args({ @Args({
@ -164,9 +164,9 @@ export class TeamEnvironmentsResolver {
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
teamEnvironmentCreated( teamEnvironmentCreated(
@Args({ @Args({
@ -186,9 +186,9 @@ export class TeamEnvironmentsResolver {
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
teamEnvironmentDeleted( teamEnvironmentDeleted(
@Args({ @Args({

View file

@ -9,7 +9,7 @@ import {
TEAM_MEMBER_NOT_FOUND, TEAM_MEMBER_NOT_FOUND,
} from 'src/errors'; } from 'src/errors';
import { TeamService } from 'src/team/team.service'; import { TeamService } from 'src/team/team.service';
import { TeamMemberRole } from 'src/team/team.model'; import { TeamAccessRole } from 'src/team/team.model';
const mockPrisma = mockDeep<PrismaService>(); const mockPrisma = mockDeep<PrismaService>();
@ -394,7 +394,7 @@ describe('TeamEnvironmentsService', () => {
mockTeamService.getTeamMember.mockResolvedValue({ mockTeamService.getTeamMember.mockResolvedValue({
membershipID: 'sdc3sfdv', membershipID: 'sdc3sfdv',
userUid: '123454', userUid: '123454',
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}); });
const result = await teamEnvironmentsService.getTeamEnvironmentForCLI( const result = await teamEnvironmentsService.getTeamEnvironmentForCLI(

View file

@ -1,5 +1,5 @@
import { ArgsType, Field, ID } from '@nestjs/graphql'; import { ArgsType, Field, ID } from '@nestjs/graphql';
import { TeamMemberRole } from 'src/team/team.model'; import { TeamAccessRole } from 'src/team/team.model';
@ArgsType() @ArgsType()
export class CreateTeamInvitationArgs { export class CreateTeamInvitationArgs {
@ -12,9 +12,9 @@ export class CreateTeamInvitationArgs {
@Field({ name: 'inviteeEmail', description: 'Email of the user to invite' }) @Field({ name: 'inviteeEmail', description: 'Email of the user to invite' })
inviteeEmail: string; inviteeEmail: string;
@Field(() => TeamMemberRole, { @Field(() => TeamAccessRole, {
name: 'inviteeRole', name: 'inviteeRole',
description: 'Role to be given to the user', description: 'Role to be given to the user',
}) })
inviteeRole: TeamMemberRole; inviteeRole: TeamAccessRole;
} }

View file

@ -1,5 +1,5 @@
import { Field, ID, ObjectType } from '@nestjs/graphql'; import { Field, ID, ObjectType } from '@nestjs/graphql';
import { TeamMemberRole } from '../team/team.model'; import { TeamAccessRole } from '../team/team.model';
@ObjectType() @ObjectType()
export class TeamInvitation { export class TeamInvitation {
@ -23,8 +23,8 @@ export class TeamInvitation {
}) })
inviteeEmail: string; inviteeEmail: string;
@Field(() => TeamMemberRole, { @Field(() => TeamAccessRole, {
description: 'The role that will be given to the invitee', description: 'The role that will be given to the invitee',
}) })
inviteeRole: TeamMemberRole; inviteeRole: TeamAccessRole;
} }

View file

@ -14,7 +14,7 @@ import { pipe } from 'fp-ts/function';
import * as TE from 'fp-ts/TaskEither'; import * as TE from 'fp-ts/TaskEither';
import * as E from 'fp-ts/Either'; import * as E from 'fp-ts/Either';
import * as O from 'fp-ts/Option'; import * as O from 'fp-ts/Option';
import { Team, TeamMember, TeamMemberRole } from 'src/team/team.model'; import { Team, TeamMember, TeamAccessRole } from 'src/team/team.model';
import { TEAM_INVITE_NO_INVITE_FOUND, USER_NOT_FOUND } from 'src/errors'; import { TEAM_INVITE_NO_INVITE_FOUND, USER_NOT_FOUND } from 'src/errors';
import { GqlUser } from 'src/decorators/gql-user.decorator'; import { GqlUser } from 'src/decorators/gql-user.decorator';
import { User } from 'src/user/user.model'; import { User } from 'src/user/user.model';
@ -96,7 +96,7 @@ export class TeamInvitationResolver {
description: 'Creates a Team Invitation', description: 'Creates a Team Invitation',
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.OWNER)
async createTeamInvitation( async createTeamInvitation(
@GqlUser() user: AuthUser, @GqlUser() user: AuthUser,
@Args() args: CreateTeamInvitationArgs, @Args() args: CreateTeamInvitationArgs,
@ -116,7 +116,7 @@ export class TeamInvitationResolver {
description: 'Revokes an invitation and deletes it', description: 'Revokes an invitation and deletes it',
}) })
@UseGuards(GqlAuthGuard, TeamInviteTeamOwnerGuard) @UseGuards(GqlAuthGuard, TeamInviteTeamOwnerGuard)
@RequiresTeamRole(TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.OWNER)
async revokeTeamInvitation( async revokeTeamInvitation(
@Args({ @Args({
name: 'inviteID', name: 'inviteID',
@ -161,9 +161,9 @@ export class TeamInvitationResolver {
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
teamInvitationAdded( teamInvitationAdded(
@Args({ @Args({
@ -183,9 +183,9 @@ export class TeamInvitationResolver {
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
teamInvitationRemoved( teamInvitationRemoved(
@Args({ @Args({

View file

@ -3,7 +3,7 @@ import * as O from 'fp-ts/Option';
import * as E from 'fp-ts/Either'; import * as E from 'fp-ts/Either';
import { PrismaService } from 'src/prisma/prisma.service'; import { PrismaService } from 'src/prisma/prisma.service';
import { TeamInvitation as DBTeamInvitation } from '@prisma/client'; import { TeamInvitation as DBTeamInvitation } from '@prisma/client';
import { TeamMember, TeamMemberRole } from 'src/team/team.model'; import { TeamMember, TeamAccessRole } from 'src/team/team.model';
import { TeamService } from 'src/team/team.service'; import { TeamService } from 'src/team/team.service';
import { import {
INVALID_EMAIL, INVALID_EMAIL,
@ -41,7 +41,7 @@ export class TeamInvitationService {
cast(dbTeamInvitation: DBTeamInvitation): TeamInvitation { cast(dbTeamInvitation: DBTeamInvitation): TeamInvitation {
return { return {
...dbTeamInvitation, ...dbTeamInvitation,
inviteeRole: TeamMemberRole[dbTeamInvitation.inviteeRole], inviteeRole: TeamAccessRole[dbTeamInvitation.inviteeRole],
}; };
} }
@ -103,7 +103,7 @@ export class TeamInvitationService {
creator: AuthUser, creator: AuthUser,
teamID: string, teamID: string,
inviteeEmail: string, inviteeEmail: string,
inviteeRole: TeamMemberRole, inviteeRole: TeamAccessRole,
) { ) {
// validate email // validate email
const isEmailValid = validateEmail(inviteeEmail); const isEmailValid = validateEmail(inviteeEmail);

View file

@ -11,7 +11,7 @@ import {
TEAM_NOT_REQUIRED_ROLE, TEAM_NOT_REQUIRED_ROLE,
} from 'src/errors'; } from 'src/errors';
import { throwErr } from 'src/utils'; import { throwErr } from 'src/utils';
import { TeamMemberRole } from 'src/team/team.model'; import { TeamAccessRole } from 'src/team/team.model';
/** /**
* This guard only allows team owner to execute the resolver * This guard only allows team owner to execute the resolver
@ -45,7 +45,7 @@ export class TeamInviteTeamOwnerGuard implements CanActivate {
); );
if (!teamMember) throwErr(TEAM_MEMBER_NOT_FOUND); if (!teamMember) throwErr(TEAM_MEMBER_NOT_FOUND);
if (teamMember.role !== TeamMemberRole.OWNER) if (teamMember.role !== TeamAccessRole.OWNER)
throwErr(TEAM_NOT_REQUIRED_ROLE); throwErr(TEAM_NOT_REQUIRED_ROLE);
return true; return true;

View file

@ -3,7 +3,7 @@ import { GqlExecutionContext } from '@nestjs/graphql';
import { TeamRequestService } from '../team-request.service'; import { TeamRequestService } from '../team-request.service';
import { TeamService } from '../../team/team.service'; import { TeamService } from '../../team/team.service';
import { Reflector } from '@nestjs/core'; import { Reflector } from '@nestjs/core';
import { TeamMemberRole } from '../../team/team.model'; import { TeamAccessRole } from '../../team/team.model';
import { import {
BUG_AUTH_NO_USER_CTX, BUG_AUTH_NO_USER_CTX,
BUG_TEAM_REQ_NO_REQ_ID, BUG_TEAM_REQ_NO_REQ_ID,
@ -23,7 +23,7 @@ export class GqlRequestTeamMemberGuard implements CanActivate {
) {} ) {}
async canActivate(context: ExecutionContext): Promise<boolean> { async canActivate(context: ExecutionContext): Promise<boolean> {
const requireRoles = this.reflector.get<TeamMemberRole[]>( const requireRoles = this.reflector.get<TeamAccessRole[]>(
'requiresTeamRole', 'requiresTeamRole',
context.getHandler(), context.getHandler(),
); );

View file

@ -17,7 +17,7 @@ import {
MoveTeamRequestArgs, MoveTeamRequestArgs,
UpdateLookUpRequestOrderArgs, UpdateLookUpRequestOrderArgs,
} from './input-type.args'; } from './input-type.args';
import { Team, TeamMemberRole } from '../team/team.model'; import { Team, TeamAccessRole } from '../team/team.model';
import { TeamRequestService } from './team-request.service'; import { TeamRequestService } from './team-request.service';
import { TeamCollection } from '../team-collection/team-collection.model'; import { TeamCollection } from '../team-collection/team-collection.model';
import { UseGuards } from '@nestjs/common'; import { UseGuards } from '@nestjs/common';
@ -70,9 +70,9 @@ export class TeamRequestResolver {
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
async searchForRequest(@Args() args: SearchTeamRequestArgs) { async searchForRequest(@Args() args: SearchTeamRequestArgs) {
return this.teamRequestService.searchRequest( return this.teamRequestService.searchRequest(
@ -89,9 +89,9 @@ export class TeamRequestResolver {
}) })
@UseGuards(GqlAuthGuard, GqlRequestTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlRequestTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
async request( async request(
@Args({ @Args({
@ -111,9 +111,9 @@ export class TeamRequestResolver {
}) })
@UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
async requestsInCollection(@Args() input: GetTeamRequestInCollectionArgs) { async requestsInCollection(@Args() input: GetTeamRequestInCollectionArgs) {
return this.teamRequestService.getRequestsInCollection( return this.teamRequestService.getRequestsInCollection(
@ -128,7 +128,7 @@ export class TeamRequestResolver {
description: 'Create a team request in the given collection.', description: 'Create a team request in the given collection.',
}) })
@UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlCollectionTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.EDITOR, TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.EDITOR, TeamAccessRole.OWNER)
async createRequestInCollection( async createRequestInCollection(
@Args({ @Args({
name: 'collectionID', name: 'collectionID',
@ -158,7 +158,7 @@ export class TeamRequestResolver {
description: 'Update a request with the given ID', description: 'Update a request with the given ID',
}) })
@UseGuards(GqlAuthGuard, GqlRequestTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlRequestTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.EDITOR, TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.EDITOR, TeamAccessRole.OWNER)
async updateRequest( async updateRequest(
@Args({ @Args({
name: 'requestID', name: 'requestID',
@ -187,7 +187,7 @@ export class TeamRequestResolver {
description: 'Delete a request with the given ID', description: 'Delete a request with the given ID',
}) })
@UseGuards(GqlAuthGuard, GqlRequestTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlRequestTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.EDITOR, TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.EDITOR, TeamAccessRole.OWNER)
async deleteRequest( async deleteRequest(
@Args({ @Args({
name: 'requestID', name: 'requestID',
@ -207,7 +207,7 @@ export class TeamRequestResolver {
description: 'Update the order of requests in the lookup table', description: 'Update the order of requests in the lookup table',
}) })
@UseGuards(GqlAuthGuard, GqlRequestTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlRequestTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.EDITOR, TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.EDITOR, TeamAccessRole.OWNER)
async updateLookUpRequestOrder( async updateLookUpRequestOrder(
@Args() @Args()
args: UpdateLookUpRequestOrderArgs, args: UpdateLookUpRequestOrderArgs,
@ -227,7 +227,7 @@ export class TeamRequestResolver {
description: 'Move a request to the given collection', description: 'Move a request to the given collection',
}) })
@UseGuards(GqlAuthGuard, GqlRequestTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlRequestTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.EDITOR, TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.EDITOR, TeamAccessRole.OWNER)
async moveRequest(@Args() args: MoveTeamRequestArgs) { async moveRequest(@Args() args: MoveTeamRequestArgs) {
const teamRequest = await this.teamRequestService.moveRequest( const teamRequest = await this.teamRequestService.moveRequest(
args.srcCollID, args.srcCollID,
@ -248,9 +248,9 @@ export class TeamRequestResolver {
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
teamRequestAdded( teamRequestAdded(
@Args({ @Args({
@ -270,9 +270,9 @@ export class TeamRequestResolver {
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
teamRequestUpdated( teamRequestUpdated(
@Args({ @Args({
@ -293,9 +293,9 @@ export class TeamRequestResolver {
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
teamRequestDeleted( teamRequestDeleted(
@Args({ @Args({
@ -316,9 +316,9 @@ export class TeamRequestResolver {
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
requestOrderUpdated( requestOrderUpdated(
@Args({ @Args({
@ -339,9 +339,9 @@ export class TeamRequestResolver {
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
requestMoved( requestMoved(
@Args({ @Args({

View file

@ -1,5 +1,5 @@
import { TeamMemberRole } from '@prisma/client'; import { TeamAccessRole } from '@prisma/client';
import { SetMetadata } from '@nestjs/common'; import { SetMetadata } from '@nestjs/common';
export const RequiresTeamRole = (...roles: TeamMemberRole[]) => export const RequiresTeamRole = (...roles: TeamAccessRole[]) =>
SetMetadata('requiresTeamRole', roles); SetMetadata('requiresTeamRole', roles);

View file

@ -1,7 +1,7 @@
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core'; import { Reflector } from '@nestjs/core';
import { TeamService } from '../team.service'; import { TeamService } from '../team.service';
import { TeamMemberRole } from '../team.model'; import { TeamAccessRole } from '../team.model';
import { GqlExecutionContext } from '@nestjs/graphql'; import { GqlExecutionContext } from '@nestjs/graphql';
import { import {
TEAM_NOT_REQUIRED_ROLE, TEAM_NOT_REQUIRED_ROLE,
@ -19,7 +19,7 @@ export class GqlTeamMemberGuard implements CanActivate {
) {} ) {}
async canActivate(context: ExecutionContext): Promise<boolean> { async canActivate(context: ExecutionContext): Promise<boolean> {
const requireRoles = this.reflector.get<TeamMemberRole[]>( const requireRoles = this.reflector.get<TeamAccessRole[]>(
'requiresTeamRole', 'requiresTeamRole',
context.getHandler(), context.getHandler(),
); );

View file

@ -1,7 +1,7 @@
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core'; import { Reflector } from '@nestjs/core';
import { TeamService } from '../../team/team.service'; import { TeamService } from '../../team/team.service';
import { TeamMemberRole } from '../../team/team.model'; import { TeamAccessRole } from '../../team/team.model';
import { import {
BUG_TEAM_NO_REQUIRE_TEAM_ROLE, BUG_TEAM_NO_REQUIRE_TEAM_ROLE,
BUG_AUTH_NO_USER_CTX, BUG_AUTH_NO_USER_CTX,
@ -19,7 +19,7 @@ export class RESTTeamMemberGuard implements CanActivate {
) {} ) {}
async canActivate(context: ExecutionContext): Promise<boolean> { async canActivate(context: ExecutionContext): Promise<boolean> {
const requireRoles = this.reflector.get<TeamMemberRole[]>( const requireRoles = this.reflector.get<TeamAccessRole[]>(
'requiresTeamRole', 'requiresTeamRole',
context.getHandler(), context.getHandler(),
); );

View file

@ -22,18 +22,18 @@ export class TeamMember {
userUid: string; userUid: string;
@Field(() => TeamMemberRole, { @Field(() => TeamAccessRole, {
description: 'Role of the given team member in the given team', description: 'Role of the given team member in the given team',
}) })
role: TeamMemberRole; role: TeamAccessRole;
} }
export enum TeamMemberRole { export enum TeamAccessRole {
OWNER = 'OWNER', OWNER = 'OWNER',
VIEWER = 'VIEWER', VIEWER = 'VIEWER',
EDITOR = 'EDITOR', EDITOR = 'EDITOR',
} }
registerEnumType(TeamMemberRole, { registerEnumType(TeamAccessRole, {
name: 'TeamMemberRole', name: 'TeamAccessRole',
}); });

View file

@ -1,4 +1,4 @@
import { Team, TeamMember, TeamMemberRole } from './team.model'; import { Team, TeamMember, TeamAccessRole } from './team.model';
import { import {
Resolver, Resolver,
ResolveField, ResolveField,
@ -59,7 +59,7 @@ export class TeamResolver {
return this.teamService.getTeamMembers(team.id); return this.teamService.getTeamMembers(team.id);
} }
@ResolveField(() => TeamMemberRole, { @ResolveField(() => TeamAccessRole, {
description: 'The role of the current user in the team', description: 'The role of the current user in the team',
nullable: true, nullable: true,
}) })
@ -67,7 +67,7 @@ export class TeamResolver {
myRole( myRole(
@Parent() team: Team, @Parent() team: Team,
@GqlUser() user: AuthUser, @GqlUser() user: AuthUser,
): Promise<TeamMemberRole | null> { ): Promise<TeamAccessRole | null> {
return this.teamService.getRoleOfUserInTeam(team.id, user.uid); return this.teamService.getRoleOfUserInTeam(team.id, user.uid);
} }
@ -77,7 +77,7 @@ export class TeamResolver {
ownersCount(@Parent() team: Team): Promise<number> { ownersCount(@Parent() team: Team): Promise<number> {
return this.teamService.getCountOfUsersWithRoleInTeam( return this.teamService.getCountOfUsersWithRoleInTeam(
team.id, team.id,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
); );
} }
@ -87,7 +87,7 @@ export class TeamResolver {
editorsCount(@Parent() team: Team): Promise<number> { editorsCount(@Parent() team: Team): Promise<number> {
return this.teamService.getCountOfUsersWithRoleInTeam( return this.teamService.getCountOfUsersWithRoleInTeam(
team.id, team.id,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
); );
} }
@ -97,7 +97,7 @@ export class TeamResolver {
viewersCount(@Parent() team: Team): Promise<number> { viewersCount(@Parent() team: Team): Promise<number> {
return this.teamService.getCountOfUsersWithRoleInTeam( return this.teamService.getCountOfUsersWithRoleInTeam(
team.id, team.id,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
); );
} }
@ -126,9 +126,9 @@ export class TeamResolver {
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
) )
team( team(
@Args({ @Args({
@ -178,7 +178,7 @@ export class TeamResolver {
description: 'Removes the team member from the team', description: 'Removes the team member from the team',
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.OWNER)
async removeTeamMember( async removeTeamMember(
@GqlUser() _user: AuthUser, @GqlUser() _user: AuthUser,
@Args({ @Args({
@ -203,7 +203,7 @@ export class TeamResolver {
description: 'Renames a team', description: 'Renames a team',
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.OWNER)
async renameTeam( async renameTeam(
@Args({ name: 'teamID', description: 'ID of the team', type: () => ID }) @Args({ name: 'teamID', description: 'ID of the team', type: () => ID })
teamID: string, teamID: string,
@ -219,7 +219,7 @@ export class TeamResolver {
description: 'Deletes the team', description: 'Deletes the team',
}) })
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@RequiresTeamRole(TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.OWNER)
async deleteTeam( async deleteTeam(
@Args({ name: 'teamID', description: 'ID of the team', type: () => ID }) @Args({ name: 'teamID', description: 'ID of the team', type: () => ID })
teamID: string, teamID: string,
@ -232,9 +232,9 @@ export class TeamResolver {
@Mutation(() => TeamMember, { @Mutation(() => TeamMember, {
description: 'Update role of a team member the executing user owns', description: 'Update role of a team member the executing user owns',
}) })
@RequiresTeamRole(TeamMemberRole.OWNER) @RequiresTeamRole(TeamAccessRole.OWNER)
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
async updateTeamMemberRole( async updateTeamAccessRole(
@Args({ @Args({
name: 'teamID', name: 'teamID',
description: 'ID of the affected team', description: 'ID of the affected team',
@ -250,11 +250,11 @@ export class TeamResolver {
@Args({ @Args({
name: 'newRole', name: 'newRole',
description: 'Updated role value', description: 'Updated role value',
type: () => TeamMemberRole, type: () => TeamAccessRole,
}) })
newRole: TeamMemberRole, newRole: TeamAccessRole,
): Promise<TeamMember> { ): Promise<TeamMember> {
const teamMember = await this.teamService.updateTeamMemberRole( const teamMember = await this.teamService.updateTeamAccessRole(
teamID, teamID,
userUid, userUid,
newRole, newRole,
@ -270,9 +270,9 @@ export class TeamResolver {
resolve: (value) => value, resolve: (value) => value,
}) })
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@ -293,9 +293,9 @@ export class TeamResolver {
resolve: (value) => value, resolve: (value) => value,
}) })
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)
@ -316,9 +316,9 @@ export class TeamResolver {
resolve: (value) => value, resolve: (value) => value,
}) })
@RequiresTeamRole( @RequiresTeamRole(
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
) )
@SkipThrottle() @SkipThrottle()
@UseGuards(GqlAuthGuard, GqlTeamMemberGuard) @UseGuards(GqlAuthGuard, GqlTeamMemberGuard)

View file

@ -1,6 +1,6 @@
import { TeamService } from './team.service'; import { TeamService } from './team.service';
import { PrismaService } from '../prisma/prisma.service'; import { PrismaService } from '../prisma/prisma.service';
import { Team, TeamMember, TeamMemberRole } from './team.model'; import { Team, TeamMember, TeamAccessRole } from './team.model';
import { TeamMember as DbTeamMember } from '@prisma/client'; import { TeamMember as DbTeamMember } from '@prisma/client';
import { import {
USER_NOT_FOUND, USER_NOT_FOUND,
@ -51,13 +51,13 @@ const teams: Team[] = [
]; ];
const dbTeamMember: DbTeamMember = { const dbTeamMember: DbTeamMember = {
id: 'teamMemberID', id: 'teamMemberID',
role: TeamMemberRole.VIEWER, role: TeamAccessRole.VIEWER,
userUid: 'userUid', userUid: 'userUid',
teamID: team.id, teamID: team.id,
}; };
const teamMember: TeamMember = { const teamMember: TeamMember = {
membershipID: dbTeamMember.id, membershipID: dbTeamMember.id,
role: TeamMemberRole[dbTeamMember.role], role: TeamAccessRole[dbTeamMember.role],
userUid: dbTeamMember.userUid, userUid: dbTeamMember.userUid,
}; };
@ -70,14 +70,14 @@ describe('getCountOfUsersWithRoleInTeam', () => {
await expect( await expect(
teamService.getCountOfUsersWithRoleInTeam( teamService.getCountOfUsersWithRoleInTeam(
dbTeamMember.teamID, dbTeamMember.teamID,
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
), ),
).resolves.toEqual(2); ).resolves.toEqual(2);
expect(mockPrisma.teamMember.count).toHaveBeenCalledWith({ expect(mockPrisma.teamMember.count).toHaveBeenCalledWith({
where: { where: {
teamID: dbTeamMember.teamID, teamID: dbTeamMember.teamID,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}, },
}); });
}); });
@ -88,14 +88,14 @@ describe('getCountOfUsersWithRoleInTeam', () => {
await expect( await expect(
teamService.getCountOfUsersWithRoleInTeam( teamService.getCountOfUsersWithRoleInTeam(
dbTeamMember.teamID, dbTeamMember.teamID,
TeamMemberRole.VIEWER, TeamAccessRole.VIEWER,
), ),
).resolves.toEqual(2); ).resolves.toEqual(2);
expect(mockPrisma.teamMember.count).toHaveBeenCalledWith({ expect(mockPrisma.teamMember.count).toHaveBeenCalledWith({
where: { where: {
teamID: dbTeamMember.teamID, teamID: dbTeamMember.teamID,
role: TeamMemberRole.VIEWER, role: TeamAccessRole.VIEWER,
}, },
}); });
}); });
@ -106,14 +106,14 @@ describe('getCountOfUsersWithRoleInTeam', () => {
await expect( await expect(
teamService.getCountOfUsersWithRoleInTeam( teamService.getCountOfUsersWithRoleInTeam(
dbTeamMember.teamID, dbTeamMember.teamID,
TeamMemberRole.EDITOR, TeamAccessRole.EDITOR,
), ),
).resolves.toEqual(2); ).resolves.toEqual(2);
expect(mockPrisma.teamMember.count).toHaveBeenCalledWith({ expect(mockPrisma.teamMember.count).toHaveBeenCalledWith({
where: { where: {
teamID: dbTeamMember.teamID, teamID: dbTeamMember.teamID,
role: TeamMemberRole.EDITOR, role: TeamAccessRole.EDITOR,
}, },
}); });
}); });
@ -127,7 +127,7 @@ describe('addMemberToTeam', () => {
teamService.addMemberToTeam( teamService.addMemberToTeam(
dbTeamMember.teamID, dbTeamMember.teamID,
dbTeamMember.userUid, dbTeamMember.userUid,
TeamMemberRole[dbTeamMember.role], TeamAccessRole[dbTeamMember.role],
), ),
).resolves.toEqual(expect.objectContaining(teamMember)); ).resolves.toEqual(expect.objectContaining(teamMember));
}); });
@ -138,7 +138,7 @@ describe('addMemberToTeam', () => {
await teamService.addMemberToTeam( await teamService.addMemberToTeam(
dbTeamMember.teamID, dbTeamMember.teamID,
dbTeamMember.userUid, dbTeamMember.userUid,
TeamMemberRole[dbTeamMember.role], TeamAccessRole[dbTeamMember.role],
); );
expect(mockPrisma.teamMember.create).toHaveBeenCalledWith({ expect(mockPrisma.teamMember.create).toHaveBeenCalledWith({
@ -149,7 +149,7 @@ describe('addMemberToTeam', () => {
id: dbTeamMember.teamID, id: dbTeamMember.teamID,
}, },
}, },
role: TeamMemberRole[dbTeamMember.role], role: TeamAccessRole[dbTeamMember.role],
}, },
}); });
}); });
@ -160,7 +160,7 @@ describe('addMemberToTeam', () => {
const member = await teamService.addMemberToTeam( const member = await teamService.addMemberToTeam(
dbTeamMember.teamID, dbTeamMember.teamID,
dbTeamMember.userUid, dbTeamMember.userUid,
TeamMemberRole[dbTeamMember.role], TeamAccessRole[dbTeamMember.role],
); );
expect(mockPubSub.publish).toHaveBeenCalledWith( expect(mockPubSub.publish).toHaveBeenCalledWith(
@ -188,7 +188,7 @@ describe('addMemberToTeamWithEmail', () => {
const result = teamService.addMemberToTeamWithEmail( const result = teamService.addMemberToTeamWithEmail(
dbTeamMember.teamID, dbTeamMember.teamID,
'test@hoppscotch.io', 'test@hoppscotch.io',
TeamMemberRole[dbTeamMember.role], TeamAccessRole[dbTeamMember.role],
); );
return expect(result).resolves.toBeDefined(); return expect(result).resolves.toBeDefined();
}); });
@ -199,7 +199,7 @@ describe('addMemberToTeamWithEmail', () => {
const result = teamService.addMemberToTeamWithEmail( const result = teamService.addMemberToTeamWithEmail(
dbTeamMember.teamID, dbTeamMember.teamID,
'test@hoppscotch.io', 'test@hoppscotch.io',
TeamMemberRole[dbTeamMember.role], TeamAccessRole[dbTeamMember.role],
); );
return expect(result).resolves.toEqualLeft(USER_NOT_FOUND); return expect(result).resolves.toEqualLeft(USER_NOT_FOUND);
}); });
@ -215,7 +215,7 @@ describe('addMemberToTeamWithEmail', () => {
await teamService.addMemberToTeamWithEmail( await teamService.addMemberToTeamWithEmail(
dbTeamMember.teamID, dbTeamMember.teamID,
'test@hoppscotch.io', 'test@hoppscotch.io',
TeamMemberRole[dbTeamMember.role], TeamAccessRole[dbTeamMember.role],
); );
expect(mockPrisma.teamMember.create).toHaveBeenCalledWith({ expect(mockPrisma.teamMember.create).toHaveBeenCalledWith({
@ -226,7 +226,7 @@ describe('addMemberToTeamWithEmail', () => {
id: dbTeamMember.teamID, id: dbTeamMember.teamID,
}, },
}, },
role: TeamMemberRole[dbTeamMember.role], role: TeamAccessRole[dbTeamMember.role],
}, },
}); });
}); });
@ -242,7 +242,7 @@ describe('addMemberToTeamWithEmail', () => {
await teamService.addMemberToTeamWithEmail( await teamService.addMemberToTeamWithEmail(
dbTeamMember.teamID, dbTeamMember.teamID,
'test@hoppscotch.io', 'test@hoppscotch.io',
TeamMemberRole[dbTeamMember.role], TeamAccessRole[dbTeamMember.role],
); );
expect(mockPubSub.publish).toHaveBeenCalledWith( expect(mockPubSub.publish).toHaveBeenCalledWith(
@ -376,7 +376,7 @@ describe('renameTeam', () => {
}); });
}); });
describe('updateTeamMemberRole', () => { describe('updateTeamAccessRole', () => {
/** /**
* Test Scenario: * Test Scenario:
* 3 users (testuid1 thru 3) having each of the roles * 3 users (testuid1 thru 3) having each of the roles
@ -385,19 +385,19 @@ describe('updateTeamMemberRole', () => {
*/ */
test('updates the role', async () => { test('updates the role', async () => {
const newRole = TeamMemberRole.EDITOR; const newRole = TeamAccessRole.EDITOR;
mockPrisma.teamMember.count.mockResolvedValue(1); mockPrisma.teamMember.count.mockResolvedValue(1);
mockPrisma.teamMember.findUnique.mockResolvedValue({ mockPrisma.teamMember.findUnique.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole[dbTeamMember.role], role: TeamAccessRole[dbTeamMember.role],
}); });
mockPrisma.teamMember.update.mockResolvedValue({ mockPrisma.teamMember.update.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: newRole, role: newRole,
}); });
await teamService.updateTeamMemberRole( await teamService.updateTeamAccessRole(
dbTeamMember.teamID, dbTeamMember.teamID,
dbTeamMember.userUid, dbTeamMember.userUid,
newRole, newRole,
@ -417,7 +417,7 @@ describe('updateTeamMemberRole', () => {
}); });
test('returns the updated details', () => { test('returns the updated details', () => {
const newRole = TeamMemberRole.EDITOR; const newRole = TeamAccessRole.EDITOR;
mockPrisma.teamMember.count.mockResolvedValue(1); mockPrisma.teamMember.count.mockResolvedValue(1);
mockPrisma.teamMember.findUnique.mockResolvedValue(dbTeamMember); mockPrisma.teamMember.findUnique.mockResolvedValue(dbTeamMember);
@ -427,7 +427,7 @@ describe('updateTeamMemberRole', () => {
}); });
return expect( return expect(
teamService.updateTeamMemberRole( teamService.updateTeamAccessRole(
dbTeamMember.teamID, dbTeamMember.teamID,
dbTeamMember.userUid, dbTeamMember.userUid,
newRole, newRole,
@ -439,17 +439,17 @@ describe('updateTeamMemberRole', () => {
mockPrisma.teamMember.count.mockResolvedValue(1); mockPrisma.teamMember.count.mockResolvedValue(1);
mockPrisma.teamMember.findUnique.mockResolvedValue({ mockPrisma.teamMember.findUnique.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}); });
// Prisma doesn't care if it goes through // Prisma doesn't care if it goes through
mockPrisma.teamMember.update.mockResolvedValue(dbTeamMember); mockPrisma.teamMember.update.mockResolvedValue(dbTeamMember);
return expect( return expect(
teamService.updateTeamMemberRole( teamService.updateTeamAccessRole(
dbTeamMember.teamID, dbTeamMember.teamID,
dbTeamMember.userUid, dbTeamMember.userUid,
TeamMemberRole[dbTeamMember.role], TeamAccessRole[dbTeamMember.role],
), ),
).resolves.toEqualLeft(TEAM_ONLY_ONE_OWNER); ).resolves.toEqualLeft(TEAM_ONLY_ONE_OWNER);
}); });
@ -458,18 +458,18 @@ describe('updateTeamMemberRole', () => {
mockPrisma.teamMember.count.mockResolvedValue(1); mockPrisma.teamMember.count.mockResolvedValue(1);
mockPrisma.teamMember.findUnique.mockResolvedValue({ mockPrisma.teamMember.findUnique.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}); });
mockPrisma.teamMember.update.mockResolvedValue({ mockPrisma.teamMember.update.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}); });
return expect( return expect(
teamService.updateTeamMemberRole( teamService.updateTeamAccessRole(
dbTeamMember.teamID, dbTeamMember.teamID,
dbTeamMember.userUid, dbTeamMember.userUid,
TeamMemberRole[TeamMemberRole.OWNER], TeamAccessRole[TeamAccessRole.OWNER],
), ),
).resolves.toBeDefined(); ).resolves.toBeDefined();
}); });
@ -478,28 +478,28 @@ describe('updateTeamMemberRole', () => {
mockPrisma.teamMember.count.mockResolvedValue(2); mockPrisma.teamMember.count.mockResolvedValue(2);
mockPrisma.teamMember.findUnique.mockResolvedValue({ mockPrisma.teamMember.findUnique.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}); });
mockPrisma.teamMember.update.mockResolvedValue(dbTeamMember); mockPrisma.teamMember.update.mockResolvedValue(dbTeamMember);
// Set another user as the owner // Set another user as the owner
await teamService.updateTeamMemberRole( await teamService.updateTeamAccessRole(
dbTeamMember.teamID, dbTeamMember.teamID,
'testuid2', 'testuid2',
TeamMemberRole.OWNER, TeamAccessRole.OWNER,
); );
await expect( await expect(
teamService.updateTeamMemberRole( teamService.updateTeamAccessRole(
dbTeamMember.teamID, dbTeamMember.teamID,
dbTeamMember.userUid, dbTeamMember.userUid,
TeamMemberRole[dbTeamMember.role], TeamAccessRole[dbTeamMember.role],
), ),
).resolves.toBeDefined(); ).resolves.toBeDefined();
}); });
test('fires "team/<team_id>/member_updated" pubsub message with correct payload', async () => { test('fires "team/<team_id>/member_updated" pubsub message with correct payload', async () => {
const newRole = TeamMemberRole.EDITOR; const newRole = TeamAccessRole.EDITOR;
mockPrisma.teamMember.count.mockResolvedValue(2); mockPrisma.teamMember.count.mockResolvedValue(2);
mockPrisma.teamMember.findUnique.mockResolvedValue(dbTeamMember); mockPrisma.teamMember.findUnique.mockResolvedValue(dbTeamMember);
@ -508,7 +508,7 @@ describe('updateTeamMemberRole', () => {
role: newRole, role: newRole,
}); });
await teamService.updateTeamMemberRole( await teamService.updateTeamAccessRole(
dbTeamMember.teamID, dbTeamMember.teamID,
dbTeamMember.userUid, dbTeamMember.userUid,
newRole, newRole,
@ -582,13 +582,13 @@ describe('leaveTeam', () => {
mockPrisma.teamMember.count.mockResolvedValue(1); mockPrisma.teamMember.count.mockResolvedValue(1);
mockPrisma.teamMember.findUnique.mockResolvedValue({ mockPrisma.teamMember.findUnique.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}); });
// Prisma does not care // Prisma does not care
mockPrisma.teamMember.delete.mockResolvedValue({ mockPrisma.teamMember.delete.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}); });
return expect( return expect(
@ -600,11 +600,11 @@ describe('leaveTeam', () => {
mockPrisma.teamMember.count.mockResolvedValue(2); mockPrisma.teamMember.count.mockResolvedValue(2);
mockPrisma.teamMember.findUnique.mockResolvedValue({ mockPrisma.teamMember.findUnique.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}); });
mockPrisma.teamMember.delete.mockResolvedValue({ mockPrisma.teamMember.delete.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}); });
await expect( await expect(
@ -652,7 +652,7 @@ describe('createTeam', () => {
members: { members: {
create: { create: {
userUid: dbTeamMember.userUid, userUid: dbTeamMember.userUid,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}, },
}, },
}), }),
@ -905,7 +905,7 @@ describe('deleteUserFromAllTeams', () => {
mockPrisma.teamMember.count.mockResolvedValue(1); mockPrisma.teamMember.count.mockResolvedValue(1);
mockPrisma.teamMember.findUnique.mockResolvedValue({ mockPrisma.teamMember.findUnique.mockResolvedValue({
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}); });
const result = teamService.deleteUserFromAllTeams(dbTeamMember.userUid)(); const result = teamService.deleteUserFromAllTeams(dbTeamMember.userUid)();
@ -922,7 +922,7 @@ describe('deleteUserFromAllTeams', () => {
mockPrisma.teamMember.findMany.mockResolvedValue([ mockPrisma.teamMember.findMany.mockResolvedValue([
{ {
...dbTeamMember, ...dbTeamMember,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}, },
]); ]);
mockPrisma.teamMember.count.mockResolvedValue(2); mockPrisma.teamMember.count.mockResolvedValue(2);

View file

@ -1,5 +1,5 @@
import { Injectable, OnModuleInit } from '@nestjs/common'; import { Injectable, OnModuleInit } from '@nestjs/common';
import { TeamMember, TeamMemberRole, Team } from './team.model'; import { TeamMember, TeamAccessRole, Team } from './team.model';
import { PrismaService } from '../prisma/prisma.service'; import { PrismaService } from '../prisma/prisma.service';
import { TeamMember as DbTeamMember } from '@prisma/client'; import { TeamMember as DbTeamMember } from '@prisma/client';
import { UserService } from '../user/user.service'; import { UserService } from '../user/user.service';
@ -50,7 +50,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
async getCountOfUsersWithRoleInTeam( async getCountOfUsersWithRoleInTeam(
teamID: string, teamID: string,
role: TeamMemberRole, role: TeamAccessRole,
): Promise<number> { ): Promise<number> {
return await this.prisma.teamMember.count({ return await this.prisma.teamMember.count({
where: { where: {
@ -63,7 +63,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
async addMemberToTeamWithEmail( async addMemberToTeamWithEmail(
teamID: string, teamID: string,
email: string, email: string,
role: TeamMemberRole, role: TeamAccessRole,
): Promise<E.Left<string> | E.Right<TeamMember>> { ): Promise<E.Left<string> | E.Right<TeamMember>> {
const user = await this.userService.findUserByEmail(email); const user = await this.userService.findUserByEmail(email);
if (O.isNone(user)) return E.left(USER_NOT_FOUND); if (O.isNone(user)) return E.left(USER_NOT_FOUND);
@ -75,7 +75,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
async addMemberToTeam( async addMemberToTeam(
teamID: string, teamID: string,
uid: string, uid: string,
role: TeamMemberRole, role: TeamAccessRole,
): Promise<TeamMember> { ): Promise<TeamMember> {
const teamMember = await this.prisma.teamMember.create({ const teamMember = await this.prisma.teamMember.create({
data: { data: {
@ -92,7 +92,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
const member: TeamMember = { const member: TeamMember = {
membershipID: teamMember.id, membershipID: teamMember.id,
userUid: teamMember.userUid, userUid: teamMember.userUid,
role: TeamMemberRole[teamMember.role], role: TeamAccessRole[teamMember.role],
}; };
this.pubsub.publish(`team/${teamID}/member_added`, member); this.pubsub.publish(`team/${teamID}/member_added`, member);
@ -151,15 +151,15 @@ export class TeamService implements UserDataHandler, OnModuleInit {
} }
} }
async updateTeamMemberRole( async updateTeamAccessRole(
teamID: string, teamID: string,
userUid: string, userUid: string,
newRole: TeamMemberRole, newRole: TeamAccessRole,
): Promise<E.Left<string> | E.Right<TeamMember>> { ): Promise<E.Left<string> | E.Right<TeamMember>> {
const ownerCount = await this.prisma.teamMember.count({ const ownerCount = await this.prisma.teamMember.count({
where: { where: {
teamID, teamID,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}, },
}); });
@ -174,8 +174,8 @@ export class TeamService implements UserDataHandler, OnModuleInit {
if (!member) return E.left(TEAM_MEMBER_NOT_FOUND); if (!member) return E.left(TEAM_MEMBER_NOT_FOUND);
if ( if (
member.role === TeamMemberRole.OWNER && member.role === TeamAccessRole.OWNER &&
newRole != TeamMemberRole.OWNER && newRole != TeamAccessRole.OWNER &&
ownerCount === 1 ownerCount === 1
) { ) {
return E.left(TEAM_ONLY_ONE_OWNER); return E.left(TEAM_ONLY_ONE_OWNER);
@ -196,7 +196,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
const updatedMember: TeamMember = { const updatedMember: TeamMember = {
membershipID: result.id, membershipID: result.id,
userUid: result.userUid, userUid: result.userUid,
role: TeamMemberRole[result.role], role: TeamAccessRole[result.role],
}; };
this.pubsub.publish(`team/${teamID}/member_updated`, updatedMember); this.pubsub.publish(`team/${teamID}/member_updated`, updatedMember);
@ -211,14 +211,14 @@ export class TeamService implements UserDataHandler, OnModuleInit {
const ownerCount = await this.prisma.teamMember.count({ const ownerCount = await this.prisma.teamMember.count({
where: { where: {
teamID, teamID,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}, },
}); });
const member = await this.getTeamMember(teamID, userUid); const member = await this.getTeamMember(teamID, userUid);
if (!member) return E.left(TEAM_INVALID_ID_OR_USER); if (!member) return E.left(TEAM_INVALID_ID_OR_USER);
if (ownerCount === 1 && member.role === TeamMemberRole.OWNER) { if (ownerCount === 1 && member.role === TeamAccessRole.OWNER) {
return E.left(TEAM_ONLY_ONE_OWNER); return E.left(TEAM_ONLY_ONE_OWNER);
} }
@ -254,7 +254,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
members: { members: {
create: { create: {
userUid: creatorUid, userUid: creatorUid,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}, },
}, },
}, },
@ -368,7 +368,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
return <TeamMember>{ return <TeamMember>{
membershipID: teamMember.id, membershipID: teamMember.id,
userUid: userUid, userUid: userUid,
role: TeamMemberRole[teamMember.role], role: TeamAccessRole[teamMember.role],
}; };
} catch (e) { } catch (e) {
return null; return null;
@ -391,7 +391,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
async getRoleOfUserInTeam( async getRoleOfUserInTeam(
teamID: string, teamID: string,
userUid: string, userUid: string,
): Promise<TeamMemberRole | null> { ): Promise<TeamAccessRole | null> {
const teamMember = await this.getTeamMember(teamID, userUid); const teamMember = await this.getTeamMember(teamID, userUid);
return teamMember ? teamMember.role : null; return teamMember ? teamMember.role : null;
} }
@ -402,7 +402,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
const userOwnedTeams = await this.prisma.teamMember.findMany({ const userOwnedTeams = await this.prisma.teamMember.findMany({
where: { where: {
userUid: uid, userUid: uid,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}, },
select: { select: {
teamID: true, teamID: true,
@ -413,7 +413,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
const ownerCount = await this.prisma.teamMember.count({ const ownerCount = await this.prisma.teamMember.count({
where: { where: {
teamID: userOwnedTeam.teamID, teamID: userOwnedTeam.teamID,
role: TeamMemberRole.OWNER, role: TeamAccessRole.OWNER,
}, },
}); });
@ -460,7 +460,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
<TeamMember>{ <TeamMember>{
membershipID: entry.id, membershipID: entry.id,
userUid: entry.userUid, userUid: entry.userUid,
role: TeamMemberRole[entry.role], role: TeamAccessRole[entry.role],
}, },
); );
@ -513,7 +513,7 @@ export class TeamService implements UserDataHandler, OnModuleInit {
<TeamMember>{ <TeamMember>{
membershipID: entry.id, membershipID: entry.id,
userUid: entry.userUid, userUid: entry.userUid,
role: TeamMemberRole[entry.role], role: TeamAccessRole[entry.role],
}, },
); );

View file

@ -21,7 +21,7 @@ import { UserDataHandler } from './user.data.handler';
import { User as DbUser } from '@prisma/client'; import { User as DbUser } from '@prisma/client';
import { OffsetPaginationArgs } from 'src/types/input-types.args'; import { OffsetPaginationArgs } from 'src/types/input-types.args';
import { GetUserWorkspacesResponse } from 'src/infra-token/request-response.dto'; import { GetUserWorkspacesResponse } from 'src/infra-token/request-response.dto';
import { TeamMemberRole } from 'src/team/team.model'; import { TeamAccessRole } from 'src/team/team.model';
@Injectable() @Injectable()
export class UserService { export class UserService {
@ -626,13 +626,13 @@ export class UserService {
const workspaces: GetUserWorkspacesResponse[] = []; const workspaces: GetUserWorkspacesResponse[] = [];
team.forEach((t) => { team.forEach((t) => {
const ownerCount = t.members.filter( const ownerCount = t.members.filter(
(m) => m.role === TeamMemberRole.OWNER, (m) => m.role === TeamAccessRole.OWNER,
).length; ).length;
const editorCount = t.members.filter( const editorCount = t.members.filter(
(m) => m.role === TeamMemberRole.EDITOR, (m) => m.role === TeamAccessRole.EDITOR,
).length; ).length;
const viewerCount = t.members.filter( const viewerCount = t.members.filter(
(m) => m.role === TeamMemberRole.VIEWER, (m) => m.role === TeamAccessRole.VIEWER,
).length; ).length;
const memberCount = t.members.length; const memberCount = t.members.length;

View file

@ -16,7 +16,7 @@ import {
ENV_NOT_SUPPORT_AUTH_PROVIDERS, ENV_NOT_SUPPORT_AUTH_PROVIDERS,
JSON_INVALID, JSON_INVALID,
} from './errors'; } from './errors';
import { TeamMemberRole } from './team/team.model'; import { TeamAccessRole } from './team/team.model';
import { RESTError } from './types/RESTError'; import { RESTError } from './types/RESTError';
import * as crypto from 'crypto'; import * as crypto from 'crypto';
@ -76,7 +76,7 @@ export const getAnnotatedRequiredRoles = (
context: ExecutionContext, context: ExecutionContext,
) => ) =>
pipe( pipe(
reflector.get<TeamMemberRole[]>('requiresTeamRole', context.getHandler()), reflector.get<TeamAccessRole[]>('requiresTeamRole', context.getHandler()),
O.fromNullable, O.fromNullable,
); );

View file

@ -325,7 +325,7 @@ import * as TE from "fp-ts/TaskEither"
import { pipe } from "fp-ts/function" import { pipe } from "fp-ts/function"
import { computed, onMounted, reactive, ref, watch } from "vue" import { computed, onMounted, reactive, ref, watch } from "vue"
import { useToast } from "~/composables/toast" import { useToast } from "~/composables/toast"
import { GetMyTeamsQuery, TeamMemberRole } from "~/helpers/backend/graphql" import { GetMyTeamsQuery, TeamAccessRole } from "~/helpers/backend/graphql"
import { deleteTeam as backendDeleteTeam } from "~/helpers/backend/mutations/Team" import { deleteTeam as backendDeleteTeam } from "~/helpers/backend/mutations/Team"
import { platform } from "~/platform" import { platform } from "~/platform"
import { import {
@ -600,7 +600,7 @@ defineActionHandler(
) )
defineActionHandler("modals.team.delete", ({ teamId }) => { defineActionHandler("modals.team.delete", ({ teamId }) => {
if (selectedTeam.value?.myRole !== TeamMemberRole.Owner) return noPermission() if (selectedTeam.value?.myRole !== TeamAccessRole.Owner) return noPermission()
teamID.value = teamId teamID.value = teamId
confirmRemove.value = true confirmRemove.value = true
}) })

View file

@ -101,9 +101,9 @@
:active="member.role === 'OWNER'" :active="member.role === 'OWNER'"
@click=" @click="
() => { () => {
updateMemberRole( updateAccessRole(
member.userID, member.userID,
TeamMemberRole.Owner TeamAccessRole.Owner
) )
hide() hide()
} }
@ -117,9 +117,9 @@
:active="member.role === 'EDITOR'" :active="member.role === 'EDITOR'"
@click=" @click="
() => { () => {
updateMemberRole( updateAccessRole(
member.userID, member.userID,
TeamMemberRole.Editor TeamAccessRole.Editor
) )
hide() hide()
} }
@ -133,9 +133,9 @@
:active="member.role === 'VIEWER'" :active="member.role === 'VIEWER'"
@click=" @click="
() => { () => {
updateMemberRole( updateAccessRole(
member.userID, member.userID,
TeamMemberRole.Viewer TeamAccessRole.Viewer
) )
hide() hide()
} }
@ -196,13 +196,13 @@ import {
GetTeamQueryVariables, GetTeamQueryVariables,
TeamMemberAddedDocument, TeamMemberAddedDocument,
TeamMemberRemovedDocument, TeamMemberRemovedDocument,
TeamMemberRole, TeamAccessRole,
TeamMemberUpdatedDocument, TeamMemberUpdatedDocument,
} from "~/helpers/backend/graphql" } from "~/helpers/backend/graphql"
import { import {
removeTeamMember, removeTeamMember,
renameTeam, renameTeam,
updateTeamMemberRole, updateTeamAccessRole,
} from "~/helpers/backend/mutations/Team" } from "~/helpers/backend/mutations/Team"
import { TeamNameCodec } from "~/helpers/backend/types/TeamName" import { TeamNameCodec } from "~/helpers/backend/types/TeamName"
@ -307,7 +307,7 @@ watch(
const roleUpdates = ref< const roleUpdates = ref<
{ {
userID: string userID: string
role: TeamMemberRole role: TeamAccessRole
}[] }[]
>([]) >([])
@ -330,7 +330,7 @@ watch(
} }
) )
const updateMemberRole = (userID: string, role: TeamMemberRole) => { const updateAccessRole = (userID: string, role: TeamAccessRole) => {
const updateIndex = roleUpdates.value.findIndex( const updateIndex = roleUpdates.value.findIndex(
(item) => item.userID === userID (item) => item.userID === userID
) )
@ -404,14 +404,14 @@ const saveTeam = async () => {
toast.error(`${t("error.something_went_wrong")}`) toast.error(`${t("error.something_went_wrong")}`)
} else { } else {
roleUpdates.value.forEach(async (update) => { roleUpdates.value.forEach(async (update) => {
const updateMemberRoleResult = await updateTeamMemberRole( const updateAccessRoleResult = await updateTeamAccessRole(
update.userID, update.userID,
props.editingTeamID, props.editingTeamID,
update.role update.role
)() )()
if (E.isLeft(updateMemberRoleResult)) { if (E.isLeft(updateAccessRoleResult)) {
toast.error(`${t("error.something_went_wrong")}`) toast.error(`${t("error.something_went_wrong")}`)
console.error(updateMemberRoleResult.left.error) console.error(updateAccessRoleResult.left.error)
} }
}) })
} }

View file

@ -232,7 +232,7 @@
:active="invitee.value === 'OWNER'" :active="invitee.value === 'OWNER'"
@click=" @click="
() => { () => {
updateNewInviteeRole(index, TeamMemberRole.Owner) updateNewInviteeRole(index, TeamAccessRole.Owner)
hide() hide()
} }
" "
@ -245,7 +245,7 @@
:active="invitee.value === 'EDITOR'" :active="invitee.value === 'EDITOR'"
@click=" @click="
() => { () => {
updateNewInviteeRole(index, TeamMemberRole.Editor) updateNewInviteeRole(index, TeamAccessRole.Editor)
hide() hide()
} }
" "
@ -258,7 +258,7 @@
:active="invitee.value === 'VIEWER'" :active="invitee.value === 'VIEWER'"
@click=" @click="
() => { () => {
updateNewInviteeRole(index, TeamMemberRole.Viewer) updateNewInviteeRole(index, TeamAccessRole.Viewer)
hide() hide()
} }
" "
@ -360,7 +360,7 @@
newInvites = [ newInvites = [
{ {
key: '', key: '',
value: TeamMemberRole.Viewer, value: TeamAccessRole.Viewer,
}, },
] ]
} }
@ -404,7 +404,7 @@ import {
GetPendingInvitesQueryVariables, GetPendingInvitesQueryVariables,
TeamInvitationAddedDocument, TeamInvitationAddedDocument,
TeamInvitationRemovedDocument, TeamInvitationRemovedDocument,
TeamMemberRole, TeamAccessRole,
} from "../../helpers/backend/graphql" } from "../../helpers/backend/graphql"
import { import {
createTeamInvitation, createTeamInvitation,
@ -558,21 +558,21 @@ const removeInvitee = async (id: string, index: number) => {
isLoadingIndex.value = null isLoadingIndex.value = null
} }
const newInvites = ref<Array<{ key: string; value: TeamMemberRole }>>([ const newInvites = ref<Array<{ key: string; value: TeamAccessRole }>>([
{ {
key: "", key: "",
value: TeamMemberRole.Viewer, value: TeamAccessRole.Viewer,
}, },
]) ])
const addNewInvitee = () => { const addNewInvitee = () => {
newInvites.value.push({ newInvites.value.push({
key: "", key: "",
value: TeamMemberRole.Viewer, value: TeamAccessRole.Viewer,
}) })
} }
const updateNewInviteeRole = (index: number, role: TeamMemberRole) => { const updateNewInviteeRole = (index: number, role: TeamAccessRole) => {
newInvites.value[index].value = role newInvites.value[index].value = role
} }
@ -623,7 +623,7 @@ const sendInvites = async () => {
const validationResult = pipe( const validationResult = pipe(
newInvites.value, newInvites.value,
O.fromPredicate( O.fromPredicate(
(invites): invites is Array<{ key: Email; value: TeamMemberRole }> => (invites): invites is Array<{ key: Email; value: TeamAccessRole }> =>
pipe( pipe(
invites, invites,
A.every((invitee) => EmailCodec.is(invitee.key)) A.every((invitee) => EmailCodec.is(invitee.key))
@ -697,7 +697,7 @@ const hideModal = () => {
newInvites.value = [ newInvites.value = [
{ {
key: "", key: "",
value: TeamMemberRole.Viewer, value: TeamAccessRole.Viewer,
}, },
] ]
emit("hide-modal") emit("hide-modal")

View file

@ -1,4 +1,4 @@
mutation CreateTeamInvitation($inviteeEmail: String!, $inviteeRole: TeamMemberRole!, $teamID: ID!) { mutation CreateTeamInvitation($inviteeEmail: String!, $inviteeRole: TeamAccessRole!, $teamID: ID!) {
createTeamInvitation(inviteeRole: $inviteeRole, inviteeEmail: $inviteeEmail, teamID: $teamID) { createTeamInvitation(inviteeRole: $inviteeRole, inviteeEmail: $inviteeEmail, teamID: $teamID) {
id id
teamID teamID

View file

@ -1,9 +1,9 @@
mutation UpdateTeamMemberRole( mutation UpdateTeamAccessRole(
$newRole: TeamMemberRole!, $newRole: TeamAccessRole!,
$userUid: ID!, $userUid: ID!,
$teamID: ID! $teamID: ID!
) { ) {
updateTeamMemberRole( updateTeamAccessRole(
newRole: $newRole newRole: $newRole
userUid: $userUid userUid: $userUid
teamID: $teamID teamID: $teamID

View file

@ -15,10 +15,10 @@ import {
RenameTeamDocument, RenameTeamDocument,
RenameTeamMutation, RenameTeamMutation,
RenameTeamMutationVariables, RenameTeamMutationVariables,
TeamMemberRole, TeamAccessRole,
UpdateTeamMemberRoleDocument, UpdateTeamAccessRoleDocument,
UpdateTeamMemberRoleMutation, UpdateTeamAccessRoleMutation,
UpdateTeamMemberRoleMutationVariables, UpdateTeamAccessRoleMutationVariables,
} from "../graphql" } from "../graphql"
import { platform } from "~/platform" import { platform } from "~/platform"
@ -40,7 +40,7 @@ type RenameTeamErrors =
| "team/invalid_id" | "team/invalid_id"
| "team/not_required_role" | "team/not_required_role"
type UpdateTeamMemberRoleErrors = type UpdateTeamAccessRoleErrors =
| "ea/not_invite_or_admin" | "ea/not_invite_or_admin"
| "team/invalid_id" | "team/invalid_id"
| "team/not_required_role" | "team/not_required_role"
@ -96,22 +96,22 @@ export const renameTeam = (teamID: string, newName: TeamName) =>
TE.map(({ renameTeam }) => renameTeam) TE.map(({ renameTeam }) => renameTeam)
) )
export const updateTeamMemberRole = ( export const updateTeamAccessRole = (
userUid: string, userUid: string,
teamID: string, teamID: string,
newRole: TeamMemberRole newRole: TeamAccessRole
) => ) =>
pipe( pipe(
runMutation< runMutation<
UpdateTeamMemberRoleMutation, UpdateTeamAccessRoleMutation,
UpdateTeamMemberRoleMutationVariables, UpdateTeamAccessRoleMutationVariables,
UpdateTeamMemberRoleErrors UpdateTeamAccessRoleErrors
>(UpdateTeamMemberRoleDocument, { >(UpdateTeamAccessRoleDocument, {
newRole, newRole,
userUid, userUid,
teamID, teamID,
}), }),
TE.map(({ updateTeamMemberRole }) => updateTeamMemberRole) TE.map(({ updateTeamAccessRole }) => updateTeamAccessRole)
) )
export const removeTeamMember = (userUid: string, teamID: string) => export const removeTeamMember = (userUid: string, teamID: string) =>

View file

@ -6,7 +6,7 @@ import {
RevokeTeamInvitationDocument, RevokeTeamInvitationDocument,
RevokeTeamInvitationMutation, RevokeTeamInvitationMutation,
RevokeTeamInvitationMutationVariables, RevokeTeamInvitationMutationVariables,
TeamMemberRole, TeamAccessRole,
} from "../graphql" } from "../graphql"
import { Email } from "../types/Email" import { Email } from "../types/Email"
@ -29,7 +29,7 @@ type AcceptTeamInvitationErrors =
export const createTeamInvitation = ( export const createTeamInvitation = (
inviteeEmail: Email, inviteeEmail: Email,
inviteeRole: TeamMemberRole, inviteeRole: TeamAccessRole,
teamID: string teamID: string
) => { ) => {
return pipe( return pipe(

View file

@ -9,7 +9,7 @@ import {
GetInviteDetailsQueryVariables, GetInviteDetailsQueryVariables,
GetMyTeamsQuery, GetMyTeamsQuery,
GetUserShortcodesQuery, GetUserShortcodesQuery,
TeamMemberRole, TeamAccessRole,
} from "~/helpers/backend/graphql" } from "~/helpers/backend/graphql"
import { useGQLQuery } from "~/composables/graphql" import { useGQLQuery } from "~/composables/graphql"
@ -51,7 +51,7 @@ export type BackendPlatformDef = {
createTeamInvitation: <CreateTeamInvitationErrors extends string>( createTeamInvitation: <CreateTeamInvitationErrors extends string>(
inviteeEmail: Email, inviteeEmail: Email,
inviteeRole: TeamMemberRole, inviteeRole: TeamAccessRole,
teamID: string teamID: string
) => TE.TaskEither< ) => TE.TaskEither<
GQLError<CreateTeamInvitationErrors>, GQLError<CreateTeamInvitationErrors>,

View file

@ -28,7 +28,7 @@ import {
GetUserShortcodesDocument, GetUserShortcodesDocument,
GetUserShortcodesQuery, GetUserShortcodesQuery,
GetUserShortcodesQueryVariables, GetUserShortcodesQueryVariables,
TeamMemberRole, TeamAccessRole,
} from "../../helpers/backend/graphql" } from "../../helpers/backend/graphql"
const getInviteDetails = <GetInviteDetailsError extends string>( const getInviteDetails = <GetInviteDetailsError extends string>(
@ -81,7 +81,7 @@ export const createTeam = <CreateTeamErrors extends string>(name: TeamName) => {
export const createTeamInvitation = <CreateTeamInvitationErrors extends string>( export const createTeamInvitation = <CreateTeamInvitationErrors extends string>(
inviteeEmail: Email, inviteeEmail: Email,
inviteeRole: TeamMemberRole, inviteeRole: TeamAccessRole,
teamID: string teamID: string
) => { ) => {
return runMutation< return runMutation<

View file

@ -5,7 +5,7 @@ import { useStreamStatic } from "~/composables/stream"
import TeamListAdapter from "~/helpers/teams/TeamListAdapter" import TeamListAdapter from "~/helpers/teams/TeamListAdapter"
import { platform } from "~/platform" import { platform } from "~/platform"
import { min } from "lodash-es" import { min } from "lodash-es"
import { TeamMemberRole } from "~/helpers/backend/graphql" import { TeamAccessRole } from "~/helpers/backend/graphql"
/** /**
* Defines a workspace and its information * Defines a workspace and its information
@ -19,7 +19,7 @@ export type TeamWorkspace = {
type: "team" type: "team"
teamID: string teamID: string
teamName: string teamName: string
role: TeamMemberRole | null | undefined role: TeamAccessRole | null | undefined
} }
export type Workspace = PersonalWorkspace | TeamWorkspace export type Workspace = PersonalWorkspace | TeamWorkspace

View file

@ -72,7 +72,7 @@
:active="member.value === 'OWNER'" :active="member.value === 'OWNER'"
@click=" @click="
() => { () => {
updateNewMemberRole(index, TeamMemberRole.Owner); updateNewAccessRole(index, TeamAccessRole.Owner);
hide(); hide();
} }
" "
@ -85,7 +85,7 @@
:active="member.value === 'EDITOR'" :active="member.value === 'EDITOR'"
@click=" @click="
() => { () => {
updateNewMemberRole(index, TeamMemberRole.Editor); updateNewAccessRole(index, TeamAccessRole.Editor);
hide(); hide();
} }
" "
@ -98,7 +98,7 @@
:active="member.value === 'VIEWER'" :active="member.value === 'VIEWER'"
@click=" @click="
() => { () => {
updateNewMemberRole(index, TeamMemberRole.Viewer); updateNewAccessRole(index, TeamAccessRole.Viewer);
hide(); hide();
} }
" "
@ -222,7 +222,7 @@ import IconTrash from '~icons/lucide/trash';
import { import {
AddUserToTeamByAdminDocument, AddUserToTeamByAdminDocument,
MetricsDocument, MetricsDocument,
TeamMemberRole, TeamAccessRole,
UsersListDocument, UsersListDocument,
} from '../../helpers/backend/graphql'; } from '../../helpers/backend/graphql';
@ -258,21 +258,21 @@ const { list: usersList } = usePagedQuery(
const allUsersEmail = computed(() => usersList.value.map((user) => user.email)); const allUsersEmail = computed(() => usersList.value.map((user) => user.email));
const newMembersList = ref<Array<{ key: string; value: TeamMemberRole }>>([ const newMembersList = ref<Array<{ key: string; value: TeamAccessRole }>>([
{ {
key: '', key: '',
value: TeamMemberRole.Viewer, value: TeamAccessRole.Viewer,
}, },
]); ]);
const addNewMember = () => { const addNewMember = () => {
newMembersList.value.push({ newMembersList.value.push({
key: '', key: '',
value: TeamMemberRole.Viewer, value: TeamAccessRole.Viewer,
}); });
}; };
const updateNewMemberRole = (index: number, role: TeamMemberRole) => { const updateNewAccessRole = (index: number, role: TeamAccessRole) => {
newMembersList.value[index].value = role; newMembersList.value[index].value = role;
}; };
@ -291,7 +291,7 @@ const addUserasTeamMember = async () => {
O.fromPredicate( O.fromPredicate(
( (
memberInvites memberInvites
): memberInvites is Array<{ key: Email; value: TeamMemberRole }> => ): memberInvites is Array<{ key: Email; value: TeamAccessRole }> =>
pipe( pipe(
memberInvites, memberInvites,
A.every((member) => EmailCodec.is(member.key)) A.every((member) => EmailCodec.is(member.key))
@ -319,7 +319,7 @@ const hideModal = () => {
newMembersList.value = [ newMembersList.value = [
{ {
key: '', key: '',
value: TeamMemberRole.Viewer, value: TeamAccessRole.Viewer,
}, },
]; ];
emit('hide-modal'); emit('hide-modal');
@ -328,7 +328,7 @@ const hideModal = () => {
const addUserToTeamMutation = useMutation(AddUserToTeamByAdminDocument); const addUserToTeamMutation = useMutation(AddUserToTeamByAdminDocument);
const addUserToTeam = async ( const addUserToTeam = async (
email: string, email: string,
userRole: TeamMemberRole, userRole: TeamAccessRole,
teamID: string teamID: string
) => { ) => {
const variables = { userEmail: email, role: userRole, teamID: teamID }; const variables = { userEmail: email, role: userRole, teamID: teamID };

View file

@ -76,7 +76,7 @@
:active="member.role === 'OWNER'" :active="member.role === 'OWNER'"
@click=" @click="
() => { () => {
updateMemberRole(member.userID, TeamMemberRole.Owner); updateAccessRole(member.userID, TeamAccessRole.Owner);
hide(); hide();
} }
" "
@ -89,9 +89,9 @@
:active="member.role === 'EDITOR'" :active="member.role === 'EDITOR'"
@click=" @click="
() => { () => {
updateMemberRole( updateAccessRole(
member.userID, member.userID,
TeamMemberRole.Editor TeamAccessRole.Editor
); );
hide(); hide();
} }
@ -105,9 +105,9 @@
:active="member.role === 'VIEWER'" :active="member.role === 'VIEWER'"
@click=" @click="
() => { () => {
updateMemberRole( updateAccessRole(
member.userID, member.userID,
TeamMemberRole.Viewer TeamAccessRole.Viewer
); );
hide(); hide();
} }
@ -179,7 +179,7 @@ import {
RemoveUserFromTeamByAdminDocument, RemoveUserFromTeamByAdminDocument,
TeamInfoDocument, TeamInfoDocument,
TeamInfoQuery, TeamInfoQuery,
TeamMemberRole, TeamAccessRole,
} from '../../helpers/backend/graphql'; } from '../../helpers/backend/graphql';
const t = useI18n(); const t = useI18n();
@ -223,39 +223,39 @@ const updateMembers = async () => {
const tippyActions = ref<any | null>(null); const tippyActions = ref<any | null>(null);
// Roles of the members in the team // Roles of the members in the team
const currentMemberRoles = ref< const currentAccessRoles = ref<
{ {
userID: string; userID: string;
role: TeamMemberRole; role: TeamAccessRole;
}[] }[]
>([]); >([]);
// Roles of the members in the team after the updates but before saving // Roles of the members in the team after the updates but before saving
const updatedMemberRoles = ref< const updatedAccessRoles = ref<
{ {
userID: string; userID: string;
role: TeamMemberRole; role: TeamAccessRole;
}[] }[]
>(cloneDeep(currentMemberRoles.value)); >(cloneDeep(currentAccessRoles.value));
// Check if the roles of the members have been updated // Check if the roles of the members have been updated
const areRolesUpdated = computed(() => const areRolesUpdated = computed(() =>
currentMemberRoles.value && updatedMemberRoles.value currentAccessRoles.value && updatedAccessRoles.value
? !isEqual(currentMemberRoles.value, updatedMemberRoles.value) ? !isEqual(currentAccessRoles.value, updatedAccessRoles.value)
: false : false
); );
// Update the role of the member selected in the UI // Update the role of the member selected in the UI
const updateMemberRole = (userID: string, role: TeamMemberRole) => { const updateAccessRole = (userID: string, role: TeamAccessRole) => {
const updateIndex = updatedMemberRoles.value.findIndex( const updateIndex = updatedAccessRoles.value.findIndex(
(item) => item.userID === userID (item) => item.userID === userID
); );
if (updateIndex !== -1) { if (updateIndex !== -1) {
// Role Update exists // Role Update exists
updatedMemberRoles.value[updateIndex].role = role; updatedAccessRoles.value[updateIndex].role = role;
} else { } else {
// Role Update does not exist // Role Update does not exist
updatedMemberRoles.value.push({ updatedAccessRoles.value.push({
userID, userID,
role, role,
}); });
@ -266,7 +266,7 @@ const updateMemberRole = (userID: string, role: TeamMemberRole) => {
const membersList = computed(() => { const membersList = computed(() => {
if (!team.value) return []; if (!team.value) return [];
const members = (team.value.teamMembers ?? []).map((member) => { const members = (team.value.teamMembers ?? []).map((member) => {
const updatedRole = updatedMemberRoles.value.find( const updatedRole = updatedAccessRoles.value.find(
(update) => update.userID === member.user.uid (update) => update.userID === member.user.uid
); );
@ -287,7 +287,7 @@ const changeUserRoleInTeamMutation = useMutation(
const changeUserRoleInTeam = ( const changeUserRoleInTeam = (
userUID: string, userUID: string,
teamID: string, teamID: string,
newRole: TeamMemberRole newRole: TeamAccessRole
) => { ) => {
return changeUserRoleInTeamMutation.executeMutation({ return changeUserRoleInTeamMutation.executeMutation({
userUID, userUID,
@ -303,7 +303,7 @@ const saveUpdatedTeam = async () => {
isLoading.value = true; isLoading.value = true;
const isOwnerPresent = membersList.value.some( const isOwnerPresent = membersList.value.some(
(member) => member.role === TeamMemberRole.Owner (member) => member.role === TeamAccessRole.Owner
); );
if (!isOwnerPresent) { if (!isOwnerPresent) {
@ -312,20 +312,20 @@ const saveUpdatedTeam = async () => {
return; return;
} }
updatedMemberRoles.value.forEach(async (update) => { updatedAccessRoles.value.forEach(async (update) => {
if (!team.value) return; if (!team.value) return;
const updateMemberRoleResult = await changeUserRoleInTeam( const updateAccessRoleResult = await changeUserRoleInTeam(
update.userID, update.userID,
team.value.id, team.value.id,
update.role update.role
); );
if (updateMemberRoleResult.error) { if (updateAccessRoleResult.error) {
toast.error(t('state.role_update_failed')); toast.error(t('state.role_update_failed'));
} else { } else {
toast.success(t('state.role_update_success')); toast.success(t('state.role_update_success'));
currentMemberRoles.value = updatedMemberRoles.value; currentAccessRoles.value = updatedAccessRoles.value;
updatedMemberRoles.value = cloneDeep(currentMemberRoles.value); updatedAccessRoles.value = cloneDeep(currentAccessRoles.value);
} }
isLoading.value = false; isLoading.value = false;
}); });

View file

@ -1,6 +1,6 @@
mutation AddUserToTeamByAdmin( mutation AddUserToTeamByAdmin(
$userEmail: String! $userEmail: String!
$role: TeamMemberRole! $role: TeamAccessRole!
$teamID: ID! $teamID: ID!
) { ) {
addUserToTeamByAdmin(role: $role, userEmail: $userEmail, teamID: $teamID) { addUserToTeamByAdmin(role: $role, userEmail: $userEmail, teamID: $teamID) {

View file

@ -1,7 +1,7 @@
mutation ChangeUserRoleInTeamByAdmin( mutation ChangeUserRoleInTeamByAdmin(
$userUID: ID! $userUID: ID!
$teamID: ID! $teamID: ID!
$newRole: TeamMemberRole! $newRole: TeamAccessRole!
) { ) {
changeUserRoleInTeamByAdmin( changeUserRoleInTeamByAdmin(
userUID: $userUID userUID: $userUID

View file

@ -1,4 +1,4 @@
mutation CreateTeamInvitation($inviteeEmail: String!, $inviteeRole: TeamMemberRole!, $teamID: ID!) { mutation CreateTeamInvitation($inviteeEmail: String!, $inviteeRole: TeamAccessRole!, $teamID: ID!) {
createTeamInvitation(inviteeRole: $inviteeRole, inviteeEmail: $inviteeEmail, teamID: $teamID) { createTeamInvitation(inviteeRole: $inviteeRole, inviteeEmail: $inviteeEmail, teamID: $teamID) {
id id
teamID teamID