import mongoose, { Document, Model, Schema, model } from "mongoose"; import { CreateMessageParams, FindMessageParams, IMessage, IMessagesAdapter, PaginateMessageParams, PaginateMessageResults, } from "./Messages.Interface"; export interface IMessageDocument extends Omit, Document {} export class MessagesAdapterMongoose implements IMessagesAdapter { schema: Schema; messageList: Model; constructor() { this.schema = new Schema({ conversationId: { type: Schema.Types.ObjectId, required: true, ref: "MessagesConversation", }, userId: { type: Schema.Types.ObjectId, required: true, ref: "User", }, message: { type: String, required: true }, messageDate: { type: Date, required: true }, readed: { type: Boolean, default: false }, }); this.messageList = model("Message", this.schema); } public async create(data: CreateMessageParams): Promise { return await this.messageList.create({ conversationId: data.conversationId, userId: data.sessionUser, message: data.message, messageDate: new Date(), readed: false, }); } public async delete(id: string): Promise { await this.messageList.findByIdAndDelete(id).exec(); } public async find(filters: Omit): Promise { return this.messageList.find(filters).exec(); } public async findOne( filters: Omit ): Promise { return this.messageList.findOne(filters).exec(); } // Método para búsqueda con expresiones regulares y paginación public async paginate(data: PaginateMessageParams): Promise { const skip = (data.page - 1) * data.limit; // Construye los criterios de búsqueda const searchCriteria: mongoose.FilterQuery = {}; // Agrega filtro por query usando expresiones regulares para 'name' y 'description' if (data.query) { const regex = new RegExp(data.query, "i"); searchCriteria.$or = [{ subject: regex }, { message: regex }]; } // Filtra por categoryId si está presente if (data.conversationId !== undefined) { searchCriteria.conversationId = data.conversationId; } if (data.readed) { searchCriteria.readed = data.readed; } // Realiza la consulta con paginación const results = await this.messageList .find(searchCriteria) .sort({ messageDate: -1 }) .skip(skip) .limit(data.limit) .exec(); // Cuenta el total de documentos que coinciden con los criterios de búsqueda const count = await this.messageList.countDocuments(searchCriteria).exec(); return { data: results, page: data.page, pages: Math.ceil(count / data.limit), }; } public async markAsRead(data: FindMessageParams): Promise { await this.messageList.updateMany( { conversationId: data.conversationId }, { $set: { readed: true } } ); } }