import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; import { ECivility, 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: any): Promise { 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: {}, }, }, }, } 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, }; } return this.model.create(createArgs); } /** * @description : Update data from a user */ public async update(uid: string, user: User): Promise { 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, }; } return this.model.update(updateArgs); } /** * @description : Find one user */ public async findOneByUid(uid: string, query?: any): Promise { const findOneArgs: Prisma.UsersFindUniqueArgs = { where: { uid: uid, } }; if(query) { findOneArgs.include = query } const userEntity = await this.model.findUnique(findOneArgs); if (!userEntity) { throw new Error("User not found"); } return userEntity; } }