import { FindEmployeesServicesParams, IEmployeesServicesAdapter, IEmployeeService, CreateEmployeeServiceParams, UpdateEmployeeServiceParams, PaginateEmployeesServicesParams, PaginateEmployeesServicesResults, } from "./EmployeesServices.Interface"; import { Document, Model, Schema, model } from "mongoose"; export interface IEmployeeServiceDocument extends Omit, Document {} export class EmployeesServicesAdapterMongoose implements IEmployeesServicesAdapter { schema: Schema; employeesServicesList: Model; constructor() { this.schema = new Schema({ serviceId: { type: Schema.Types.ObjectId, required: true, ref: "Service" }, employeeId: { type: Schema.Types.ObjectId, required: true, ref: "Employee" }, companyId: { type: Schema.Types.ObjectId, required: true, ref: "Companie" }, price: { type: Number, required: false }, creationDate: { type: Date, required: true, default: Date.now }, }); this.employeesServicesList = model( "EmployeeService", this.schema ); } public async create(data: CreateEmployeeServiceParams): Promise { return await this.employeesServicesList.create(data); } public async update(data: UpdateEmployeeServiceParams): Promise { const updateEmployeeService = await this.employeesServicesList.findOne({ _id: data.id }); if (!updateEmployeeService) { throw new Error("Employee service not found"); } if (data.price) { updateEmployeeService.price = data.price; } await updateEmployeeService.save(); } public async delete(id: string): Promise { await this.employeesServicesList.deleteOne({ _id: id }).exec(); } public async find(filters: FindEmployeesServicesParams): Promise { return this.employeesServicesList.find(filters).exec(); } public async findOne( filters: FindEmployeesServicesParams ): Promise { return this.employeesServicesList.findOne(filters).exec(); } public async paginate( filters: PaginateEmployeesServicesParams ): Promise { const { page, limit, ...findFilters } = filters; //Extract page and limit from filters const count = await this.employeesServicesList.countDocuments(findFilters).exec(); const skip = (page - 1) * limit; const results = await this.employeesServicesList .find(findFilters) .skip(skip) .limit(filters.limit) .exec(); return { data: results, page: filters.page, pages: Math.ceil(count / filters.limit), }; } }