import dotenv from "dotenv"; import { printJobModel } from "../../schemas/printjob.schema.js"; import { printSubJobModel } from "../../schemas/printsubjob.schema.js"; import log4js from "log4js"; import { printerModel } from "../../schemas/printer.schema.js"; import { filamentModel } from "../../schemas/filament.schema.js"; import { gcodeFileModel } from "../../schemas/gcodefile.schema.js"; dotenv.config(); const logger = log4js.getLogger("PrintJobs"); logger.level = process.env.LOG_LEVEL; const formatPrintersResponse = (printers) => { return printers.map((printer) => ({ id: printer.id, name: printer.name, link: `/production/printers/info?printerId=${printer.id}`, printer: printer, })); }; const formatJobsResponse = (jobs) => { return jobs.map((job) => ({ id: job.id, name: job.gcodeFile.name, link: `/production/printjobs/info?printJobId=${job.id}`, job: job, })); }; const formatFilamentsResponse = (filaments) => { return filaments.map((filament) => ({ id: filament.id, name: filament.name, link: `/management/filaments/info?filamentId=${filament.id}`, filament: filament, })); }; const formatGCodeFilesResponse = (gcodeFiles) => { return gcodeFiles.map((gcodeFile) => ({ id: gcodeFile.id, name: gcodeFile.name, link: `/management/gcodefiles/info?gcodeFileId=${gcodeFile.id}`, gcodeFile: gcodeFile, })); }; export const getSpotlightRouteHandler = async (req, res) => { try { const query = req.params.query; if (query.length <= 4) { res.status(200).send([]); return; } const prefix = query.substring(0, 3); const delimiter = query.substring(3, 4); const suffix = query.substring(4); if (delimiter == ":") { switch (prefix) { case "PRN": const printer = await printerModel.findOne({ id: suffix }); if (!printer) { res.status(404).send({ error: "Job not found" }); } else { res.status(200).send(formatPrintersResponse([printer])); } break; case "JOB": const job = await printJobModel .findOne({ _id: suffix }) .populate("gcodeFile", "name"); if (!job) { res.status(404).send({ error: "Job not found" }); } else { res.status(200).send(formatJobsResponse([job])); } break; case "FIL": const filament = await filamentModel.findOne({ _id: suffix }); if (!filament) { res.status(404).send({ error: "Filament not found" }); } else { res.status(200).send(formatFilamentsResponse([filament])); } break; case "GCF": const gcodeFile = await gcodeFileModel.findOne({ _id: suffix }); if (!gcodeFile) { res.status(404).send({ error: "Filament not found" }); } else { res.status(200).send(formatGCodeFilesResponse([gcodeFile])); } break; case "SBJ": const subJob = await printSubJobModel.findOne({ id: suffix }); if (!subJob) { res.status(404).send({ error: "SubJob not found" }); } else { res.status(200).send([subJob]); } break; default: res.status(400).send({ error: "Invalid prefix" }); } } } catch (error) { logger.error("Error listing print jobs:", error); res.status(500).send({ error: error }); } };