Notes/apps/client/src/test/easy-froca.ts
2025-04-22 22:12:56 +03:00

98 lines
2.8 KiB
TypeScript

import utils from "../services/utils.js";
import FNote from "../entities/fnote.js";
import froca from "../services/froca.js";
import FAttribute from "../entities/fattribute.js";
import noteAttributeCache from "../services/note_attribute_cache.js";
type AttributeDefinitions = { [key in `#${string}`]: string; };
type RelationDefinitions = { [key in `~${string}`]: string; };
interface NoteDefinition extends AttributeDefinitions, RelationDefinitions {
id?: string | undefined;
title: string;
}
/**
* Creates the given notes with the given title and optionally one or more attributes.
*
* For a label to be created, simply pass on a key prefixed with `#` and any desired value.
*
* The notes and attributes will be injected in the froca.
*
* @param notes
* @returns an array containing the IDs of the created notes.
* @example
* buildNotes([
* { title: "A", "#startDate": "2025-05-05" },
* { title: "B", "#startDate": "2025-05-07" }
* ]);
*/
export function buildNotes(notes: NoteDefinition[]) {
const ids = [];
for (const noteDef of notes) {
ids.push(buildNote(noteDef).noteId);
}
return ids;
}
export function buildNote(noteDef: NoteDefinition) {
const note = new FNote(froca, {
noteId: noteDef.id ?? utils.randomString(12),
title: noteDef.title,
type: "text",
mime: "text/html",
isProtected: false,
blobId: ""
});
froca.notes[note.noteId] = note;
let position = 0;
for (const [ key, value ] of Object.entries(noteDef)) {
const attributeId = utils.randomString(12);
const name = key.substring(1);
let attribute: FAttribute | null = null;
if (key.startsWith("#")) {
attribute = new FAttribute(froca, {
noteId: note.noteId,
attributeId,
type: "label",
name,
value,
position,
isInheritable: false
});
}
if (key.startsWith("~")) {
attribute = new FAttribute(froca, {
noteId: note.noteId,
attributeId,
type: "relation",
name,
value,
position,
isInheritable: false
});
}
if (!attribute) {
continue;
}
froca.attributes[attributeId] = attribute;
note.attributes.push(attributeId);
position++;
// Inject the attribute into the note attribute cache, since FNote.getAttribute() doesn't always work.
// If we add support for templates into froca, this might cause issues.
if (!noteAttributeCache.attributes[note.noteId]) {
noteAttributeCache.attributes[note.noteId] = [];
}
noteAttributeCache.attributes[note.noteId].push(attribute);
}
return note;
}