mirror of
				https://github.com/zadam/trilium.git
				synced 2025-11-04 05:28:59 +01:00 
			
		
		
		
	server-ts: Port services/attributes
This commit is contained in:
		
							parent
							
								
									2fbd2e3c29
								
							
						
					
					
						commit
						d8d729342d
					
				@ -66,7 +66,7 @@ export type AttributeType = "label" | "relation";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export interface AttributeRow {
 | 
					export interface AttributeRow {
 | 
				
			||||||
    attributeId?: string;
 | 
					    attributeId?: string;
 | 
				
			||||||
    noteId: string;
 | 
					    noteId?: string;
 | 
				
			||||||
    type: AttributeType;
 | 
					    type: AttributeType;
 | 
				
			||||||
    name: string;
 | 
					    name: string;
 | 
				
			||||||
    position?: number;
 | 
					    position?: number;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
const becca = require('../becca/becca');
 | 
					const becca = require('../becca/becca');
 | 
				
			||||||
const eu = require('./etapi_utils');
 | 
					const eu = require('./etapi_utils');
 | 
				
			||||||
const mappers = require('./mappers.js');
 | 
					const mappers = require('./mappers.js');
 | 
				
			||||||
const attributeService = require('../services/attributes.js');
 | 
					const attributeService = require('../services/attributes');
 | 
				
			||||||
const v = require('./validators.js');
 | 
					const v = require('./validators.js');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function register(router) {
 | 
					function register(router) {
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const sql = require('../../services/sql');
 | 
					const sql = require('../../services/sql');
 | 
				
			||||||
const log = require('../../services/log');
 | 
					const log = require('../../services/log');
 | 
				
			||||||
const attributeService = require('../../services/attributes.js');
 | 
					const attributeService = require('../../services/attributes');
 | 
				
			||||||
const BAttribute = require('../../becca/entities/battribute');
 | 
					const BAttribute = require('../../becca/entities/battribute');
 | 
				
			||||||
const becca = require('../../becca/becca');
 | 
					const becca = require('../../becca/becca');
 | 
				
			||||||
const ValidationError = require('../../errors/validation_error');
 | 
					const ValidationError = require('../../errors/validation_error');
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
"use strict";
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const attributeService = require('../../services/attributes.js');
 | 
					const attributeService = require('../../services/attributes');
 | 
				
			||||||
const cloneService = require('../../services/cloning.js');
 | 
					const cloneService = require('../../services/cloning.js');
 | 
				
			||||||
const noteService = require('../../services/notes');
 | 
					const noteService = require('../../services/notes');
 | 
				
			||||||
const dateNoteService = require('../../services/date_notes.js');
 | 
					const dateNoteService = require('../../services/date_notes.js');
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
"use strict";
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const scriptService = require('../../services/script.js');
 | 
					const scriptService = require('../../services/script.js');
 | 
				
			||||||
const attributeService = require('../../services/attributes.js');
 | 
					const attributeService = require('../../services/attributes');
 | 
				
			||||||
const becca = require('../../becca/becca');
 | 
					const becca = require('../../becca/becca');
 | 
				
			||||||
const syncService = require('../../services/sync.js');
 | 
					const syncService = require('../../services/sync.js');
 | 
				
			||||||
const sql = require('../../services/sql');
 | 
					const sql = require('../../services/sql');
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
"use strict";
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const sql = require('../services/sql');
 | 
					const sql = require('../services/sql');
 | 
				
			||||||
const attributeService = require('../services/attributes.js');
 | 
					const attributeService = require('../services/attributes');
 | 
				
			||||||
const config = require('../services/config');
 | 
					const config = require('../services/config');
 | 
				
			||||||
const optionService = require('../services/options');
 | 
					const optionService = require('../services/options');
 | 
				
			||||||
const log = require('../services/log');
 | 
					const log = require('../services/log');
 | 
				
			||||||
 | 
				
			|||||||
@ -42,7 +42,7 @@ const setupApiRoute = require('./api/setup.js');
 | 
				
			|||||||
const sqlRoute = require('./api/sql');
 | 
					const sqlRoute = require('./api/sql');
 | 
				
			||||||
const databaseRoute = require('./api/database.js');
 | 
					const databaseRoute = require('./api/database.js');
 | 
				
			||||||
const imageRoute = require('./api/image.js');
 | 
					const imageRoute = require('./api/image.js');
 | 
				
			||||||
const attributesRoute = require('./api/attributes.js');
 | 
					const attributesRoute = require('./api/attributes');
 | 
				
			||||||
const scriptRoute = require('./api/script.js');
 | 
					const scriptRoute = require('./api/script.js');
 | 
				
			||||||
const senderRoute = require('./api/sender.js');
 | 
					const senderRoute = require('./api/sender.js');
 | 
				
			||||||
const filesRoute = require('./api/files.js');
 | 
					const filesRoute = require('./api/files.js');
 | 
				
			||||||
@ -64,7 +64,7 @@ const shareRoutes = require('../share/routes.js');
 | 
				
			|||||||
const etapiAuthRoutes = require('../etapi/auth.js');
 | 
					const etapiAuthRoutes = require('../etapi/auth.js');
 | 
				
			||||||
const etapiAppInfoRoutes = require('../etapi/app_info');
 | 
					const etapiAppInfoRoutes = require('../etapi/app_info');
 | 
				
			||||||
const etapiAttachmentRoutes = require('../etapi/attachments.js');
 | 
					const etapiAttachmentRoutes = require('../etapi/attachments.js');
 | 
				
			||||||
const etapiAttributeRoutes = require('../etapi/attributes.js');
 | 
					const etapiAttributeRoutes = require('../etapi/attributes');
 | 
				
			||||||
const etapiBranchRoutes = require('../etapi/branches.js');
 | 
					const etapiBranchRoutes = require('../etapi/branches.js');
 | 
				
			||||||
const etapiNoteRoutes = require('../etapi/notes.js');
 | 
					const etapiNoteRoutes = require('../etapi/notes.js');
 | 
				
			||||||
const etapiSpecialNoteRoutes = require('../etapi/special_notes.js');
 | 
					const etapiSpecialNoteRoutes = require('../etapi/special_notes.js');
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
"use strict";
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import BAttribute = require("../becca/entities/battribute");
 | 
					import { AttributeRow } from "../becca/entities/rows";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function formatAttrForSearch(attr: BAttribute, searchWithValue: string) {
 | 
					function formatAttrForSearch(attr: AttributeRow, searchWithValue: boolean) {
 | 
				
			||||||
    let searchStr = '';
 | 
					    let searchStr = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (attr.type === 'label') {
 | 
					    if (attr.type === 'label') {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,18 @@
 | 
				
			|||||||
"use strict";
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const searchService = require('./search/services/search');
 | 
					import searchService = require('./search/services/search');
 | 
				
			||||||
const sql = require('./sql');
 | 
					import sql = require('./sql');
 | 
				
			||||||
const becca = require('../becca/becca');
 | 
					import becca = require('../becca/becca');
 | 
				
			||||||
const BAttribute = require('../becca/entities/battribute');
 | 
					import BAttribute = require('../becca/entities/battribute');
 | 
				
			||||||
const {formatAttrForSearch} = require('./attribute_formatter');
 | 
					import attributeFormatter = require('./attribute_formatter');
 | 
				
			||||||
const BUILTIN_ATTRIBUTES = require('./builtin_attributes');
 | 
					import BUILTIN_ATTRIBUTES = require('./builtin_attributes');
 | 
				
			||||||
 | 
					import BNote = require('../becca/entities/bnote');
 | 
				
			||||||
 | 
					import { AttributeRow } from '../becca/entities/rows';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ATTRIBUTE_TYPES = ['label', 'relation'];
 | 
					const ATTRIBUTE_TYPES = ['label', 'relation'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** @returns {BNote[]} */
 | 
					function getNotesWithLabel(name: string, value?: string): BNote[] {
 | 
				
			||||||
function getNotesWithLabel(name, value = undefined) {
 | 
					    const query = attributeFormatter.formatAttrForSearch({type: 'label', name, value}, value !== undefined);
 | 
				
			||||||
    const query = formatAttrForSearch({type: 'label', name, value}, value !== undefined);
 | 
					 | 
				
			||||||
    return searchService.searchNotes(query, {
 | 
					    return searchService.searchNotes(query, {
 | 
				
			||||||
        includeArchivedNotes: true,
 | 
					        includeArchivedNotes: true,
 | 
				
			||||||
        ignoreHoistedNote: true
 | 
					        ignoreHoistedNote: true
 | 
				
			||||||
@ -19,8 +20,7 @@ function getNotesWithLabel(name, value = undefined) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO: should be in search service
 | 
					// TODO: should be in search service
 | 
				
			||||||
/** @returns {BNote|null} */
 | 
					function getNoteWithLabel(name: string, value?: string): BNote | null {
 | 
				
			||||||
function getNoteWithLabel(name, value = undefined) {
 | 
					 | 
				
			||||||
    // optimized version (~20 times faster) without using normal search, useful for e.g., finding date notes
 | 
					    // optimized version (~20 times faster) without using normal search, useful for e.g., finding date notes
 | 
				
			||||||
    const attrs = becca.findAttributes('label', name);
 | 
					    const attrs = becca.findAttributes('label', name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -39,7 +39,7 @@ function getNoteWithLabel(name, value = undefined) {
 | 
				
			|||||||
    return null;
 | 
					    return null;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function createLabel(noteId, name, value = "") {
 | 
					function createLabel(noteId: string, name: string, value: string = "") {
 | 
				
			||||||
    return createAttribute({
 | 
					    return createAttribute({
 | 
				
			||||||
        noteId: noteId,
 | 
					        noteId: noteId,
 | 
				
			||||||
        type: 'label',
 | 
					        type: 'label',
 | 
				
			||||||
@ -48,7 +48,7 @@ function createLabel(noteId, name, value = "") {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function createRelation(noteId, name, targetNoteId) {
 | 
					function createRelation(noteId: string, name: string, targetNoteId: string) {
 | 
				
			||||||
    return createAttribute({
 | 
					    return createAttribute({
 | 
				
			||||||
        noteId: noteId,
 | 
					        noteId: noteId,
 | 
				
			||||||
        type: 'relation',
 | 
					        type: 'relation',
 | 
				
			||||||
@ -57,14 +57,14 @@ function createRelation(noteId, name, targetNoteId) {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function createAttribute(attribute) {
 | 
					function createAttribute(attribute: AttributeRow) {
 | 
				
			||||||
    return new BAttribute(attribute).save();
 | 
					    return new BAttribute(attribute).save();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getAttributeNames(type, nameLike) {
 | 
					function getAttributeNames(type: string, nameLike: string) {
 | 
				
			||||||
    nameLike = nameLike.toLowerCase();
 | 
					    nameLike = nameLike.toLowerCase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let names = sql.getColumn(
 | 
					    let names = sql.getColumn<string>(
 | 
				
			||||||
        `SELECT DISTINCT name 
 | 
					        `SELECT DISTINCT name 
 | 
				
			||||||
             FROM attributes 
 | 
					             FROM attributes 
 | 
				
			||||||
             WHERE isDeleted = 0
 | 
					             WHERE isDeleted = 0
 | 
				
			||||||
@ -98,11 +98,11 @@ function getAttributeNames(type, nameLike) {
 | 
				
			|||||||
    return names;
 | 
					    return names;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function isAttributeType(type) {
 | 
					function isAttributeType(type: string): boolean {
 | 
				
			||||||
    return ATTRIBUTE_TYPES.includes(type);
 | 
					    return ATTRIBUTE_TYPES.includes(type);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function isAttributeDangerous(type, name) {
 | 
					function isAttributeDangerous(type: string, name: string): boolean {
 | 
				
			||||||
    return BUILTIN_ATTRIBUTES.some(attr =>
 | 
					    return BUILTIN_ATTRIBUTES.some(attr =>
 | 
				
			||||||
        attr.type === type &&
 | 
					        attr.type === type &&
 | 
				
			||||||
        attr.name.toLowerCase() === name.trim().toLowerCase() &&
 | 
					        attr.name.toLowerCase() === name.trim().toLowerCase() &&
 | 
				
			||||||
@ -110,7 +110,7 @@ function isAttributeDangerous(type, name) {
 | 
				
			|||||||
    );
 | 
					    );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = {
 | 
					export = {
 | 
				
			||||||
    getNotesWithLabel,
 | 
					    getNotesWithLabel,
 | 
				
			||||||
    getNoteWithLabel,
 | 
					    getNoteWithLabel,
 | 
				
			||||||
    createLabel,
 | 
					    createLabel,
 | 
				
			||||||
@ -2,7 +2,7 @@ const log = require('./log');
 | 
				
			|||||||
const noteService = require('./notes');
 | 
					const noteService = require('./notes');
 | 
				
			||||||
const sql = require('./sql');
 | 
					const sql = require('./sql');
 | 
				
			||||||
const utils = require('./utils');
 | 
					const utils = require('./utils');
 | 
				
			||||||
const attributeService = require('./attributes.js');
 | 
					const attributeService = require('./attributes');
 | 
				
			||||||
const dateNoteService = require('./date_notes.js');
 | 
					const dateNoteService = require('./date_notes.js');
 | 
				
			||||||
const treeService = require('./tree.js');
 | 
					const treeService = require('./tree.js');
 | 
				
			||||||
const config = require('./config');
 | 
					const config = require('./config');
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
"use strict";
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const noteService = require('./notes');
 | 
					const noteService = require('./notes');
 | 
				
			||||||
const attributeService = require('./attributes.js');
 | 
					const attributeService = require('./attributes');
 | 
				
			||||||
const dateUtils = require('./date_utils');
 | 
					const dateUtils = require('./date_utils');
 | 
				
			||||||
const sql = require('./sql');
 | 
					const sql = require('./sql');
 | 
				
			||||||
const protectedSessionService = require('./protected_session');
 | 
					const protectedSessionService = require('./protected_session');
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@ const BAttribute = require('../../becca/entities/battribute');
 | 
				
			|||||||
const utils = require('../../services/utils');
 | 
					const utils = require('../../services/utils');
 | 
				
			||||||
const log = require('../../services/log');
 | 
					const log = require('../../services/log');
 | 
				
			||||||
const noteService = require('../../services/notes');
 | 
					const noteService = require('../../services/notes');
 | 
				
			||||||
const attributeService = require('../../services/attributes.js');
 | 
					const attributeService = require('../../services/attributes');
 | 
				
			||||||
const BBranch = require('../../becca/entities/bbranch');
 | 
					const BBranch = require('../../becca/entities/bbranch');
 | 
				
			||||||
const path = require('path');
 | 
					const path = require('path');
 | 
				
			||||||
const protectedSessionService = require('../protected_session');
 | 
					const protectedSessionService = require('../protected_session');
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ const cls = require('./cls');
 | 
				
			|||||||
const sqlInit = require('./sql_init');
 | 
					const sqlInit = require('./sql_init');
 | 
				
			||||||
const config = require('./config');
 | 
					const config = require('./config');
 | 
				
			||||||
const log = require('./log');
 | 
					const log = require('./log');
 | 
				
			||||||
const attributeService = require('../services/attributes.js');
 | 
					const attributeService = require('../services/attributes');
 | 
				
			||||||
const protectedSessionService = require('../services/protected_session');
 | 
					const protectedSessionService = require('../services/protected_session');
 | 
				
			||||||
const hiddenSubtreeService = require('./hidden_subtree');
 | 
					const hiddenSubtreeService = require('./hidden_subtree');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
const attributeService = require('./attributes.js');
 | 
					const attributeService = require('./attributes');
 | 
				
			||||||
const dateNoteService = require('./date_notes.js');
 | 
					const dateNoteService = require('./date_notes.js');
 | 
				
			||||||
const becca = require('../becca/becca');
 | 
					const becca = require('../becca/becca');
 | 
				
			||||||
const noteService = require('./notes');
 | 
					const noteService = require('./notes');
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@
 | 
				
			|||||||
require('../becca/entity_constructor');
 | 
					require('../becca/entity_constructor');
 | 
				
			||||||
const sqlInit = require('../services/sql_init');
 | 
					const sqlInit = require('../services/sql_init');
 | 
				
			||||||
const noteService = require('../services/notes');
 | 
					const noteService = require('../services/notes');
 | 
				
			||||||
const attributeService = require('../services/attributes.js');
 | 
					const attributeService = require('../services/attributes');
 | 
				
			||||||
const cls = require('../services/cls');
 | 
					const cls = require('../services/cls');
 | 
				
			||||||
const cloningService = require('../services/cloning.js');
 | 
					const cloningService = require('../services/cloning.js');
 | 
				
			||||||
const loremIpsum = require('lorem-ipsum').loremIpsum;
 | 
					const loremIpsum = require('lorem-ipsum').loremIpsum;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user