import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; import { Addresses, Contacts, ECivility, Offices, Prisma, Users } from "@prisma/client"; import User from "le-coffre-resources/dist/SuperAdmin"; @Service() export default class UsersRepository extends BaseRepository { constructor(private database: Database) { super(); } protected get model() { return this.database.getClient().users; } protected get instanceDb() { return this.database.getClient(); } /** * @description : Find many users */ public async findMany(query: Prisma.UsersFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } /** * @description : Create a user */ public async create(user: User): Promise { const createArgs: Prisma.UsersCreateArgs = { data: { idNot: user.idNot, office_membership: { connectOrCreate: { where: { idNot: user.office_membership!.idNot, }, create: { idNot: user.office_membership!.idNot, name: user.office_membership!.name, crpcen: user.office_membership!.crpcen, address: { create: { address: user.office_membership!.address!.address, zip_code: user.office_membership!.address!.zip_code, city: user.office_membership!.address!.city, }, }, }, }, }, contact: { create: { first_name: user.contact!.first_name, last_name: user.contact!.last_name, email: user.contact!.email, phone_number: user.contact!.phone_number, cell_phone_number: user.contact!.cell_phone_number, civility: ECivility[user.contact!.civility as keyof typeof ECivility], address: {}, }, }, role: { connect: { uid: user.role!.uid, }, }, }, }; if (user.contact!.address) { createArgs.data.contact!.create!.address!.create = { address: user.contact!.address.address, zip_code: user.contact!.address.zip_code, city: user.contact!.address.city, }; } if (user.office_role) { createArgs.data.office_role = { connect: { uid: user.office_role.uid, }, }; } return this.model.create({ ...createArgs, include: { contact: true, office_membership: { include: { address: true } } } }); } /** * @description : Update data from a user */ public async update( uid: string, user: User, ): Promise< Users & { contact: Contacts; office_membership: Offices & { address: Addresses; }; } > { const updateArgs: Prisma.UsersUpdateArgs = { where: { uid: uid, }, data: { idNot: user.idNot, office_membership: { connectOrCreate: { where: { idNot: user.office_membership!.idNot, }, create: { idNot: user.office_membership!.idNot, name: user.office_membership!.name, crpcen: user.office_membership!.crpcen, address: { create: { address: user.office_membership!.address!.address, zip_code: user.office_membership!.address!.zip_code, city: user.office_membership!.address!.city, }, }, }, }, }, contact: { update: { first_name: user.contact!.first_name, last_name: user.contact!.last_name, email: user.contact!.email, phone_number: user.contact!.phone_number, cell_phone_number: user.contact!.cell_phone_number, civility: ECivility[user.contact!.civility as keyof typeof ECivility], address: {}, }, }, }, }; if (user.contact!.address) { updateArgs.data.contact!.update!.address!.update = { address: user.contact!.address!.address, zip_code: user.contact!.address!.zip_code, city: user.contact!.address!.city, }; } if (user.office_role) { updateArgs.data.office_role = { connect: { uid: user.office_role.uid, }, }; } return this.model.update({ ...updateArgs, include: { contact: true, office_membership: { include: { address: true } } } }); } /** * @description : Find one user */ public async findOneByUid(uid: string, query?: Prisma.UsersInclude){ return this.model.findUnique({ where: { uid: uid, }, include: query, }); } /** * @description : Find one user */ public async findOneByProvider(providerName: string, id: string) { return this.model.findUnique({ where: { [providerName]: id }, include: { role: { include: { rules: true } } , office_role: { include: { rules: true } } , office_membership: true, }, }); } }