const { encrypt, decrypt } = require('helpers/crypt') const mongoose = require('mongoose') const decryptTitles = l => ({ notes: l.notes.map(n => ({ ...n, title: decrypt(n.title) })) }) const noteListSchema = new mongoose.Schema({ notes: [{ title: { type: String, maxlength: 1000, required: true }, noteId: { type: mongoose.Schema.Types.ObjectId, ref: 'Note', required: true }, created_at: { type: Date, default: Date.now }, updated_at: { type: Date, default: Date.now } }] }) noteListSchema.statics.getList = async (id) => { const newList = await NoteList.findById(id).lean() return { notes: newList.notes.map(n => ({ ...n, title: decrypt(n.title) })) } } noteListSchema.statics.getNoteId = async (_id, id) => { const noteList = await NoteList.findById(_id).lean() return noteList.notes .find(n => n._id.toString() === id.toString()).noteId } noteListSchema.statics.addNote = async (_id, noteId, title) => { const noteList = await NoteList.findOneAndUpdate( { _id }, { $push: { notes: { title: encrypt(title || 'no title'), noteId } } }, { new: true } ).lean() return decryptTitles(noteList) } noteListSchema.statics.removeNote = async (_id, id) => { const noteList = await NoteList.findOneAndUpdate( { _id }, { $pull: { notes: { _id: id } } } ).lean() return decryptTitles(noteList) } noteListSchema.statics.updateList = async (_id, noteId, title) => { const noteList = await NoteList.findOneAndUpdate( { _id, 'notes.noteId': noteId }, { $set: { 'notes.$.title': encrypt(title || 'No title'), 'notes.$.updated_at': Date.now() } }, { new: true } ).lean() return decryptTitles(noteList) } const NoteList = mongoose.models.NoteList || mongoose.model('NoteList', noteListSchema) export default NoteList