sunrise-cms/helpers/functions.cache.js

254 lines
9.3 KiB
JavaScript

// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable @typescript-eslint/init-declarations */
import cluster from 'node:cluster';
import Debug from 'debug';
import getBurialSiteStatusesFromDatabase from '../database/getBurialSiteStatuses.js';
import getBurialSiteTypesFromDatabase from '../database/getBurialSiteTypes.js';
import getCommittalTypesFromDatabase from '../database/getCommittalTypes.js';
import getContractTypeFieldsFromDatabase from '../database/getContractTypeFields.js';
import getContractTypesFromDatabase from '../database/getContractTypes.js';
import getIntermentContainerTypesFromDatabase from '../database/getIntermentContainerTypes.js';
import getWorkOrderMilestoneTypesFromDatabase from '../database/getWorkOrderMilestoneTypes.js';
import getWorkOrderTypesFromDatabase from '../database/getWorkOrderTypes.js';
import { DEBUG_NAMESPACE } from '../debug.config.js';
import { getConfigProperty } from './config.helpers.js';
const debug = Debug(`${DEBUG_NAMESPACE}:functions.cache:${process.pid}`);
/*
* Burial Site Statuses
*/
let burialSiteStatuses;
export async function getBurialSiteStatuses() {
if (burialSiteStatuses === undefined) {
burialSiteStatuses = await getBurialSiteStatusesFromDatabase();
}
return burialSiteStatuses;
}
export async function getBurialSiteStatusById(burialSiteStatusId) {
const cachedStatuses = await getBurialSiteStatuses();
return cachedStatuses.find((currentStatus) => currentStatus.burialSiteStatusId === burialSiteStatusId);
}
export async function getBurialSiteStatusByBurialSiteStatus(burialSiteStatus) {
const cachedStatuses = await getBurialSiteStatuses();
const statusLowerCase = burialSiteStatus.toLowerCase();
return cachedStatuses.find((currentStatus) => currentStatus.burialSiteStatus.toLowerCase() === statusLowerCase);
}
function clearBurialSiteStatusesCache() {
burialSiteStatuses = undefined;
}
/*
* Burial Site Types
*/
let burialSiteTypes;
export async function getBurialSiteTypes() {
if (burialSiteTypes === undefined) {
burialSiteTypes = await getBurialSiteTypesFromDatabase();
}
return burialSiteTypes;
}
export async function getBurialSiteTypeById(burialSiteTypeId) {
const cachedTypes = await getBurialSiteTypes();
return cachedTypes.find((currentType) => currentType.burialSiteTypeId === burialSiteTypeId);
}
export async function getBurialSiteTypesByBurialSiteType(burialSiteType) {
const cachedTypes = await getBurialSiteTypes();
const typeLowerCase = burialSiteType.toLowerCase();
return cachedTypes.find((currentType) => currentType.burialSiteType.toLowerCase() === typeLowerCase);
}
function clearBurialSiteTypesCache() {
burialSiteTypes = undefined;
}
/*
* Contract Types
*/
let contractTypes;
let allContractTypeFields;
export async function getContractTypes() {
if (contractTypes === undefined) {
contractTypes = await getContractTypesFromDatabase();
}
return contractTypes;
}
export async function getAllContractTypeFields() {
if (allContractTypeFields === undefined) {
allContractTypeFields = await getContractTypeFieldsFromDatabase();
}
return allContractTypeFields;
}
export async function getContractTypeById(contractTypeId) {
const cachedTypes = await getContractTypes();
return cachedTypes.find((currentType) => currentType.contractTypeId === contractTypeId);
}
export async function getContractTypeByContractType(contractTypeString) {
const cachedTypes = await getContractTypes();
const typeLowerCase = contractTypeString.toLowerCase();
return cachedTypes.find((currentType) => currentType.contractType.toLowerCase() === typeLowerCase);
}
export async function getContractTypePrintsById(contractTypeId) {
const contractType = await getContractTypeById(contractTypeId);
if (contractType?.contractTypePrints === undefined ||
contractType.contractTypePrints.length === 0) {
return [];
}
if (contractType.contractTypePrints.includes('*')) {
return getConfigProperty('settings.contracts.prints');
}
return contractType.contractTypePrints ?? [];
}
function clearContractTypesCache() {
contractTypes = undefined;
allContractTypeFields = undefined;
}
/*
* Interment Container Types
*/
let intermentContainerTypes;
export async function getIntermentContainerTypes() {
if (intermentContainerTypes === undefined) {
intermentContainerTypes = await getIntermentContainerTypesFromDatabase();
}
return intermentContainerTypes;
}
export async function getIntermentContainerTypeById(intermentContainerTypeId) {
const cachedContainerTypes = await getIntermentContainerTypes();
return cachedContainerTypes.find((currentContainerType) => currentContainerType.intermentContainerTypeId === intermentContainerTypeId);
}
function clearIntermentContainerTypesCache() {
intermentContainerTypes = undefined;
}
/*
* Committal Types
*/
let committalTypes;
export async function getCommittalTypes() {
if (committalTypes === undefined) {
committalTypes = await getCommittalTypesFromDatabase();
}
return committalTypes;
}
export async function getCommittalTypeById(committalTypeId) {
const cachedCommittalTypes = await getCommittalTypes();
return cachedCommittalTypes.find((currentCommittalType) => currentCommittalType.committalTypeId === committalTypeId);
}
function clearCommittalTypesCache() {
committalTypes = undefined;
}
/*
* Work Order Types
*/
let workOrderTypes;
export async function getWorkOrderTypes() {
if (workOrderTypes === undefined) {
workOrderTypes = await getWorkOrderTypesFromDatabase();
}
return workOrderTypes;
}
export async function getWorkOrderTypeById(workOrderTypeId) {
const cachedWorkOrderTypes = await getWorkOrderTypes();
return cachedWorkOrderTypes.find((currentWorkOrderType) => currentWorkOrderType.workOrderTypeId === workOrderTypeId);
}
function clearWorkOrderTypesCache() {
workOrderTypes = undefined;
}
/*
* Work Order Milestone Types
*/
let workOrderMilestoneTypes;
export async function getWorkOrderMilestoneTypes() {
if (workOrderMilestoneTypes === undefined) {
workOrderMilestoneTypes = await getWorkOrderMilestoneTypesFromDatabase();
}
return workOrderMilestoneTypes;
}
export async function getWorkOrderMilestoneTypeById(workOrderMilestoneTypeId) {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes();
return cachedWorkOrderMilestoneTypes.find((currentWorkOrderMilestoneType) => currentWorkOrderMilestoneType.workOrderMilestoneTypeId ===
workOrderMilestoneTypeId);
}
export async function getWorkOrderMilestoneTypeByWorkOrderMilestoneType(workOrderMilestoneTypeString) {
const cachedWorkOrderMilestoneTypes = await getWorkOrderMilestoneTypes();
const workOrderMilestoneTypeLowerCase = workOrderMilestoneTypeString.toLowerCase();
return cachedWorkOrderMilestoneTypes.find((currentWorkOrderMilestoneType) => currentWorkOrderMilestoneType.workOrderMilestoneType.toLowerCase() ===
workOrderMilestoneTypeLowerCase);
}
export async function preloadCaches() {
debug('Preloading caches');
await getBurialSiteStatuses();
await getBurialSiteTypes();
await getContractTypes();
await getCommittalTypes();
await getIntermentContainerTypes();
await getWorkOrderTypes();
await getWorkOrderMilestoneTypes();
}
export function clearCaches() {
clearBurialSiteStatusesCache();
clearBurialSiteTypesCache();
clearContractTypesCache();
clearCommittalTypesCache();
clearIntermentContainerTypesCache();
clearWorkOrderTypesCache();
clearWorkOrderMilestoneTypesCache();
}
function clearWorkOrderMilestoneTypesCache() {
workOrderMilestoneTypes = undefined;
}
export function clearCacheByTableName(tableName, relayMessage = true) {
switch (tableName) {
case 'BurialSiteStatuses': {
clearBurialSiteStatusesCache();
break;
}
case 'BurialSiteTypes':
case 'BurialSiteTypeFields': {
clearBurialSiteTypesCache();
break;
}
case 'ContractTypes':
case 'ContractTypeFields':
case 'ContractTypePrints': {
clearContractTypesCache();
break;
}
case 'IntermentContainerTypes': {
clearIntermentContainerTypesCache();
break;
}
case 'CommittalTypes': {
clearCommittalTypesCache();
break;
}
case 'WorkOrderMilestoneTypes': {
clearWorkOrderMilestoneTypesCache();
break;
}
case 'WorkOrderTypes': {
clearWorkOrderTypesCache();
break;
}
default: {
return;
}
}
try {
if (relayMessage && cluster.isWorker) {
const workerMessage = {
messageType: 'clearCache',
tableName,
timeMillis: Date.now(),
pid: process.pid
};
debug(`Sending clear cache from worker: ${tableName}`);
if (process.send !== undefined) {
process.send(workerMessage);
}
}
}
catch { }
}
process.on('message', (message) => {
if (message.messageType === 'clearCache' && message.pid !== process.pid) {
debug(`Clearing cache: ${message.tableName}`);
clearCacheByTableName(message.tableName, false);
}
});