mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 10:26:08 +01:00 
			
		
		
		
	created repository object to access entities
This commit is contained in:
		| @@ -56,7 +56,7 @@ app.use((req, res, next) => { | |||||||
|  |  | ||||||
| // error handler | // error handler | ||||||
| app.use((err, req, res, next) => { | app.use((err, req, res, next) => { | ||||||
|     log.error(err.message); |     log.info(err); | ||||||
|  |  | ||||||
|     res.status(err.status || 500); |     res.status(err.status || 500); | ||||||
|     res.send({ |     res.send({ | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ const Entity = require('./entity'); | |||||||
|  |  | ||||||
| class Attribute extends Entity { | class Attribute extends Entity { | ||||||
|     async getNote() { |     async getNote() { | ||||||
|         return this.sql.getEntity("SELECT * FROM notes WHERE noteId = ?", [this.noteId]); |         return this.repository.getEntity("SELECT * FROM notes WHERE noteId = ?", [this.noteId]); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,8 +1,12 @@ | |||||||
| "use strict"; | "use strict"; | ||||||
|  |  | ||||||
|  | const utils = require('../services/utils'); | ||||||
|  |  | ||||||
| class Entity { | class Entity { | ||||||
|     constructor(sql, row) { |     constructor(repository, row) { | ||||||
|         this.sql = sql; |         utils.assertArguments(repository, row) | ||||||
|  |  | ||||||
|  |         this.repository = repository; | ||||||
|  |  | ||||||
|         for (const key in row) { |         for (const key in row) { | ||||||
|             this[key] = row[key]; |             this[key] = row[key]; | ||||||
|   | |||||||
| @@ -3,28 +3,32 @@ | |||||||
| const Entity = require('./entity'); | const Entity = require('./entity'); | ||||||
|  |  | ||||||
| class Note extends Entity { | class Note extends Entity { | ||||||
|     constructor(sql, row) { |     constructor(repository, row) { | ||||||
|         super(sql, row); |         super(repository, row); | ||||||
|  |  | ||||||
|         if (this.type === "code" && this.mime === "application/json") { |         if (this.isJson()) { | ||||||
|             this.jsonContent = JSON.parse(this.content); |             this.jsonContent = JSON.parse(this.content); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     isJson() { | ||||||
|  |         return this.type === "code" && this.mime === "application/json"; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     async getAttributes() { |     async getAttributes() { | ||||||
|         return this.sql.getEntities("SELECT * FROM attributes WHERE noteId = ?", [this.noteId]); |         return this.repository.getEntities("SELECT * FROM attributes WHERE noteId = ?", [this.noteId]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async getAttribute(name) { |     async getAttribute(name) { | ||||||
|         return this.sql.getEntity("SELECT * FROM attributes WHERE noteId = ? AND name = ?", [this.noteId, name]); |         return this.repository.getEntity("SELECT * FROM attributes WHERE noteId = ? AND name = ?", [this.noteId, name]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async getRevisions() { |     async getRevisions() { | ||||||
|         return this.sql.getEntities("SELECT * FROM note_revisions WHERE noteId = ?", [this.noteId]); |         return this.repository.getEntities("SELECT * FROM note_revisions WHERE noteId = ?", [this.noteId]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async getTrees() { |     async getTrees() { | ||||||
|         return this.sql.getEntities("SELECT * FROM note_tree WHERE isDeleted = 0 AND noteId = ?", [this.noteId]); |         return this.repository.getEntities("SELECT * FROM note_tree WHERE isDeleted = 0 AND noteId = ?", [this.noteId]); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ const Entity = require('./entity'); | |||||||
|  |  | ||||||
| class NoteRevision extends Entity { | class NoteRevision extends Entity { | ||||||
|     async getNote() { |     async getNote() { | ||||||
|         return this.sql.getEntity("SELECT * FROM notes WHERE noteId = ?", [this.noteId]); |         return this.repository.getEntity("SELECT * FROM notes WHERE noteId = ?", [this.noteId]); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,11 +4,11 @@ const Entity = require('./entity'); | |||||||
|  |  | ||||||
| class NoteTree extends Entity { | class NoteTree extends Entity { | ||||||
|     async getNote() { |     async getNote() { | ||||||
|         return this.sql.getEntity("SELECT * FROM note_tree WHERE isDeleted = 0 AND noteId = ?", [this.noteId]); |         return this.repository.getEntity("SELECT * FROM note_tree WHERE isDeleted = 0 AND noteId = ?", [this.noteId]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async getParentNote() { |     async getParentNote() { | ||||||
|         return this.sql.getEntity("SELECT * FROM note_tree WHERE isDeleted = 0 AND parentNoteId = ?", [this.parentNoteId]); |         return this.repository.getEntity("SELECT * FROM note_tree WHERE isDeleted = 0 AND parentNoteId = ?", [this.parentNoteId]); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,11 +4,10 @@ const express = require('express'); | |||||||
| const router = express.Router(); | const router = express.Router(); | ||||||
| const auth = require('../../services/auth'); | const auth = require('../../services/auth'); | ||||||
| const wrap = require('express-promise-wrap').wrap; | const wrap = require('express-promise-wrap').wrap; | ||||||
| const sql = require('../../services/sql'); |  | ||||||
| const notes = require('../../services/notes'); | const notes = require('../../services/notes'); | ||||||
| const protected_session = require('../../services/protected_session'); |  | ||||||
| const attributes = require('../../services/attributes'); | const attributes = require('../../services/attributes'); | ||||||
| const script = require('../../services/script'); | const script = require('../../services/script'); | ||||||
|  | const Repository = require('../../services/repository'); | ||||||
|  |  | ||||||
| router.post('/exec/:noteId', auth.checkApiAuth, wrap(async (req, res, next) => { | router.post('/exec/:noteId', auth.checkApiAuth, wrap(async (req, res, next) => { | ||||||
|     const noteId = req.params.noteId; |     const noteId = req.params.noteId; | ||||||
| @@ -33,9 +32,11 @@ router.get('/startup', auth.checkApiAuth, wrap(async (req, res, next) => { | |||||||
| router.get('/subtree/:noteId', auth.checkApiAuth, wrap(async (req, res, next) => { | router.get('/subtree/:noteId', auth.checkApiAuth, wrap(async (req, res, next) => { | ||||||
|     const noteId = req.params.noteId; |     const noteId = req.params.noteId; | ||||||
|  |  | ||||||
|     const noteScript = (await notes.getNoteById(noteId, req)).content; |     const repository = new Repository(req); | ||||||
|  |  | ||||||
|     const subTreeScripts = await getSubTreeScripts(noteId, [noteId], req); |     const noteScript = (await repository.getNote(noteId)).content; | ||||||
|  |  | ||||||
|  |     const subTreeScripts = await getSubTreeScripts(noteId, [noteId], repository); | ||||||
|  |  | ||||||
|     res.send(subTreeScripts + noteScript); |     res.send(subTreeScripts + noteScript); | ||||||
| })); | })); | ||||||
| @@ -48,15 +49,14 @@ async function getNoteWithSubtreeScript(noteId, req) { | |||||||
|     return subTreeScripts + noteScript; |     return subTreeScripts + noteScript; | ||||||
| } | } | ||||||
|  |  | ||||||
| async function getSubTreeScripts(parentId, includedNoteIds, dataKey) { | async function getSubTreeScripts(parentId, includedNoteIds, repository) { | ||||||
|     const children = await sql.getRows(`SELECT notes.noteId, notes.title, notes.content, notes.isProtected, notes.mime  |     const children = await repository.getEntities(` | ||||||
|  |                                       SELECT notes.*  | ||||||
|                                       FROM notes JOIN note_tree USING(noteId) |                                       FROM notes JOIN note_tree USING(noteId) | ||||||
|                                       WHERE note_tree.isDeleted = 0 AND notes.isDeleted = 0 |                                       WHERE note_tree.isDeleted = 0 AND notes.isDeleted = 0 | ||||||
|                                            AND note_tree.parentNoteId = ? AND notes.type = 'code' |                                            AND note_tree.parentNoteId = ? AND notes.type = 'code' | ||||||
|                                            AND (notes.mime = 'application/javascript' OR notes.mime = 'text/html')`, [parentId]); |                                            AND (notes.mime = 'application/javascript' OR notes.mime = 'text/html')`, [parentId]); | ||||||
|  |  | ||||||
|     protected_session.decryptNotes(dataKey, children); |  | ||||||
|  |  | ||||||
|     let script = "\r\n"; |     let script = "\r\n"; | ||||||
|  |  | ||||||
|     for (const child of children) { |     for (const child of children) { | ||||||
| @@ -66,7 +66,7 @@ async function getSubTreeScripts(parentId, includedNoteIds, dataKey) { | |||||||
|  |  | ||||||
|         includedNoteIds.push(child.noteId); |         includedNoteIds.push(child.noteId); | ||||||
|  |  | ||||||
|         script += await getSubTreeScripts(child.noteId, includedNoteIds, dataKey); |         script += await getSubTreeScripts(child.noteId, includedNoteIds, repository); | ||||||
|  |  | ||||||
|         if (child.mime === 'application/javascript') { |         if (child.mime === 'application/javascript') { | ||||||
|             child.content = '<script>' + child.content + '</script>'; |             child.content = '<script>' + child.content + '</script>'; | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
| const sql = require('./sql'); | const sql = require('./sql'); | ||||||
| const utils = require('./utils'); | const utils = require('./utils'); | ||||||
| const sync_table = require('./sync_table'); | const sync_table = require('./sync_table'); | ||||||
| const protected_session = require('./protected_session'); | const Repository = require('./repository'); | ||||||
|  |  | ||||||
| async function getNoteAttributeMap(noteId) { | async function getNoteAttributeMap(noteId) { | ||||||
|     return await sql.getMap(`SELECT name, value FROM attributes WHERE noteId = ?`, [noteId]); |     return await sql.getMap(`SELECT name, value FROM attributes WHERE noteId = ?`, [noteId]); | ||||||
| @@ -15,21 +15,19 @@ async function getNoteIdWithAttribute(name, value) { | |||||||
| } | } | ||||||
|  |  | ||||||
| async function getNotesWithAttribute(dataKey, name, value) { | async function getNotesWithAttribute(dataKey, name, value) { | ||||||
|  |     const repository = new Repository(dataKey); | ||||||
|  |  | ||||||
|     let notes; |     let notes; | ||||||
|  |  | ||||||
|     if (value !== undefined) { |     if (value !== undefined) { | ||||||
|         notes = await sql.getEntities(`SELECT notes.* FROM notes JOIN attributes USING(noteId)  |         notes = await repository.getEntities(`SELECT notes.* FROM notes JOIN attributes USING(noteId)  | ||||||
|           WHERE notes.isDeleted = 0 AND attributes.name = ? AND attributes.value = ?`, [name, value]); |           WHERE notes.isDeleted = 0 AND attributes.name = ? AND attributes.value = ?`, [name, value]); | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|         notes = await sql.getEntities(`SELECT notes.* FROM notes JOIN attributes USING(noteId)  |         notes = await repository.getEntities(`SELECT notes.* FROM notes JOIN attributes USING(noteId)  | ||||||
|           WHERE notes.isDeleted = 0 AND attributes.name = ?`, [name]); |           WHERE notes.isDeleted = 0 AND attributes.name = ?`, [name]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     for (const note of notes) { |  | ||||||
|         protected_session.decryptNote(dataKey, note); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return notes; |     return notes; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,21 +5,6 @@ const sync_table = require('./sync_table'); | |||||||
| const attributes = require('./attributes'); | const attributes = require('./attributes'); | ||||||
| const protected_session = require('./protected_session'); | const protected_session = require('./protected_session'); | ||||||
|  |  | ||||||
| async function getNoteById(noteId, dataKey) { |  | ||||||
|     const note = await sql.getEntity("SELECT * FROM notes WHERE noteId = ?", [noteId]); |  | ||||||
|  |  | ||||||
|     protected_session.decryptNote(dataKey, note); |  | ||||||
|  |  | ||||||
|     return note; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| async function getJsonNoteById(noteId, dataKey) { |  | ||||||
|     const note = await getNoteById(noteId, dataKey); |  | ||||||
|     note.data = JSON.parse(note.content); |  | ||||||
|  |  | ||||||
|     return note; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| async function updateJsonNote(noteId, data) { | async function updateJsonNote(noteId, data) { | ||||||
|     const ret = await createNewNote(noteId, { |     const ret = await createNewNote(noteId, { | ||||||
|         title: name, |         title: name, | ||||||
| @@ -329,7 +314,6 @@ async function deleteNote(noteTreeId, sourceId) { | |||||||
| } | } | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|     getNoteById, |  | ||||||
|     createNewNote, |     createNewNote, | ||||||
|     updateNote, |     updateNote, | ||||||
|     deleteNote, |     deleteNote, | ||||||
|   | |||||||
							
								
								
									
										62
									
								
								src/services/repository.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/services/repository.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | const sql = require('./sql'); | ||||||
|  | const protected_session = require('./protected_session'); | ||||||
|  | const Note = require('../entities/note'); | ||||||
|  | const NoteRevision = require('../entities/note_revision'); | ||||||
|  | const NoteTree = require('../entities/note_tree'); | ||||||
|  | const Attribute = require('../entities/attribute'); | ||||||
|  |  | ||||||
|  | class Repository { | ||||||
|  |     constructor(dataKey) { | ||||||
|  |         this.dataKey = protected_session.getDataKey(dataKey); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async getEntities(query, params = []) { | ||||||
|  |         const rows = await sql.getRows(query, params); | ||||||
|  |  | ||||||
|  |         for (const row of rows) { | ||||||
|  |             row.dataKey = this.dataKey; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return rows.map(row => this.createEntityFromRow(row)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async getEntity(query, params = []) { | ||||||
|  |         const row = await sql.getRowOrNull(query, params); | ||||||
|  |  | ||||||
|  |         if (!row) { | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         row.dataKey = this.dataKey; | ||||||
|  |  | ||||||
|  |         return this.createEntityFromRow(row); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async getNote(noteId) { | ||||||
|  |         return await this.getEntity("SELECT * FROM notes WHERE noteId = ?", [noteId]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     createEntityFromRow(row) { | ||||||
|  |         let entity; | ||||||
|  |  | ||||||
|  |         if (row.attributeId) { | ||||||
|  |             entity = new Attribute(this, row); | ||||||
|  |         } | ||||||
|  |         else if (row.noteRevisionId) { | ||||||
|  |             entity = new NoteRevision(this, row); | ||||||
|  |         } | ||||||
|  |         else if (row.noteTreeId) { | ||||||
|  |             entity = new NoteTree(this, row); | ||||||
|  |         } | ||||||
|  |         else if (row.noteId) { | ||||||
|  |             entity = new Note(this, row); | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             throw new Error('Unknown entity type for row: ' + JSON.stringify(row)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return entity; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | module.exports = Repository; | ||||||
| @@ -5,17 +5,19 @@ const attributes = require('./attributes'); | |||||||
| const date_notes = require('./date_notes'); | const date_notes = require('./date_notes'); | ||||||
| const sql = require('./sql'); | const sql = require('./sql'); | ||||||
| const sync_table = require('./sync_table'); | const sync_table = require('./sync_table'); | ||||||
|  | const Repository = require('./repository'); | ||||||
|  |  | ||||||
| function ScriptContext(noteId, dataKey) { | function ScriptContext(noteId, dataKey) { | ||||||
|     this.scriptNoteId = noteId; |     this.scriptNoteId = noteId; | ||||||
|     this.dataKey = protected_session.getDataKey(dataKey); |     this.dataKey = protected_session.getDataKey(dataKey); | ||||||
|  |     this.repository = new Repository(dataKey); | ||||||
|  |  | ||||||
|     function serializePayload(payload) { |     function serializePayload(payload) { | ||||||
|         return JSON.stringify(payload, null, '\t'); |         return JSON.stringify(payload, null, '\t'); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     this.getNoteById = async function(noteId) { |     this.getNoteById = async function(noteId) { | ||||||
|         return notes.getNoteById(noteId, this.dataKey); |         return this.repository.getNote(noteId); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     this.getNotesWithAttribute = async function (attrName, attrValue) { |     this.getNotesWithAttribute = async function (attrName, attrValue) { | ||||||
| @@ -60,7 +62,7 @@ function ScriptContext(noteId, dataKey) { | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     this.updateNote = async function (note) { |     this.updateNote = async function (note) { | ||||||
|         if (note.type === 'code' && note.mime === 'application/json') { |         if (note.isJson()) { | ||||||
|             note.content = serializePayload(note.jsonContent); |             note.content = serializePayload(note.jsonContent); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,10 +6,6 @@ const fs = require('fs'); | |||||||
| const sqlite = require('sqlite'); | const sqlite = require('sqlite'); | ||||||
| const app_info = require('./app_info'); | const app_info = require('./app_info'); | ||||||
| const resource_dir = require('./resource_dir'); | const resource_dir = require('./resource_dir'); | ||||||
| const Note = require('../entities/note'); |  | ||||||
| const NoteRevision = require('../entities/note_revision'); |  | ||||||
| const NoteTree = require('../entities/note_tree'); |  | ||||||
| const Attribute = require('../entities/attribute'); |  | ||||||
|  |  | ||||||
| async function createConnection() { | async function createConnection() { | ||||||
|     return await sqlite.open(dataDir.DOCUMENT_PATH, {Promise}); |     return await sqlite.open(dataDir.DOCUMENT_PATH, {Promise}); | ||||||
| @@ -137,45 +133,6 @@ async function getRows(query, params = []) { | |||||||
|     return await wrap(async db => db.all(query, ...params)); |     return await wrap(async db => db.all(query, ...params)); | ||||||
| } | } | ||||||
|  |  | ||||||
| async function getEntities(query, params = []) { |  | ||||||
|     const rows = await getRows(query, params); |  | ||||||
|  |  | ||||||
|     return rows.map(createEntityFromRow); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| async function getEntity(query, params = []) { |  | ||||||
|     const row = await getRowOrNull(query, params); |  | ||||||
|  |  | ||||||
|     if (!row) { |  | ||||||
|         return null; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return createEntityFromRow(row); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function createEntityFromRow(row) { |  | ||||||
|     let entity; |  | ||||||
|     let sql = module.exports; |  | ||||||
|  |  | ||||||
|     if (row.attributeId) { |  | ||||||
|         entity = new Attribute(sql, row); |  | ||||||
|     } |  | ||||||
|     else if (row.noteRevisionId) { |  | ||||||
|         entity = new NoteRevision(sql, row); |  | ||||||
|     } |  | ||||||
|     else if (row.noteTreeId) { |  | ||||||
|         entity = new NoteTree(sql, row); |  | ||||||
|     } |  | ||||||
|     else if (row.noteId) { |  | ||||||
|         entity = new Note(sql, row); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         throw new Error('Unknown entity type for row: ' + JSON.stringify(row)); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return entity; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| async function getMap(query, params = []) { | async function getMap(query, params = []) { | ||||||
|     const map = {}; |     const map = {}; | ||||||
|     const results = await getRows(query, params); |     const results = await getRows(query, params); | ||||||
| @@ -309,8 +266,6 @@ module.exports = { | |||||||
|     getRow, |     getRow, | ||||||
|     getRowOrNull, |     getRowOrNull, | ||||||
|     getRows, |     getRows, | ||||||
|     getEntities, |  | ||||||
|     getEntity, |  | ||||||
|     getMap, |     getMap, | ||||||
|     getColumn, |     getColumn, | ||||||
|     execute, |     execute, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user