import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; import { ECivility, Prisma, Users } from "@prisma/client"; import User, { Role } 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 = 1000; 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, }, }, office_status: "ACTIVATED", }, }, }, 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 || null, civility: ECivility[user.contact?.civility as keyof typeof ECivility], }, }, 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); } /** * @description : Update data from a user */ public async update(uid: string, user: User): Promise { console.log("Updating user", JSON.stringify(user)); const updateArgs: Prisma.UsersUpdateArgs = { where: { uid: uid, }, data: { idNot: user.idNot, contact: { update: { first_name: user.contact?.first_name, last_name: user.contact?.last_name, email: user.contact?.email === null ? undefined : user.contact?.email, phone_number: user.contact?.phone_number === null ? undefined : user.contact?.phone_number, cell_phone_number: user.contact?.cell_phone_number === null ? undefined : user.contact?.cell_phone_number, civility: ECivility[user.contact?.civility as keyof typeof ECivility], }, }, }, }; if (user.office_membership) { updateArgs.data.office_membership = { connect: { idNot: user.office_membership?.idNot, }, }; } 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, }, }; } if (user.role) { updateArgs.data.role = { connect: { uid: user.role.uid, }, }; } console.log("updateArgs", JSON.stringify(updateArgs)); return this.model.update({ ...updateArgs, include: { contact: true, office_membership: { include: { address: true } } } }); } /** * @description : Update check date of a user */ public async updateCheckedAt(uid: string) { return this.model.update({ where: { uid: uid, }, data: { checked_at: new Date(), }, }); } /** * @description : Update office role from a user */ public async updateOfficeRole(uid: string, user: User): Promise { const updateArgs: Prisma.UsersUpdateArgs = { where: { uid: uid, }, data: {}, }; 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 : Delete one user */ public async delete(uid: string): Promise { return this.model.delete({ where: { uid: uid, }, }); } /** * @description : Find one user */ public async findOneByUid(uid: string, query?: Prisma.UsersInclude): Promise { return this.model.findUnique({ where: { uid: uid, }, include: query, }); } /** * @description : Find one user with office */ public async findOneByUidWithOffice(uid: string) { return this.model.findUnique({ where: { uid: uid, }, include: { office_membership: true }, }); } /** * @description : Find one user with office */ public async findOneByUidWithRole(uid: string): Promise<(Users & { role: Role }) | null> { return this.model.findUnique({ where: { uid: uid, }, include: { role: true }, }); } /** * @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, }, }); } /** * @description : Find users which need to be checked with idNot API */ public async findManyToCheck() { return this.model.findMany({ where: { OR: [ { checked_at: null, }, { checked_at: { lt: new Date(Date.now() - 3 * 60 * 1000) }, // less than 24h ago }, ], }, include: { contact: true, role: true, office_membership: true, }, }); } }