mirror of
				https://github.com/zadam/trilium.git
				synced 2025-11-04 13:39:01 +01:00 
			
		
		
		
	etapi fixes + basic test
This commit is contained in:
		
							parent
							
								
									e8acf3f9f3
								
							
						
					
					
						commit
						e3114e0602
					
				@ -3,6 +3,12 @@ const utils = require("../../services/utils");
 | 
			
		||||
const noteService = require("../../services/notes");
 | 
			
		||||
const attributeService = require("../../services/attributes");
 | 
			
		||||
const Branch = require("../../becca/entities/branch");
 | 
			
		||||
const cls = require("../../services/cls.js");
 | 
			
		||||
const sql = require("../../services/sql.js");
 | 
			
		||||
const log = require("../../services/log.js");
 | 
			
		||||
const entityChangesService = require("../../services/entity_changes.js");
 | 
			
		||||
const sqlInit = require("../../services/sql_init.js");
 | 
			
		||||
const passwordService = require("../../services/password.js");
 | 
			
		||||
 | 
			
		||||
const GENERIC_CODE = "GENERIC";
 | 
			
		||||
 | 
			
		||||
@ -29,8 +35,43 @@ function sendAttributeNotFoundError(res, attributeId) {
 | 
			
		||||
    return sendError(res, 404, "ATTRIBUTE_NOT_FOUND",`Attribute ${attributeId} not found`);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO:
 | 
			
		||||
// * add date/month/year functions
 | 
			
		||||
 | 
			
		||||
function checkEtapiAuth(req, res, next) {
 | 
			
		||||
    if (false) {
 | 
			
		||||
        sendError(res, 401, "NOT_AUTHENTICATED", "Not authenticated");
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        next();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function register(router) {
 | 
			
		||||
    router.get('/etapi/notes/:noteId', (req, res, next) => {
 | 
			
		||||
    function route(method, path, routeHandler) {
 | 
			
		||||
        router[method](path, checkEtapiAuth, (req, res, next) => {
 | 
			
		||||
            try {
 | 
			
		||||
                cls.namespace.bindEmitter(req);
 | 
			
		||||
                cls.namespace.bindEmitter(res);
 | 
			
		||||
 | 
			
		||||
                cls.init(() => {
 | 
			
		||||
                    cls.set('sourceId', "etapi");
 | 
			
		||||
                    cls.set('localNowDateTime', req.headers['trilium-local-now-datetime']);
 | 
			
		||||
 | 
			
		||||
                    const cb = () => routeHandler(req, res, next);
 | 
			
		||||
 | 
			
		||||
                    return sql.transactional(cb);
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            catch (e) {
 | 
			
		||||
                log.error(`${method} ${path} threw exception: ` + e.stack);
 | 
			
		||||
 | 
			
		||||
                res.status(500).send(e.message);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    route('get', '/etapi/notes/:noteId', (req, res, next) => {
 | 
			
		||||
        const {noteId} = req.params;
 | 
			
		||||
        const note = becca.getNote(noteId);
 | 
			
		||||
 | 
			
		||||
@ -41,7 +82,7 @@ function register(router) {
 | 
			
		||||
        res.json(mapNoteToPojo(note));
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    router.get('/etapi/notes/:noteId/content', (req, res, next) => {
 | 
			
		||||
    route('get', '/etapi/notes/:noteId/content', (req, res, next) => {
 | 
			
		||||
        const {noteId} = req.params;
 | 
			
		||||
        const note = becca.getNote(noteId);
 | 
			
		||||
 | 
			
		||||
@ -59,7 +100,7 @@ function register(router) {
 | 
			
		||||
        res.send(note.getContent());
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    router.get('/etapi/branches/:branchId', (req, res, next) => {
 | 
			
		||||
    route('get', '/etapi/branches/:branchId', (req, res, next) => {
 | 
			
		||||
        const {branchId} = req.params;
 | 
			
		||||
        const branch = becca.getBranch(branchId);
 | 
			
		||||
 | 
			
		||||
@ -70,7 +111,7 @@ function register(router) {
 | 
			
		||||
        res.json(mapBranchToPojo(branch));
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    router.get('/etapi/attributes/:attributeId', (req, res, next) => {
 | 
			
		||||
    route('get', '/etapi/attributes/:attributeId', (req, res, next) => {
 | 
			
		||||
        const {attributeId} = req.params;
 | 
			
		||||
        const attribute = becca.getAttribute(attributeId);
 | 
			
		||||
 | 
			
		||||
@ -81,7 +122,7 @@ function register(router) {
 | 
			
		||||
        res.json(mapAttributeToPojo(attribute));
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    router.post('/etapi/notes', (req, res, next) => {
 | 
			
		||||
    route('post' ,'/etapi/notes', (req, res, next) => {
 | 
			
		||||
        const params = req.body;
 | 
			
		||||
 | 
			
		||||
        if (!becca.getNote(params.parentNoteId)) {
 | 
			
		||||
@ -101,7 +142,7 @@ function register(router) {
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    router.post('/etapi/branches', (req, res, next) => {
 | 
			
		||||
    route('post' ,'/etapi/branches', (req, res, next) => {
 | 
			
		||||
        const params = req.body;
 | 
			
		||||
 | 
			
		||||
        if (!becca.getNote(params.noteId)) {
 | 
			
		||||
@ -132,7 +173,7 @@ function register(router) {
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    router.post('/etapi/attributes', (req, res, next) => {
 | 
			
		||||
    route('post' ,'/etapi/attributes', (req, res, next) => {
 | 
			
		||||
        const params = req.body;
 | 
			
		||||
 | 
			
		||||
        if (!becca.getNote(params.noteId)) {
 | 
			
		||||
 | 
			
		||||
@ -134,18 +134,18 @@ function BackendScriptApi(currentNote, apiParams) {
 | 
			
		||||
    this.getNoteWithLabel = attributeService.getNoteWithLabel;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If there's no branch between note and parent note, create one. Otherwise do nothing.
 | 
			
		||||
     * If there's no branch between note and parent note, create one. Otherwise, do nothing.
 | 
			
		||||
     *
 | 
			
		||||
     * @method
 | 
			
		||||
     * @param {string} noteId
 | 
			
		||||
     * @param {string} parentNoteId
 | 
			
		||||
     * @param {string} prefix - if branch will be create between note and parent note, set this prefix
 | 
			
		||||
     * @param {string} prefix - if branch will be created between note and parent note, set this prefix
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    this.ensureNoteIsPresentInParent = cloningService.ensureNoteIsPresentInParent;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If there's a branch between note and parent note, remove it. Otherwise do nothing.
 | 
			
		||||
     * If there's a branch between note and parent note, remove it. Otherwise, do nothing.
 | 
			
		||||
     *
 | 
			
		||||
     * @method
 | 
			
		||||
     * @param {string} noteId
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										39
									
								
								test-etapi/create-note.http
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								test-etapi/create-note.http
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
			
		||||
POST {{triliumHost}}/etapi/notes
 | 
			
		||||
Content-Type: application/json
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  "parentNoteId": "root",
 | 
			
		||||
  "title": "Hello",
 | 
			
		||||
  "type": "text",
 | 
			
		||||
  "content": "Hi there!"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
> {%
 | 
			
		||||
    client.test("Request executed successfully", function() {
 | 
			
		||||
        client.assert(response.status === 200, "Response status is not 200");
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    client.global.set("createdNoteId", response.body.note.noteId);
 | 
			
		||||
    client.global.set("createdBranchId", response.body.note.branchId);
 | 
			
		||||
%}
 | 
			
		||||
 | 
			
		||||
###
 | 
			
		||||
 | 
			
		||||
POST {{triliumHost}}/etapi/attributes
 | 
			
		||||
Content-Type: application/json
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  "noteId": "{{createdNoteId}}",
 | 
			
		||||
  "type": "label",
 | 
			
		||||
  "name": "mylabel",
 | 
			
		||||
  "value": "val",
 | 
			
		||||
  "isInheritable": "true"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
> {%
 | 
			
		||||
    client.test("Request executed successfully", function() {
 | 
			
		||||
        client.assert(response.status === 200, "Response status is not 200");
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    client.global.set("createdAttributeId", response.body.attributeId);
 | 
			
		||||
%}
 | 
			
		||||
							
								
								
									
										5
									
								
								test-etapi/http-client.env.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								test-etapi/http-client.env.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
  "dev": {
 | 
			
		||||
    "triliumHost": "http://localhost:37740"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user