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:
parent
609aaa4070
commit
f26d32c4e4
43 changed files with 329 additions and 327 deletions
|
|
@ -0,0 +1,2 @@
|
||||||
|
-- Alter the enum type "TeamMemberRole" to "TeamAccessRole"
|
||||||
|
ALTER TYPE "TeamMemberRole" RENAME TO "TeamAccessRole";
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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({
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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({
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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({
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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],
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) =>
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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>,
|
||||||
|
|
|
||||||
|
|
@ -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<
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 };
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue