@iservice365/module-hygiene 0.0.1 → 0.1.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.
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
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"],"sourcesContent":["import { BadRequestError, logger } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport interface TAreaChecklist {\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?: TAreaChecklist[];\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 } from \"@iservice365/node-server-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport interface TParentChecklistStatus {\n site: string | ObjectId;\n status: string;\n completedAt: string | Date;\n type: string;\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 site: Joi.string().hex().required(),\n status: Joi.string().required(),\n completedAt: Joi.date().required(),\n type: Joi.string().required(),\n })\n )\n .optional(),\n updatedAt: Joi.date().optional().allow(\"\", null),\n});\n\nexport function MParentChecklist(value: TParentChecklist) {\n const { error } = parentChecklistSchema.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n return {\n date: value.date,\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 { MParentChecklist, TParentChecklist } from \"../models/hygiene-parent-checklist.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\";\nimport Joi from \"joi\";\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, delCache } =\n useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { date: \"text\" } },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on site.\");\n }\n }\n\n async function create(value: TParentChecklist, session?: ClientSession) {\n try {\n\n const currentDate = new Date();\n\n const startOfDay = new Date(currentDate);\n startOfDay.setDate(currentDate.getDate());\n startOfDay.setUTCHours(0, 0, 0, 0);\n\n const endOfDay = new Date(currentDate);\n endOfDay.setDate(currentDate.getDate());\n endOfDay.setUTCHours(23, 59, 59, 999);\n\n const checklistRecord = await collection.findOne({\n date: {\n $gte: startOfDay,\n $lte: endOfDay,\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 if (!checklistRecord) {\n value = MParentChecklist(value);\n const res = await collection.insertOne(value, { session });\n return res.insertedId;\n }\n\n return checklistRecord;\n\n } catch (error) {\n throw error;\n }\n }\n\n async function get({\n page = 1,\n limit = 10,\n search = \"\",\n sort = {},\n startDate = \"\",\n endDate = \"\",\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 const query: Record<string, any> = {\n createdAt: {\n createdAt: {\n $gte: new Date(startDate),\n $lte: new Date(endDate),\n },\n },\n };\n\n const cacheOptions: Record<string, any> = {\n createdAt: {\n createdAt: {\n $gte: new Date(startDate),\n $lte: new Date(endDate),\n },\n },\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 },\n },\n {\n $facet: {\n totalCount: [{ $count: \"count\" }],\n items: [\n { $sort: { createdAt: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ],\n },\n },\n ])\n .toArray();\n\n const length = await collection.countDocuments(dateFilter);\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 return {\n createIndexes,\n create,\n get,\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\";\n\nexport function useParentCheckilstController() {\n const {\n get: _getAll,\n create: _create,\n } = useParentChecklistRepo();\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 });\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 create(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const schema = Joi.object({\n date: Joi.string().required(),\n });\n\n const { error } = schema.validate(value);\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 _create(value);\n res.status(201).json(result);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n getAll,\n create,\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 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) {\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 value = MScheduleTaskArea({ ...params, updatedAt: new Date() });\n\n const res = await collection.updateOne({ _id }, { $set: value });\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 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 const cacheKey = makeCacheKey(namespace_collection, { _id });\n delCache(cacheKey)\n .then(() => {\n logger.info(`Cache deleted for key: ${cacheKey}`);\n })\n .catch((err) => {\n logger.error(`Failed to delete cache for key: ${cacheKey}`, err);\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 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 $facet: {\n totalCount: [{ $count: \"count\" }],\n items: [\n { $sort: { createdAt: -1 } },\n { $skip: page * limit },\n { $limit: limit },\n ],\n },\n },\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(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 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 return {\n createScheduleTaskArea,\n updateScheduleTaskArea,\n deleteScheduleTaskArea,\n getScheduleTaskAreas,\n createIndexes,\n getScheduleTaskAreaByName,\n getScheduleTaskAreaById,\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 {\n getScheduleTaskAreas: _getAll,\n createScheduleTaskArea: _create,\n updateScheduleTaskArea: _updateById,\n deleteScheduleTaskArea: _deleteById,\n getScheduleTaskAreaByName: _getScheduleTaskAreaByName,\n getScheduleTaskAreaById: _getScheduleTaskAreaById,\n } = useScheduleTaskAreaRepository();\n\n async function getAll(query: TGetScheduleTaskAreasQuery) {\n return await _getAll(query);\n }\n\n async function create(scheduleTaskArea: TScheduleTaskArea) {\n const result = await _getScheduleTaskAreaByName(\n scheduleTaskArea.name,\n scheduleTaskArea.site\n );\n if (result)\n throw new InternalServerError(\n \"Schedule Task Area name already exists in this site.\"\n );\n return await _create(scheduleTaskArea);\n }\n\n async function updateById(\n id: string | ObjectId,\n scheduleTaskArea: TScheduleTaskArea\n ) {\n const result = await _getScheduleTaskAreaByName(\n scheduleTaskArea.name,\n scheduleTaskArea.site\n );\n const resultId = result?._id.toString() ?? \"\";\n\n if (result && id != resultId) {\n throw new InternalServerError(\n \"Schedule Task Area name already exists in this site.\"\n );\n }\n return await _updateById(id, scheduleTaskArea);\n }\n\n async function deleteById(id: string | ObjectId) {\n return await _deleteById(id);\n }\n\n return {\n getAll,\n create,\n updateById,\n deleteById,\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\";\n\nexport function useScheduleTaskAreaController() {\n const {\n getAll: _getAll,\n create: _createScheduleTaskArea,\n updateById: _updateScheduleTaskArea,\n deleteById: _deleteById,\n } = useScheduleTaskAreaService();\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 scheduleTaskAreas = await _getAll({\n page,\n limit,\n sort: sortObj,\n site,\n search,\n });\n res.json(scheduleTaskAreas);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function createScheduleTaskArea(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const value = req.body;\n\n const schema = Joi.object({\n name: Joi.string().required(),\n site: Joi.string().hex().optional().allow(\"\", null),\n createdBy: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = schema.validate(value);\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 _createScheduleTaskArea(value);\n res.status(201).json(result);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateScheduleTaskArea(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const { name, site, createdBy } = req.body;\n const id = req.params.id;\n const schema = Joi.object({\n id: Joi.string().hex().required(),\n name: Joi.string().required(),\n site: Joi.string().required(),\n checklist: Joi.array()\n .optional()\n .items(\n Joi.object({\n _id: Joi.string().optional().required(),\n name: Joi.string().optional().required(),\n })\n ),\n createdBy: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = schema.validate({ id, name, createdBy, site });\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 _updateScheduleTaskArea(id, {\n name,\n createdBy,\n site,\n });\n res.json(result);\n return;\n } catch (error) {\n next(error);\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\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 return {\n getAll,\n createScheduleTaskArea,\n updateScheduleTaskArea,\n deleteScheduleTaskArea,\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","Joi","useAtlas","InternalServerError","paginate","useCache","logger","makeCacheKey","BadRequestError","logger","Joi","Joi","BadRequestError","error","logger","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","useCache","logger","makeCacheKey","ObjectId","InternalServerError","InternalServerError","BadRequestError","logger","Joi","Joi","BadRequestError","error","logger"]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@iservice365/module-hygiene",
3
3
  "license": "MIT",
4
- "version": "0.0.1",
4
+ "version": "0.1.0",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",
8
8
  "scripts": {
9
- "build": "tsup src/index.ts --format cjs,esm --dts && cp -r src/public dist",
9
+ "build": "tsup src/index.ts --format cjs,esm --dts",
10
10
  "release": "yarn run build && changeset publish",
11
11
  "lint": "tsc"
12
12
  },
@@ -24,6 +24,7 @@
24
24
  "dependencies": {
25
25
  "@iservice365/node-server-utils": "^1.1.8",
26
26
  "@types/urllib": "^2.33.0",
27
+ "cors": "^2.8.5",
27
28
  "dotenv": "^16.4.7",
28
29
  "express": "^4.21.2",
29
30
  "fast-levenshtein": "^3.0.0",
@@ -32,8 +33,10 @@
32
33
  "mongodb": "^6.18.0",
33
34
  "multer": "^1.4.5-lts.2",
34
35
  "node-cron": "^3.0.3",
36
+ "redis": "^4.6.10",
35
37
  "urllib": "^4.8.2",
36
38
  "uuid": "^11.1.0",
39
+ "xlsx": "^0.18.5",
37
40
  "zod": "^3.24.2"
38
41
  }
39
42
  }
@@ -1,142 +0,0 @@
1
- <div
2
- style="
3
- position: relative;
4
- max-width: 600px;
5
- margin: 0 auto;
6
- background: #111426;
7
- padding: 40px;
8
- border-radius: 16px;
9
- box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);
10
- color: #ddd;
11
- font-family: 'Segoe UI', Helvetica, Arial, sans-serif;
12
- overflow: hidden;
13
- "
14
- >
15
-
16
- <img
17
- src="https://seven365-storage.sgp1.cdn.digitaloceanspaces.com/seven365-public/images/email-background.png?quality=lossless"
18
- alt=""
19
- style="
20
- position: absolute;
21
- top: 0;
22
- right: 0;
23
- width: 300px;
24
- height: auto;
25
- z-index: 0;
26
- opacity: 1;
27
- "
28
- />
29
-
30
- <div style="position: relative; z-index: 1">
31
- <!-- logo -->
32
- <div style="text-align: start; margin-bottom: 30px; width: 50%">
33
- <img
34
- src="https://seven365-storage.sgp1.cdn.digitaloceanspaces.com/seven365-public/images/seven365-logo.png"
35
- alt="Seven365 Logo"
36
- style="height: 50px"
37
- />
38
- </div>
39
-
40
- <!-- header -->
41
- <div style="text-align: start; margin-bottom: 30px">
42
- <h2 style="font-size: 36px; color: #fafafa; margin: 0; font-weight: 400">
43
- You’ve Been Invited to Join
44
- <br />
45
- iService365
46
- </h2>
47
- </div>
48
-
49
- <!-- body -->
50
- <div style="font-size: 20px; color: #fafafa; text-align: start">
51
- <p><strong style="font-size: 20px">Hi {{email}},</strong></p>
52
- <p style="font-size: 16px">
53
- You’ve been invited to join our platform. Please use the link below to
54
- complete your registration. This link is valid for
55
- <strong>{{validity}}</strong>.
56
- </p>
57
- </div>
58
-
59
- <!-- cta button -->
60
- <div style="text-align: left; margin: 30px 0">
61
- <a
62
- href="{{link}}"
63
- target="_blank"
64
- style="
65
- background: #1e90ff;
66
- color: #fff;
67
- padding: 14px 38px;
68
- text-decoration: none;
69
- border-radius: 6px;
70
- font-size: 16px;
71
- display: inline-block;
72
- "
73
- >
74
- Accept Invitation
75
- </a>
76
- </div>
77
-
78
- <!-- additional info -->
79
- <div style="text-align: left; margin-bottom: 30px">
80
- <p style="font-size: 14px; color: #fafafa; margin-bottom: 16px">
81
- If you weren’t expecting this invitation, you can safely ignore this
82
- email.
83
- </p>
84
-
85
- <p style="font-size: 14px; color: #fafafa; margin-bottom: 16px">
86
- Need help? Contact our support team at
87
- <a
88
- href="mailto:contact@seven365.com.sg"
89
- style="color: #1e90ff"
90
- >contact@seven365.com.sg</a>
91
- </p>
92
-
93
- <p style="font-size: 14px; margin-top: 30px; color: #fafafa">
94
- Welcome aboard!<br />
95
- <strong>iService365 Support Team</strong>
96
- </p>
97
- </div>
98
-
99
- <!-- social icons -->
100
- <div style="text-align: start; margin-top: 30px">
101
- <!-- <a href="#" style="margin: 0 10px; text-decoration: none">
102
- <img
103
- src="https://seven365-storage.sgp1.cdn.digitaloceanspaces.com/seven365-public/images/facebook-icon.png"
104
- alt="Facebook"
105
- style="cursor: pointer"
106
- />
107
- </a> -->
108
- <a
109
- href="https://www.linkedin.com/company/seven365-pte-ltd/"
110
- style="margin: 0 10px; text-decoration: none"
111
- >
112
- <img
113
- src="https://seven365-storage.sgp1.cdn.digitaloceanspaces.com/seven365-public/images/linkedin-icon.png"
114
- alt="LinkedIn"
115
- style="cursor: pointer"
116
- />
117
- </a>
118
- <!-- <a href="#" style="margin: 0 10px; text-decoration: none">
119
- <img
120
- src="https://seven365-storage.sgp1.cdn.digitaloceanspaces.com/seven365-public/images/twitter-icon.png"
121
- alt="Twitter"
122
- style="cursor: pointer"
123
- />
124
- </a> -->
125
- </div>
126
-
127
- <!-- footer -->
128
- <div
129
- style="
130
- margin-top: 40px;
131
- font-size: 14px;
132
- color: #fafafa;
133
- text-align: center;
134
- background-color: #343a45;
135
- padding: 18px;
136
- border-radius: 8px;
137
- "
138
- >
139
- You're receiving this email because you are a subscriber of Seven365.
140
- </div>
141
- </div>
142
- </div>