const {encrypt, decrypt} = require('lib/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, 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 ? 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 ? title : 'No title') } }, { new: true } ).lean() return decryptTitles(noteList) } const NoteList = mongoose.models.NoteList || mongoose.model('NoteList', noteListSchema) export default NoteList