diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index f9035aa2..63f8da27 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -54,6 +54,8 @@ model Users { idNot String @unique @db.VarChar(255) contact Contacts @relation(fields: [contact_uid], references: [uid], onDelete: Cascade) contact_uid String @unique @db.VarChar(255) + role Roles @relation(fields: [roles_uid], references: [uid]) + roles_uid String created_at DateTime? @default(now()) updated_at DateTime? @updatedAt office_membership Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) @@ -205,7 +207,7 @@ model Files { file_path String @unique @db.VarChar(255) file_name String @db.VarChar(255) mimetype String @db.VarChar(255) - size Int + size Int archived_at DateTime? key String? @db.VarChar(255) created_at DateTime? @default(now()) @@ -296,6 +298,55 @@ model DeedTypeHasDocumentTypes { @@map("deed_type_has_document_types") } +model Roles { + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + role_has_rules RolesHasRules[] + office_role_has_rules OfficesRolesHasRules[] + users Users[] + + @@map("roles") +} + +model Rules { + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + role_has_rules RolesHasRules? @relation(fields: [role_has_rules_uid], references: [uid]) + role_has_rules_uid String? + office_role_has_rules OfficesRolesHasRules? @relation(fields: [office_role_has_rules_uid], references: [uid]) + office_role_has_rules_uid String? + + @@map("rules") +} + +model RolesHasRules { + uid String @id @unique @default(uuid()) + role Roles @relation(fields: [role_uid], references: [uid], onDelete: Cascade) + role_uid String @db.VarChar(255) + rule_uid String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + rules Rules[] + + @@map("role_has_rules") +} + +model OfficesRolesHasRules { + uid String @id @unique @default(uuid()) + role Roles @relation(fields: [role_uid], references: [uid], onDelete: Cascade) + role_uid String @db.VarChar(255) + rule_uid String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + rules Rules[] + + @@map("office_role_has_rules") +} + enum ECivility { MALE FEMALE diff --git a/src/common/repositories/OfficeRoleHasRulesRepository.ts b/src/common/repositories/OfficeRoleHasRulesRepository.ts new file mode 100644 index 00000000..f36ccfd2 --- /dev/null +++ b/src/common/repositories/OfficeRoleHasRulesRepository.ts @@ -0,0 +1,42 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { OfficesRolesHasRules, Prisma } from "@prisma/client"; + +@Service() +export default class OfficeRoleHasRulesRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().officesRolesHasRules; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many relations between office roles and rules + */ + public async findMany(query: any): Promise { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Find one relation between an office role and rules + */ + public async findOneByUid(uid: string, query?: any): Promise { + const findOneArgs: Prisma.OfficesRolesHasRulesFindUniqueArgs = { + where: { + uid: uid, + }, + }; + if (query) { + findOneArgs.include = query; + } + const roleEntity = await this.model.findUnique(findOneArgs); + + return roleEntity; + } +} diff --git a/src/common/repositories/RolesHasRulesRepository.ts b/src/common/repositories/RolesHasRulesRepository.ts new file mode 100644 index 00000000..7a255dc5 --- /dev/null +++ b/src/common/repositories/RolesHasRulesRepository.ts @@ -0,0 +1,42 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { RolesHasRules, Prisma } from "@prisma/client"; + +@Service() +export default class RolesHasRulesRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().rolesHasRules; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many relations between basic roles and rules + */ + public async findMany(query: any): Promise { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Find one relation between an basic role and rules + */ + public async findOneByUid(uid: string, query?: any): Promise { + const findOneArgs: Prisma.RolesHasRulesFindUniqueArgs = { + where: { + uid: uid, + }, + }; + if (query) { + findOneArgs.include = query; + } + const roleEntity = await this.model.findUnique(findOneArgs); + + return roleEntity; + } +} diff --git a/src/common/repositories/RolesRepository.ts b/src/common/repositories/RolesRepository.ts new file mode 100644 index 00000000..159674a5 --- /dev/null +++ b/src/common/repositories/RolesRepository.ts @@ -0,0 +1,111 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { Roles, Prisma } from "@prisma/client"; +import { Role } from "le-coffre-resources/dist/SuperAdmin"; + +@Service() +export default class RolesRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().roles; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many roles + */ + public async findMany(query: any): Promise { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Create new role with rules + */ + public async create(role: Role): Promise { + const createArgs: Prisma.RolesCreateArgs = { + data: { + name: role.name, + role_has_rules: { + createMany: { + data: role.role_has_rules!.rules.map((relation) => ({ + rule_uid: relation.uid!, + })), + skipDuplicates: true, + }, + }, + }, + }; + + return this.model.create(createArgs); + } + + /** + * @description : Update data of a role with rules + */ + public async update(role: Role): Promise { + const updateArgs: Prisma.RolesUpdateArgs = { + where: { + uid: role.uid, + }, + data: { + name: role.name, + role_has_rules: { + deleteMany: { role_uid: role.uid }, + createMany: { + data: role.role_has_rules!.rules.map((relation) => ({ + rule_uid: relation.uid!, + })), + skipDuplicates: true, + }, + }, + }, + }; + if(role.office_role_has_rules) { + updateArgs.data.office_role_has_rules = { + deleteMany: { role_uid: role.uid }, + createMany: { + data: role.office_role_has_rules.rules.map((relation) => ({ + rule_uid: relation.uid!, + })), + skipDuplicates: true, + }, + }; + } + + return this.model.update(updateArgs); + } + + /** + * @description : Find one role + */ + public async findOneByUid(uid: string, query?: any): Promise { + const findOneArgs: Prisma.RolesFindUniqueArgs = { + where: { + uid: uid, + }, + }; + if (query) { + findOneArgs.include = query; + } + const roleEntity = await this.model.findUnique(findOneArgs); + + return roleEntity; + } + + /** + * @description : Delete a role + */ + public async delete(uid: string): Promise { + return this.model.delete({ + where: { + uid: uid, + }, + }); + } +} diff --git a/src/common/repositories/RulesRepository.ts b/src/common/repositories/RulesRepository.ts new file mode 100644 index 00000000..7d015429 --- /dev/null +++ b/src/common/repositories/RulesRepository.ts @@ -0,0 +1,83 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { Rules, Prisma } from "@prisma/client"; +import { Rule } from "le-coffre-resources/dist/SuperAdmin"; + +@Service() +export default class RulesRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().rules; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many rules + */ + public async findMany(query: any): Promise { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Create new rule + */ + public async create(rule: Rule): Promise { + const createArgs: Prisma.RulesCreateArgs = { + data: { + name: rule.name + }, + }; + + return this.model.create(createArgs); + } + + /** + * @description : Update data of a rule + */ + public async update(rule: Rule): Promise { + const updateArgs: Prisma.RulesUpdateArgs = { + where: { + uid: rule.uid, + }, + data: { + name: rule.name + }, + }; + + return this.model.update(updateArgs); + } + + /** + * @description : Find one rule + */ + public async findOneByUid(uid: string, query?: any): Promise { + const findOneArgs: Prisma.RulesFindUniqueArgs = { + where: { + uid: uid, + }, + }; + if (query) { + findOneArgs.include = query; + } + const ruleEntity = await this.model.findUnique(findOneArgs); + + return ruleEntity; + } + + /** + * @description : Delete a rule + */ + public async delete(uid: string): Promise { + return this.model.delete({ + where: { + uid: uid, + }, + }); + } +} diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index b051af69..a0f14234 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -61,6 +61,11 @@ export default class UsersRepository extends BaseRepository { address: {}, }, }, + role: { + connect: { + uid: user.role!.uid, + }, + } }, }; if (user.contact!.address) {