Added ref spotlight lookup.

This commit is contained in:
Tom Butcher 2025-12-03 13:11:53 +00:00
parent 944ad34f89
commit 7a947ed2fd
2 changed files with 79 additions and 30 deletions

View File

@ -26,32 +26,67 @@ import { courierModel } from '../../schemas/management/courier.schema.js';
// Map prefixes to models and id fields
const PREFIX_MODEL_MAP = {
PRN: { model: printerModel, idField: '_id', type: 'printer' },
FIL: { model: filamentModel, idField: '_id', type: 'filament' },
GCF: { model: gcodeFileModel, idField: '_id', type: 'gcodeFile' },
JOB: { model: jobModel, idField: '_id', type: 'job' },
PRT: { model: partModel, idField: '_id', type: 'part' },
PRD: { model: productModel, idField: '_id', type: 'product' },
VEN: { model: vendorModel, idField: '_id', type: 'vendor' },
SJB: { model: subJobModel, idField: '_id', type: 'subJob' },
FLS: { model: filamentStockModel, idField: '_id', type: 'filamentStock' },
SEV: { model: stockEventModel, idField: '_id', type: 'stockEvent' },
SAU: { model: stockAuditModel, idField: '_id', type: 'stockAudit' },
PTS: { model: partStockModel, idField: '_id', type: 'partStock' },
PDS: { model: null, idField: '_id', type: 'productStock' }, // No productStockModel found
ADL: { model: auditLogModel, idField: '_id', type: 'auditLog' },
USR: { model: userModel, idField: '_id', type: 'user' },
NTY: { model: noteTypeModel, idField: '_id', type: 'noteType' },
NTE: { model: noteModel, idField: '_id', type: 'note' },
DSZ: { model: documentSizeModel, idField: '_id', type: 'documentSize' },
DTP: { model: documentTemplateModel, idField: '_id', type: 'documentTemplate' },
DPR: { model: documentPrinterModel, idField: '_id', type: 'documentPrinter' },
DJB: { model: documentJobModel, idField: '_id', type: 'documentJob' },
HST: { model: hostModel, idField: '_id', type: 'host' },
FLE: { model: fileModel, idField: '_id', type: 'file' },
POR: { model: purchaseOrderModel, idField: '_id', type: 'purchaseOrder' },
COS: { model: courierServiceModel, idField: '_id', type: 'courierService' },
COR: { model: courierModel, idField: '_id', type: 'courier' },
PRN: { model: printerModel, idField: '_id', type: 'printer', referenceField: '_reference' },
FIL: { model: filamentModel, idField: '_id', type: 'filament', referenceField: '_reference' },
GCF: { model: gcodeFileModel, idField: '_id', type: 'gcodeFile', referenceField: '_reference' },
JOB: { model: jobModel, idField: '_id', type: 'job', referenceField: '_reference' },
PRT: { model: partModel, idField: '_id', type: 'part', referenceField: '_reference' },
PRD: { model: productModel, idField: '_id', type: 'product', referenceField: '_reference' },
VEN: { model: vendorModel, idField: '_id', type: 'vendor', referenceField: '_reference' },
SJB: { model: subJobModel, idField: '_id', type: 'subJob', referenceField: '_reference' },
FLS: {
model: filamentStockModel,
idField: '_id',
type: 'filamentStock',
referenceField: '_reference',
},
SEV: { model: stockEventModel, idField: '_id', type: 'stockEvent', referenceField: '_reference' },
SAU: { model: stockAuditModel, idField: '_id', type: 'stockAudit', referenceField: '_reference' },
PTS: { model: partStockModel, idField: '_id', type: 'partStock', referenceField: '_reference' },
PDS: { model: null, idField: '_id', type: 'productStock', referenceField: '_reference' }, // No productStockModel found
ADL: { model: auditLogModel, idField: '_id', type: 'auditLog', referenceField: '_reference' },
USR: { model: userModel, idField: '_id', type: 'user', referenceField: '_reference' },
NTY: { model: noteTypeModel, idField: '_id', type: 'noteType', referenceField: '_reference' },
NTE: { model: noteModel, idField: '_id', type: 'note', referenceField: '_reference' },
DSZ: {
model: documentSizeModel,
idField: '_id',
type: 'documentSize',
referenceField: '_reference',
},
DTP: {
model: documentTemplateModel,
idField: '_id',
type: 'documentTemplate',
referenceField: '_reference',
},
DPR: {
model: documentPrinterModel,
idField: '_id',
type: 'documentPrinter',
referenceField: '_reference',
},
DJB: {
model: documentJobModel,
idField: '_id',
type: 'documentJob',
referenceField: '_reference',
},
HST: { model: hostModel, idField: '_id', type: 'host', referenceField: '_reference' },
FLE: { model: fileModel, idField: '_id', type: 'file', referenceField: '_reference' },
POR: {
model: purchaseOrderModel,
idField: '_id',
type: 'purchaseOrder',
referenceField: '_reference',
},
COS: {
model: courierServiceModel,
idField: '_id',
type: 'courierService',
referenceField: '_reference',
},
COR: { model: courierModel, idField: '_id', type: 'courier', referenceField: '_reference' },
};
/**

View File

@ -60,7 +60,7 @@ export const getSpotlightRouteHandler = async (req, res) => {
res.status(200).send([]);
return;
}
const prefix = query.substring(0, 3);
const prefix = query.substring(0, 3).toUpperCase();
const delimiter = query.substring(3, 4);
const suffix = query.substring(4);
@ -72,18 +72,32 @@ export const getSpotlightRouteHandler = async (req, res) => {
res.status(400).send({ error: 'Invalid or unsupported prefix' });
return;
}
const { model, idField, type } = prefixEntry;
const { model, idField, type, referenceField } = prefixEntry;
const suffixLength = suffix.length;
// Validate ObjectId if the idField is '_id'
if (idField === '_id' && !mongoose.Types.ObjectId.isValid(suffix)) {
if (
idField === '_id' &&
referenceField === '_reference' &&
!mongoose.Types.ObjectId.isValid(suffix) &&
suffixLength != 12
) {
res.status(200).send([]);
return;
}
// Find the object by the correct field
const queryObj = {};
queryObj[idField] = suffix.toLowerCase();
if (suffixLength == 12) {
queryObj[referenceField] = suffix.toUpperCase();
} else {
queryObj[idField] = suffix.toLowerCase();
}
let doc = await model.findOne(queryObj).lean();
if (!doc) {
res.status(200).send([]);
return;