mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-08-10 18:39:22 +08:00
86 lines
2.8 KiB
TypeScript
86 lines
2.8 KiB
TypeScript
import becca from "../becca/becca.js";
|
|
import eu from "./etapi_utils.js";
|
|
import mappers from "./mappers.js";
|
|
import attributeService from "../services/attributes.js";
|
|
import v from "./validators.js";
|
|
import { Router } from "express";
|
|
import type { AttributeRow } from "../becca/entities/rows.js";
|
|
import type { ValidatorMap } from "./etapi-interface.js";
|
|
|
|
function register(router: Router) {
|
|
eu.route(router, "get", "/etapi/attributes/:attributeId", (req, res, next) => {
|
|
const attribute = eu.getAndCheckAttribute(req.params.attributeId);
|
|
|
|
res.json(mappers.mapAttributeToPojo(attribute));
|
|
});
|
|
|
|
const ALLOWED_PROPERTIES_FOR_CREATE_ATTRIBUTE: ValidatorMap = {
|
|
attributeId: [v.mandatory, v.notNull, v.isValidEntityId],
|
|
noteId: [v.mandatory, v.notNull, v.isNoteId],
|
|
type: [v.mandatory, v.notNull, v.isAttributeType],
|
|
name: [v.mandatory, v.notNull, v.isString],
|
|
value: [v.notNull, v.isString],
|
|
isInheritable: [v.notNull, v.isBoolean],
|
|
position: [v.notNull, v.isInteger]
|
|
};
|
|
|
|
eu.route(router, "post", "/etapi/attributes", (req, res, next) => {
|
|
if (req.body.type === "relation") {
|
|
eu.getAndCheckNote(req.body.value);
|
|
}
|
|
|
|
const _params = {};
|
|
eu.validateAndPatch(_params, req.body, ALLOWED_PROPERTIES_FOR_CREATE_ATTRIBUTE);
|
|
const params: AttributeRow = _params as AttributeRow;
|
|
|
|
try {
|
|
const attr = attributeService.createAttribute(params);
|
|
|
|
res.status(201).json(mappers.mapAttributeToPojo(attr));
|
|
} catch (e: any) {
|
|
throw new eu.EtapiError(500, eu.GENERIC_CODE, e.message);
|
|
}
|
|
});
|
|
|
|
const ALLOWED_PROPERTIES_FOR_PATCH_LABEL = {
|
|
value: [v.notNull, v.isString],
|
|
position: [v.notNull, v.isInteger]
|
|
};
|
|
|
|
const ALLOWED_PROPERTIES_FOR_PATCH_RELATION = {
|
|
position: [v.notNull, v.isInteger]
|
|
};
|
|
|
|
eu.route(router, "patch", "/etapi/attributes/:attributeId", (req, res, next) => {
|
|
const attribute = eu.getAndCheckAttribute(req.params.attributeId);
|
|
|
|
if (attribute.type === "label") {
|
|
eu.validateAndPatch(attribute, req.body, ALLOWED_PROPERTIES_FOR_PATCH_LABEL);
|
|
} else if (attribute.type === "relation") {
|
|
eu.getAndCheckNote(req.body.value);
|
|
|
|
eu.validateAndPatch(attribute, req.body, ALLOWED_PROPERTIES_FOR_PATCH_RELATION);
|
|
}
|
|
|
|
attribute.save();
|
|
|
|
res.json(mappers.mapAttributeToPojo(attribute));
|
|
});
|
|
|
|
eu.route(router, "delete", "/etapi/attributes/:attributeId", (req, res, next) => {
|
|
const attribute = becca.getAttribute(req.params.attributeId);
|
|
|
|
if (!attribute) {
|
|
return res.sendStatus(204);
|
|
}
|
|
|
|
attribute.markAsDeleted();
|
|
|
|
res.sendStatus(204);
|
|
});
|
|
}
|
|
|
|
export default {
|
|
register
|
|
};
|