@iservice365/module-hygiene 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/index.d.ts +98 -271
- package/dist/index.js +1042 -2384
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1135 -2496
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/models/hygiene-area.model.ts","../src/repositories/hygiene-area.repository.ts","../src/services/hygiene-area.service.ts","../src/controllers/hygiene-area.controller.ts","../src/utils/convert-excel.util.ts","../src/models/hygiene-toilet-location.model.ts","../src/repositories/hygiene-toilet-location.repository.ts","../src/services/hygiene-toilet-location.service.ts","../src/controllers/hygiene-toilet-location.controller.ts","../src/models/hygiene-parent-checklist.model.ts","../src/repositories/hygiene-parent-checklist.repository.ts","../src/controllers/hygiene-parent-checklist.controller.ts","../src/models/hygiene-unit.model.ts","../src/services/hygiene-unit.service.ts","../src/repositories/hygiene-unit.repository.ts","../src/controllers/hygiene-unit.controller.ts","../src/models/hygiene-schedule-task-area.model.ts","../src/repositories/hygiene-schedule-task-area.repository.ts","../src/services/hygiene-schedule-task-area.service.ts","../src/controllers/hygiene-schedule-task-area.controller.ts","../src/models/hygiene-area-checklist.model.ts","../src/repositories/hygiene-area-checklist.repository.ts","../src/controllers/hygiene-area-checklist.controller.ts","../src/services/hygiene-area-checklist.service.ts","../src/models/hygiene-unit-checklist.model.ts","../src/repositories/hygiene-unit-checklist.repository.ts","../src/controllers/hygiene-unit-checklist.controller.ts","../src/services/hygiene-unit-checklist.service.ts"],"sourcesContent":["import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport interface TManageAreaChecklist {\n _id: string | ObjectId;\n name: string;\n}\n\nexport type TArea = {\n _id?: ObjectId;\n name: string;\n site?: string | ObjectId;\n createdBy?: string | ObjectId;\n checklist?: TManageAreaChecklist[];\n status?: string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n};\n\nexport type TAreaUpdate = Pick<TArea, \"name\">;\nexport type TAreaUpdateChecklist = NonNullable<Pick<TArea, \"checklist\">>;\n\nexport const areaSchema = Joi.object({\n name: Joi.string().required(),\n site: Joi.string().hex().required(),\n createdBy: Joi.string().hex().required(),\n checklist: Joi.array()\n .items(\n Joi.object({\n _id: Joi.string().hex().required(),\n name: Joi.string().required(),\n })\n )\n .optional(),\n});\n\nexport function MArea(value: TArea) {\n const { error } = areaSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Area Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n if (value.checklist && Array.isArray(value.checklist)) {\n value.checklist = value.checklist.map((item) => {\n try {\n return {\n ...item,\n _id: new ObjectId(item._id),\n };\n } catch (error) {\n throw new BadRequestError(\n `Invalid checklist item ID format: ${item._id}`\n );\n }\n });\n }\n\n return {\n name: value.name,\n site: value.site,\n createdBy: value.createdBy,\n checklist: value.checklist,\n status: value.status ?? \"active\",\n createdAt: new Date(),\n updatedAt: value.updatedAt ?? \"\",\n deletedAt: value.deletedAt ?? \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MArea,\n TArea,\n TAreaUpdate,\n TAreaUpdateChecklist,\n} from \"../models/hygiene-area.model\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n NotFoundError,\n} from \"@iservice365/node-server-utils\";\n\nexport function useAreaRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"hygiene-areas\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { createdBy: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on hygiene area.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene area.\"\n );\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { name: 1, site: 1, deletedAt: 1 },\n { unique: true }\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene area.\"\n );\n }\n }\n\n async function createArea(value: TArea, session?: ClientSession) {\n try {\n value = MArea(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function getAreas({\n page = 1,\n limit = 10,\n search = \"\",\n startDate = \"\",\n endDate = \"\",\n site = \"\",\n }: {\n page?: number;\n limit?: number;\n search?: string;\n startDate?: Date | string;\n endDate?: Date | string;\n site?: ObjectId | string;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n if (site) {\n try {\n site = new ObjectId(site);\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n if (startDate && endDate) {\n query.createdAt = {\n $gte: new Date(startDate),\n $lte: new Date(endDate),\n };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n } else if (startDate) {\n query.createdAt = { $gte: new Date(startDate) };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n } else if (endDate) {\n query.createdAt = { $lte: new Date(endDate) };\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $lookup: {\n from: \"sites\",\n localField: \"site\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"site\",\n },\n },\n {\n $unwind: {\n path: \"$site\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $lookup: {\n from: \"users\",\n localField: \"createdBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"createdBy\",\n },\n },\n {\n $unwind: {\n path: \"$createdBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n site: \"$site._id\",\n siteName: \"$site.name\",\n createdByName: \"$createdBy.name\",\n checklist: 1,\n status: 1,\n createdAt: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n const query: Record<string, any> = {\n _id,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const data = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n checklist: 1,\n },\n },\n ])\n .toArray();\n\n if (!data || !data.length) {\n throw new NotFoundError(\"Area not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n return data[0];\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaByName(name: string, site?: string | ObjectId) {\n try {\n if (site) site = new ObjectId(site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n try {\n return await collection.findOne({\n name: { $regex: new RegExp(`^${name}$`, \"i\") },\n ...(site && { site }),\n });\n } catch (error: any) {\n throw new BadRequestError(\"Unable to fetch area by name.\");\n }\n }\n\n async function updateArea(_id: string | ObjectId, value: TAreaUpdate) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function updateAreaChecklist(\n _id: string | ObjectId,\n value: TAreaUpdateChecklist\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n if (value.checklist && Array.isArray(value.checklist)) {\n value.checklist = value.checklist.map((item) => {\n try {\n return {\n ...item,\n _id: new ObjectId(item._id),\n };\n } catch (error) {\n throw new BadRequestError(\n `Invalid checklist item ID format: ${item._id}`\n );\n }\n });\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n async function deleteArea(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session }\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUniqueIndex,\n createArea,\n getAreas,\n getAreaById,\n getAreaByName,\n updateArea,\n updateAreaChecklist,\n deleteArea,\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport {\n BadRequestError,\n logger,\n NotFoundError,\n useAtlas,\n} from \"@iservice365/node-server-utils\";\nimport { useAreaRepository } from \"../repositories/hygiene-area.repository\";\n\nexport function useAreaService() {\n const { createArea: _createArea } = useAreaRepository();\n\n async function uploadByFile({\n dataJson,\n createdBy,\n site,\n }: {\n dataJson: string;\n createdBy: string | ObjectId;\n site: string | ObjectId;\n }) {\n let dataArray: any[];\n try {\n dataArray = JSON.parse(dataJson);\n } catch (error) {\n throw new BadRequestError(\"Invalid JSON format for data in excel\");\n }\n\n if (!dataArray || dataArray.length === 0) {\n throw new NotFoundError(\"No data found in the uploaded file\");\n }\n\n const session = useAtlas.getClient()?.startSession();\n const insertedAreaIds: ObjectId[] = [];\n\n try {\n session?.startTransaction();\n\n for (const row of dataArray) {\n if (!row?.AREA_NAME) {\n logger.warn(\"Skipping row with missing AREA_NAME:\", row);\n continue;\n }\n\n try {\n const insertedId = await _createArea(\n {\n name: String(row.AREA_NAME).trim(),\n site,\n createdBy,\n },\n session\n );\n insertedAreaIds.push(insertedId);\n } catch (error: any) {\n logger.error(\n `Error creating area \"${row.AREA_NAME}\":`,\n error.message\n );\n continue;\n }\n }\n\n await session?.commitTransaction();\n logger.info(`Successfully uploaded ${insertedAreaIds.length} areas`);\n\n return {\n message: `Successfully uploaded ${insertedAreaIds.length} areas`,\n };\n } catch (error) {\n await session?.abortTransaction();\n logger.error(\"Error while uploading area information\", error);\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n return {\n uploadByFile,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useAreaRepository } from \"../repositories/hygiene-area.repository\";\nimport { areaSchema } from \"../models/hygiene-area.model\";\nimport { useAreaService } from \"../services/hygiene-area.service\";\nimport { convertBufferFile } from \"../utils/convert-excel.util\";\nimport { MulterRequest } from \"../utils/multer-request.util\";\n\nexport function useAreaController() {\n const {\n createArea: _createArea,\n getAreas: _getAll,\n getAreaById: _getAreaById,\n updateArea: _updateArea,\n updateAreaChecklist: _updateAreaChecklist,\n deleteArea: _deleteById,\n } = useAreaRepository();\n const { uploadByFile: _uploadByFile } = useAreaService();\n\n async function createArea(req: Request, res: Response, next: NextFunction) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = { ...req.body, createdBy };\n\n const { error } = areaSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createArea(payload);\n res.status(201).json({ message: \"Area created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const query = req.query;\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n startDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n endDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n site: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.query.site as string) ?? \"\";\n const startDate = (req.query.startDate as string) ?? \"\";\n const endDate = (req.query.endDate as string) ?? \"\";\n\n try {\n const data = await _getAll({\n page,\n limit,\n search,\n site,\n startDate,\n endDate,\n });\n\n res.json(data);\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function getAreaById(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAreaById(_id);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateArea(req: Request, res: Response, next: NextFunction) {\n const payload = { id: req.params.id, ...req.body };\n\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().required(),\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateArea(id, value);\n res.json({ message: \"Area updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, ...req.body };\n\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n checklist: Joi.array()\n .items(\n Joi.object({\n _id: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).required()\n )\n .min(1)\n .unique(\"_id\", { ignoreUndefined: true })\n .messages({\n \"array.unique\": \"Duplicate checklist items are not allowed\",\n }),\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateAreaChecklist(id, value);\n res.json({ message: \"Area updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteArea(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate({ id });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteById(id);\n res.json({ message: \"Area deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function uploadByFile(\n req: MulterRequest,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"File is required!\"));\n return;\n }\n\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n\n const createdBy = cookies[\"user\"] || \"\";\n const { site } = req.body;\n\n const schema = Joi.object({\n site: Joi.string().hex().optional().allow(\"\", null),\n createdBy: Joi.string().hex().required(),\n });\n\n const { error } = schema.validate({ site, createdBy });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const xlsData = await convertBufferFile(req.file.buffer);\n const dataJson = JSON.stringify(xlsData);\n const result = await _uploadByFile({ dataJson, createdBy, site });\n return res.status(201).json(result);\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createArea,\n getAll,\n getAreaById,\n updateArea,\n updateAreaChecklist,\n deleteArea,\n uploadByFile,\n };\n}\n","import { Readable } from \"stream\";\nimport * as xlsx from \"xlsx\";\n\nexport function convertBufferFile(bufferFile: Buffer): Promise<any[]> {\n return new Promise((resolve, reject) => {\n const fileStream = Readable.from(bufferFile);\n\n let fileBuffer = Buffer.alloc(0);\n fileStream.on(\"data\", (chunk) => {\n fileBuffer = Buffer.concat([fileBuffer, chunk]);\n });\n\n fileStream.on(\"end\", () => {\n try {\n const workbook = xlsx.read(fileBuffer, { type: \"buffer\" });\n const sheetName = workbook.SheetNames[0];\n const sheet = workbook.Sheets[sheetName];\n const jsonData = xlsx.utils.sheet_to_json(sheet);\n resolve(jsonData);\n } catch (error) {\n reject(\"Error parsing file\");\n }\n });\n\n fileStream.on(\"error\", (err) => {\n reject(\"Error Reading File: \" + err.message);\n });\n });\n}\n\nexport function calculateTotalHrs(time: number) {\n const totalHrs = time / (1000 * 60 * 60);\n return totalHrs.toFixed(1) + \" Hr\";\n}\n","import { BadRequestError } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport interface TToiletLocationChecklist {\n _id: string | ObjectId;\n name: string;\n}\n\nexport interface TGetToiletLocationsQuery {\n page?: number;\n limit?: number;\n search?: string;\n sort?: Record<string, any>;\n startDate?: Date | string;\n endDate?: Date | string;\n site: ObjectId | string;\n}\n\nexport type TToiletLocation = {\n _id?: ObjectId;\n name: string;\n createdBy?: string | ObjectId;\n checklist?: TToiletLocationChecklist[];\n status?: string;\n site?: string | ObjectId;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: Date | string;\n};\n\nexport type TToiletUpdateChecklist = NonNullable<Pick<TToiletLocation, \"checklist\">>;\n\n\nexport const toiletLocationSchema = Joi.object({\n name: Joi.string().required(),\n site: Joi.string().hex().required(),\n createdBy: Joi.string().hex().required(),\n checklist: Joi.array()\n .items(\n Joi.object({\n _id: Joi.string().hex().required(),\n name: Joi.string().required(),\n })\n )\n .optional(),\n updatedAt: Joi.date().optional().allow(\"\", null),\n status: Joi.string().allow(\"\", null).optional(),\n});\n\nexport function MToiletLocation(value: TToiletLocation) {\n const { error } = toiletLocationSchema.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n if (value.checklist && Array.isArray(value.checklist)) {\n value.checklist = value.checklist.map((item) => {\n try {\n return {\n ...item,\n _id: new ObjectId(item._id),\n };\n } catch (error) {\n throw new BadRequestError(\n `Invalid checklist item ID format: ${item._id}`\n );\n }\n });\n }\n\n return {\n name: value.name,\n site: value.site,\n createdBy: value.createdBy,\n checklist: value.checklist,\n status: value.status ?? \"\",\n createdAt: new Date(),\n updatedAt: value.updatedAt ?? \"\",\n deletedAt: value.deletedAt ?? \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MToiletLocation,\n TToiletLocation,\n TToiletUpdateChecklist\n} from \"../models/hygiene-toilet-location.model\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n NotFoundError,\n useCache,\n logger,\n makeCacheKey,\n AppError,\n} from \"@iservice365/node-server-utils\";\n\nexport function useToiletLocationRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"hygiene-toilet-locations\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache, delCache } =\n useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { name: \"text\" } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on site.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { name: 1, site: 1, deletedAt: 1 },\n { unique: true }\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene area.\"\n );\n }\n }\n\n async function create(value: TToiletLocation, session?: ClientSession) {\n try {\n value = MToiletLocation(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Toilet location already exists.\");\n }\n\n throw error;\n }\n }\n\n async function updateToiletLocation(\n _id: string | ObjectId,\n value: TToiletLocation\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n if (value.checklist && Array.isArray(value.checklist)) {\n value.checklist = value.checklist.map((item) => {\n try {\n return {\n ...item,\n _id: new ObjectId(item._id),\n };\n } catch (error) {\n throw new BadRequestError(\n `Invalid checklist item ID format: ${item._id}`\n );\n }\n });\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update toilet location.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Toilet location already exists.\");\n }\n\n throw error;\n }\n }\n\n async function deleteToiletLocation(\n _id: string | ObjectId,\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session }\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete toilet location.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function getToiletLocations({\n page = 1,\n limit = 10,\n search = \"\",\n sort = {},\n startDate = \"\",\n endDate = \"\",\n site = \"\",\n }: {\n page?: number;\n limit?: number;\n search?: string;\n sort?: Record<string, any>;\n startDate?: Date | string;\n endDate?: Date | string;\n site?: ObjectId | string;\n }) {\n page = page > 0 ? page - 1 : 0;\n let dateFilter = {};\n\n try {\n site = new ObjectId(site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n site: site.toString(),\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n cacheOptions.sort = JSON.stringify(sort);\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n if (startDate && endDate) {\n dateFilter = {\n createdAt: {\n $gte: new Date(startDate),\n $lte: new Date(endDate),\n },\n };\n } else if (startDate) {\n dateFilter = { createdAt: { $gte: new Date(startDate) } };\n } else if (endDate) {\n dateFilter = { createdAt: { $lte: new Date(endDate) } };\n }\n\n try {\n const items = await collection\n .aggregate([\n {\n $match: {\n ...dateFilter,\n ...query,\n },\n },\n {\n $lookup: {\n from: \"sites\",\n localField: \"site\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"site\",\n },\n },\n {\n $unwind: {\n path: \"$site\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $lookup: {\n from: \"users\",\n localField: \"createdBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"createdBy\",\n },\n },\n {\n $unwind: {\n path: \"$createdBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n site: \"$site._id\",\n siteName: \"$site.name\",\n createdByName: \"$createdBy.name\",\n checklist: 1,\n status: 1,\n createdAt: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getToiletLocationByName(\n name: string,\n site?: string | ObjectId\n ) {\n try {\n if (site) site = new ObjectId(site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n try {\n return await collection.findOne({\n name: { $regex: new RegExp(`^${name}$`, \"i\") },\n ...(site && { site }),\n });\n } catch (error: any) {\n throw new BadRequestError(\"Unable to fetch toilet location by name.\");\n }\n }\n\n async function updateToiletLocationChecklist(\n _id: string | ObjectId,\n value: TToiletUpdateChecklist\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n if (value.checklist && Array.isArray(value.checklist)) {\n value.checklist = value.checklist.map((item) => {\n try {\n return {\n ...item,\n _id: new ObjectId(item._id),\n };\n } catch (error) {\n throw new BadRequestError(\n `Invalid checklist item ID format: ${item._id}`\n );\n }\n });\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update toilet location.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n async function getToiletLocationById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n const query: Record<string, any> = {\n _id,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const data = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n checklist: 1,\n },\n },\n ])\n .toArray();\n\n if (!data || !data.length) {\n throw new NotFoundError(\"Area not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n return data[0];\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndexes,\n createUniqueIndex,\n getToiletLocations,\n create,\n updateToiletLocation,\n deleteToiletLocation,\n getToiletLocationByName,\n getToiletLocationById,\n updateToiletLocationChecklist\n };\n}\n","import { useToiletLocationRepository } from \"../repositories/hygiene-toilet-location.repository\";\nimport {\n TToiletLocation,\n TGetToiletLocationsQuery,\n} from \"../models/hygiene-toilet-location.model\";\nimport {\n BadRequestError,\n logger,\n NotFoundError,\n useAtlas,\n} from \"@iservice365/node-server-utils\";\nimport { InternalServerError } from \"@iservice365/node-server-utils\";\nimport { ObjectId } from \"mongodb\";\n\nexport function useToiletLocationService() {\n const { create: _createToilet } = useToiletLocationRepository();\n\n async function uploadByFile({\n dataJson,\n createdBy,\n site,\n }: {\n dataJson: string;\n createdBy: string | ObjectId;\n site: string | ObjectId;\n }) {\n let dataArray: any[];\n try {\n dataArray = JSON.parse(dataJson);\n } catch (error) {\n throw new BadRequestError(\"Invalid JSON format for data in excel\");\n }\n\n if (!dataArray || dataArray.length === 0) {\n throw new NotFoundError(\"No data found in the uploaded file\");\n }\n\n const session = useAtlas.getClient()?.startSession();\n const insertedAreaIds: ObjectId[] = [];\n\n try {\n session?.startTransaction();\n\n for (const row of dataArray) {\n if (!row?.AREA_NAME) {\n logger.warn(\"Skipping row with missing TOILET NAME:\", row);\n continue;\n }\n\n try {\n const insertedId = await _createToilet(\n {\n name: String(row.TOILET_NAME).trim(),\n site,\n createdBy,\n },\n session\n );\n insertedAreaIds.push(insertedId);\n } catch (error: any) {\n logger.error(\n `Error creating area \"${row.AREA_NAME}\":`,\n error.message\n );\n continue;\n }\n }\n\n await session?.commitTransaction();\n logger.info(`Successfully uploaded ${insertedAreaIds.length} areas`);\n\n return {\n message: `Successfully uploaded ${insertedAreaIds.length} areas`,\n };\n } catch (error) {\n await session?.abortTransaction();\n logger.error(\"Error while uploading area information\", error);\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n return {\n uploadByFile\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport { useToiletLocationService } from \"../services/hygiene-toilet-location.service\";\nimport { useToiletLocationRepository } from \"../repositories/hygiene-toilet-location.repository\";\nimport { MulterRequest } from \"../utils/multer-request.util\";\nimport { convertBufferFile } from \"../utils/convert-excel.util\";\n\n\n\nexport function useToiletLocationController() {\n const { uploadByFile: _uploadByFile } = useToiletLocationService();\n\n const {\n create: _createToiletLocation,\n updateToiletLocation: _updateToiletLocation,\n updateToiletLocationChecklist: _updateToiletLocationChecklist,\n getToiletLocationById: _getToiletLocationById,\n getToiletLocations: _getAll,\n deleteToiletLocation: _deleteById\n } = useToiletLocationRepository();\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const query = req.query;\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n let limit = parseInt(req.query.limit as string) ?? 20;\n limit = isNaN(limit) ? 20 : limit;\n const sort = req.query.sort ? String(req.query.sort).split(\",\") : \"\";\n const sortOrder = req.query.sortOrder\n ? String(req.query.sortOrder).split(\",\")\n : \"\";\n\n const sortObj: Record<string, number> = {};\n if (\n sort &&\n Array.isArray(sort) &&\n sort.length &&\n sortOrder &&\n Array.isArray(sortOrder) &&\n sortOrder.length\n ) {\n sort.forEach((field, index) => {\n sortObj[field] = sortOrder[index] === \"desc\" ? -1 : 1;\n });\n }\n\n const site = (req.query.site as string) ?? \"\";\n const search = (req.query.search as string) ?? \"\";\n\n try {\n const buildings = await _getAll({\n page,\n limit,\n sort: sortObj,\n site,\n search,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function createToiletLocation(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = { ...req.body, createdBy };\n\n const schema = Joi.object({\n name: Joi.string().required(),\n site: Joi.string().hex().optional().allow(\"\", null),\n status: Joi.string().optional().allow(\"\", null),\n createdBy: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n next(new BadRequestError(error.message));\n logger.info(`Controller: ${error.message}`);\n return;\n }\n\n try {\n const result = await _createToiletLocation(payload);\n res.status(201).json(result);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateToiletLocation(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, ...req.body };\n\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().required(),\n checklist: Joi.array().items(\n Joi.object({\n _id: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).optional()\n ),\n site: Joi.string().hex().optional().allow(\"\", null),\n status: Joi.string().optional().allow(\"\", null),\n\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateToiletLocation(id, value);\n res\n .status(201)\n .json({ message: \"Toilet location updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n }\n }\n\n async function deleteToiletLocation(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const id = req.params.id;\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate({ id });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _deleteById(id);\n res.json(message);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateToiletLocationChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, ...req.body };\n\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n checklist: Joi.array()\n .items(\n Joi.object({\n _id: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).required()\n )\n .min(1)\n .unique(\"_id\", { ignoreUndefined: true })\n .messages({\n \"array.unique\": \"Duplicate checklist items are not allowed\",\n }),\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateToiletLocationChecklist(id, value);\n res.json({ message: \"Toilet location updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getToiletLocationById(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getToiletLocationById(_id);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function uploadByFile(\n req: MulterRequest,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"File is required!\"));\n return;\n }\n\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n\n const createdBy = cookies[\"user\"] || \"\";\n const { site } = req.body;\n\n const schema = Joi.object({\n site: Joi.string().hex().optional().allow(\"\", null),\n createdBy: Joi.string().hex().required(),\n });\n\n const { error } = schema.validate({ site, createdBy });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const xlsData = await convertBufferFile(req.file.buffer);\n const dataJson = JSON.stringify(xlsData);\n const result = await _uploadByFile({ dataJson, createdBy, site });\n return res.status(201).json(result);\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n getAll,\n createToiletLocation,\n updateToiletLocation,\n deleteToiletLocation,\n updateToiletLocationChecklist,\n getToiletLocationById,\n uploadByFile\n };\n}\n","import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport const allowedTypes: string[] = [\"cleaner\", \"toilet\"];\nexport const allowedStatus: string[] = [\n \"To Do\",\n \"Pending\",\n \"In Progress\",\n \"Completed\",\n \"Expired\",\n];\n\nexport interface TParentChecklistStatus {\n type: (typeof allowedTypes)[number];\n site: string | ObjectId;\n status: (typeof allowedStatus)[number];\n completedAt: string | Date;\n}\n\nexport type TParentChecklist = {\n _id?: ObjectId;\n date: Date;\n status?: TParentChecklistStatus[];\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n};\n\nexport const parentChecklistSchema = Joi.object({\n date: Joi.date().required(),\n status: Joi.array()\n .items(\n Joi.object({\n type: Joi.string()\n .required()\n .valid(...allowedTypes),\n site: Joi.string().hex().required(),\n })\n )\n .optional(),\n});\n\nexport function MParentChecklist(value: TParentChecklist) {\n const { error } = parentChecklistSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Parent Checklist Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.status && Array.isArray(value.status)) {\n value.status = value.status.map((item) => {\n try {\n return {\n ...item,\n site: new ObjectId(item.site),\n status: item.status || \"To Do\",\n completedAt: item.completedAt || \"\",\n };\n } catch (error) {\n throw new BadRequestError(\n `Invalid status site ID format: ${item.site}`\n );\n }\n });\n }\n\n return {\n date: new Date(value.date),\n status: value.status,\n createdAt: new Date(),\n updatedAt: value.updatedAt ?? \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n allowedTypes,\n MParentChecklist,\n TParentChecklist,\n} from \"../models/hygiene-parent-checklist.model\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n useCache,\n logger,\n makeCacheKey,\n BadRequestError,\n} from \"@iservice365/node-server-utils\";\n\nexport function useParentChecklistRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"hygiene-parent-checklist\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { date: 1 } },\n { key: { \"status.type\": 1, \"status.site\": 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene parent checklist.\"\n );\n }\n }\n\n async function createParentChecklist(\n value: TParentChecklist,\n session?: ClientSession\n ) {\n try {\n const currentDate = value.date ? new Date(value.date) : new Date();\n\n const startOfDay = new Date(currentDate);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(currentDate);\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n const existingChecklist = await collection.findOne({\n date: {\n $gte: startOfDay,\n $lte: endOfDay,\n },\n });\n\n if (existingChecklist) {\n const dateStr = currentDate.toISOString().split(\"T\")[0];\n logger.info(`Parent checklist already exists for today: ${dateStr}`);\n return existingChecklist._id;\n }\n\n const processedValue = MParentChecklist(value);\n const result = await collection.insertOne(processedValue, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n const dateStr = currentDate.toISOString().split(\"T\")[0];\n logger.info(\n `Created new parent checklist ${result.insertedId} for today: ${dateStr}`\n );\n\n return result.insertedId;\n } catch (error) {\n logger.error(\"Failed to create daily parent checklist\", error);\n throw error;\n }\n }\n\n async function getAllParentChecklist({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n type,\n startDate = \"\",\n endDate = \"\",\n }: {\n page?: number;\n limit?: number;\n search?: string;\n site: ObjectId | string;\n type: (typeof allowedTypes)[number];\n startDate?: Date | string;\n endDate?: Date | string;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n cacheOptions.type = type;\n\n query.status = {\n $elemMatch: {\n site: new ObjectId(site),\n type: type,\n },\n };\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n if (startDate && endDate) {\n query.createdAt = {\n $gte: new Date(startDate),\n $lte: new Date(endDate),\n };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n } else if (startDate) {\n query.createdAt = { $gte: new Date(startDate) };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n } else if (endDate) {\n query.createdAt = { $lte: new Date(endDate) };\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const pipeline: Object[] = [{ $match: query }];\n\n const filterConditions: any[] = [];\n\n filterConditions.push({ $eq: [\"$$this.site\", new ObjectId(site)] });\n filterConditions.push({ $eq: [\"$$this.type\", type] });\n\n pipeline.push({\n $addFields: {\n filteredStatus: {\n $filter: {\n input: \"$status\",\n cond: { $and: filterConditions },\n },\n },\n },\n });\n\n pipeline.push({\n $match: {\n filteredStatus: { $ne: [] },\n },\n });\n\n pipeline.push({\n $addFields: {\n statusObj: { $arrayElemAt: [\"$filteredStatus\", 0] },\n },\n });\n\n pipeline.push({\n $project: {\n _id: 1,\n date: 1,\n status: \"$statusObj.status\",\n completedAt: \"$statusObj.completedAt\",\n createdAt: 1,\n },\n });\n\n pipeline.push(\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit }\n );\n\n const items = await collection.aggregate(pipeline).toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateParentChecklistStatuses(date?: Date) {\n try {\n const currentDate = new Date();\n\n const dateToUpdate =\n date || new Date(currentDate.getTime() - 24 * 60 * 60 * 1000);\n\n const startOfDay = new Date(dateToUpdate);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(dateToUpdate);\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n logger.info(\n `Updating parent checklist statuses for date: ${\n dateToUpdate.toISOString().split(\"T\")[0]\n }`\n );\n\n const statusUpdates = await collection\n .aggregate([\n {\n $match: {\n createdAt: {\n $gte: startOfDay,\n $lte: endOfDay,\n },\n },\n },\n {\n $lookup: {\n from: \"hygiene-checklist.areas\",\n localField: \"_id\",\n foreignField: \"parentChecklist\",\n pipeline: [\n {\n $group: {\n _id: {\n site: \"$site\",\n type: \"$type\",\n },\n completedCount: {\n $sum: {\n $cond: [{ $eq: [\"$status\", \"Completed\"] }, 1, 0],\n },\n },\n inProgressCount: {\n $sum: {\n $cond: [{ $eq: [\"$status\", \"In Progress\"] }, 1, 0],\n },\n },\n toDoCount: {\n $sum: {\n $cond: [\n {\n $or: [\n { $eq: [\"$status\", \"To Do\"] },\n { $eq: [\"$status\", \"Pending\"] },\n ],\n },\n 1,\n 0,\n ],\n },\n },\n totalCount: { $sum: 1 },\n },\n },\n {\n $addFields: {\n finalStatus: {\n $cond: {\n if: {\n $and: [\n { $gt: [\"$completedCount\", 0] },\n { $eq: [\"$inProgressCount\", 0] },\n { $eq: [\"$toDoCount\", 0] },\n ],\n },\n then: \"Completed\",\n else: {\n $cond: {\n if: {\n $and: [\n { $eq: [\"$completedCount\", 0] },\n { $eq: [\"$inProgressCount\", 0] },\n ],\n },\n then: \"Expired\",\n else: \"In Progress\",\n },\n },\n },\n },\n completedAt: {\n $cond: {\n if: {\n $and: [\n { $gt: [\"$completedCount\", 0] },\n { $eq: [\"$inProgressCount\", 0] },\n { $eq: [\"$toDoCount\", 0] },\n ],\n },\n then: new Date(),\n else: null,\n },\n },\n },\n },\n ],\n as: \"areaStats\",\n },\n },\n {\n $addFields: {\n newStatus: {\n $map: {\n input: \"$areaStats\",\n as: \"stat\",\n in: {\n site: \"$$stat._id.site\",\n type: \"$$stat._id.type\",\n status: \"$$stat.finalStatus\",\n completedAt: \"$$stat.completedAt\",\n },\n },\n },\n },\n },\n { $match: { newStatus: { $ne: [] } } },\n {\n $project: {\n _id: 1,\n newStatus: 1,\n },\n },\n ])\n .toArray();\n\n logger.info(\n `Found ${statusUpdates.length} parent checklists to potentially update`\n );\n\n if (statusUpdates.length === 0) {\n logger.info(\n `No parent checklists found for date range: ${startOfDay.toISOString()} to ${endOfDay.toISOString()}`\n );\n return null;\n }\n\n const bulkOps = statusUpdates.map((update) => {\n const statusTypes = update.newStatus\n .map((s: any) => `${s.type}(${s.status})`)\n .join(\", \");\n logger.info(\n `Updating parent checklist ${update._id} with ${update.newStatus.length} status entries: [${statusTypes}]`\n );\n return {\n updateOne: {\n filter: { _id: update._id },\n update: {\n $set: {\n status: update.newStatus,\n updatedAt: new Date(),\n },\n },\n },\n };\n });\n\n let result = null;\n if (bulkOps.length > 0) {\n result = await collection.bulkWrite(bulkOps);\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n }\n\n logger.info(`Updated statuses for ${bulkOps.length} parent checklists.`);\n\n return result;\n } catch (error) {\n logger.error(\"Failed to update parent checklist statuses\", error);\n throw error;\n }\n }\n\n return {\n createIndex,\n createParentChecklist,\n getAllParentChecklist,\n updateParentChecklistStatuses,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useParentChecklistRepo } from \"../repositories/hygiene-parent-checklist.repository\";\nimport {\n allowedTypes,\n parentChecklistSchema,\n} from \"../models/hygiene-parent-checklist.model\";\n\nexport function useParentChecklistController() {\n const {\n createParentChecklist: _createParentChecklist,\n getAllParentChecklist: _getAllParentChecklist,\n } = useParentChecklistRepo();\n\n async function createParentChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = req.body;\n\n const { error } = parentChecklistSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createParentChecklist(payload);\n res\n .status(201)\n .json({ message: \"Parent checklist created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAllParentChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n type: Joi.string()\n .required()\n .valid(...allowedTypes),\n startDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n endDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const type = (req.params.type as string) ?? \"\";\n const startDate = (req.query.startDate as string) ?? \"\";\n const endDate = (req.query.endDate as string) ?? \"\";\n\n try {\n const data = await _getAllParentChecklist({\n page,\n limit,\n search,\n site,\n type,\n startDate,\n endDate,\n });\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createParentChecklist,\n getAllParentChecklist,\n };\n}\n","import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport interface TUnit {\n _id?: ObjectId;\n name: string;\n site?: string | ObjectId;\n createdBy?: string | ObjectId;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n}\n\nexport type TUnitUpdate = Partial<Pick<TUnit, \"name\">>;\n\nexport interface TGetUnitsQuery {\n page?: number;\n limit?: number;\n search?: string;\n startDate?: Date | string;\n endDate?: Date | string;\n site: ObjectId | string;\n}\n\nexport const unitSchema = Joi.object({\n name: Joi.string().required(),\n site: Joi.string().hex().required(),\n createdBy: Joi.string().hex().required(),\n});\n\nexport function MUnit(value: TUnit) {\n const { error } = unitSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Unit Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n return {\n name: value.name,\n createdBy: value.createdBy,\n site: value.site,\n status: \"active\",\n createdAt: new Date(),\n updatedAt: value.updatedAt ?? \"\",\n deletedAt: value.deletedAt ?? \"\",\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport {\n BadRequestError,\n logger,\n NotFoundError,\n useAtlas,\n} from \"@iservice365/node-server-utils\";\nimport { useUnitRepository } from \"../repositories/hygiene-unit.repository\";\n\nexport function useUnitService() {\n const { createUnit: _createUnit } = useUnitRepository();\n\n async function uploadByFile({\n dataJson,\n createdBy,\n site,\n }: {\n dataJson: string;\n createdBy: string | ObjectId;\n site: string | ObjectId;\n }) {\n let dataArray: any[];\n try {\n dataArray = JSON.parse(dataJson);\n } catch (error) {\n throw new BadRequestError(\"Invalid JSON format for data in excel\");\n }\n\n if (!dataArray || dataArray.length === 0) {\n throw new NotFoundError(\"No data found in the uploaded file\");\n }\n\n const session = useAtlas.getClient()?.startSession();\n const insertedUnitIds: ObjectId[] = [];\n\n try {\n session?.startTransaction();\n\n for (const row of dataArray) {\n if (!row?.UNIT_NAME) {\n logger.warn(\"Skipping row with missing UNIT_NAME:\", row);\n continue;\n }\n\n try {\n const insertedId = await _createUnit(\n {\n name: String(row.UNIT_NAME).trim(),\n site,\n createdBy,\n },\n session\n );\n insertedUnitIds.push(insertedId);\n } catch (error: any) {\n logger.error(\n `Error creating unit \"${row.UNIT_NAME}\":`,\n error.message\n );\n continue;\n }\n }\n\n await session?.commitTransaction();\n logger.info(`Successfully uploaded ${insertedUnitIds.length} units`);\n\n return {\n message: `Successfully uploaded ${insertedUnitIds.length} units`,\n };\n } catch (error) {\n await session?.abortTransaction();\n logger.error(\"Error while uploading unit information\", error);\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n return {\n uploadByFile,\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n TUnit,\n MUnit,\n TGetUnitsQuery,\n TUnitUpdate,\n} from \"../models/hygiene-unit.model\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n} from \"@iservice365/node-server-utils\";\n\nexport function useUnitRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"hygiene-units\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { createdBy: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on hygiene unit.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene unit.\"\n );\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { name: 1, site: 1, deletedAt: 1 },\n { unique: true }\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene unit.\"\n );\n }\n }\n\n async function createUnit(value: TUnit, session?: ClientSession) {\n try {\n value = MUnit(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Unit already exists.\");\n }\n\n throw error;\n }\n }\n\n async function getUnits({\n page = 1,\n limit = 10,\n search = \"\",\n startDate = \"\",\n endDate = \"\",\n site = \"\",\n }: TGetUnitsQuery) {\n page = page > 0 ? page - 1 : 0;\n\n try {\n site = new ObjectId(site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n site,\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n site: site.toString(),\n };\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n if (startDate && endDate) {\n query.createdAt = {\n $gte: new Date(startDate),\n $lte: new Date(endDate),\n };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n } else if (startDate) {\n query.createdAt = { $gte: new Date(startDate) };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n } else if (endDate) {\n query.createdAt = { $lte: new Date(endDate) };\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $lookup: {\n from: \"sites\",\n localField: \"site\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"site\",\n },\n },\n {\n $unwind: {\n path: \"$site\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $lookup: {\n from: \"users\",\n localField: \"createdBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"createdBy\",\n },\n },\n {\n $unwind: {\n path: \"$createdBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n site: \"$site._id\",\n siteName: \"$site.name\",\n createdByName: \"$createdBy.name\",\n checklist: 1,\n status: 1,\n createdAt: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getUnitByName(name: string, site?: string | ObjectId) {\n try {\n if (site) site = new ObjectId(site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n try {\n return await collection.findOne({\n name: { $regex: new RegExp(`^${name}$`, \"i\") },\n ...(site && { site }),\n });\n } catch (error: any) {\n throw new BadRequestError(\"Unable to fetch unit by name.\");\n }\n }\n\n async function getUnitById(id: string | ObjectId, site?: string | ObjectId) {\n try {\n id = typeof id === \"string\" ? new ObjectId(id) : id;\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n if (site) site = new ObjectId(site);\n } catch (error) {\n throw new BadRequestError(\n \"Unable to fetch unit by ID, Invalid site ID format.\"\n );\n }\n\n try {\n return await collection.findOne({ _id: id, ...(site && { site }) });\n } catch (error: any) {\n throw new BadRequestError(\"Unable to fetch unit by id.\");\n }\n }\n\n async function updateUnit(_id: string | ObjectId, value: TUnitUpdate) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning unit.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function deleteUnit(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session }\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete unit.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUniqueIndex,\n createUnit,\n getUnits,\n getUnitByName,\n getUnitById,\n updateUnit,\n deleteUnit,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useUnitRepository } from \"../repositories/hygiene-unit.repository\";\nimport { unitSchema } from \"../models/hygiene-unit.model\";\nimport { useUnitService } from \"../services/hygiene-unit.service\";\nimport { MulterRequest } from \"../utils/multer-request.util\";\nimport { convertBufferFile } from \"../utils/convert-excel.util\";\n\nexport function useUnitController() {\n const {\n createUnit: _createUnit,\n getUnits: _getUnits,\n updateUnit: _updateUnit,\n deleteUnit: _deleteUnit,\n } = useUnitRepository();\n const { uploadByFile: _uploadByFile } = useUnitService();\n\n async function createUnit(req: Request, res: Response, next: NextFunction) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = { ...req.body, createdBy };\n\n const { error } = unitSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createUnit(payload);\n res.status(201).json({ message: \"Unit created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const query = req.query;\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n startDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n endDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n site: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.query.site as string) ?? \"\";\n const startDate = (req.query.startDate as string) ?? \"\";\n const endDate = (req.query.endDate as string) ?? \"\";\n\n try {\n const data = await _getUnits({\n page,\n limit,\n search,\n site,\n startDate,\n endDate,\n });\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateUnit(req: Request, res: Response, next: NextFunction) {\n const payload = { id: req.params.id, ...req.body };\n\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().required(),\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateUnit(id, value);\n res.json({ message: \"Unit updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteUnit(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate({ id });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteUnit(id);\n res.json({ message: \"Unit deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function uploadByFile(\n req: MulterRequest,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"File is required!\"));\n return;\n }\n\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n\n const createdBy = cookies[\"user\"] || \"\";\n const { site } = req.body;\n\n const schema = Joi.object({\n site: Joi.string().hex().optional().allow(\"\", null),\n createdBy: Joi.string().hex().required(),\n });\n\n const { error } = schema.validate({ site, createdBy });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const xlsData = await convertBufferFile(req.file.buffer);\n const dataJson = JSON.stringify(xlsData);\n const result = await _uploadByFile({ dataJson, createdBy, site });\n return res.status(201).json(result);\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createUnit,\n getAll,\n updateUnit,\n deleteUnit,\n uploadByFile,\n };\n}\n","import { BadRequestError } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport interface TScheduleTaskAreaCheckList {\n _id: string | ObjectId;\n name: string;\n}\n\nexport interface TGetScheduleTaskAreasQuery {\n page?: number;\n limit?: number;\n search?: string;\n sort?: Record<string, any>;\n startDate?: Date | string;\n endDate?: Date | string;\n site: ObjectId | string;\n}\n\nexport type TScheduleTaskArea = {\n _id?: ObjectId;\n name: string;\n site?: string | ObjectId;\n createdBy?: string | ObjectId;\n checklist?: TScheduleTaskAreaCheckList[];\n status?: string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n};\n\nexport const scheduleTaskAreaSchema = Joi.object({\n name: Joi.string().required(),\n site: Joi.string().hex().required(),\n createdBy: Joi.string().hex().required(),\n checklist: Joi.array()\n .items(\n Joi.object({\n _id: Joi.string().hex().required(),\n name: Joi.string().required(),\n })\n )\n .optional(),\n updatedAt: Joi.date().optional().allow(\"\", null),\n status: Joi.string().allow(\"\", null).optional(),\n});\n\nexport function MScheduleTaskArea(value: TScheduleTaskArea) {\n const { error } = scheduleTaskAreaSchema.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n if (value.checklist && Array.isArray(value.checklist)) {\n value.checklist = value.checklist.map((item) => {\n try {\n return {\n ...item,\n _id: new ObjectId(item._id),\n };\n } catch (error) {\n throw new BadRequestError(\n `Invalid checklist item ID format: ${item._id}`\n );\n }\n });\n }\n\n return {\n name: value.name,\n site: value.site,\n createdBy: value.createdBy,\n checklist: value.checklist,\n status: value.status ?? \"\",\n createdAt: new Date(),\n updatedAt: value.updatedAt ?? \"\",\n deletedAt: value.deletedAt ?? \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MScheduleTaskArea,\n TScheduleTaskArea,\n} from \"../models/hygiene-schedule-task-area.model\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n NotFoundError,\n useCache,\n logger,\n makeCacheKey,\n AppError,\n} from \"@iservice365/node-server-utils\";\n\nexport function useScheduleTaskAreaRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"hygiene-schedule-task-areas\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache, delCache } =\n useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { name: \"text\" } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on site.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { name: 1, site: 1, deletedAt: 1 },\n { unique: true }\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene area.\"\n );\n }\n }\n\n async function createScheduleTaskArea(\n value: TScheduleTaskArea,\n session?: ClientSession\n ) {\n try {\n value = MScheduleTaskArea(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function updateScheduleTaskArea(\n _id: string | ObjectId,\n params: TScheduleTaskArea\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue = { ...params, updatedAt: new Date() };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function deleteScheduleTaskArea(\n _id: string | ObjectId,\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session }\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function getScheduleTaskAreas({\n page = 1,\n limit = 10,\n search = \"\",\n startDate = \"\",\n endDate = \"\",\n site = \"\",\n }: {\n page?: number;\n limit?: number;\n search?: string;\n startDate?: Date | string;\n endDate?: Date | string;\n site?: ObjectId | string;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n if (site) {\n try {\n site = new ObjectId(site);\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n if (startDate && endDate) {\n query.createdAt = {\n $gte: new Date(startDate),\n $lte: new Date(endDate),\n };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n } else if (startDate) {\n query.createdAt = { $gte: new Date(startDate) };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n } else if (endDate) {\n query.createdAt = { $lte: new Date(endDate) };\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n {\n $match: query,\n },\n {\n $lookup: {\n from: \"sites\",\n localField: \"site\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"site\",\n },\n },\n {\n $unwind: {\n path: \"$site\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $lookup: {\n from: \"users\",\n localField: \"createdBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"createdBy\",\n },\n },\n {\n $unwind: {\n path: \"$createdBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n site: \"$site._id\",\n siteName: \"$site.name\",\n createdByName: \"$createdBy.name\",\n checklist: 1,\n status: 1,\n createdAt: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getScheduleTaskAreaByName(\n name: string,\n site?: string | ObjectId\n ) {\n try {\n if (site) site = new ObjectId(site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n try {\n return await collection.findOne({\n name: { $regex: new RegExp(`^${name}$`, \"i\") },\n ...(site && { site }),\n });\n } catch (error: any) {\n throw new BadRequestError(\"Unable to fetch schedule task area by name.\");\n }\n }\n\n async function getScheduleTaskAreaById(\n id: string | ObjectId,\n site?: string | ObjectId\n ) {\n try {\n id = typeof id === \"string\" ? new ObjectId(id) : id;\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n if (site) site = new ObjectId(site);\n } catch (error) {\n throw new BadRequestError(\n \"Unable to fetch schedule task area by ID, Invalid site ID format.\"\n );\n }\n\n try {\n return await collection.findOne({ _id: id, ...(site && { site }) });\n } catch (error: any) {\n throw new BadRequestError(\"Unable to fetch schedule task area by id.\");\n }\n }\n\n async function getAreaById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n const query: Record<string, any> = {\n _id,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const data = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n checklist: 1,\n },\n },\n ])\n .toArray();\n\n if (!data || !data.length) {\n throw new NotFoundError(\"Area not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n return data[0];\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createUniqueIndex,\n createScheduleTaskArea,\n updateScheduleTaskArea,\n deleteScheduleTaskArea,\n getScheduleTaskAreas,\n createIndexes,\n getScheduleTaskAreaByName,\n getScheduleTaskAreaById,\n getAreaById,\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n NotFoundError,\n useAtlas,\n} from \"@iservice365/node-server-utils\";\nimport { useScheduleTaskAreaRepository } from \"../repositories/hygiene-schedule-task-area.repository\";\nimport {\n TScheduleTaskArea,\n TGetScheduleTaskAreasQuery,\n} from \"../models/hygiene-schedule-task-area.model\";\nimport { ObjectId } from \"mongodb\";\n\nexport function useScheduleTaskAreaService() {\n const { createScheduleTaskArea: _create } = useScheduleTaskAreaRepository();\n\n async function uploadByFile({\n dataJson,\n createdBy,\n site,\n }: {\n dataJson: string;\n createdBy: string | ObjectId;\n site: string | ObjectId;\n }) {\n let dataArray: any[];\n try {\n dataArray = JSON.parse(dataJson);\n } catch (error) {\n throw new BadRequestError(\"Invalid JSON format for data in excel\");\n }\n\n if (!dataArray || dataArray.length === 0) {\n throw new NotFoundError(\"No data found in the uploaded file\");\n }\n\n const session = useAtlas.getClient()?.startSession();\n const insertedAreaIds: ObjectId[] = [];\n\n try {\n session?.startTransaction();\n\n for (const row of dataArray) {\n if (!row?.AREA_NAME) {\n logger.warn(\"Skipping row with missing AREA_NAME:\", row);\n continue;\n }\n\n try {\n const insertedId = await _create(\n {\n name: String(row.AREA_NAME).trim(),\n site,\n createdBy,\n },\n session\n );\n insertedAreaIds.push(insertedId);\n } catch (error: any) {\n logger.error(\n `Error creating area \"${row.AREA_NAME}\":`,\n error.message\n );\n continue;\n }\n }\n\n await session?.commitTransaction();\n logger.info(`Successfully uploaded ${insertedAreaIds.length} areas`);\n\n return {\n message: `Successfully uploaded ${insertedAreaIds.length} areas`,\n };\n } catch (error) {\n await session?.abortTransaction();\n logger.error(\"Error while uploading area information\", error);\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n return {\n uploadByFile,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useScheduleTaskAreaService } from \"../services/hygiene-schedule-task-area.service\";\nimport { scheduleTaskAreaSchema } from \"../models/hygiene-schedule-task-area.model\";\nimport { useScheduleTaskAreaRepository } from \"../repositories/hygiene-schedule-task-area.repository\";\nimport { MulterRequest } from \"../utils/multer-request.util\";\nimport { convertBufferFile } from \"../utils/convert-excel.util\";\n\nexport function useScheduleTaskAreaController() {\n const { uploadByFile: _uploadByFile } = useScheduleTaskAreaService();\n\n const {\n getScheduleTaskAreas: _getAll,\n createScheduleTaskArea: _createScheduleTaskArea,\n updateScheduleTaskArea: _updateScheduleTaskArea,\n deleteScheduleTaskArea: _deleteById,\n getAreaById: _getAreaById,\n } = useScheduleTaskAreaRepository();\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const query = req.query;\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n startDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n endDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n site: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.query.site as string) ?? \"\";\n const startDate = (req.query.startDate as string) ?? \"\";\n const endDate = (req.query.endDate as string) ?? \"\";\n\n try {\n const data = await _getAll({\n page,\n limit,\n search,\n site,\n startDate,\n endDate,\n });\n\n res.json(data);\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function createScheduleTaskArea(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = { ...req.body, createdBy };\n\n const { error } = scheduleTaskAreaSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createScheduleTaskArea(payload);\n res.status(201).json({ message: \"Area created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateScheduleTaskArea(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, ...req.body };\n\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().required(),\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n next(new BadRequestError(error.message));\n logger.info(`Controller: ${error.message}`);\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateScheduleTaskArea(id, value);\n res.json({ message: \"Area updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteScheduleTaskArea(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const id = req.params.id;\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate({ id });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteById(id);\n res.json({ message: \"Area deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function uploadByFile(\n req: MulterRequest,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"File is required!\"));\n return;\n }\n\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n\n const createdBy = cookies[\"user\"] || \"\";\n const { site } = req.body;\n\n const schema = Joi.object({\n site: Joi.string().hex().optional().allow(\"\", null),\n createdBy: Joi.string().hex().required(),\n });\n\n const { error } = schema.validate({ site, createdBy });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const xlsData = await convertBufferFile(req.file.buffer);\n const dataJson = JSON.stringify(xlsData);\n const result = await _uploadByFile({ dataJson, createdBy, site });\n return res.status(201).json(result);\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaById(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAreaById(_id);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n getAll,\n getAreaById,\n createScheduleTaskArea,\n updateScheduleTaskArea,\n deleteScheduleTaskArea,\n uploadByFile,\n };\n}\n","import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { allowedStatus, allowedTypes } from \"./hygiene-parent-checklist.model\";\n\nexport type TAreaChecklist = {\n _id?: ObjectId;\n type: (typeof allowedTypes)[number];\n site: string | ObjectId;\n parentChecklist: string | ObjectId;\n area: string | ObjectId;\n name?: string;\n metadata?: TAreaChecklistMetadata;\n status?: (typeof allowedStatus)[number];\n createdBy?: string | ObjectId;\n createdAt?: Date | string;\n acceptedBy?: string | ObjectId;\n acceptedAt?: Date | string;\n startedAt?: Date | string;\n endedAt?: Date | string;\n signature?: string;\n updatedAt?: Date | string;\n};\n\nexport type TAreaChecklistMetadata = {\n attachments?: string[];\n};\n\nexport type TAreaChecklistCreate = Pick<\n TAreaChecklist,\n \"type\" | \"site\" | \"parentChecklist\" | \"createdBy\"\n> & {\n areas: Array<{\n area: string | ObjectId;\n name?: string;\n }>;\n};\n\nexport const areaChecklistSchema = Joi.object({\n type: Joi.string()\n .required()\n .valid(...allowedTypes),\n site: Joi.string().hex().required(),\n parentChecklist: Joi.string().hex().required(),\n area: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n createdBy: Joi.string().hex().optional().allow(\"\", null),\n});\n\nexport function MAreaChecklist(value: TAreaChecklist) {\n const { error } = areaChecklistSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Checklist Area Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.parentChecklist) {\n try {\n value.parentChecklist = new ObjectId(value.parentChecklist);\n } catch (error) {\n throw new BadRequestError(\"Invalid checklist ID format.\");\n }\n }\n\n if (value.area) {\n try {\n value.area = new ObjectId(value.area);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n }\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n if (value.acceptedBy) {\n try {\n value.acceptedBy = new ObjectId(value.acceptedBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid acceptedBy ID format.\");\n }\n }\n\n return {\n type: value.type,\n site: value.site,\n parentChecklist: value.parentChecklist,\n area: value.area,\n name: value.name ?? \"\",\n status: value.status ?? \"To Do\",\n createdBy: value.createdBy ?? \"\",\n createdAt: new Date(),\n acceptedBy: value.acceptedBy ?? \"\",\n acceptedAt: value.acceptedAt ?? \"\",\n startedAt: value.startedAt ?? \"\",\n endedAt: value.endedAt ?? \"\",\n signature: value.signature ?? \"\",\n updatedAt: value.updatedAt ?? \"\",\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@iservice365/node-server-utils\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MAreaChecklist,\n TAreaChecklist,\n} from \"../models/hygiene-area-checklist.model\";\nimport {\n allowedStatus,\n allowedTypes,\n} from \"../models/hygiene-parent-checklist.model\";\n\nexport function useAreaChecklistRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"hygiene-checklist.areas\";\n const unit_checklist_collection = \"hygiene-checklist.units\";\n\n const collection = db.collection(namespace_collection);\n const unitChecklistCollection = db.collection(unit_checklist_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n const { delNamespace: delUnitNamespace } = useCache(\n unit_checklist_collection\n );\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { type: 1 } },\n { key: { site: 1 } },\n { key: { parentChecklist: 1 } },\n { key: { area: 1 } },\n { key: { createdAt: 1 } },\n { key: { acceptedBy: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene checklist area.\"\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene checklist area.\"\n );\n }\n }\n\n async function createAreaChecklist(\n value: TAreaChecklist,\n session?: ClientSession\n ) {\n try {\n const siteId = new ObjectId(value.site);\n const parentChecklistId = new ObjectId(value.parentChecklist);\n const areaId = new ObjectId(value.area);\n\n const currentDate = new Date();\n\n const startOfDay = new Date(currentDate);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(currentDate);\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n const existingChecklist = await collection.findOne({\n type: value.type,\n site: siteId,\n parentChecklist: parentChecklistId,\n area: areaId,\n createdAt: {\n $gte: startOfDay,\n $lte: endOfDay,\n },\n });\n\n if (existingChecklist) {\n logger.info(\n `Area checklist already exists for area ${areaId} on ${\n currentDate.toISOString().split(\"T\")[0]\n }`\n );\n return existingChecklist._id;\n }\n\n const processedValue = MAreaChecklist(value);\n const result = await collection.insertOne(processedValue, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return result.insertedId;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAllAreaChecklist({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n type,\n parentChecklist,\n }: {\n page?: number;\n limit?: number;\n search?: string;\n site: string | ObjectId;\n type: (typeof allowedTypes)[number];\n parentChecklist: string | ObjectId;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { type };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query.site = new ObjectId(site);\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n try {\n query.parentChecklist = new ObjectId(parentChecklist);\n cacheOptions.parentChecklist = parentChecklist.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const pipeline: Object[] = [\n { $match: query },\n {\n $lookup: {\n from: \"users\",\n localField: \"acceptedBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"acceptedBy\",\n },\n },\n {\n $unwind: {\n path: \"$acceptedBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n acceptedByName: \"$acceptedBy.name\",\n status: 1,\n createdAt: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const items = await collection.aggregate(pipeline).toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistHistory({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n type,\n parentChecklist,\n status,\n createdAt,\n user,\n }: {\n page?: number;\n limit?: number;\n search?: string;\n site: string | ObjectId;\n type: (typeof allowedTypes)[number];\n parentChecklist: string | ObjectId;\n status?: (typeof allowedStatus)[number];\n createdAt?: string | Date;\n user?: string | ObjectId;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { type };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query.site = new ObjectId(site);\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n try {\n query.parentChecklist = new ObjectId(parentChecklist);\n cacheOptions.parentChecklist = parentChecklist.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n if (createdAt) {\n query.createdAt = {\n $gte: new Date(`${createdAt}T00:00:00Z`),\n $lte: new Date(`${createdAt}T23:59:59Z`),\n };\n cacheOptions.createdAt = new Date(createdAt).toISOString().split(\"T\")[0];\n }\n\n if (status) {\n query.status = status;\n cacheOptions.status = status;\n } else {\n query.status = { $in: [\"In Progress\", \"Completed\"] };\n }\n\n if (user) {\n try {\n query.acceptedBy = new ObjectId(user);\n cacheOptions.user = user.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID format.\");\n }\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const pipeline: Object[] = [\n { $match: query },\n {\n $lookup: {\n from: \"users\",\n localField: \"acceptedBy\",\n foreignField: \"_id\",\n pipeline: [\n ...(search\n ? [{ $match: { name: { $regex: search, $options: \"i\" } } }]\n : []),\n { $project: { name: 1 } },\n ],\n as: \"acceptedBy\",\n },\n },\n {\n $unwind: {\n path: \"$acceptedBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n createdAt: 1,\n acceptedByName: \"$acceptedBy.name\",\n status: 1,\n startedAt: 1,\n endedAt: 1,\n },\n },\n { $sort: { status: 1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const items = await collection.aggregate(pipeline).toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistHistoryDetails(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const areaPipeline: Object[] = [\n { $match: { _id } },\n {\n $lookup: {\n from: \"users\",\n localField: \"createdBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"createdBy\",\n },\n },\n {\n $unwind: {\n path: \"$createdBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $lookup: {\n from: \"users\",\n localField: \"acceptedBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"acceptedBy\",\n },\n },\n {\n $unwind: {\n path: \"$acceptedBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n createdAt: 1,\n createdByName: \"$createdBy.name\",\n startedAt: 1,\n endedAt: 1,\n status: 1,\n signature: 1,\n acceptedByName: \"$acceptedBy.name\",\n },\n },\n ];\n\n const unitPipeline: Object[] = [\n { $match: { areaChecklist: _id } },\n {\n $project: {\n name: 1,\n remarks: \"$metadata.remarks\",\n attachments: \"$metadata.attachments\",\n approve: { $ifNull: [\"$approve\", null] },\n reject: { $ifNull: [\"$reject\", null] },\n },\n },\n ];\n\n const [area, units] = await Promise.all([\n collection.aggregate(areaPipeline).toArray(),\n unitChecklistCollection.aggregate(unitPipeline).toArray(),\n ]);\n\n if (!area.length) {\n throw new BadRequestError(\"Area checklist not found.\");\n }\n\n const items: Record<string, any> = {\n area: area[0],\n units,\n };\n\n setCache(cacheKey, items, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return items;\n } catch (error) {\n throw error;\n }\n }\n\n async function acceptAreaChecklist(\n _id: string | ObjectId,\n acceptedBy: string | ObjectId\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n acceptedBy = new ObjectId(acceptedBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid acceptedBy ID format.\");\n }\n\n try {\n const now = new Date();\n const updateValue = {\n acceptedBy,\n acceptedAt: now,\n startedAt: now,\n updatedAt: now,\n };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n async function attachImageAreaChecklist(\n _id: string | ObjectId,\n attachments: string[],\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n const now = new Date();\n const updateValue = {\n metadata: { attachments },\n updatedAt: now,\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session }\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\n \"Unable to update cleaning area checklist.\"\n );\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n delUnitNamespace()\n .then(() => {\n logger.info(\n `Cache cleared for namespace: ${unit_checklist_collection}`\n );\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${unit_checklist_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n async function submitAreaChecklist(\n _id: string | ObjectId,\n signature: string\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const now = new Date();\n const updateValue = {\n signature,\n status: \"In Progress\",\n endedAt: now,\n updatedAt: now,\n };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n async function completeAreaChecklist(\n _id: string | ObjectId,\n signature: string\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const now = new Date();\n const updateValue = {\n signature,\n status: \"Completed\",\n endedAt: now,\n updatedAt: now,\n };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createAreaChecklist,\n getAllAreaChecklist,\n getAreaChecklistHistory,\n getAreaChecklistHistoryDetails,\n acceptAreaChecklist,\n attachImageAreaChecklist,\n submitAreaChecklist,\n completeAreaChecklist,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useAreaChecklistRepo } from \"../repositories/hygiene-area-checklist.repository\";\nimport {\n allowedStatus,\n allowedTypes,\n} from \"../models/hygiene-parent-checklist.model\";\nimport { useAreaChecklistService } from \"../services/hygiene-area-checklist.service\";\n\nexport function useAreaChecklistController() {\n const {\n getAllAreaChecklist: _getAllAreaChecklist,\n getAreaChecklistHistory: _getAreaChecklistHistory,\n getAreaChecklistHistoryDetails: _getAreaChecklistHistoryDetails,\n acceptAreaChecklist: _acceptAreaChecklist,\n attachImageAreaChecklist: _attachImageAreaChecklist,\n submitAreaChecklist: _submitAreaChecklist,\n completeAreaChecklist: _completeAreaChecklist,\n } = useAreaChecklistRepo();\n const { createAreaChecklist: _createAreaChecklist } =\n useAreaChecklistService();\n\n async function createAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = { ...req.body, ...req.params, createdBy };\n\n const validation = Joi.object({\n type: Joi.string()\n .required()\n .valid(...allowedTypes),\n site: Joi.string().hex().required(),\n parentChecklist: Joi.string().hex().required(),\n createdBy: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createAreaChecklist(payload);\n res\n .status(201)\n .json({ message: \"Area checklists generated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAllAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n parentChecklist: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const type = (req.params.type as string) ?? \"\";\n const parentChecklist = (req.params.parentChecklist as string) ?? \"\";\n\n try {\n const data = await _getAllAreaChecklist({\n page,\n limit,\n search,\n site,\n type,\n parentChecklist,\n });\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaChecklistHistory(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const user = cookies[\"user\"] || \"\";\n\n const query = { ...req.query, ...req.params, user };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n parentChecklist: Joi.string().hex().required(),\n status: Joi.string().allow(\"\", null, ...allowedStatus),\n createdAt: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n user: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const type = (req.params.type as string) ?? \"\";\n const parentChecklist = (req.params.parentChecklist as string) ?? \"\";\n const status = (req.query.status as string) ?? \"\";\n const createdAt = (req.query.createdAt as string) ?? \"\";\n\n try {\n const data = await _getAreaChecklistHistory({\n page,\n limit,\n search,\n site,\n type,\n parentChecklist,\n status,\n createdAt,\n user,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaChecklistHistoryDetails(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAreaChecklistHistoryDetails(_id);\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function acceptAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const acceptedBy = cookies[\"user\"] || \"\";\n\n const payload = { id: req.params.id, acceptedBy };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n acceptedBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _acceptAreaChecklist(payload.id, payload.acceptedBy);\n res.json({ message: \"Area checklist updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function attachImageAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, attachments: req.body.attachments };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n attachments: Joi.array().items(Joi.string()).optional(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _attachImageAreaChecklist(payload.id, payload.attachments);\n\n res.json({ message: \"Area checklist attachments updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function submitAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, signature: req.body.signature };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n signature: Joi.string().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _submitAreaChecklist(payload.id, payload.signature);\n res.json({ message: \"Area checklist submitted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function completeAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, signature: req.body.signature };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n signature: Joi.string().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _completeAreaChecklist(payload.id, payload.signature);\n res.json({ message: \"Area checklist completed successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createAreaChecklist,\n getAllAreaChecklist,\n getAreaChecklistHistory,\n getAreaChecklistHistoryDetails,\n acceptAreaChecklist,\n attachImageAreaChecklist,\n submitAreaChecklist,\n completeAreaChecklist,\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport { logger } from \"@iservice365/node-server-utils\";\nimport { useAreaChecklistRepo } from \"../repositories/hygiene-area-checklist.repository\";\nimport {\n TAreaChecklistCreate,\n TAreaChecklist,\n} from \"../models/hygiene-area-checklist.model\";\nimport { useAreaRepository } from \"../repositories/hygiene-area.repository\";\nimport { useToiletLocationRepository } from \"../repositories/hygiene-toilet-location.repository\";\n\nexport function useAreaChecklistService() {\n const { createAreaChecklist: _createAreaChecklist } = useAreaChecklistRepo();\n const { getAreas } = useAreaRepository();\n const { getToiletLocations } = useToiletLocationRepository();\n\n async function createAreaChecklist(value: TAreaChecklistCreate) {\n try {\n const results: ObjectId[] = [];\n\n if (value.type === \"cleaner\") {\n const cleanerAreasResult = (await getAreas({\n site: value.site,\n })) as any;\n const cleanerAreas = cleanerAreasResult.items || [];\n\n if (cleanerAreas.length === 0) {\n logger.warn(`No cleaner areas found for site: ${value.site}`);\n return results;\n }\n\n for (const area of cleanerAreas) {\n const checklistData: TAreaChecklist = {\n type: \"cleaner\",\n site: value.site,\n parentChecklist: value.parentChecklist,\n area: area._id.toString(),\n name: area.name,\n createdBy: value.createdBy,\n };\n\n const insertedId = await _createAreaChecklist(checklistData);\n results.push(insertedId);\n }\n\n logger.info(\n `Created ${results.length} cleaner area checklists for site: ${value.site}`\n );\n }\n\n if (value.type === \"toilet\") {\n const toiletAreasResult = (await getToiletLocations({\n site: value.site,\n })) as any;\n const toiletAreas = toiletAreasResult.items || [];\n\n if (toiletAreas.length === 0) {\n logger.warn(`No toilet locations found for site: ${value.site}`);\n return results;\n }\n\n for (const toiletLocation of toiletAreas) {\n const checklistData: TAreaChecklist = {\n type: \"toilet\",\n site: value.site,\n parentChecklist: value.parentChecklist,\n area: toiletLocation._id,\n name: toiletLocation.name,\n createdBy: value.createdBy,\n };\n\n const insertedId = await _createAreaChecklist(checklistData);\n results.push(insertedId);\n }\n\n logger.info(\n `Created ${results.length} toilet area checklists for site: ${value.site}`\n );\n }\n\n return results;\n } catch (error) {\n logger.error(`Error generating area checklists:`, error);\n throw error;\n }\n }\n\n return { createAreaChecklist };\n}\n","import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { allowedTypes } from \"./hygiene-parent-checklist.model\";\n\nexport type TUnitChecklistMetadataWorkOrder = {\n attachments?: Array<string>;\n subject: string;\n category: string | ObjectId;\n highPriority?: boolean;\n block?: string;\n level?: string;\n unit?: string;\n location?: string;\n description: string;\n createdBy: string | ObjectId;\n createdByName?: string;\n serviceProvider?: string | ObjectId;\n organization?: string | ObjectId;\n site?: string | ObjectId;\n};\n\nexport type TUnitChecklistMetadata = {\n attachments?: string[];\n remarks?: string;\n workOrder?: TUnitChecklistMetadataWorkOrder;\n};\n\nexport type TUnitChecklist = {\n _id?: ObjectId;\n site: string | ObjectId;\n type: (typeof allowedTypes)[number];\n parentChecklist: string | ObjectId;\n areaChecklist: string | ObjectId;\n unit: ObjectId;\n name?: string;\n approve?: boolean;\n reject?: boolean;\n checkedBy?: string | ObjectId;\n metadata?: TUnitChecklistMetadata;\n createdBy?: string | ObjectId;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport type TUnitChecklistApprove = Partial<\n Pick<TUnitChecklist, \"approve\" | \"reject\" | \"checkedBy\">\n>;\n\nexport type TUnitChecklistReject = Partial<\n Pick<TUnitChecklist, \"approve\" | \"reject\" | \"checkedBy\" | \"metadata\">\n>;\n\nexport const unitChecklistSchema = Joi.object({\n site: Joi.string().hex().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n parentChecklist: Joi.string().hex().required(),\n areaChecklist: Joi.string().hex().required(),\n unit: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n createdBy: Joi.string().hex().optional().allow(\"\", null),\n});\n\nexport function MUnitChecklist(value: TUnitChecklist) {\n const { error } = unitChecklistSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Checklist Unit Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.parentChecklist) {\n try {\n value.parentChecklist = new ObjectId(value.parentChecklist);\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n }\n\n if (value.areaChecklist) {\n try {\n value.areaChecklist = new ObjectId(value.areaChecklist);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n }\n\n if (value.unit) {\n try {\n value.unit = new ObjectId(value.unit);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n }\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n return {\n site: value.site,\n type: value.type,\n parentChecklist: value.parentChecklist,\n areaChecklist: value.areaChecklist,\n unit: value.unit,\n name: value.name ?? \"\",\n approve: false,\n reject: false,\n createdBy: value.createdBy ?? \"\",\n createdAt: new Date(),\n updatedAt: value.updatedAt ?? \"\",\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@iservice365/node-server-utils\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MUnitChecklist,\n TUnitChecklist,\n TUnitChecklistApprove,\n TUnitChecklistReject,\n} from \"../models/hygiene-unit-checklist.model\";\nimport { allowedTypes } from \"../models/hygiene-parent-checklist.model\";\n\nexport function useUnitChecklistRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"hygiene-checklist.units\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { type: 1 } },\n { key: { parentChecklist: 1 } },\n { key: { areaChecklist: 1 } },\n { key: { \"metadata.workOrder.category\": 1 } },\n { key: { \"metadata.workOrder.createdBy\": 1 } },\n { key: { \"metadata.workOrder.serviceProvider\": 1 } },\n { key: { \"metadata.workOrder.organization\": 1 } },\n { key: { \"metadata.workOrder.site\": 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene unit checklist.\"\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene unit checklist.\"\n );\n }\n }\n\n async function createUnitChecklist(\n value: TUnitChecklist,\n session?: ClientSession\n ) {\n try {\n value = MUnitChecklist(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n throw error;\n }\n }\n\n async function getAllUnitChecklist({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n type,\n parentChecklist,\n areaChecklist,\n }: {\n page?: number;\n limit?: number;\n search?: string;\n site: string | ObjectId;\n type: (typeof allowedTypes)[number];\n parentChecklist: string | ObjectId;\n areaChecklist: string | ObjectId;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { type };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query.site = new ObjectId(site);\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n try {\n query.parentChecklist = new ObjectId(parentChecklist);\n cacheOptions.parentChecklist = parentChecklist.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n try {\n query.areaChecklist = new ObjectId(areaChecklist);\n cacheOptions.areaChecklist = areaChecklist.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const areaAttachmentsResult = await collection\n .aggregate([\n { $match: query },\n {\n $lookup: {\n from: \"hygiene-checklist.areas\",\n localField: \"areaChecklist\",\n foreignField: \"_id\",\n pipeline: [\n { $project: { attachments: \"$metadata.attachments\" } },\n ],\n as: \"areaChecklistData\",\n },\n },\n {\n $unwind: {\n path: \"$areaChecklistData\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $group: {\n _id: null,\n attachments: { $first: \"$areaChecklistData.attachments\" },\n },\n },\n ])\n .toArray();\n\n const areaAttachments =\n areaAttachmentsResult.length > 0\n ? areaAttachmentsResult[0].attachments || []\n : [];\n\n const pipeline: Object[] = [\n { $match: query },\n {\n $lookup: {\n from: \"organizations\",\n localField: \"metadata.workOrder.category\",\n foreignField: \"_id\",\n pipeline: [{ $project: { nature: 1 } }],\n as: \"categoryData\",\n },\n },\n {\n $lookup: {\n from: \"users\",\n localField: \"metadata.workOrder.createdBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"createdByData\",\n },\n },\n {\n $lookup: {\n from: \"service-providers\",\n localField: \"metadata.workOrder.serviceProvider\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"serviceProviderData\",\n },\n },\n {\n $lookup: {\n from: \"organizations\",\n localField: \"metadata.workOrder.organization\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"organizationData\",\n },\n },\n {\n $lookup: {\n from: \"sites\",\n localField: \"metadata.workOrder.site\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"siteData\",\n },\n },\n {\n $addFields: {\n \"metadata.workOrder.categoryName\": {\n $arrayElemAt: [\"$categoryData.nature\", 0],\n },\n \"metadata.workOrder.createdByName\": {\n $arrayElemAt: [\"$createdByData.name\", 0],\n },\n \"metadata.workOrder.serviceProviderName\": {\n $arrayElemAt: [\"$serviceProviderData.name\", 0],\n },\n \"metadata.workOrder.organizationName\": {\n $arrayElemAt: [\"$organizationData.name\", 0],\n },\n \"metadata.workOrder.siteName\": {\n $arrayElemAt: [\"$siteData.name\", 0],\n },\n },\n },\n {\n $project: {\n name: 1,\n remarks: \"$metadata.remarks\",\n attachments: \"$metadata.attachments\",\n workOrder: \"$metadata.workOrder\",\n approve: { $ifNull: [\"$approve\", null] },\n reject: { $ifNull: [\"$reject\", null] },\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const items = await collection.aggregate(pipeline).toArray();\n const length = await collection.countDocuments(query);\n\n const paginatedData = paginate(items, page, limit, length);\n\n const data = {\n attachments: areaAttachments,\n ...paginatedData,\n };\n\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getUnitChecklistById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit checklist ID format.\");\n }\n\n try {\n return await collection.findOne({ _id });\n } catch (error) {\n throw error;\n }\n }\n\n async function updateUnitChecklist(\n _id: string | ObjectId,\n value: TUnitChecklistApprove | TUnitChecklistReject,\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit checklist ID format.\");\n }\n\n if (value.checkedBy && typeof value.checkedBy === \"string\") {\n try {\n value.checkedBy = new ObjectId(value.checkedBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid checkedBy ID format.\");\n }\n }\n\n if (\"metadata\" in value && value.metadata?.workOrder) {\n const workOrder = value.metadata.workOrder;\n\n if (workOrder.category && typeof workOrder.category === \"string\") {\n try {\n workOrder.category = new ObjectId(workOrder.category);\n } catch (error) {\n throw new BadRequestError(\"Invalid category ID format.\");\n }\n }\n\n if (workOrder.createdBy && typeof workOrder.createdBy === \"string\") {\n try {\n workOrder.createdBy = new ObjectId(workOrder.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n if (\n workOrder.serviceProvider &&\n typeof workOrder.serviceProvider === \"string\"\n ) {\n try {\n workOrder.serviceProvider = new ObjectId(workOrder.serviceProvider);\n } catch (error) {\n throw new BadRequestError(\"Invalid serviceProvider ID format.\");\n }\n }\n\n if (\n workOrder.organization &&\n typeof workOrder.organization === \"string\"\n ) {\n try {\n workOrder.organization = new ObjectId(workOrder.organization);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID format.\");\n }\n }\n\n if (workOrder.site && typeof workOrder.site === \"string\") {\n try {\n workOrder.site = new ObjectId(workOrder.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session }\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update unit checklist.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUnitChecklist,\n getAllUnitChecklist,\n getUnitChecklistById,\n updateUnitChecklist,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useUnitChecklistRepo } from \"../repositories/hygiene-unit-checklist.repository\";\nimport { unitChecklistSchema } from \"../models/hygiene-unit-checklist.model\";\nimport { allowedTypes } from \"../models/hygiene-parent-checklist.model\";\nimport { useUnitChecklistService } from \"../services/hygiene-unit-checklist.service\";\nimport { workOrderSchema } from \"@iservice365/core\";\n\nexport function useUnitChecklistController() {\n const {\n createUnitChecklist: _createUnitChecklist,\n getAllUnitChecklist: _getAllUnitChecklist,\n } = useUnitChecklistRepo();\n const {\n approveUnitChecklist: _approveUnitChecklist,\n rejectUnitChecklist: _rejectUnitChecklist,\n } = useUnitChecklistService();\n\n async function createUnitChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = { ...req.body, ...req.params, createdBy };\n\n const { error } = unitChecklistSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createUnitChecklist(payload);\n res\n .status(201)\n .json({ message: \"Unit checklist created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAllUnitChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n parentChecklist: Joi.string().hex().required(),\n areaChecklist: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const type = (req.params.type as string) ?? \"\";\n const parentChecklist = (req.params.parentChecklist as string) ?? \"\";\n const areaChecklist = (req.params.areaChecklist as string) ?? \"\";\n\n try {\n const data = await _getAllUnitChecklist({\n page,\n limit,\n search,\n site,\n type,\n parentChecklist,\n areaChecklist,\n });\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function approveUnitChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const checkedBy = cookies[\"user\"] || \"\";\n\n const payload = { id: req.params.id, checkedBy };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n checkedBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _approveUnitChecklist(id, value);\n\n res.json({ message: \"Unit checklist approved successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function rejectUnitChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const checkedBy = cookies[\"user\"] || \"\";\n\n if (req.body.workOrder) {\n req.body.workOrder.createdBy = checkedBy;\n }\n\n const payload = { id: req.params.id, checkedBy, ...req.body };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n attachments: Joi.array().items(Joi.string()).optional(),\n remarks: Joi.string().required(),\n workOrder: workOrderSchema.optional(),\n checkedBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, attachments, remarks, workOrder, ...value } = payload;\n\n value.metadata = {\n attachments: attachments || [],\n remarks: remarks || \"\",\n workOrder: workOrder,\n };\n\n if (value.metadata.workOrder) {\n if (value.metadata.workOrder.category) {\n value.metadata.workOrder.category = value.metadata.workOrder.category;\n }\n\n if (value.metadata.workOrder.serviceProvider) {\n value.metadata.workOrder.serviceProvider =\n value.metadata.workOrder.serviceProvider;\n }\n\n value.metadata.workOrder.createdBy = checkedBy;\n }\n\n const fullHost = req.headers.origin as string;\n\n await _rejectUnitChecklist(id, value, fullHost);\n\n res.json({ message: \"Unit checklist rejected successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createUnitChecklist,\n getAllUnitChecklist,\n approveUnitChecklist,\n rejectUnitChecklist,\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport { logger, NotFoundError } from \"@iservice365/node-server-utils\";\nimport { useUnitChecklistRepo } from \"../repositories/hygiene-unit-checklist.repository\";\nimport {\n TUnitChecklistApprove,\n TUnitChecklistReject,\n} from \"../models/hygiene-unit-checklist.model\";\nimport {\n TWorkOrder,\n useSiteRepo,\n useWorkOrderService,\n} from \"@iservice365/core\";\n\nexport function useUnitChecklistService() {\n const {\n getUnitChecklistById: _getUnitChecklistById,\n updateUnitChecklist: _updateUnitChecklist,\n } = useUnitChecklistRepo();\n const { getSiteById } = useSiteRepo();\n const { createWorkOrder } = useWorkOrderService();\n\n async function approveUnitChecklist(\n id: string | ObjectId,\n value: TUnitChecklistApprove\n ) {\n try {\n value.approve = true;\n value.reject = false;\n\n const result = await _updateUnitChecklist(id, value);\n return result;\n } catch (error) {\n logger.error(`Error updating unit checklist with id ${id}:`, error);\n throw error;\n }\n }\n\n async function rejectUnitChecklist(\n id: string | ObjectId,\n value: TUnitChecklistReject,\n fullHost?: string\n ) {\n try {\n value.reject = true;\n value.approve = false;\n\n if (value.metadata?.workOrder) {\n const existingChecklist = await _getUnitChecklistById(id);\n if (!existingChecklist)\n throw new NotFoundError(\"Unit checklist not found.\");\n\n const site = await getSiteById(\n existingChecklist.site as string | ObjectId\n );\n if (!site) throw new NotFoundError(\"Site not found.\");\n\n const workOrderData = {\n ...value.metadata.workOrder,\n attachments: value.metadata.attachments,\n createdBy: value.checkedBy as string,\n organization: site.orgId as string,\n site: site._id,\n };\n\n const workOrder = await createWorkOrder(\n workOrderData as TWorkOrder,\n fullHost\n );\n if (!workOrder) throw new NotFoundError(\"Failed to create work order.\");\n }\n\n const result = await _updateUnitChecklist(id, value);\n return result;\n } catch (error) {\n logger.error(`Error updating unit checklist with id ${id}:`, error);\n throw error;\n }\n }\n\n return {\n approveUnitChecklist,\n rejectUnitChecklist,\n };\n}\n"],"mappings":"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","names":["error","ObjectId","BadRequestError","logger","ObjectId","BadRequestError","logger","NotFoundError","useAtlas","BadRequestError","NotFoundError","useAtlas","logger","BadRequestError","logger","Joi","logger","BadRequestError","error","Joi","BadRequestError","Joi","ObjectId","error","ObjectId","useAtlas","InternalServerError","paginate","BadRequestError","NotFoundError","useCache","logger","makeCacheKey","ObjectId","BadRequestError","logger","NotFoundError","useAtlas","Joi","BadRequestError","logger","Joi","BadRequestError","error","logger","BadRequestError","logger","Joi","ObjectId","error","ObjectId","useAtlas","InternalServerError","paginate","useCache","logger","makeCacheKey","BadRequestError","dateStr","ObjectId","BadRequestError","logger","Joi","logger","BadRequestError","error","Joi","BadRequestError","logger","Joi","ObjectId","error","BadRequestError","logger","NotFoundError","useAtlas","ObjectId","useAtlas","InternalServerError","paginate","BadRequestError","useCache","logger","makeCacheKey","ObjectId","BadRequestError","NotFoundError","useAtlas","logger","BadRequestError","logger","Joi","logger","BadRequestError","error","Joi","BadRequestError","Joi","ObjectId","error","ObjectId","useAtlas","InternalServerError","paginate","BadRequestError","NotFoundError","useCache","logger","makeCacheKey","ObjectId","BadRequestError","logger","NotFoundError","useAtlas","BadRequestError","NotFoundError","useAtlas","logger","BadRequestError","logger","Joi","Joi","BadRequestError","error","logger","BadRequestError","logger","Joi","ObjectId","Joi","logger","BadRequestError","ObjectId","error","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","InternalServerError","useCache","ObjectId","logger","BadRequestError","makeCacheKey","paginate","BadRequestError","logger","Joi","logger","logger","Joi","logger","BadRequestError","error","BadRequestError","logger","Joi","ObjectId","Joi","logger","BadRequestError","ObjectId","error","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","InternalServerError","useCache","logger","ObjectId","BadRequestError","makeCacheKey","paginate","BadRequestError","logger","Joi","logger","NotFoundError","logger","NotFoundError","logger","BadRequestError","error","Joi"]}
|
|
1
|
+
{"version":3,"sources":["../src/models/hygiene-area.model.ts","../src/models/hygiene-base.model.ts","../src/repositories/hygiene-area.repository.ts","../src/utils/capitalize-text.ts","../src/services/hygiene-area.service.ts","../src/controllers/hygiene-area.controller.ts","../src/utils/convert-excel.util.ts","../src/models/hygiene-unit.model.ts","../src/services/hygiene-unit.service.ts","../src/repositories/hygiene-unit.repository.ts","../src/controllers/hygiene-unit.controller.ts","../src/models/hygiene-parent-checklist.model.ts","../src/repositories/hygiene-parent-checklist.repository.ts","../src/controllers/hygiene-parent-checklist.controller.ts","../src/models/hygiene-area-checklist.model.ts","../src/repositories/hygiene-area-checklist.repository.ts","../src/controllers/hygiene-area-checklist.controller.ts","../src/services/hygiene-area-checklist.service.ts","../src/models/hygiene-unit-checklist.model.ts","../src/repositories/hygiene-unit-checklist.repository.ts","../src/controllers/hygiene-unit-checklist.controller.ts","../src/services/hygiene-unit-checklist.service.ts"],"sourcesContent":["import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { allowedTypes } from \"./hygiene-base.model\";\n\nexport type TAreaUnits = {\n unit: string | ObjectId;\n name: string;\n};\n\nexport type TArea = {\n _id?: ObjectId;\n site: string | ObjectId;\n name: string;\n type: (typeof allowedTypes)[number];\n set?: number;\n units?: TAreaUnits[];\n status?: \"active\" | \"deleted\";\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n};\n\nexport type TAreaGetQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TArea, \"site\">;\n\nexport type TAreaCreate = Pick<\n TArea,\n \"site\" | \"name\" | \"type\" | \"set\" | \"units\"\n>;\n\nexport type TAreaUpdate = Partial<\n Pick<TArea, \"name\" | \"type\" | \"set\" | \"units\">\n>;\n\nexport type TAreaGetAreasForChecklist = Pick<TArea, \"site\" | \"type\">;\n\nexport type TAreaUpdateChecklist = {\n units: TAreaUnits[];\n};\n\nexport const areaSchema = Joi.object({\n site: Joi.string().hex().required(),\n name: Joi.string().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n set: Joi.number().min(0).optional(),\n units: Joi.array()\n .items(\n Joi.object({\n unit: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).optional()\n )\n .min(1)\n .unique(\"unit\", { ignoreUndefined: true })\n .messages({\n \"array.unique\": \"Duplicate area units are not allowed\",\n }),\n});\n\nexport function MArea(value: TAreaCreate) {\n const { error } = areaSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Area Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.units && Array.isArray(value.units)) {\n value.units = value.units.map((item) => {\n try {\n return {\n ...item,\n unit: new ObjectId(item.unit),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid unit ID format: ${item.unit}`);\n }\n });\n }\n\n return {\n site: value.site,\n name: value.name,\n type: value.type,\n set: value.set ?? 0,\n units: value.units ?? [],\n status: \"active\",\n createdAt: new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","export const allowedTypes: string[] = [\"common\", \"toilet\"];\n\nexport const allowedStatus: string[] = [\"ready\", \"ongoing\", \"completed\"];\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MArea,\n TAreaCreate,\n TAreaGetQuery,\n TAreaGetAreasForChecklist,\n TAreaUpdate,\n TAreaUpdateChecklist,\n} from \"../models/hygiene-area.model\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n NotFoundError,\n} from \"@iservice365/node-server-utils\";\nimport { capitalizeText } from \"../utils/capitalize-text\";\n\nexport function useAreaRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.areas\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { type: 1 } },\n { key: { status: 1 } },\n { key: { \"units.unit\": 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on hygiene area.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene area.\"\n );\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { site: 1, name: 1, type: 1, deletedAt: 1 },\n { unique: true }\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene area.\"\n );\n }\n }\n\n async function createArea(value: TAreaCreate, session?: ClientSession) {\n try {\n value = MArea(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\n `${capitalizeText(value.type)} area already exists.`\n );\n }\n\n throw error;\n }\n }\n\n async function getAreas({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TAreaGetQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n type: 1,\n set: 1,\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreasForChecklist({\n site,\n type,\n }: TAreaGetAreasForChecklist) {\n const query: Record<string, any> = { type, status: { $ne: \"deleted\" } };\n const cacheOptions: Record<string, any> = { type };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n set: 1,\n units: 1,\n },\n },\n { $sort: { _id: -1 } },\n ])\n .toArray();\n\n setCache(cacheKey, items, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return items;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n const query: Record<string, any> = {\n _id,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const data = await collection\n .aggregate([\n { $match: query },\n {\n $project: {\n name: 1,\n set: 1,\n units: 1,\n },\n },\n ])\n .toArray();\n\n if (!data || data.length === 0) {\n throw new NotFoundError(\"Area not found.\");\n }\n\n setCache(cacheKey, data[0], 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data[0];\n } catch (error) {\n throw error;\n }\n }\n\n async function updateArea(_id: string | ObjectId, value: TAreaUpdate) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue: any = {\n updatedAt: new Date(),\n };\n\n if (value.name !== undefined) {\n updateValue.name = value.name;\n }\n\n if (value.type !== undefined) {\n updateValue.type = value.type;\n }\n\n if (value.set !== undefined) {\n updateValue.set = value.set;\n }\n\n if (value.units && Array.isArray(value.units)) {\n updateValue.units = value.units.map((item) => {\n try {\n return {\n ...item,\n unit: new ObjectId(item.unit),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid unit ID format: ${item.unit}`);\n }\n });\n }\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function updateAreaChecklist(\n _id: string | ObjectId,\n value: TAreaUpdateChecklist\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n if (value.units && Array.isArray(value.units)) {\n value.units = value.units.map((item) => {\n try {\n return {\n ...item,\n unit: new ObjectId(item.unit),\n };\n } catch (error) {\n throw new BadRequestError(`Invalid unit ID format: ${item.unit}`);\n }\n });\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n async function deleteArea(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session }\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUniqueIndex,\n createArea,\n getAreas,\n getAreasForChecklist,\n getAreaById,\n updateArea,\n updateAreaChecklist,\n deleteArea,\n };\n}\n","export function capitalizeText(text: string): string {\n if (!text) return \"\";\n return text\n .toLowerCase()\n .split(\" \")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n","import { ObjectId } from \"mongodb\";\nimport {\n BadRequestError,\n logger,\n NotFoundError,\n} from \"@iservice365/node-server-utils\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\n\nexport function useAreaService() {\n const { createArea: _createArea } = useAreaRepo();\n\n async function importArea({\n dataJson,\n site,\n }: {\n dataJson: string;\n site: string | ObjectId;\n }) {\n let dataArray: any[];\n\n try {\n dataArray = JSON.parse(dataJson);\n } catch (error) {\n throw new BadRequestError(\"Invalid JSON format for data in excel\");\n }\n\n if (!dataArray || dataArray.length === 0) {\n throw new NotFoundError(\"No data found in the uploaded file\");\n }\n\n const insertedAreaIds: ObjectId[] = [];\n const duplicateAreas: string[] = [];\n const failedAreas: string[] = [];\n const skippedRows: number[] = [];\n\n try {\n for (let i = 0; i < dataArray.length; i++) {\n const row = dataArray[i];\n\n if (!row?.TYPE) {\n logger.warn(`Skipping row ${i + 1} with missing TYPE:`, row);\n skippedRows.push(i + 1);\n continue;\n }\n\n const areaType = String(row.TYPE).trim();\n if (!areaType) {\n logger.warn(`Skipping row ${i + 1} with empty area type`);\n skippedRows.push(i + 1);\n continue;\n }\n\n if (!row?.NAME) {\n logger.warn(`Skipping row ${i + 1} with missing NAME:`, row);\n skippedRows.push(i + 1);\n continue;\n }\n\n const areaName = String(row.NAME).trim();\n if (!areaName) {\n logger.warn(`Skipping row ${i + 1} with empty ${areaType} area name`);\n skippedRows.push(i + 1);\n continue;\n }\n\n try {\n const insertedId = await _createArea({\n type: areaType,\n name: areaName,\n site,\n });\n\n insertedAreaIds.push(insertedId);\n\n logger.info(`Successfully created ${areaType} area: ${areaName}`);\n } catch (error: any) {\n logger.error(\n `Error creating ${areaType} area \"${areaName}\": ${error.message}`\n );\n\n if (error.message.includes(\"duplicate\")) {\n duplicateAreas.push(areaName);\n } else {\n failedAreas.push(areaName);\n }\n }\n }\n\n let message = `Upload completed: ${insertedAreaIds.length} areas successfully created`;\n\n if (duplicateAreas.length > 0) {\n message += `, ${duplicateAreas.length} areas skipped (already exist)`;\n }\n\n if (failedAreas.length > 0) {\n message += `, ${failedAreas.length} areas failed`;\n }\n\n if (skippedRows.length > 0) {\n message += `, ${skippedRows.length} rows skipped (invalid data)`;\n }\n\n logger.info(message);\n\n if (insertedAreaIds.length === 0) {\n if (duplicateAreas.length > 0 && failedAreas.length === 0) {\n throw new BadRequestError(\n `No new areas were created. All ${\n duplicateAreas.length\n } areas already exist in the system: ${duplicateAreas.join(\", \")}`\n );\n } else if (failedAreas.length > 0) {\n throw new BadRequestError(\n `No areas were created. Please check your data format and ensure area names are valid.`\n );\n } else if (skippedRows.length > 0) {\n throw new BadRequestError(\n `No areas were created. All rows contained invalid or missing area names.`\n );\n }\n }\n\n return { message };\n } catch (error: any) {\n logger.error(\"Error while uploading area information\", error);\n\n if (error instanceof BadRequestError) {\n throw error;\n } else if (error.message.includes(\"duplicate\")) {\n throw new BadRequestError(\n `Upload failed due to duplicate area names. Please ensure all area names are unique.`\n );\n } else if (error.message.includes(\"validation\")) {\n throw new BadRequestError(\n \"Upload failed due to invalid data format. Please check that all required fields are properly filled.\"\n );\n } else {\n throw new BadRequestError(\n `Upload failed: ${\n error.message || \"Please check your data format and try again.\"\n }`\n );\n }\n }\n }\n\n return { importArea };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\nimport { useAreaService } from \"../services/hygiene-area.service\";\nimport { allowedTypes } from \"../models/hygiene-base.model\";\nimport { areaSchema } from \"../models/hygiene-area.model\";\nimport { MulterRequest } from \"../utils/multer-request.util\";\nimport { convertBufferFile } from \"../utils/convert-excel.util\";\n\nexport function useAreaController() {\n const {\n createArea: _createArea,\n getAreas: _getAreas,\n getAreaById: _getAreaById,\n updateArea: _updateArea,\n updateAreaChecklist: _updateAreaChecklist,\n deleteArea: _deleteById,\n } = useAreaRepo();\n const { importArea: _importArea } = useAreaService();\n\n async function createArea(req: Request, res: Response, next: NextFunction) {\n const payload = { ...req.body, ...req.params };\n\n const { error } = areaSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createArea(payload);\n\n res.status(201).json({ message: \"Area created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreas(req: Request, res: Response, next: NextFunction) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getAreas({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function getAreaById(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAreaById(_id);\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateArea(req: Request, res: Response, next: NextFunction) {\n const payload = { id: req.params.id, ...req.body };\n\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n type: Joi.string()\n .optional()\n .allow(\"\", null, ...allowedTypes),\n set: Joi.number().min(0).optional(),\n units: Joi.array()\n .items(\n Joi.object({\n unit: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).required()\n )\n .min(1)\n .unique(\"unit\", { ignoreUndefined: true })\n .optional()\n .messages({\n \"array.unique\": \"Duplicate area units are not allowed\",\n }),\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateArea(id, value);\n\n res.json({ message: \"Area updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, ...req.body };\n\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n units: Joi.array()\n .items(\n Joi.object({\n unit: Joi.string().hex().required(),\n name: Joi.string().required(),\n }).required()\n )\n .min(1)\n .unique(\"unit\", { ignoreUndefined: true })\n .messages({\n \"array.unique\": \"Duplicate area units are not allowed\",\n }),\n });\n\n const { error } = schema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateAreaChecklist(id, value);\n\n res.json({ message: \"Area updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteArea(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const validation = Joi.string().hex().required();\n\n const { error } = validation.validate(id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteById(id);\n res.json({ message: \"Area deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function importArea(\n req: MulterRequest,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"File is required!\"));\n return;\n }\n\n const { site } = req.params;\n\n const schema = Joi.string().hex().required();\n\n const { error } = schema.validate(site);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const xlsData = await convertBufferFile(req.file.buffer);\n const dataJson = JSON.stringify(xlsData);\n const result = await _importArea({ dataJson, site });\n\n return res.status(201).json(result);\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createArea,\n getAreas,\n getAreaById,\n updateArea,\n updateAreaChecklist,\n deleteArea,\n importArea,\n };\n}\n","import { Readable } from \"stream\";\nimport * as xlsx from \"xlsx\";\n\nexport function convertBufferFile(bufferFile: Buffer): Promise<any[]> {\n return new Promise((resolve, reject) => {\n const fileStream = Readable.from(bufferFile);\n\n let fileBuffer = Buffer.alloc(0);\n fileStream.on(\"data\", (chunk) => {\n fileBuffer = Buffer.concat([fileBuffer, chunk]);\n });\n\n fileStream.on(\"end\", () => {\n try {\n const workbook = xlsx.read(fileBuffer, { type: \"buffer\" });\n const sheetName = workbook.SheetNames[0];\n const sheet = workbook.Sheets[sheetName];\n const jsonData = xlsx.utils.sheet_to_json(sheet);\n resolve(jsonData);\n } catch (error) {\n reject(\"Error parsing file\");\n }\n });\n\n fileStream.on(\"error\", (err) => {\n reject(\"Error Reading File: \" + err.message);\n });\n });\n}\n\nexport function calculateTotalHrs(time: number) {\n const totalHrs = time / (1000 * 60 * 60);\n return totalHrs.toFixed(1) + \" Hr\";\n}\n","import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TUnit = {\n _id?: ObjectId;\n site: string | ObjectId;\n name: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n status?: \"active\" | \"deleted\";\n};\n\nexport type TUnitCreate = Partial<Pick<TUnit, \"site\" | \"name\">>;\n\nexport type TUnitUpdate = Partial<Pick<TUnit, \"name\">>;\n\nexport type TGetUnitsQuery = {\n page?: number;\n limit?: number;\n search?: string;\n} & Pick<TUnit, \"site\">;\n\nexport const unitSchema = Joi.object({\n site: Joi.string().hex().required(),\n name: Joi.string().required(),\n});\n\nexport function MUnit(value: TUnitCreate) {\n const { error } = unitSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Unit Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n return {\n site: value.site,\n name: value.name,\n createdAt: new Date(),\n status: \"active\",\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport {\n BadRequestError,\n logger,\n NotFoundError,\n} from \"@iservice365/node-server-utils\";\nimport { useUnitRepository } from \"../repositories/hygiene-unit.repository\";\n\nexport function useUnitService() {\n const { createUnit: _createUnit } = useUnitRepository();\n\n async function importUnit({\n dataJson,\n site,\n }: {\n dataJson: string;\n site: string | ObjectId;\n }) {\n let dataArray: any[];\n\n try {\n dataArray = JSON.parse(dataJson);\n } catch (error) {\n throw new BadRequestError(\"Invalid JSON format for data in excel\");\n }\n\n if (!dataArray || dataArray.length === 0) {\n throw new NotFoundError(\"No data found in the uploaded file\");\n }\n\n const insertedUnitIds: ObjectId[] = [];\n const duplicateUnits: string[] = [];\n const failedUnits: string[] = [];\n const skippedRows: number[] = [];\n\n try {\n for (let i = 0; i < dataArray.length; i++) {\n const row = dataArray[i];\n\n if (!row?.NAME) {\n logger.warn(`Skipping row ${i + 1} with missing NAME:`, row);\n skippedRows.push(i + 1);\n continue;\n }\n\n const unitName = String(row.NAME).trim();\n if (!unitName) {\n logger.warn(`Skipping row ${i + 1} with empty unit name`);\n skippedRows.push(i + 1);\n continue;\n }\n\n try {\n const insertedId = await _createUnit({\n name: unitName,\n site,\n });\n\n insertedUnitIds.push(insertedId);\n\n logger.info(`Successfully created unit: ${unitName}`);\n } catch (error: any) {\n logger.error(`Error creating unit \"${unitName}\": ${error.message}`);\n\n if (error.message.includes(\"Unit already exists\")) {\n duplicateUnits.push(unitName);\n } else {\n failedUnits.push(unitName);\n }\n }\n }\n\n let message = `Upload completed: ${insertedUnitIds.length} units successfully created`;\n\n if (duplicateUnits.length > 0) {\n message += `, ${duplicateUnits.length} units skipped (already exist)`;\n }\n\n if (failedUnits.length > 0) {\n message += `, ${failedUnits.length} units failed`;\n }\n\n if (skippedRows.length > 0) {\n message += `, ${skippedRows.length} rows skipped (invalid data)`;\n }\n\n logger.info(message);\n\n if (insertedUnitIds.length === 0) {\n if (duplicateUnits.length > 0 && failedUnits.length === 0) {\n throw new BadRequestError(\n `No new units were created. All ${\n duplicateUnits.length\n } units already exist in the system: ${duplicateUnits.join(\", \")}`\n );\n } else if (failedUnits.length > 0) {\n throw new BadRequestError(\n `No units were created. Please check your data format and ensure unit names are valid.`\n );\n } else if (skippedRows.length > 0) {\n throw new BadRequestError(\n `No units were created. All rows contained invalid or missing unit names.`\n );\n }\n }\n\n return { message };\n } catch (error: any) {\n logger.error(\"Error while uploading unit information\", error);\n\n if (error instanceof BadRequestError) {\n throw error;\n } else if (error.message.includes(\"duplicate\")) {\n throw new BadRequestError(\n \"Upload failed due to duplicate unit names. Please ensure all unit names are unique.\"\n );\n } else if (error.message.includes(\"validation\")) {\n throw new BadRequestError(\n \"Upload failed due to invalid data format. Please check that all required fields are properly filled.\"\n );\n } else {\n throw new BadRequestError(\n `Upload failed: ${\n error.message || \"Please check your data format and try again.\"\n }`\n );\n }\n }\n }\n\n return { importUnit };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MUnit,\n TGetUnitsQuery,\n TUnitUpdate,\n TUnitCreate,\n} from \"../models/hygiene-unit.model\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n BadRequestError,\n useCache,\n logger,\n makeCacheKey,\n} from \"@iservice365/node-server-utils\";\n\nexport function useUnitRepository() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.area.unit\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on hygiene unit.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene unit.\"\n );\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { site: 1, name: 1, deletedAt: 1 },\n { unique: true }\n );\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create unique index on hygiene unit.\"\n );\n }\n }\n\n async function createUnit(value: TUnitCreate, session?: ClientSession) {\n try {\n value = MUnit(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n if (isDuplicated) {\n throw new BadRequestError(\"Unit already exists.\");\n }\n\n throw error;\n }\n }\n\n async function getUnits({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n }: TGetUnitsQuery) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$or = [{ name: { $regex: search, $options: \"i\" } }];\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n { $project: { name: 1 } },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateUnit(_id: string | ObjectId, value: TUnitUpdate) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning unit.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Area already exists.\");\n }\n\n throw error;\n }\n }\n\n async function deleteUnit(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n\n try {\n const updateValue = {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session }\n );\n\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to delete unit.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUniqueIndex,\n createUnit,\n getUnits,\n updateUnit,\n deleteUnit,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useUnitRepository } from \"../repositories/hygiene-unit.repository\";\nimport { unitSchema } from \"../models/hygiene-unit.model\";\nimport { useUnitService } from \"../services/hygiene-unit.service\";\nimport { MulterRequest } from \"../utils/multer-request.util\";\nimport { convertBufferFile } from \"../utils/convert-excel.util\";\n\nexport function useUnitController() {\n const {\n createUnit: _createUnit,\n getUnits: _getUnits,\n updateUnit: _updateUnit,\n deleteUnit: _deleteUnit,\n } = useUnitRepository();\n const { importUnit: _importUnit } = useUnitService();\n\n async function createUnit(req: Request, res: Response, next: NextFunction) {\n const payload = { ...req.body, ...req.params };\n\n const { error } = unitSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createUnit(payload);\n\n res.status(201).json({ message: \"Unit created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getUnits(req: Request, res: Response, next: NextFunction) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n\n try {\n const data = await _getUnits({\n page,\n limit,\n search,\n site,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function updateUnit(req: Request, res: Response, next: NextFunction) {\n const payload = { id: req.params.id, ...req.body };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _updateUnit(id, value);\n\n res.json({ message: \"Unit updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function deleteUnit(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate({ id });\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _deleteUnit(id);\n\n res.json({ message: \"Unit deleted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function importUnit(\n req: MulterRequest,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"File is required!\"));\n return;\n }\n\n const { site } = req.params;\n\n const validation = Joi.string().hex().required();\n\n const { error } = validation.validate(site);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const xlsData = await convertBufferFile(req.file.buffer);\n const dataJson = JSON.stringify(xlsData);\n\n const result = await _importUnit({ dataJson, site });\n return res.status(201).json(result);\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createUnit,\n getUnits,\n updateUnit,\n deleteUnit,\n importUnit,\n };\n}\n","import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { allowedStatus } from \"./hygiene-base.model\";\n\nexport type TParentChecklist = {\n _id?: ObjectId;\n site?: string | ObjectId;\n status?: (typeof allowedStatus)[number];\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport const parentChecklistSchema = Joi.object({\n createdAt: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n site: Joi.string().hex().required(),\n});\n\nexport function MParentChecklist(value: TParentChecklist) {\n const { error } = parentChecklistSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Parent Checklist Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(`Invalid site ID format: ${value.site}`);\n }\n }\n\n return {\n site: value.site,\n status: \"ready\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt ?? \"\",\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MParentChecklist,\n TParentChecklist,\n} from \"../models/hygiene-parent-checklist.model\";\nimport {\n useAtlas,\n InternalServerError,\n paginate,\n useCache,\n logger,\n makeCacheKey,\n BadRequestError,\n} from \"@iservice365/node-server-utils\";\n\nexport function useParentChecklistRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.schedules\";\n const site_collection = \"sites\";\n\n const collection = db.collection(namespace_collection);\n const siteCollection = db.collection(site_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { createdAt: 1 } },\n { key: { site: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene parent checklist.\"\n );\n }\n }\n\n async function createParentChecklist(\n value: TParentChecklist,\n session?: ClientSession\n ) {\n try {\n const currentDate = value.createdAt\n ? new Date(value.createdAt)\n : new Date();\n\n const startOfDay = new Date(currentDate);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(currentDate);\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n const existingChecklist = await collection.findOne({\n createdAt: {\n $gte: startOfDay,\n $lte: endOfDay,\n },\n });\n\n if (existingChecklist) {\n const dateStr = currentDate.toISOString().split(\"T\")[0];\n logger.info(`Parent checklist already exists for today: ${dateStr}`);\n return existingChecklist._id;\n }\n\n const siteIds = await getHygieneSiteIds();\n\n if (!Array.isArray(siteIds)) {\n logger.error(\"getHygieneSiteIds returned non-array value:\", siteIds);\n throw new InternalServerError(\"Failed to retrieve site IDs\");\n }\n\n if (siteIds.length === 0) {\n logger.warn(\"No sites found for creating parent checklist\");\n throw new BadRequestError(\"No sites available for checklist creation\");\n }\n\n const checklistDocs: any[] = [];\n\n for (const site of siteIds) {\n checklistDocs.push(\n MParentChecklist({\n site,\n createdAt: currentDate,\n })\n );\n }\n\n const result = await collection.insertMany(checklistDocs, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n const dateStr = currentDate.toISOString().split(\"T\")[0];\n logger.info(\n `Created ${\n Object.keys(result.insertedIds).length\n } parent checklists for today: ${dateStr}`\n );\n\n return Object.values(result.insertedIds);\n } catch (error) {\n logger.error(\"Failed to create daily parent checklist\", error);\n throw error;\n }\n }\n\n async function getAllParentChecklist({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n startDate = \"\",\n endDate = \"\",\n }: {\n page?: number;\n limit?: number;\n search?: string;\n site: ObjectId | string;\n startDate?: Date | string;\n endDate?: Date | string;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n site = new ObjectId(site);\n query.site = site;\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n if (startDate && endDate) {\n query.createdAt = {\n $gte: new Date(startDate),\n $lte: new Date(endDate),\n };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n } else if (startDate) {\n query.createdAt = { $gte: new Date(startDate) };\n cacheOptions.startDate = new Date(startDate).toISOString().split(\"T\")[0];\n } else if (endDate) {\n query.createdAt = { $lte: new Date(endDate) };\n cacheOptions.endDate = new Date(endDate).toISOString().split(\"T\")[0];\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const pipeline: Object[] = [{ $match: query }];\n\n pipeline.push({\n $project: {\n _id: 1,\n site: 1,\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n {\n case: { $eq: [\"$status\", \"ongoing\"] },\n then: \"Ongoing\",\n },\n { case: { $eq: [\"$status\", \"completed\"] }, then: \"Completed\" },\n ],\n default: \"$status\",\n },\n },\n completedAt: 1,\n createdAt: 1,\n },\n });\n\n pipeline.push(\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit }\n );\n\n const items = await collection.aggregate(pipeline).toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function updateParentChecklistStatuses(createdAt?: Date) {\n try {\n const currentDate = new Date();\n\n const dateToUpdate =\n createdAt || new Date(currentDate.getTime() - 24 * 60 * 60 * 1000);\n\n const startOfDay = new Date(dateToUpdate);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(dateToUpdate);\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n logger.info(\n `Updating parent checklist statuses for date: ${\n dateToUpdate.toISOString().split(\"T\")[0]\n }`\n );\n\n const statusUpdates = await collection\n .aggregate([\n {\n $match: {\n createdAt: {\n $gte: startOfDay,\n $lte: endOfDay,\n },\n },\n },\n {\n $lookup: {\n from: \"site.cleaning.schedule.areas\",\n let: { parentId: \"$_id\" },\n pipeline: [\n {\n $match: {\n $expr: { $eq: [\"$parentChecklist\", \"$$parentId\"] },\n },\n },\n {\n $group: {\n _id: {\n parentChecklist: \"$parentChecklist\",\n },\n completedCount: {\n $sum: {\n $cond: [{ $eq: [\"$status\", \"completed\"] }, 1, 0],\n },\n },\n ongoingCount: {\n $sum: {\n $cond: [{ $eq: [\"$status\", \"ongoing\"] }, 1, 0],\n },\n },\n readyCount: {\n $sum: {\n $cond: [{ $eq: [\"$status\", \"ready\"] }, 1, 0],\n },\n },\n totalCount: { $sum: 1 },\n },\n },\n {\n $addFields: {\n finalStatus: {\n $cond: {\n if: {\n $and: [\n { $gt: [\"$completedCount\", 0] },\n { $eq: [\"$ongoingCount\", 0] },\n { $eq: [\"$readyCount\", 0] },\n ],\n },\n then: \"completed\",\n else: {\n $cond: {\n if: {\n $and: [\n { $eq: [\"$completedCount\", 0] },\n { $eq: [\"$ongoingCount\", 0] },\n ],\n },\n then: \"expired\",\n else: \"ongoing\",\n },\n },\n },\n },\n completedAt: {\n $cond: {\n if: {\n $and: [\n { $gt: [\"$completedCount\", 0] },\n { $eq: [\"$ongoingCount\", 0] },\n { $eq: [\"$readyCount\", 0] },\n ],\n },\n then: new Date(),\n else: null,\n },\n },\n },\n },\n ],\n as: \"areaStats\",\n },\n },\n {\n $match: {\n \"areaStats.0\": { $exists: true },\n },\n },\n {\n $addFields: {\n areaData: { $arrayElemAt: [\"$areaStats\", 0] },\n },\n },\n {\n $project: {\n _id: 1,\n newStatus: \"$areaData.finalStatus\",\n completedAt: \"$areaData.completedAt\",\n },\n },\n ])\n .toArray();\n\n logger.info(\n `Found ${statusUpdates.length} parent checklists to potentially update`\n );\n\n if (statusUpdates.length === 0) {\n logger.info(\n `No parent checklists found for date range: ${startOfDay.toISOString()} to ${endOfDay.toISOString()}`\n );\n return null;\n }\n\n const bulkOps = statusUpdates.map((update) => {\n logger.info(\n `Updating parent checklist ${update._id} with status: ${update.newStatus}`\n );\n return {\n updateOne: {\n filter: { _id: update._id },\n update: {\n $set: {\n status: update.newStatus,\n completedAt: update.completedAt,\n updatedAt: new Date(),\n },\n },\n },\n };\n });\n\n let result = null;\n if (bulkOps.length > 0) {\n result = await collection.bulkWrite(bulkOps);\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n }\n\n logger.info(`Updated statuses for ${bulkOps.length} parent checklists.`);\n\n return result;\n } catch (error) {\n logger.error(\"Failed to update parent checklist statuses\", error);\n throw error;\n }\n }\n\n async function getHygieneSiteIds() {\n const query: Record<string, any> = {\n status: { $ne: \"deleted\" },\n };\n\n const cacheKey = makeCacheKey(site_collection, { tag: \"site-ids\" });\n const cachedData = await getCache(cacheKey);\n if (cachedData && Array.isArray(cachedData)) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const items = await siteCollection\n .aggregate([\n { $match: query },\n { $project: { _id: 1 } },\n { $sort: { _id: -1 } },\n ])\n .toArray();\n\n const siteIds = items.map((item) => item._id.toString());\n\n if (siteIds.length > 0) {\n setCache(cacheKey, siteIds, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n }\n\n return siteIds;\n } catch (error) {\n logger.error(\"Failed to get hygiene site IDs\", error);\n throw error;\n }\n }\n\n return {\n createIndex,\n createParentChecklist,\n getAllParentChecklist,\n updateParentChecklistStatuses,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useParentChecklistRepo } from \"../repositories/hygiene-parent-checklist.repository\";\nimport { parentChecklistSchema } from \"../models/hygiene-parent-checklist.model\";\nimport { allowedTypes } from \"../models/hygiene-base.model\";\n\nexport function useParentChecklistController() {\n const {\n createParentChecklist: _createParentChecklist,\n getAllParentChecklist: _getAllParentChecklist,\n } = useParentChecklistRepo();\n\n async function createParentChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = req.body;\n\n const { error } = parentChecklistSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createParentChecklist(payload);\n res\n .status(201)\n .json({ message: \"Parent checklist created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAllParentChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n startDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n endDate: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const startDate = (req.query.startDate as string) ?? \"\";\n const endDate = (req.query.endDate as string) ?? \"\";\n\n try {\n const data = await _getAllParentChecklist({\n page,\n limit,\n search,\n site,\n startDate,\n endDate,\n });\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createParentChecklist,\n getAllParentChecklist,\n };\n}\n","import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { allowedStatus, allowedTypes } from \"./hygiene-base.model\";\n\nexport const allowedChecklistStatus = [\"ready\", \"completed\"];\n\nexport type TCleaningScheduleArea = {\n _id?: ObjectId;\n schedule: string | ObjectId;\n name: string;\n type: (typeof allowedTypes)[number];\n checklist: TAreaChecklist[];\n status?: (typeof allowedStatus)[number];\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport type TAreaChecklist = {\n set: number;\n units: TAreaChecklistUnits[];\n};\n\nexport type TAreaChecklistUnits = {\n name: string;\n status?: (typeof allowedChecklistStatus)[number];\n remarks?: string;\n timestamp?: Date | string;\n};\n\nexport type TAreaChecklistCreate = Pick<TCleaningScheduleArea, \"schedule\"> & {\n site: string | ObjectId;\n};\n\nexport const areaChecklistSchema = Joi.object({\n schedule: Joi.string().hex().required(),\n name: Joi.string().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n checklist: Joi.array()\n .items(\n Joi.object({\n set: Joi.number().min(0).required(),\n units: Joi.array()\n .items(\n Joi.object({\n name: Joi.string().required(),\n }).required()\n )\n .min(1)\n .required(),\n }).required()\n )\n .optional()\n .default([]),\n});\n\nexport function MAreaChecklist(value: TCleaningScheduleArea) {\n const { error } = areaChecklistSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Checklist Area Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.schedule) {\n try {\n value.schedule = new ObjectId(value.schedule);\n } catch (error) {\n throw new BadRequestError(\"Invalid schedule ID format.\");\n }\n }\n\n if (value.checklist && Array.isArray(value.checklist)) {\n value.checklist = value.checklist.map((checklistItem) => {\n return {\n set: checklistItem.set,\n units: checklistItem.units.map((unit) => ({\n name: unit.name,\n status: \"ready\",\n remarks: \"\",\n timestamp: \"\",\n })),\n };\n });\n }\n\n return {\n schedule: value.schedule,\n name: value.name,\n type: value.type,\n checklist: value.checklist || [],\n status: \"ready\",\n createdAt: new Date(),\n updatedAt: \"\",\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@iservice365/node-server-utils\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MAreaChecklist,\n TCleaningScheduleArea,\n} from \"../models/hygiene-area-checklist.model\";\nimport { allowedStatus, allowedTypes } from \"../models/hygiene-base.model\";\n\nexport function useAreaChecklistRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"site.cleaning.schedule.areas\";\n const unit_checklist_collection = \"site.cleaning.schedule.units\";\n\n const collection = db.collection(namespace_collection);\n const unitChecklistCollection = db.collection(unit_checklist_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n const { delNamespace: delUnitNamespace } = useCache(\n unit_checklist_collection\n );\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { schedule: 1 } },\n { key: { type: 1 } },\n { key: { status: 1 } },\n { key: { createdAt: 1 } },\n { key: { acceptedBy: 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene checklist area.\"\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene checklist area.\"\n );\n }\n }\n\n async function createAreaChecklist(\n value: TCleaningScheduleArea,\n session?: ClientSession\n ) {\n try {\n const parentChecklistId = new ObjectId(value.schedule);\n\n const currentDate = new Date();\n\n const startOfDay = new Date(currentDate);\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(currentDate);\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n const existingChecklist = await collection.findOne({\n type: value.type,\n schedule: parentChecklistId,\n name: value.name,\n createdAt: {\n $gte: startOfDay,\n $lte: endOfDay,\n },\n });\n\n if (existingChecklist) {\n logger.info(\n `Area checklist already exists for area ${value.name} on ${\n currentDate.toISOString().split(\"T\")[0]\n }`\n );\n return existingChecklist._id;\n }\n\n const processedValue = MAreaChecklist(value);\n const result = await collection.insertOne(processedValue, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return result.insertedId;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAllAreaChecklist({\n page = 1,\n limit = 10,\n search = \"\",\n type,\n schedule,\n }: {\n page?: number;\n limit?: number;\n search?: string;\n type?: (typeof allowedTypes)[number];\n schedule: string | ObjectId;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query.schedule = new ObjectId(schedule);\n cacheOptions.schedule = schedule.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n if (type) {\n query.type = type;\n cacheOptions.type = type;\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const pipeline: Object[] = [\n { $match: query },\n {\n $project: {\n name: 1,\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n { case: { $eq: [\"$status\", \"ongoing\"] }, then: \"Ongoing\" },\n {\n case: { $eq: [\"$status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$status\",\n },\n },\n type: 1,\n set: {\n $cond: {\n if: { $gt: [{ $size: { $ifNull: [\"$checklist\", []] } }, 0] },\n then: { $max: \"$checklist.set\" },\n else: 0,\n },\n },\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const items = await collection.aggregate(pipeline).toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistHistory({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n type,\n schedule,\n status,\n createdAt,\n user,\n }: {\n page?: number;\n limit?: number;\n search?: string;\n site: string | ObjectId;\n type: (typeof allowedTypes)[number];\n schedule: string | ObjectId;\n status?: (typeof allowedStatus)[number];\n createdAt?: string | Date;\n user?: string | ObjectId;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { type };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query.site = new ObjectId(site);\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n try {\n query.schedule = new ObjectId(schedule);\n cacheOptions.schedule = schedule.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n if (createdAt) {\n query.createdAt = {\n $gte: new Date(`${createdAt}T00:00:00Z`),\n $lte: new Date(`${createdAt}T23:59:59Z`),\n };\n cacheOptions.createdAt = new Date(createdAt).toISOString().split(\"T\")[0];\n }\n\n if (status) {\n query.status = status;\n cacheOptions.status = status;\n } else {\n query.status = { $in: [\"ongoing\", \"completed\"] };\n }\n\n if (user) {\n try {\n query.acceptedBy = new ObjectId(user);\n cacheOptions.user = user.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID format.\");\n }\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const pipeline: Object[] = [\n { $match: query },\n {\n $lookup: {\n from: \"users\",\n localField: \"acceptedBy\",\n foreignField: \"_id\",\n pipeline: [\n ...(search\n ? [{ $match: { name: { $regex: search, $options: \"i\" } } }]\n : []),\n { $project: { name: 1 } },\n ],\n as: \"acceptedBy\",\n },\n },\n {\n $unwind: {\n path: \"$acceptedBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n createdAt: 1,\n acceptedByName: \"$acceptedBy.name\",\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n { case: { $eq: [\"$status\", \"ongoing\"] }, then: \"Ongoing\" },\n {\n case: { $eq: [\"$status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$status\",\n },\n },\n startedAt: \"$acceptedAt\",\n endedAt: \"$completedAt\",\n },\n },\n { $sort: { status: 1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const items = await collection.aggregate(pipeline).toArray();\n\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getAreaChecklistHistoryDetails(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: _id.toString(),\n });\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const areaPipeline: Object[] = [\n { $match: { _id } },\n {\n $lookup: {\n from: \"users\",\n localField: \"createdBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"createdBy\",\n },\n },\n {\n $unwind: {\n path: \"$createdBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $lookup: {\n from: \"users\",\n localField: \"acceptedBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"acceptedBy\",\n },\n },\n {\n $unwind: {\n path: \"$acceptedBy\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $project: {\n name: 1,\n createdAt: 1,\n createdByName: \"$createdBy.name\",\n startedAt: \"$acceptedAt\",\n endedAt: \"$completedAt\",\n status: {\n $switch: {\n branches: [\n { case: { $eq: [\"$status\", \"ready\"] }, then: \"Ready\" },\n { case: { $eq: [\"$status\", \"ongoing\"] }, then: \"Ongoing\" },\n {\n case: { $eq: [\"$status\", \"completed\"] },\n then: \"Completed\",\n },\n ],\n default: \"$status\",\n },\n },\n signature: 1,\n acceptedByName: \"$acceptedBy.name\",\n },\n },\n ];\n\n const unitPipeline: Object[] = [\n { $match: { areaChecklist: _id } },\n {\n $project: {\n name: 1,\n remarks: \"$metadata.remarks\",\n attachments: \"$metadata.attachments\",\n approve: { $ifNull: [\"$approve\", null] },\n reject: { $ifNull: [\"$reject\", null] },\n },\n },\n ];\n\n const [area, units] = await Promise.all([\n collection.aggregate(areaPipeline).toArray(),\n unitChecklistCollection.aggregate(unitPipeline).toArray(),\n ]);\n\n if (!area.length) {\n throw new BadRequestError(\"Area checklist not found.\");\n }\n\n const items: Record<string, any> = {\n area: area[0],\n units,\n };\n\n setCache(cacheKey, items, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return items;\n } catch (error) {\n throw error;\n }\n }\n\n async function acceptAreaChecklist(\n _id: string | ObjectId,\n acceptedBy: string | ObjectId\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n acceptedBy = new ObjectId(acceptedBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid acceptedBy ID format.\");\n }\n\n try {\n const now = new Date();\n const updateValue = {\n metadata: {\n acceptedBy,\n acceptedAt: now,\n },\n updatedAt: now,\n };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n async function attachImageAreaChecklist(\n _id: string | ObjectId,\n attachments: string[],\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n try {\n const now = new Date();\n const updateValue = {\n metadata: { attachments },\n updatedAt: now,\n };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session }\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\n \"Unable to update cleaning area checklist.\"\n );\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n delUnitNamespace()\n .then(() => {\n logger.info(\n `Cache cleared for namespace: ${unit_checklist_collection}`\n );\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${unit_checklist_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n async function submitAreaChecklist(\n _id: string | ObjectId,\n signature: string\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const now = new Date();\n const updateValue = {\n metadata: {\n signature,\n completedAt: now,\n },\n status: \"ongoing\",\n updatedAt: now,\n };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n async function completeAreaChecklist(\n _id: string | ObjectId,\n signature: string\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid area ID format.\");\n }\n\n try {\n const now = new Date();\n const updateValue = {\n metadata: {\n signature,\n completedAt: now,\n },\n status: \"completed\",\n updatedAt: now,\n };\n\n const res = await collection.updateOne({ _id }, { $set: updateValue });\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update cleaning area.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createAreaChecklist,\n getAllAreaChecklist,\n getAreaChecklistHistory,\n getAreaChecklistHistoryDetails,\n acceptAreaChecklist,\n attachImageAreaChecklist,\n submitAreaChecklist,\n completeAreaChecklist,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useAreaChecklistRepo } from \"../repositories/hygiene-area-checklist.repository\";\nimport { allowedStatus, allowedTypes } from \"../models/hygiene-base.model\";\nimport { useAreaChecklistService } from \"../services/hygiene-area-checklist.service\";\n\nexport function useAreaChecklistController() {\n const {\n getAllAreaChecklist: _getAllAreaChecklist,\n getAreaChecklistHistory: _getAreaChecklistHistory,\n getAreaChecklistHistoryDetails: _getAreaChecklistHistoryDetails,\n acceptAreaChecklist: _acceptAreaChecklist,\n attachImageAreaChecklist: _attachImageAreaChecklist,\n submitAreaChecklist: _submitAreaChecklist,\n completeAreaChecklist: _completeAreaChecklist,\n } = useAreaChecklistRepo();\n const { createAreaChecklist: _createAreaChecklist } =\n useAreaChecklistService();\n\n async function createAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = {\n site: req.params.site,\n schedule: req.params.schedule,\n };\n\n const validation = Joi.object({\n site: Joi.string().hex().required(),\n schedule: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createAreaChecklist(payload);\n res\n .status(201)\n .json({ message: \"Area checklist generated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAllAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n type: Joi.string()\n .optional()\n .allow(\"\", ...allowedTypes),\n schedule: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const type = (req.query.type as string) ?? \"\";\n const schedule = (req.params.schedule as string) ?? \"\";\n\n try {\n const data = await _getAllAreaChecklist({\n page,\n limit,\n search,\n type,\n schedule,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaChecklistHistory(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const user = cookies[\"user\"] || \"\";\n\n const query = { ...req.query, ...req.params, user };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n schedule: Joi.string().hex().required(),\n status: Joi.string().allow(\"\", null, ...allowedStatus),\n createdAt: Joi.alternatives()\n .try(Joi.date(), Joi.string())\n .optional()\n .allow(\"\", null),\n user: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const type = (req.query.type as string) ?? \"\";\n const schedule = (req.params.schedule as string) ?? \"\";\n const status = (req.query.status as string) ?? \"\";\n const createdAt = (req.query.createdAt as string) ?? \"\";\n\n try {\n const data = await _getAreaChecklistHistory({\n page,\n limit,\n search,\n site,\n type,\n schedule,\n status,\n createdAt,\n user,\n });\n\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAreaChecklistHistoryDetails(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const validation = Joi.string().hex().required();\n\n const _id = req.params.id;\n\n const { error } = validation.validate(_id);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAreaChecklistHistoryDetails(_id);\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function acceptAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const acceptedBy = cookies[\"user\"] || \"\";\n\n const payload = { id: req.params.id, acceptedBy };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n acceptedBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _acceptAreaChecklist(payload.id, payload.acceptedBy);\n\n res.json({ message: \"Area checklist updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function attachImageAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, attachments: req.body.attachments };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n attachments: Joi.array().items(Joi.string()).optional(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _attachImageAreaChecklist(payload.id, payload.attachments);\n\n res.json({ message: \"Area checklist attachments updated successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function submitAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, signature: req.body.signature };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n signature: Joi.string().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _submitAreaChecklist(payload.id, payload.signature);\n\n res.json({ message: \"Area checklist submitted successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function completeAreaChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = { id: req.params.id, signature: req.body.signature };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n signature: Joi.string().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _completeAreaChecklist(payload.id, payload.signature);\n\n res.json({ message: \"Area checklist completed successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createAreaChecklist,\n getAllAreaChecklist,\n getAreaChecklistHistory,\n getAreaChecklistHistoryDetails,\n acceptAreaChecklist,\n attachImageAreaChecklist,\n submitAreaChecklist,\n completeAreaChecklist,\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport { logger, useAtlas } from \"@iservice365/node-server-utils\";\nimport { useAreaChecklistRepo } from \"../repositories/hygiene-area-checklist.repository\";\nimport {\n TAreaChecklistCreate,\n TCleaningScheduleArea,\n} from \"../models/hygiene-area-checklist.model\";\nimport { useAreaRepo } from \"../repositories/hygiene-area.repository\";\n\nexport function useAreaChecklistService() {\n const { createAreaChecklist: _createAreaChecklist } = useAreaChecklistRepo();\n const { getAreasForChecklist } = useAreaRepo();\n\n async function createAreaChecklist(value: TAreaChecklistCreate) {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n\n const results: ObjectId[] = [];\n let totalChecklistsCreated = 0;\n\n const BATCH_SIZE = 10;\n\n const commonAreasResult = (await getAreasForChecklist({\n site: value.site,\n type: \"common\",\n })) as any;\n const commonAreas = commonAreasResult || [];\n\n if (commonAreas.length > 0) {\n for (let i = 0; i < commonAreas.length; i += BATCH_SIZE) {\n const batch = commonAreas.slice(i, i + BATCH_SIZE);\n\n const batchPromises = batch.map(async (area: any) => {\n const checklistData: TCleaningScheduleArea = {\n schedule: value.schedule,\n name: area.name,\n type: \"common\",\n checklist:\n area.units && area.units.length > 0\n ? [\n {\n set: area.set || 0,\n units: area.units.map((unit: any) => ({\n name: unit.name,\n })),\n },\n ]\n : [],\n };\n\n const insertedId = await _createAreaChecklist(\n checklistData,\n session\n );\n totalChecklistsCreated++;\n return insertedId;\n });\n\n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n\n logger.info(\n `Created ${commonAreas.length} common area checklists for site: ${value.site}`\n );\n } else {\n logger.warn(`No common areas found for site: ${value.site}`);\n }\n\n const toiletAreasResult = (await getAreasForChecklist({\n site: value.site,\n type: \"toilet\",\n })) as any;\n const toiletAreas = toiletAreasResult || [];\n\n if (toiletAreas.length > 0) {\n for (let i = 0; i < toiletAreas.length; i += BATCH_SIZE) {\n const batch = toiletAreas.slice(i, i + BATCH_SIZE);\n\n const batchPromises = batch.map(async (toiletLocation: any) => {\n const checklistData: TCleaningScheduleArea = {\n schedule: value.schedule,\n name: toiletLocation.name,\n type: \"toilet\",\n checklist:\n toiletLocation.units && toiletLocation.units.length > 0\n ? [\n {\n set: toiletLocation.set || 0,\n units: toiletLocation.units.map((unit: any) => ({\n name: unit.name,\n })),\n },\n ]\n : [],\n };\n\n const insertedId = await _createAreaChecklist(\n checklistData,\n session\n );\n totalChecklistsCreated++;\n return insertedId;\n });\n\n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n\n logger.info(\n `Created ${toiletAreas.length} toilet area checklists for site: ${value.site}`\n );\n } else {\n logger.warn(`No toilet locations found for site: ${value.site}`);\n }\n\n await session?.commitTransaction();\n\n logger.info(\n `Successfully created ${totalChecklistsCreated} area checklists for site: ${value.site}`\n );\n\n return results;\n } catch (error) {\n logger.error(`Error generating area checklists:`, error);\n if (session?.inTransaction()) {\n await session?.abortTransaction();\n }\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n return { createAreaChecklist };\n}\n","import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\nimport { allowedTypes } from \"./hygiene-base.model\";\n\nexport type TUnitChecklistMetadataWorkOrder = {\n attachments?: Array<string>;\n subject: string;\n category: string | ObjectId;\n highPriority?: boolean;\n block?: string;\n level?: string;\n unit?: string;\n location?: string;\n description: string;\n createdBy: string | ObjectId;\n createdByName?: string;\n serviceProvider?: string | ObjectId;\n organization?: string | ObjectId;\n site?: string | ObjectId;\n};\n\nexport type TUnitChecklistMetadata = {\n attachments?: string[];\n remarks?: string;\n workOrder?: TUnitChecklistMetadataWorkOrder;\n};\n\nexport type TUnitChecklist = {\n _id?: ObjectId;\n site: string | ObjectId;\n type: (typeof allowedTypes)[number];\n parentChecklist: string | ObjectId;\n areaChecklist: string | ObjectId;\n unit: ObjectId;\n name?: string;\n approve?: boolean;\n reject?: boolean;\n checkedBy?: string | ObjectId;\n metadata?: TUnitChecklistMetadata;\n createdBy?: string | ObjectId;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport type TUnitChecklistApprove = Partial<\n Pick<TUnitChecklist, \"approve\" | \"reject\" | \"checkedBy\">\n>;\n\nexport type TUnitChecklistReject = Partial<\n Pick<TUnitChecklist, \"approve\" | \"reject\" | \"checkedBy\" | \"metadata\">\n>;\n\nexport const unitChecklistSchema = Joi.object({\n site: Joi.string().hex().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n parentChecklist: Joi.string().hex().required(),\n areaChecklist: Joi.string().hex().required(),\n unit: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n createdBy: Joi.string().hex().optional().allow(\"\", null),\n});\n\nexport function MUnitChecklist(value: TUnitChecklist) {\n const { error } = unitChecklistSchema.validate(value);\n if (error) {\n logger.info(`Hygiene Checklist Unit Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value.site) {\n try {\n value.site = new ObjectId(value.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n\n if (value.parentChecklist) {\n try {\n value.parentChecklist = new ObjectId(value.parentChecklist);\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n }\n\n if (value.areaChecklist) {\n try {\n value.areaChecklist = new ObjectId(value.areaChecklist);\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n }\n\n if (value.unit) {\n try {\n value.unit = new ObjectId(value.unit);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit ID format.\");\n }\n }\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n return {\n site: value.site,\n type: value.type,\n parentChecklist: value.parentChecklist,\n areaChecklist: value.areaChecklist,\n unit: value.unit,\n name: value.name ?? \"\",\n approve: false,\n reject: false,\n createdBy: value.createdBy ?? \"\",\n createdAt: new Date(),\n updatedAt: value.updatedAt ?? \"\",\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@iservice365/node-server-utils\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MUnitChecklist,\n TUnitChecklist,\n TUnitChecklistApprove,\n TUnitChecklistReject,\n} from \"../models/hygiene-unit-checklist.model\";\nimport { allowedTypes } from \"../models/hygiene-base.model\";\n\nexport function useUnitChecklistRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"hygiene-checklist.units\";\n\n const collection = db.collection(namespace_collection);\n\n const { delNamespace, setCache, getCache } = useCache(namespace_collection);\n\n async function createIndex() {\n try {\n await collection.createIndexes([\n { key: { site: 1 } },\n { key: { type: 1 } },\n { key: { parentChecklist: 1 } },\n { key: { areaChecklist: 1 } },\n { key: { \"metadata.workOrder.category\": 1 } },\n { key: { \"metadata.workOrder.createdBy\": 1 } },\n { key: { \"metadata.workOrder.serviceProvider\": 1 } },\n { key: { \"metadata.workOrder.organization\": 1 } },\n { key: { \"metadata.workOrder.site\": 1 } },\n ]);\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create index on hygiene unit checklist.\"\n );\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\n \"Failed to create text index on hygiene unit checklist.\"\n );\n }\n }\n\n async function createUnitChecklist(\n value: TUnitChecklist,\n session?: ClientSession\n ) {\n try {\n value = MUnitChecklist(value);\n const res = await collection.insertOne(value, { session });\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.insertedId;\n } catch (error: any) {\n throw error;\n }\n }\n\n async function getAllUnitChecklist({\n page = 1,\n limit = 10,\n search = \"\",\n site,\n type,\n parentChecklist,\n areaChecklist,\n }: {\n page?: number;\n limit?: number;\n search?: string;\n site: string | ObjectId;\n type: (typeof allowedTypes)[number];\n parentChecklist: string | ObjectId;\n areaChecklist: string | ObjectId;\n }) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { type };\n\n const cacheOptions: Record<string, any> = {\n page,\n limit,\n };\n\n try {\n query.site = new ObjectId(site);\n cacheOptions.site = site.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n\n try {\n query.parentChecklist = new ObjectId(parentChecklist);\n cacheOptions.parentChecklist = parentChecklist.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid parent checklist ID format.\");\n }\n\n try {\n query.areaChecklist = new ObjectId(areaChecklist);\n cacheOptions.areaChecklist = areaChecklist.toString();\n } catch (error) {\n throw new BadRequestError(\"Invalid area checklist ID format.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheOptions);\n const cachedData = await getCache(cacheKey);\n if (cachedData) {\n logger.info(`Cache hit for key: ${cacheKey}`);\n return cachedData;\n }\n\n try {\n const areaAttachmentsResult = await collection\n .aggregate([\n { $match: query },\n {\n $lookup: {\n from: \"hygiene-checklist.areas\",\n localField: \"areaChecklist\",\n foreignField: \"_id\",\n pipeline: [\n { $project: { attachments: \"$metadata.attachments\" } },\n ],\n as: \"areaChecklistData\",\n },\n },\n {\n $unwind: {\n path: \"$areaChecklistData\",\n preserveNullAndEmptyArrays: true,\n },\n },\n {\n $group: {\n _id: null,\n attachments: { $first: \"$areaChecklistData.attachments\" },\n },\n },\n ])\n .toArray();\n\n const areaAttachments =\n areaAttachmentsResult.length > 0\n ? areaAttachmentsResult[0].attachments || []\n : [];\n\n const pipeline: Object[] = [\n { $match: query },\n {\n $lookup: {\n from: \"organizations\",\n localField: \"metadata.workOrder.category\",\n foreignField: \"_id\",\n pipeline: [{ $project: { nature: 1 } }],\n as: \"categoryData\",\n },\n },\n {\n $lookup: {\n from: \"users\",\n localField: \"metadata.workOrder.createdBy\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"createdByData\",\n },\n },\n {\n $lookup: {\n from: \"service-providers\",\n localField: \"metadata.workOrder.serviceProvider\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"serviceProviderData\",\n },\n },\n {\n $lookup: {\n from: \"organizations\",\n localField: \"metadata.workOrder.organization\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"organizationData\",\n },\n },\n {\n $lookup: {\n from: \"sites\",\n localField: \"metadata.workOrder.site\",\n foreignField: \"_id\",\n pipeline: [{ $project: { name: 1 } }],\n as: \"siteData\",\n },\n },\n {\n $addFields: {\n \"metadata.workOrder.categoryName\": {\n $arrayElemAt: [\"$categoryData.nature\", 0],\n },\n \"metadata.workOrder.createdByName\": {\n $arrayElemAt: [\"$createdByData.name\", 0],\n },\n \"metadata.workOrder.serviceProviderName\": {\n $arrayElemAt: [\"$serviceProviderData.name\", 0],\n },\n \"metadata.workOrder.organizationName\": {\n $arrayElemAt: [\"$organizationData.name\", 0],\n },\n \"metadata.workOrder.siteName\": {\n $arrayElemAt: [\"$siteData.name\", 0],\n },\n },\n },\n {\n $project: {\n name: 1,\n remarks: \"$metadata.remarks\",\n attachments: \"$metadata.attachments\",\n workOrder: \"$metadata.workOrder\",\n approve: { $ifNull: [\"$approve\", null] },\n reject: { $ifNull: [\"$reject\", null] },\n },\n },\n { $sort: { _id: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ];\n\n const items = await collection.aggregate(pipeline).toArray();\n const length = await collection.countDocuments(query);\n\n const paginatedData = paginate(items, page, limit, length);\n\n const data = {\n attachments: areaAttachments,\n ...paginatedData,\n };\n\n setCache(cacheKey, data, 15 * 60)\n .then(() => {\n logger.info(`Cache set for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to set cache for key: ${cacheKey}`, err);\n });\n\n return data;\n } catch (error) {\n throw error;\n }\n }\n\n async function getUnitChecklistById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit checklist ID format.\");\n }\n\n try {\n return await collection.findOne({ _id });\n } catch (error) {\n throw error;\n }\n }\n\n async function updateUnitChecklist(\n _id: string | ObjectId,\n value: TUnitChecklistApprove | TUnitChecklistReject,\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid unit checklist ID format.\");\n }\n\n if (value.checkedBy && typeof value.checkedBy === \"string\") {\n try {\n value.checkedBy = new ObjectId(value.checkedBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid checkedBy ID format.\");\n }\n }\n\n if (\"metadata\" in value && value.metadata?.workOrder) {\n const workOrder = value.metadata.workOrder;\n\n if (workOrder.category && typeof workOrder.category === \"string\") {\n try {\n workOrder.category = new ObjectId(workOrder.category);\n } catch (error) {\n throw new BadRequestError(\"Invalid category ID format.\");\n }\n }\n\n if (workOrder.createdBy && typeof workOrder.createdBy === \"string\") {\n try {\n workOrder.createdBy = new ObjectId(workOrder.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID format.\");\n }\n }\n\n if (\n workOrder.serviceProvider &&\n typeof workOrder.serviceProvider === \"string\"\n ) {\n try {\n workOrder.serviceProvider = new ObjectId(workOrder.serviceProvider);\n } catch (error) {\n throw new BadRequestError(\"Invalid serviceProvider ID format.\");\n }\n }\n\n if (\n workOrder.organization &&\n typeof workOrder.organization === \"string\"\n ) {\n try {\n workOrder.organization = new ObjectId(workOrder.organization);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID format.\");\n }\n }\n\n if (workOrder.site && typeof workOrder.site === \"string\") {\n try {\n workOrder.site = new ObjectId(workOrder.site);\n } catch (error) {\n throw new BadRequestError(\"Invalid site ID format.\");\n }\n }\n }\n\n try {\n const updateValue = { ...value, updatedAt: new Date() };\n\n const res = await collection.updateOne(\n { _id },\n { $set: updateValue },\n { session }\n );\n if (res.modifiedCount === 0) {\n throw new InternalServerError(\"Unable to update unit checklist.\");\n }\n\n delNamespace()\n .then(() => {\n logger.info(`Cache cleared for namespace: ${namespace_collection}`);\n })\n .catch((err) => {\n logger.error(\n `Failed to clear cache for namespace: ${namespace_collection}`,\n err\n );\n });\n\n return res.modifiedCount;\n } catch (error: any) {\n throw error;\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createUnitChecklist,\n getAllUnitChecklist,\n getUnitChecklistById,\n updateUnitChecklist,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { useUnitChecklistRepo } from \"../repositories/hygiene-unit-checklist.repository\";\nimport { unitChecklistSchema } from \"../models/hygiene-unit-checklist.model\";\nimport { allowedTypes } from \"../models/hygiene-base.model\";\nimport { useUnitChecklistService } from \"../services/hygiene-unit-checklist.service\";\nimport { workOrderSchema } from \"@iservice365/core\";\n\nexport function useUnitChecklistController() {\n const {\n createUnitChecklist: _createUnitChecklist,\n getAllUnitChecklist: _getAllUnitChecklist,\n } = useUnitChecklistRepo();\n const {\n approveUnitChecklist: _approveUnitChecklist,\n rejectUnitChecklist: _rejectUnitChecklist,\n } = useUnitChecklistService();\n\n async function createUnitChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const createdBy = cookies[\"user\"] || \"\";\n\n const payload = { ...req.body, ...req.params, createdBy };\n\n const { error } = unitChecklistSchema.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createUnitChecklist(payload);\n res\n .status(201)\n .json({ message: \"Unit checklist created successfully.\", id });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function getAllUnitChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const query = { ...req.query, ...req.params };\n\n const validation = Joi.object({\n page: Joi.number().min(1).optional().allow(\"\", null),\n limit: Joi.number().min(1).optional().allow(\"\", null),\n search: Joi.string().optional().allow(\"\", null),\n site: Joi.string().hex().required(),\n type: Joi.string()\n .valid(...allowedTypes)\n .required(),\n parentChecklist: Joi.string().hex().required(),\n areaChecklist: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(query);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n const page = parseInt(req.query.page as string) ?? 1;\n const limit = parseInt(req.query.limit as string) ?? 20;\n const search = (req.query.search as string) ?? \"\";\n const site = (req.params.site as string) ?? \"\";\n const type = (req.params.type as string) ?? \"\";\n const parentChecklist = (req.params.parentChecklist as string) ?? \"\";\n const areaChecklist = (req.params.areaChecklist as string) ?? \"\";\n\n try {\n const data = await _getAllUnitChecklist({\n page,\n limit,\n search,\n site,\n type,\n parentChecklist,\n areaChecklist,\n });\n res.json(data);\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function approveUnitChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const checkedBy = cookies[\"user\"] || \"\";\n\n const payload = { id: req.params.id, checkedBy };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n checkedBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, ...value } = payload;\n await _approveUnitChecklist(id, value);\n\n res.json({ message: \"Unit checklist approved successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n async function rejectUnitChecklist(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const cookies = req.headers.cookie\n ? req.headers.cookie\n .split(\";\")\n .map((cookie) => cookie.trim().split(\"=\"))\n .reduce(\n (acc, [key, value]) => ({ ...acc, [key]: value }),\n {} as Record<string, string>\n )\n : {};\n const checkedBy = cookies[\"user\"] || \"\";\n\n if (req.body.workOrder) {\n req.body.workOrder.createdBy = checkedBy;\n }\n\n const payload = { id: req.params.id, checkedBy, ...req.body };\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n attachments: Joi.array().items(Joi.string()).optional(),\n remarks: Joi.string().required(),\n workOrder: workOrderSchema.optional(),\n checkedBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n logger.log({ level: \"error\", message: error.message });\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const { id, attachments, remarks, workOrder, ...value } = payload;\n\n value.metadata = {\n attachments: attachments || [],\n remarks: remarks || \"\",\n workOrder: workOrder,\n };\n\n if (value.metadata.workOrder) {\n if (value.metadata.workOrder.category) {\n value.metadata.workOrder.category = value.metadata.workOrder.category;\n }\n\n if (value.metadata.workOrder.serviceProvider) {\n value.metadata.workOrder.serviceProvider =\n value.metadata.workOrder.serviceProvider;\n }\n\n value.metadata.workOrder.createdBy = checkedBy;\n }\n\n const fullHost = req.headers.origin as string;\n\n await _rejectUnitChecklist(id, value, fullHost);\n\n res.json({ message: \"Unit checklist rejected successfully.\" });\n return;\n } catch (error: any) {\n logger.log({ level: \"error\", message: error.message });\n next(error);\n return;\n }\n }\n\n return {\n createUnitChecklist,\n getAllUnitChecklist,\n approveUnitChecklist,\n rejectUnitChecklist,\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport { logger, NotFoundError } from \"@iservice365/node-server-utils\";\nimport { useUnitChecklistRepo } from \"../repositories/hygiene-unit-checklist.repository\";\nimport {\n TUnitChecklistApprove,\n TUnitChecklistReject,\n} from \"../models/hygiene-unit-checklist.model\";\nimport {\n TWorkOrder,\n useSiteRepo,\n useWorkOrderService,\n} from \"@iservice365/core\";\n\nexport function useUnitChecklistService() {\n const {\n getUnitChecklistById: _getUnitChecklistById,\n updateUnitChecklist: _updateUnitChecklist,\n } = useUnitChecklistRepo();\n const { getSiteById } = useSiteRepo();\n const { createWorkOrder } = useWorkOrderService();\n\n async function approveUnitChecklist(\n id: string | ObjectId,\n value: TUnitChecklistApprove\n ) {\n try {\n value.approve = true;\n value.reject = false;\n\n const result = await _updateUnitChecklist(id, value);\n return result;\n } catch (error) {\n logger.error(`Error updating unit checklist with id ${id}:`, error);\n throw error;\n }\n }\n\n async function rejectUnitChecklist(\n id: string | ObjectId,\n value: TUnitChecklistReject,\n fullHost?: string\n ) {\n try {\n value.reject = true;\n value.approve = false;\n\n if (value.metadata?.workOrder) {\n const existingChecklist = await _getUnitChecklistById(id);\n if (!existingChecklist)\n throw new NotFoundError(\"Unit checklist not found.\");\n\n const site = await getSiteById(\n existingChecklist.site as string | ObjectId\n );\n if (!site) throw new NotFoundError(\"Site not found.\");\n\n const workOrderData = {\n ...value.metadata.workOrder,\n attachments: value.metadata.attachments,\n createdBy: value.checkedBy as string,\n organization: site.orgId as string,\n site: site._id,\n };\n\n const workOrder = await createWorkOrder(\n workOrderData as TWorkOrder,\n fullHost\n );\n if (!workOrder) throw new NotFoundError(\"Failed to create work order.\");\n }\n\n const result = await _updateUnitChecklist(id, value);\n return result;\n } catch (error) {\n logger.error(`Error updating unit checklist with id ${id}:`, error);\n throw error;\n }\n }\n\n return {\n approveUnitChecklist,\n rejectUnitChecklist,\n };\n}\n"],"mappings":"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","names":["error","ObjectId","BadRequestError","logger","logger","BadRequestError","ObjectId","BadRequestError","logger","NotFoundError","BadRequestError","NotFoundError","logger","BadRequestError","logger","Joi","logger","BadRequestError","error","Joi","BadRequestError","logger","Joi","ObjectId","error","BadRequestError","logger","NotFoundError","ObjectId","useAtlas","InternalServerError","paginate","BadRequestError","useCache","logger","makeCacheKey","ObjectId","BadRequestError","NotFoundError","logger","BadRequestError","logger","Joi","logger","BadRequestError","error","Joi","BadRequestError","logger","Joi","ObjectId","error","ObjectId","useAtlas","InternalServerError","paginate","useCache","logger","makeCacheKey","BadRequestError","dateStr","ObjectId","BadRequestError","logger","Joi","logger","BadRequestError","error","Joi","BadRequestError","logger","Joi","ObjectId","Joi","logger","BadRequestError","ObjectId","error","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","InternalServerError","useCache","ObjectId","logger","BadRequestError","makeCacheKey","paginate","BadRequestError","logger","Joi","logger","useAtlas","useAtlas","logger","Joi","logger","BadRequestError","error","BadRequestError","logger","Joi","ObjectId","Joi","logger","BadRequestError","ObjectId","error","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","InternalServerError","useCache","logger","ObjectId","BadRequestError","makeCacheKey","paginate","BadRequestError","logger","Joi","logger","NotFoundError","logger","NotFoundError","logger","BadRequestError","error","Joi"]}
|