Skip to content

Commit

Permalink
Separate graphql and typeORM logics through DTO and entity
Browse files Browse the repository at this point in the history
  • Loading branch information
ijreilly committed Feb 3, 2025
1 parent dc8a057 commit ce4e12d
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 48 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { Field, HideField, ObjectType } from '@nestjs/graphql';

import {
Column,
CreateDateColumn,
PrimaryGeneratedColumn,
Relation,
UpdateDateColumn,
} from 'typeorm';

import { WorkspaceMember } from 'src/engine/core-modules/user/dtos/workspace-member.dto';
import { UserWorkspaceRoleEntity } from 'src/engine/metadata-modules/role/user-workspace-role.entity';

@ObjectType()
export class RoleDTO {
@Field({ nullable: false })
@PrimaryGeneratedColumn('uuid')
id: string;

@Field({ nullable: false })
@Column({ nullable: false })
label: string;

@Column({ nullable: false, default: false })
canUpdateAllSettings: boolean;

@Field({ nullable: false })
@Column({ nullable: true, type: 'text' })
description: string;

@Column({ nullable: false, type: 'uuid' })
workspaceId: string;

@CreateDateColumn({ type: 'timestamptz' })
createdAt: Date;

@UpdateDateColumn({ type: 'timestamptz' })
updatedAt: Date;

@Field({ nullable: false })
@Column({ nullable: false, default: true })
isEditable: boolean;

@HideField()
userWorkspaceRoles: Relation<UserWorkspaceRoleEntity[]>;

@Field(() => [WorkspaceMember], { nullable: true })
workspaceMembers?: WorkspaceMember[];
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Field, ObjectType } from '@nestjs/graphql';
import { Field } from '@nestjs/graphql';

import {
Column,
Expand All @@ -10,10 +10,8 @@ import {
UpdateDateColumn,
} from 'typeorm';

import { WorkspaceMember } from 'src/engine/core-modules/user/dtos/workspace-member.dto';
import { UserWorkspaceRoleEntity } from 'src/engine/metadata-modules/role/user-workspace-role.entity';

@ObjectType()
@Entity('role')
export class RoleEntity {
@Field({ nullable: false })
Expand Down Expand Up @@ -49,7 +47,4 @@ export class RoleEntity {
(userWorkspaceRole: UserWorkspaceRoleEntity) => userWorkspaceRole.role,
)
userWorkspaceRoles: Relation<UserWorkspaceRoleEntity[]>;

@Field(() => [WorkspaceMember], { nullable: true })
workspaceMembers?: WorkspaceMember[];
}
Original file line number Diff line number Diff line change
@@ -1,52 +1,18 @@
import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
import { InjectRepository } from '@nestjs/typeorm';

import { In, Repository } from 'typeorm';

import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { WorkspaceMember } from 'src/engine/core-modules/user/dtos/workspace-member.dto';
import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity';
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import { RoleDTO } from 'src/engine/metadata-modules/role/dtos/role.dto';
import { RoleService } from 'src/engine/metadata-modules/role/role.service';
import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';

@Resolver(() => RoleEntity)
@Resolver(() => RoleDTO)
export class RoleResolver {
constructor(
@InjectRepository(UserWorkspace, 'core')
private readonly userWorkspaceRepository: Repository<UserWorkspace>,
private readonly twentyORMGlobalManager: TwentyORMGlobalManager,
) {}
constructor(private readonly roleService: RoleService) {}

@ResolveField('workspaceMembers', () => [WorkspaceMember])
async getWorkspaceMembersAssignedToRole(
@Parent() role: RoleEntity,
@Parent() role: RoleDTO,
): Promise<WorkspaceMemberWorkspaceEntity[]> {
const userIds = await this.userWorkspaceRepository
.find({
where: {
id: In(
role.userWorkspaceRoles.map(
(userWorkspaceRole) => userWorkspaceRole.userWorkspaceId,
),
),
},
})
.then((userWorkspaces) =>
userWorkspaces.map((userWorkspace) => userWorkspace.userId),
);

const workspaceMemberRepository =
await this.twentyORMGlobalManager.getRepositoryForWorkspace<WorkspaceMemberWorkspaceEntity>(
role.workspaceId,
'workspaceMember',
);

const workspaceMembers = await workspaceMemberRepository.find({
where: {
userId: In(userIds),
},
});

return workspaceMembers;
return this.roleService.getWorkspaceMembersAssignedToRole(role);
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
import { InjectRepository } from '@nestjs/typeorm';

import { Repository } from 'typeorm';
import { isDefined } from 'twenty-shared';
import { In, Repository } from 'typeorm';

import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { ADMIN_ROLE_LABEL } from 'src/engine/metadata-modules/permissions/constants/admin-role-label.constants';
import {
PermissionsException,
PermissionsExceptionCode,
} from 'src/engine/metadata-modules/permissions/permissions.exception';
import { RoleDTO } from 'src/engine/metadata-modules/role/dtos/role.dto';
import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity';
import { UserWorkspaceRoleEntity } from 'src/engine/metadata-modules/role/user-workspace-role.entity';
import { isDefined } from 'src/utils/is-defined';
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';

export class RoleService {
constructor(
Expand All @@ -20,6 +23,7 @@ export class RoleService {
private readonly userWorkspaceRoleRepository: Repository<UserWorkspaceRoleEntity>,
@InjectRepository(UserWorkspace, 'core')
private readonly userWorkspaceRepository: Repository<UserWorkspace>,
private readonly twentyORMGlobalManager: TwentyORMGlobalManager,
) {}

public async getWorkspaceRoles(workspaceId: string): Promise<RoleEntity[]> {
Expand Down Expand Up @@ -109,4 +113,36 @@ export class RoleService {
},
});
}

public async getWorkspaceMembersAssignedToRole(
role: RoleDTO,
): Promise<WorkspaceMemberWorkspaceEntity[]> {
const userIds = await this.userWorkspaceRepository
.find({
where: {
id: In(
role.userWorkspaceRoles.map(
(userWorkspaceRole) => userWorkspaceRole.userWorkspaceId,
),
),
},
})
.then((userWorkspaces) =>
userWorkspaces.map((userWorkspace) => userWorkspace.userId),
);

const workspaceMemberRepository =
await this.twentyORMGlobalManager.getRepositoryForWorkspace<WorkspaceMemberWorkspaceEntity>(
role.workspaceId,
'workspaceMember',
);

const workspaceMembers = await workspaceMemberRepository.find({
where: {
userId: In(userIds),
},
});

return workspaceMembers;
}
}

0 comments on commit ce4e12d

Please sign in to comment.