Files
ERitors-Scribe-Desktop/electron/database/models/Incident.ts
natreex cf6fb97bf0 Add models for guidelines, incidents, plot points, issues, acts, and world data
- Introduced new models: `GuideLine`, `Incident`, `PlotPoint`, `Issue`, `Act`, and `World` for managing book-related entities.
- Integrated encryption/decryption for sensitive properties in all models using user-specific keys.
- Added methods for CRUD operations and synchronization workflows with error handling and multilingual support.
- Improved maintainability with JSDoc comments and streamlined queries.
2026-01-12 13:38:10 -05:00

106 lines
4.3 KiB
TypeScript

import { getUserEncryptionKey } from "../keyManager.js";
import System from "../System.js";
import { ActChapter } from "./Act.js";
import IncidentRepository, { IncidentQuery } from "../repositories/incident.repository.js";
export interface IncidentStory {
incidentTitle: string;
incidentSummary: string;
chapterSummary: string;
chapterGoal: string;
}
export interface SyncedIncident {
id: string;
name: string;
lastUpdate: number;
}
export interface IncidentProps {
incidentId: string;
title: string;
summary: string;
chapters?: ActChapter[];
}
export default class Incident {
/**
* Creates a new incident for a book.
* Encrypts the incident name and generates a hashed version for indexing.
* @param userId - The unique identifier of the user creating the incident
* @param bookId - The unique identifier of the book to add the incident to
* @param name - The plain text name of the incident
* @param lang - The language for error messages (defaults to 'fr')
* @param existingIncidentId - Optional existing incident ID to use instead of generating a new one
* @returns The unique identifier of the created incident
*/
public static addNewIncident(
userId: string,
bookId: string,
name: string,
lang: 'fr' | 'en' = 'fr',
existingIncidentId?: string
): string {
const userKey: string = getUserEncryptionKey(userId);
const encryptedName: string = System.encryptDataWithUserKey(name, userKey);
const hashedName: string = System.hashElement(name);
const incidentId: string = existingIncidentId || System.createUniqueId();
return IncidentRepository.insertNewIncident(incidentId, userId, bookId, encryptedName, hashedName, lang);
}
/**
* Retrieves all incidents for a specific book with their associated chapters.
* Decrypts incident titles and summaries using the user's encryption key.
* @param userId - The unique identifier of the user
* @param bookId - The unique identifier of the book
* @param actChapters - Array of chapters from acts to associate with incidents
* @param lang - The language for error messages (defaults to 'fr')
* @returns A promise resolving to an array of incident properties with decrypted data
*/
public static async getIncitentsIncidents(
userId: string,
bookId: string,
actChapters: ActChapter[],
lang: 'fr' | 'en' = 'fr'
): Promise<IncidentProps[]> {
const incidentQueryResults: IncidentQuery[] = IncidentRepository.fetchAllIncitentIncidents(userId, bookId, lang);
const incidents: IncidentProps[] = [];
const userKey: string = getUserEncryptionKey(userId);
if (incidentQueryResults.length > 0) {
for (const incidentRecord of incidentQueryResults) {
const associatedChapters: ActChapter[] = [];
for (const chapter of actChapters) {
if (chapter.incidentId === incidentRecord.incident_id) {
associatedChapters.push(chapter);
}
}
incidents.push({
incidentId: incidentRecord.incident_id,
title: incidentRecord.title ? System.decryptDataWithUserKey(incidentRecord.title, userKey) : '',
summary: incidentRecord.summary ? System.decryptDataWithUserKey(incidentRecord.summary, userKey) : '',
chapters: associatedChapters
});
}
}
return incidents;
}
/**
* Removes an incident from a book.
* @param userId - The unique identifier of the user
* @param bookId - The unique identifier of the book
* @param incidentId - The unique identifier of the incident to remove
* @param lang - The language for error messages (defaults to 'fr')
* @returns True if the incident was successfully deleted, false otherwise
*/
public static removeIncident(
userId: string,
bookId: string,
incidentId: string,
lang: 'fr' | 'en' = 'fr'
): boolean {
return IncidentRepository.deleteIncident(userId, bookId, incidentId, lang);
}
}