Files
notesnook/packages/core/models/topic.js

95 lines
2.5 KiB
JavaScript

import { qclone } from "qclone";
export default class Topic {
/**
* @param {Object} topic
* @param {string} notebookId
* @param {import('../api').default} db
*/
constructor(topic, notebookId, db) {
this._topic = topic;
this._db = db;
this._notebookId = notebookId;
}
get totalNotes() {
return this._topic.totalNotes;
}
has(noteId) {
return this._topic.notes.findIndex((n) => n === noteId) > -1;
}
async add(...noteIds) {
const topic = qclone(this._topic);
for (let noteId of noteIds) {
let note = this._db.notes.note(noteId);
if (this.has(noteId) || !note || note.data.deleted) continue;
topic.notes.push(noteId);
let array = note.notebooks || [];
array = array.slice();
const notebookIndex = array.findIndex((nb) => nb.id === this._notebookId);
if (notebookIndex === -1) {
let notebook = {};
notebook.id = this._notebookId;
notebook.topics = [topic.id];
array.push(notebook);
} else {
const topicIndex = array[notebookIndex].topics.indexOf(topic.id);
if (topicIndex > -1) return;
array[notebookIndex].topics.push(topic.id);
}
await this._db.notes.add({
id: noteId,
notebooks: array,
});
topic.totalNotes++;
}
return await this._save(topic);
}
async delete(...noteIds) {
const topic = qclone(this._topic);
for (let noteId of noteIds) {
let note = this._db.notes.note(noteId);
if (!this.has(noteId) || !note || note.data.deleted || !note.notebooks)
return this;
let index = topic.notes.indexOf(noteId);
topic.notes.splice(index, 1);
let array = note.notebooks.slice();
const notebookIndex = array.findIndex((nb) => nb.id === this._notebookId);
if (notebookIndex === -1) return;
const topicIndex = array[notebookIndex].topics.indexOf(topic.id);
if (topicIndex === -1) return;
array[notebookIndex].topics.splice(topicIndex, 1);
if (array[notebookIndex].topics.length <= 0)
array.splice(notebookIndex, 1);
await this._db.notes.add({
id: noteId,
notebooks: array,
});
topic.totalNotes--;
}
return await this._save(topic);
}
async _save(topic) {
await this._db.notebooks.notebook(this._notebookId).topics.add(topic);
return this;
}
get all() {
return this._topic.notes
.map((note) => {
let fullNote = this._db.notes.note(note);
if (fullNote) return fullNote.data;
})
.filter((v) => v);
}
}