Files
ERitors-Scribe-Desktop/electron/database/models/SeriesLocation.ts
natreex 209dc6f85a Remove CharacterComponent and CharacterDetail components
- Deleted `CharacterComponent` and `CharacterDetail` files from the project.
- Refactored related logic to improve code maintainability and reduce redundancy.
2026-02-05 14:12:08 -05:00

171 lines
8.1 KiB
TypeScript

import { getUserEncryptionKey } from "../keyManager.js";
import System from "../System.js";
import SeriesLocationRepo, { SeriesLocationResult, SeriesLocationElementResult, SeriesLocationSubElementResult } from "../repositories/series-location.repo.js";
import RemovedItem from "./RemovedItem.js";
export interface SeriesLocationSubElementProps {
id: string;
name: string;
description: string;
}
export interface SeriesLocationElementProps {
id: string;
name: string;
description: string;
subElements: SeriesLocationSubElementProps[];
}
export interface SeriesLocationListProps {
id: string;
name: string;
elements: SeriesLocationElementProps[];
}
export default class SeriesLocation {
/**
* Retrieves all locations for a series with their elements and sub-elements.
* @param userId - The unique identifier of the user
* @param seriesId - The unique identifier of the series
* @param lang - The language for error messages ('fr' or 'en')
* @returns The list of locations
*/
public static getLocationList(userId: string, seriesId: string, lang: 'fr' | 'en' = 'fr'): SeriesLocationListProps[] {
const userKey: string = getUserEncryptionKey(userId);
const locationsResult: SeriesLocationResult[] = SeriesLocationRepo.fetchLocations(userId, seriesId, lang);
return locationsResult.map((loc): SeriesLocationListProps => {
const elementsResult: SeriesLocationElementResult[] = SeriesLocationRepo.fetchElements(userId, loc.loc_id, lang);
const elements: SeriesLocationElementProps[] = elementsResult.map((elem): SeriesLocationElementProps => {
const subElementsResult: SeriesLocationSubElementResult[] = SeriesLocationRepo.fetchSubElements(userId, elem.element_id, lang);
const subElements: SeriesLocationSubElementProps[] = subElementsResult.map((sub): SeriesLocationSubElementProps => ({
id: sub.sub_element_id,
name: sub.sub_elem_name ? System.decryptDataWithUserKey(sub.sub_elem_name, userKey) : '',
description: sub.sub_elem_description ? System.decryptDataWithUserKey(sub.sub_elem_description, userKey) : ''
}));
return {
id: elem.element_id,
name: elem.element_name ? System.decryptDataWithUserKey(elem.element_name, userKey) : '',
description: elem.element_description ? System.decryptDataWithUserKey(elem.element_description, userKey) : '',
subElements
};
});
return {
id: loc.loc_id,
name: loc.loc_name ? System.decryptDataWithUserKey(loc.loc_name, userKey) : '',
elements
};
});
}
/**
* Adds a new location section to a series.
* @param userId - The unique identifier of the user
* @param seriesId - The unique identifier of the series
* @param name - The name of the location
* @param lang - The language for error messages ('fr' or 'en')
* @returns The new location ID
*/
public static addLocationSection(userId: string, seriesId: string, name: string, lang: 'fr' | 'en' = 'fr'): string {
const userKey: string = getUserEncryptionKey(userId);
const locationId: string = System.createUniqueId();
const encryptedName: string = System.encryptDataWithUserKey(name, userKey);
const originalName: string = System.hashElement(name);
SeriesLocationRepo.insertLocation(locationId, seriesId, userId, encryptedName, originalName, lang);
return locationId;
}
/**
* Adds a new element to a location.
* @param userId - The unique identifier of the user
* @param locationId - The unique identifier of the location
* @param name - The name of the element
* @param lang - The language for error messages ('fr' or 'en')
* @param description - The description of the element (optional)
* @returns The new element ID
*/
public static addElement(userId: string, locationId: string, name: string, lang: 'fr' | 'en' = 'fr', description?: string): string {
const userKey: string = getUserEncryptionKey(userId);
const elementId: string = System.createUniqueId();
const encryptedName: string = System.encryptDataWithUserKey(name, userKey);
const originalName: string = System.hashElement(name);
const encryptedDescription: string | null = description ? System.encryptDataWithUserKey(description, userKey) : null;
SeriesLocationRepo.insertElement(elementId, locationId, userId, encryptedName, originalName, encryptedDescription, lang);
return elementId;
}
/**
* Adds a new sub-element to an element.
* @param userId - The unique identifier of the user
* @param elementId - The unique identifier of the element
* @param name - The name of the sub-element
* @param lang - The language for error messages ('fr' or 'en')
* @param description - The description of the sub-element (optional)
* @returns The new sub-element ID
*/
public static addSubElement(userId: string, elementId: string, name: string, lang: 'fr' | 'en' = 'fr', description?: string): string {
const userKey: string = getUserEncryptionKey(userId);
const subElementId: string = System.createUniqueId();
const encryptedName: string = System.encryptDataWithUserKey(name, userKey);
const originalName: string = System.hashElement(name);
const encryptedDescription: string | null = description ? System.encryptDataWithUserKey(description, userKey) : null;
SeriesLocationRepo.insertSubElement(subElementId, elementId, userId, encryptedName, originalName, encryptedDescription, lang);
return subElementId;
}
/**
* Deletes a location section.
* @param userId - The unique identifier of the user
* @param locationId - The unique identifier of the location
* @param deletedAt - The timestamp of deletion
* @param lang - The language for error messages ('fr' or 'en')
* @returns True if successful
*/
public static deleteLocation(userId: string, locationId: string, deletedAt: number = System.timeStampInSeconds(), lang: 'fr' | 'en' = 'fr'): boolean {
const deleted: boolean = SeriesLocationRepo.deleteLocation(userId, locationId, lang);
if (deleted) {
RemovedItem.deleteTracker(userId, null, 'series_locations', locationId, deletedAt, lang);
}
return deleted;
}
/**
* Deletes an element.
* @param userId - The unique identifier of the user
* @param elementId - The unique identifier of the element
* @param deletedAt - The timestamp of deletion
* @param lang - The language for error messages ('fr' or 'en')
* @returns True if successful
*/
public static deleteElement(userId: string, elementId: string, deletedAt: number = System.timeStampInSeconds(), lang: 'fr' | 'en' = 'fr'): boolean {
const deleted: boolean = SeriesLocationRepo.deleteElement(userId, elementId, lang);
if (deleted) {
RemovedItem.deleteTracker(userId, null, 'series_location_elements', elementId, deletedAt, lang);
}
return deleted;
}
/**
* Deletes a sub-element.
* @param userId - The unique identifier of the user
* @param subElementId - The unique identifier of the sub-element
* @param deletedAt - The timestamp of deletion
* @param lang - The language for error messages ('fr' or 'en')
* @returns True if successful
*/
public static deleteSubElement(userId: string, subElementId: string, deletedAt: number = System.timeStampInSeconds(), lang: 'fr' | 'en' = 'fr'): boolean {
const deleted: boolean = SeriesLocationRepo.deleteSubElement(userId, subElementId, lang);
if (deleted) {
RemovedItem.deleteTracker(userId, null, 'series_location_sub_elements', subElementId, deletedAt, lang);
}
return deleted;
}
}