import { Customers, Prisma } from "@prisma/client"; import CustomersRepository from "@Repositories/CustomersRepository"; import BaseService from "@Services/BaseService"; import ContactsService from "@Services/common/ContactService/ContactService"; import { Customer } from "le-coffre-resources/dist/SuperAdmin"; import { Service } from "typedi"; @Service() export default class CustomersService extends BaseService { constructor(private customerRepository: CustomersRepository, private contactService: ContactsService) { super(); } /** * @description : Get all Customers * @throws {Error} If Customers cannot be get */ public async get(query: Prisma.CustomersFindManyArgs): Promise { return this.customerRepository.findMany(query); } /** * @description : Create a new customer * @throws {Error} If customer cannot be created */ public async create(customerEntity: Customer): Promise { const customers = await this.get({ where: { contact: { OR: [{ email: customerEntity.contact?.email }, { cell_phone_number: customerEntity.contact?.cell_phone_number }], }, }, }); if(customers[0]) return customers[0]; return this.customerRepository.create(customerEntity); } /** * @description : Modify a customer * @throws {Error} If customer cannot be modified */ public async update(uid: string, customerEntity: Customer): Promise { let errors = []; if(customerEntity.contact?.email) { const contactWithSameEmail = await this.contactService.getByEmail(customerEntity.contact.email); if(contactWithSameEmail && contactWithSameEmail.uid != customerEntity.contact.uid) errors.push({property: "email", constraints: {email: "mail déjà utilisé"}}); } if(customerEntity.contact?.cell_phone_number) { const contactWithSamePhoneNumber = await this.contactService.getByPhone(customerEntity.contact.cell_phone_number); if(contactWithSamePhoneNumber && contactWithSamePhoneNumber.uid != customerEntity.contact.uid) errors.push({property: "cell_phone_number", constraints: {phone: "numéro de téléphone déjà utilisé"}}); } if(errors.length != 0) throw errors; return this.customerRepository.update(uid, customerEntity); } /** * @description : Get a customer by uid * @throws {Error} If customer cannot be get by uid */ public async getByUid(uid: string, query?: Prisma.CustomersInclude): Promise { return this.customerRepository.findOneByUid(uid, query); } /** * @description : Get a customer by contact uid * @throws {Error} If customer cannot be get by contact uid */ public async getByContact(contactUid: string): Promise { return this.customerRepository.findOneByContact(contactUid); } }