@goweekdays/core 2.8.0 → 2.9.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 +85 -2
- package/dist/index.js +3017 -2062
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2976 -2009
- 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/resources/user/user.repository.ts","../src/resources/user/user.model.ts","../src/resources/auth/auth.service.ts","../node_modules/uuid/dist/esm-node/rng.js","../node_modules/uuid/dist/esm-node/stringify.js","../node_modules/uuid/dist/esm-node/native.js","../node_modules/uuid/dist/esm-node/v4.js","../src/resources/auth/auth.controller.ts","../src/resources/verification/verification.service.ts","../src/resources/verification/verification.model.ts","../src/resources/verification/verification.repository.ts","../src/config.ts","../src/resources/user/user.service.ts","../src/resources/file/file.repository.ts","../src/resources/file/file.model.ts","../src/resources/member/member.repository.ts","../src/resources/member/member.model.ts","../src/resources/role/role.repository.ts","../src/resources/role/role.model.ts","../src/resources/permission/permission.model.ts","../src/resources/permission/permission.repository.ts","../src/resources/permission/permission.service.ts","../src/resources/permission/permission.controller.ts","../src/resources/permission/permission.group.model.ts","../src/resources/permission/permission.group.repository.ts","../src/resources/permission/permission.group.service.ts","../src/resources/app/app.model.ts","../src/resources/app/app.repository.ts","../src/resources/app/app.service.ts","../src/resources/app/app.controller.ts","../src/resources/permission/permission.group.controller.ts","../src/resources/organization/organization.model.ts","../src/resources/organization/organization.repository.ts","../src/resources/organization/organization.service.ts","../src/resources/member/member.controller.ts","../src/resources/member/member.service.ts","../src/resources/role/role.service.ts","../src/resources/role/role.controller.ts","../src/resources/subscription/subscription.model.ts","../src/resources/subscription/subscription.repository.ts","../src/resources/subscription/subscription.controller.ts","../src/resources/subscription/subscription.service.ts","../src/resources/subscription/subscription.transaction.repository.ts","../src/resources/subscription/subscription.transaction.model.ts","../src/resources/subscription/subscription.transaction.controller.ts","../src/resources/plan/plan.model.ts","../src/resources/plan/plan.repository.ts","../src/resources/plan/plan.service.ts","../src/resources/plan/plan.controller.ts","../src/resources/utils/paypal.service.ts","../src/resources/verification/verification.controller.ts","../src/resources/ledger/ledger.billing.model.ts","../src/resources/ledger/ledger.billing.repository.ts","../src/resources/ledger/ledger.billing.controller.ts","../src/resources/organization/organization.controller.ts","../src/resources/user/user.controller.ts","../src/resources/building/building.model.ts","../src/resources/building/building.repository.ts","../src/resources/building/building.service.ts","../src/resources/building/building-unit.repository.ts","../src/resources/building/building.controller.ts","../src/resources/building/building-unit.service.ts","../src/resources/building/building-unit.controller.ts","../src/resources/counter/counter.model.ts","../src/resources/counter/counter.repository.ts","../src/resources/file/file.service.ts","../src/resources/file/file.controller.ts","../src/resources/promo/promo.model.ts","../src/resources/promo/promo.repository.ts","../src/resources/utils/github.service.ts","../src/resources/utils/util.controller.ts","../src/resources/utils/transaction.schema.ts","../src/resources/job-post/job.post.model.ts","../src/resources/job-post/job.post.controller.ts","../src/resources/job-post/job.post.repository.ts","../src/resources/job-post/job.post.service.ts"],"sourcesContent":["import { ClientSession, ObjectId } from \"mongodb\";\nimport { modelUser, TUser } from \"./user.model\";\nimport {\n useAtlas,\n InternalServerError,\n logger,\n BadRequestError,\n paginate,\n useCache,\n makeCacheKey,\n} from \"@goweekdays/utils\";\n\nexport function useUserRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"users\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: {\n firstName: \"text\",\n middleName: \"text\",\n lastName: \"text\",\n email: \"text\",\n },\n },\n { key: { email: 1, deletedAt: 1 }, unique: true },\n ]);\n } catch (error) {}\n }\n\n async function add(value: TUser, session?: ClientSession) {\n try {\n value = modelUser(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({ level: \"error\", message: `${error}` });\n\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Item name already exists\");\n }\n\n throw new InternalServerError(\"Internal server error.\");\n }\n }\n\n async function getUserByEmail(email: string) {\n const cacheKey = makeCacheKey(namespace_collection, { email });\n\n try {\n const cached = await getCache<TUser>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getUserByEmail: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TUser>({ email });\n\n if (result) {\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for user by email: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for user by email: ${err.message}`,\n });\n });\n }\n\n return result;\n } catch (error) {\n throw new Error(\"Failed to get user by email.\");\n }\n }\n\n async function getUserByReferralCode(referralCode: string) {\n const cacheKey = makeCacheKey(namespace_collection, { referralCode });\n\n try {\n const cached = await getCache<TUser>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getUserByReferralCode: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TUser>({ referralCode });\n\n if (result) {\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for user by referral code: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for user by referral code: ${err.message}`,\n });\n });\n }\n\n return result;\n } catch (error) {\n throw new Error(\"Failed to get user by referral code.\");\n }\n }\n\n async function getUserById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new Error(\"Invalid user ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TUser>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getUserById: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TUser>({ _id });\n\n if (result) {\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for user by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for user by id: ${err.message}`,\n });\n });\n }\n\n return result;\n } catch (error) {\n throw new Error(\"Failed to get user by id.\");\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n status = \"active\",\n type = \"\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n if (type) {\n query.type = type;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n search,\n page,\n limit,\n sort: JSON.stringify(sort),\n status,\n type,\n });\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n {\n $project: {\n _id: 1,\n name: {\n $concat: [\"$firstName\", \" \", \"$lastName\"],\n },\n email: 1,\n type: 1,\n status: 1,\n },\n },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function updatePassword(\n { _id, password } = {} as { _id: string | ObjectId; password: string },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new Error(\"Invalid user ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { password } },\n { session }\n );\n delCachedData();\n return result;\n } catch (error) {\n throw new Error(\"Failed to update user password.\");\n }\n }\n\n async function updateName(\n { _id, firstName, lastName } = {} as {\n _id: string | ObjectId;\n firstName?: string;\n lastName?: string;\n },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new Error(\"Invalid user ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { firstName, lastName } },\n { session }\n );\n delCachedData();\n return result;\n } catch (error) {\n throw new Error(\"Failed to update user profile.\");\n }\n }\n\n async function updateBirthday(\n { _id, month, day, year } = {} as {\n _id: string | ObjectId;\n month: string;\n day: number;\n year: number;\n },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new Error(\"Invalid user ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { birthMonth: month, birthDay: day, birthYear: year } },\n { session }\n );\n delCachedData();\n return result;\n } catch (error) {\n throw new Error(\"Failed to update user birthday.\");\n }\n }\n\n async function updateUserFieldById(\n { _id, field, value } = {} as {\n _id: string | ObjectId;\n field: string;\n value: string | ObjectId;\n },\n session?: ClientSession\n ) {\n // Allowed fields to prevent arbitrary updates\n const allowedFields = [\n \"gender\",\n \"email\",\n \"contact\",\n \"profile\",\n \"defaultOrg\",\n \"password\",\n ];\n\n if (!allowedFields.includes(field)) {\n throw new BadRequestError(\n `Field \"${field}\" is not allowed to be updated.`\n );\n }\n\n // Validate ID\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n if (field === \"defaultOrg\") {\n try {\n value = new ObjectId(value);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { [field]: value } },\n { session }\n );\n delCachedData();\n return result;\n } catch (error) {\n throw new BadRequestError(`Failed to update user ${field}.`);\n }\n }\n\n return {\n createIndexes,\n add,\n getUserByEmail,\n getUserById,\n getAll,\n updatePassword,\n updateName,\n updateBirthday,\n updateUserFieldById,\n getUserByReferralCode,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TUser = {\n _id?: ObjectId;\n email: string;\n password: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n defaultOrg?: ObjectId | string;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaUser = Joi.object({\n email: Joi.string().email().required(),\n password: Joi.string().min(8).required(),\n firstName: Joi.string().max(100).required(),\n middleName: Joi.string().max(100).optional().allow(null, \"\"),\n lastName: Joi.string().max(100).required(),\n defaultOrg: Joi.string().optional().allow(null, \"\"),\n});\n\nexport function modelUser(data: TUser) {\n const { error } = schemaUser.validate(data);\n\n if (error) {\n throw new Error(`User model validation error: ${error.message}`);\n }\n\n if (data._id && typeof data._id === \"string\") {\n try {\n data._id = new ObjectId(data._id);\n } catch (error) {\n throw new Error(`Invalid _id format: ${data._id}`);\n }\n }\n\n return {\n _id: data._id,\n email: data.email,\n password: data.password,\n firstName: data.firstName,\n middleName: data.middleName ?? \"\",\n lastName: data.lastName,\n defaultOrg: data.defaultOrg ?? \"\",\n status: data.status ?? \"active\",\n createdAt: data.createdAt ?? new Date(),\n updatedAt: data.updatedAt ?? \"\",\n deletedAt: data.deletedAt ?? \"\",\n };\n}\n","import { useUserRepo } from \"../user/user.repository\";\nimport {\n AppError,\n BadRequestError,\n comparePassword,\n InternalServerError,\n NotFoundError,\n useCache,\n} from \"@goweekdays/utils\";\nimport { TUser } from \"../user/user.model\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport function useAuthService() {\n const { setCache, delCache } = useCache(\"sessions\");\n\n async function login(\n { email, password } = {} as { email: string; password: string }\n ) {\n if (!email) {\n throw new BadRequestError(\"Email is required\");\n }\n\n if (!password) {\n throw new BadRequestError(\"Password is required\");\n }\n\n // fetch user from database\n let _user: TUser | null;\n\n try {\n _user = await useUserRepo().getUserByEmail(email);\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(`${error}`);\n }\n }\n\n if (!_user) {\n throw new NotFoundError(\n \"Invalid user email. Please check your email and try again.\"\n );\n }\n\n if (_user.status === \"suspended\") {\n throw new BadRequestError(\n \"Your account is currently suspended. Please contact support for assistance.\"\n );\n }\n\n // verify password\n const isPasswordValid = await comparePassword(password, _user.password);\n if (!isPasswordValid) {\n throw new BadRequestError(\"Invalid password\");\n }\n\n const sid = uuidv4(); // Generate a unique session ID\n\n const cacheKey = `sid:${sid}`;\n\n // set TTL to 4 hours\n setCache(cacheKey, _user, 14400)\n .then(() => {\n console.log(\"Session ID cached successfully\");\n })\n .catch((error) => {\n console.error(\"Error caching session ID:\", error);\n });\n\n return { sid, user: _user._id?.toString() ?? \"\" };\n }\n\n async function logout(sid: string) {\n try {\n await delCache(`sid:${sid}`);\n return \"Session deleted successfully\";\n } catch (error) {\n throw new InternalServerError(\"Error deleting token\");\n }\n }\n\n return {\n login,\n logout,\n };\n}\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useAuthService } from \"./auth.service\";\nimport {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n} from \"@goweekdays/utils\";\nimport { useUserService } from \"../user/user.service\";\nimport { useVerificationService } from \"../verification/verification.service\";\nimport { DOMAIN } from \"../../config\";\n\nexport function useAuthController() {\n const { signUp: _signUp } = useVerificationService();\n\n async function login(req: Request, res: Response, next: NextFunction) {\n const email = req.body.email as string;\n const password = req.body.password as string;\n\n const validation = Joi.object({\n email: Joi.string().email().required(),\n password: Joi.string().required(),\n });\n\n const { error } = validation.validate({ email, password });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const session = await useAuthService().login({\n email,\n password,\n });\n\n const cookieOptions = {\n domain: DOMAIN,\n secure: true,\n maxAge: 4 * 60 * 60 * 1000,\n };\n\n res\n .cookie(\"sid\", session.sid, cookieOptions)\n .cookie(\"user\", session.user, cookieOptions)\n .json({ message: \"Login successful\" });\n\n return;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `Error during login: ${error.message}`,\n });\n\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(\"An unexpected error occurred\"));\n }\n return;\n }\n }\n\n async function logout(req: Request, res: Response, next: NextFunction) {\n const sid = (req.headers[\"authorization\"] as string) ?? \"\";\n\n if (!sid) {\n next(new BadRequestError(\"Session ID is required\"));\n return;\n }\n\n try {\n await useAuthService().logout(sid);\n res.json({ message: \"Logged out successfully\" });\n } catch (error) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(\"An unexpected error occurred\"));\n }\n }\n }\n\n return {\n login,\n logout,\n };\n}\n","import {\n useMailer,\n compileHandlebar,\n logger,\n getDirectory,\n BadRequestError,\n NotFoundError,\n InternalServerError,\n useAtlas,\n AppError,\n} from \"@goweekdays/utils\";\nimport {\n schemaInviteMember,\n TVerification,\n TVerificationMetadata,\n} from \"./verification.model\";\nimport { useVerificationRepo } from \"./verification.repository\";\nimport {\n APP_MAIN,\n APP_ORG,\n MAILER_EMAIL,\n MAILER_PASSWORD,\n MAILER_TRANSPORT_HOST,\n MAILER_TRANSPORT_PORT,\n MAILER_TRANSPORT_SECURE,\n VERIFICATION_FORGET_PASSWORD_DURATION,\n VERIFICATION_USER_INVITE_DURATION,\n} from \"../../config\";\n\nimport { useUserRepo } from \"../user\";\nimport { useMemberRepo } from \"../member\";\nimport { TOrg, useOrgRepo } from \"../organization\";\nimport { useRoleRepo } from \"../role\";\nimport Joi from \"joi\";\nimport { usePaypalService } from \"../utils/paypal.service\";\nimport { usePlanRepo } from \"../plan\";\n\nexport function useVerificationService() {\n const MailerConfig = {\n host: MAILER_TRANSPORT_HOST,\n port: MAILER_TRANSPORT_PORT,\n secure: MAILER_TRANSPORT_SECURE,\n email: MAILER_EMAIL,\n password: MAILER_PASSWORD,\n };\n\n const mailer = new useMailer(MailerConfig);\n\n const {\n add,\n getById: _getById,\n updateStatusById: _updateStatusById,\n getVerifications: _getVerifications,\n } = useVerificationRepo();\n const { getUserByEmail } = useUserRepo();\n const { add: addMember } = useMemberRepo();\n\n const { getById: getOrgById } = useOrgRepo();\n const { getById: getRoleById } = useRoleRepo();\n\n async function createUserInvite({\n email,\n metadata,\n }: {\n email: string;\n metadata: TVerificationMetadata;\n }) {\n const value: TVerification = {\n type: \"user-invite\",\n email,\n metadata,\n expireAt: new Date(\n new Date().getTime() + 72 * 60 * 60 * 1000\n ).toISOString(), // 72 hours (3 days) from now\n createdAt: new Date().toISOString(),\n };\n\n if (!metadata.app) {\n throw new BadRequestError(\"App metadata is required.\");\n }\n\n try {\n const user = await getUserByEmail(email);\n const dir = __dirname;\n if (user) {\n value.type = \"member-invite\";\n const res = await add(value);\n const filePath = getDirectory(dir, \"./public/handlebars/member-invite\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_USER_INVITE_DURATION,\n link: `${APP_MAIN}/verify/member-invite/${res}`,\n organization_name:\n metadata.app === \"admin\" ? \"Admin\" : metadata.orgName,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"Member Invite\",\n html: emailContent,\n from: \"GoWeekdays\",\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending user invite email: ${error}`,\n });\n });\n\n return res;\n }\n\n const res = await add(value);\n\n const filePath = getDirectory(dir, \"./public/handlebars/user-invite\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_USER_INVITE_DURATION,\n link: `${APP_MAIN}/verify/invitation/${res}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"User Invite\",\n html: emailContent,\n from: \"GoWeekdays\",\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending user invite email: ${error}`,\n });\n });\n\n return res;\n } catch (error) {\n throw error;\n }\n }\n\n async function createForgetPassword(email: string) {\n const value: TVerification = {\n type: \"forget-password\",\n email,\n expireAt: new Date(new Date().getTime() + 10 * 60 * 1000).toISOString(), // 10 minutes from now\n createdAt: new Date().toISOString(),\n };\n\n try {\n const res = await add(value);\n\n const dir = __dirname;\n\n const filePath = getDirectory(dir, \"./public/handlebars/forget-password\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_FORGET_PASSWORD_DURATION,\n link: `${APP_MAIN}/reset-password/${res}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"Forget Password\",\n from: \"GoWeekdays\",\n html: emailContent,\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending forget password email: ${error}`,\n });\n });\n\n return \"Successfully created a link to reset password. Please check your email.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to create forget password link.\");\n }\n }\n\n async function getById(id: string) {\n try {\n const _id = await _getById(id);\n if (!_id) {\n throw new NotFoundError(\"Verification not found.\");\n }\n return _id;\n } catch (error) {\n throw error;\n }\n }\n\n async function getVerifications({\n search = \"\",\n page = 1,\n status = \"\",\n type = \"\",\n email = \"\",\n limit = 10,\n app = \"\",\n } = {}) {\n try {\n return await _getVerifications({\n search,\n page,\n status,\n type,\n limit,\n email,\n app,\n });\n } catch (error) {\n throw error;\n }\n }\n\n function errorByType(type: string, status?: string) {\n if (type === \"user-invite\" && status === \"expired\") {\n throw new BadRequestError(\n \"Invitation has already expired, please contact admin to resend the invitation.\"\n );\n }\n\n if (type === \"user-sign-up\" && status === \"expired\") {\n throw new BadRequestError(\n \"Sign up verification has expired, please sign up again to get a new verification link.\"\n );\n }\n\n if (type === \"user-invite\" && status === \"complete\") {\n throw new BadRequestError(\n \"User already registered, please login to continue.\"\n );\n }\n\n if (type === \"forget-password\" && status === \"complete\") {\n throw new BadRequestError(\n \"Forget password verification has already been used, please request a new one.\"\n );\n }\n\n if (type === \"forget-password\" && status === \"expired\") {\n throw new BadRequestError(\n \"Forget password verification has expired, please request a new one.\"\n );\n }\n\n throw new BadRequestError(\"Invalid verification.\");\n }\n\n async function verify(id: string) {\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\n try {\n const _id = await _getById(id);\n if (!_id) {\n throw new NotFoundError(\"Verification not found.\");\n }\n\n if (_id.status === \"expired\") {\n errorByType(_id.type, \"expired\");\n }\n\n if (_id.status === \"complete\") {\n throw new BadRequestError(\"Verification already completed.\");\n }\n\n if (!_id.expireAt) {\n throw new BadRequestError(\"Expiration date is required.\");\n }\n\n const expiration = new Date(_id.expireAt).getTime();\n const now = new Date().getTime();\n if (now > expiration) {\n await _updateStatusById(id, \"expired\", session);\n\n errorByType(_id.type, \"expired\");\n\n await session?.commitTransaction();\n }\n\n if (_id.type === \"member-invite\") {\n await _updateStatusById(id, \"complete\", session);\n const user = await getUserByEmail(_id.email);\n if (!user) {\n throw new NotFoundError(\"User not found for member invite.\");\n }\n\n if (!_id.metadata?.app) {\n throw new BadRequestError(\n \"App metadata is required for member invite.\"\n );\n }\n\n if (!_id.metadata?.role || !_id.metadata?.roleName) {\n throw new BadRequestError(\n \"Role metadata is required for member invite.\"\n );\n }\n\n await addMember(\n {\n user: user._id?.toString() ?? \"\",\n app: _id.metadata?.app,\n org: String(_id.metadata?.org ?? \"\"),\n orgName: _id.metadata?.orgName ?? \"\",\n role: String(_id.metadata?.role ?? \"\"),\n roleName: _id.metadata?.roleName,\n name: `${user.firstName} ${user.lastName}`,\n },\n session\n );\n\n await session?.commitTransaction();\n\n return \"Member invitation verified successfully.\";\n }\n\n return _id;\n } catch (error) {\n await session?.abortTransaction();\n logger.log({\n level: \"info\",\n message: `Error verifying user invitation: ${error}`,\n });\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function cancelUserInvitation(id: string) {\n try {\n await updateStatusById(id, \"cancelled\");\n } catch (error) {\n throw new InternalServerError(\n `Error cancelling user invitation: ${error}`\n );\n }\n }\n\n async function updateStatusById(_id: string, status: string) {\n try {\n await _updateStatusById(_id, status);\n return \"Successfully updated verification status.\";\n } catch (error) {\n throw error;\n }\n }\n\n async function signUp({\n email,\n metadata,\n }: {\n email: string;\n metadata?: TVerificationMetadata;\n }) {\n try {\n const user = await getUserByEmail(email);\n\n if (user) {\n throw new BadRequestError(\n `Email ${email} is already registered, please login to continue.`\n );\n }\n\n const value: TVerification = {\n type: \"user-sign-up\",\n email,\n metadata,\n expireAt: new Date(new Date().getTime() + 5 * 60 * 1000), // 5mins from now\n };\n\n const res = await add(value);\n\n const dir = __dirname;\n\n const filePath = getDirectory(dir, \"./public/handlebars/sign-up\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: \"5 minutes\",\n link: `${APP_MAIN}/sign-up/${res}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"Sign Up Verification\",\n html: emailContent,\n from: \"GoWeekdays\",\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending user invite email: ${error}`,\n });\n });\n\n return res;\n } catch (error) {\n throw error;\n }\n }\n\n async function inviteMember(value: {\n email: string;\n role: string;\n app: string;\n org?: string;\n }) {\n const { error } = schemaInviteMember.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n const role = await getRoleById(value.role);\n if (!role) {\n throw new NotFoundError(\"Role not found.\");\n }\n\n let org: TOrg | null = null;\n\n if (value.org) {\n org = await getOrgById(String(value.org));\n if (!org) {\n throw new NotFoundError(\"Organization not found.\");\n }\n }\n\n let verificationData = {\n type: \"user-invite\",\n email: value.email,\n metadata: {\n role: value.role,\n roleName: role.name,\n app: value.app,\n org: value.org,\n orgName: org ? org.name : \"\",\n },\n };\n\n try {\n const user = await getUserByEmail(value.email);\n const dir = __dirname;\n if (user) {\n verificationData.type = \"member-invite\";\n const verificationId = await add(verificationData);\n const filePath = getDirectory(dir, \"./public/handlebars/member-invite\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_USER_INVITE_DURATION,\n link: `${APP_MAIN}/verify/member-invite/${verificationId}`,\n organization_name:\n verificationData.metadata.app === \"admin\"\n ? \"Admin\"\n : org\n ? org.name\n : \"\",\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: value.email,\n subject: \"Member Invite\",\n html: emailContent,\n from: \"GoWeekdays\",\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending user invite email: ${error}`,\n });\n });\n\n return verificationId;\n }\n\n const verificationId = await add(verificationData);\n\n const filePath = getDirectory(dir, \"./public/handlebars/user-invite\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_USER_INVITE_DURATION,\n link: `${APP_MAIN}/verify/invitation/${verificationId}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: value.email,\n subject: \"User Invite\",\n html: emailContent,\n from: \"GoWeekdays\",\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending user invite email: ${error}`,\n });\n });\n\n return verificationId;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to invite member.\");\n }\n }\n }\n\n async function cancelInviteMember(id: string) {\n const { error } = Joi.string().hex().required().validate(id);\n if (error) {\n throw new BadRequestError(\"Invalid verification ID.\");\n }\n\n try {\n const invite = await _getById(id);\n if (!invite) {\n throw new NotFoundError(\"Invitation not found.\");\n }\n\n if (invite.status === \"cancelled\") {\n throw new BadRequestError(\"Invitation already cancelled.\");\n }\n\n if (invite.status === \"complete\") {\n throw new BadRequestError(\"Cannot cancel a completed invitation.\");\n }\n\n await _updateStatusById(id, \"cancelled\");\n return \"Successfully cancelled the invitation.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to cancel the invitation.\");\n }\n }\n }\n\n async function forgetPassword(email: string) {\n const { error } = Joi.string().email().required().validate(email);\n if (error) {\n throw new BadRequestError(\"Invalid email address.\");\n }\n\n try {\n const member = await getUserByEmail(email);\n if (!member) {\n throw new NotFoundError(\"User not found.\");\n }\n\n const value: TVerification = {\n type: \"forget-password\",\n email,\n expireAt: new Date(new Date().getTime() + 10 * 60 * 1000).toISOString(), // 10 minutes from now\n };\n\n const res = await add(value);\n\n const dir = __dirname;\n\n const filePath = getDirectory(dir, \"./public/handlebars/forget-password\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_FORGET_PASSWORD_DURATION,\n link: `${APP_MAIN}/reset-password/${res}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"Forget Password\",\n from: \"GoWeekdays\",\n html: emailContent,\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending forget password email: ${error}`,\n });\n });\n\n return \"Successfully created a link to reset password. Please check your email.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\n \"Failed to process forget password request.\"\n );\n }\n }\n }\n\n const { addOrder: addPaypalOrder } = usePaypalService();\n const { getByEmail: getOrgByEmail, getByName: getOrgByName } = useOrgRepo();\n\n async function orgSetupFee(\n value: TOrg & {\n seats: number;\n }\n ) {\n const session = useAtlas.getClient()?.startSession();\n if (!session) {\n throw new BadRequestError(\"Unable to start database session.\");\n }\n\n try {\n session.startTransaction();\n\n const orgExistingByName = await getOrgByName(value.name);\n if (orgExistingByName) {\n throw new BadRequestError(`Name ${value.name} is already taken.`);\n }\n\n const orgExistingByEmail = await getOrgByEmail(value.email);\n if (orgExistingByEmail) {\n throw new BadRequestError(`Email ${value.email} is already taken.`);\n }\n\n const amount = 100;\n\n const verificationId = await add(\n {\n type: \"org-setup-fee\",\n email: value.email,\n metadata: {\n seats: value.seats,\n contact: value.contact,\n orgName: value.name,\n createdBy: value.createdBy,\n amount,\n },\n },\n session\n );\n\n const order = await addPaypalOrder({\n amount,\n currency: \"PHP\",\n customId: String(verificationId),\n returnUrl: `${APP_ORG}/organizations/success`,\n cancelUrl: `${APP_ORG}/organizations/cancel`,\n action: \"pay\",\n });\n\n // Commit transaction\n await session?.commitTransaction();\n\n const paypalOrderLink = JSON.parse(order.body.toString()).links.find(\n (link: any) => link.rel === \"approve\"\n );\n\n return {\n paypalOrderLink: paypalOrderLink ? paypalOrderLink.href : \"\",\n };\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\n \"Failed to process organization setup fee.\"\n );\n }\n }\n\n return {\n createForgetPassword,\n createUserInvite,\n verify,\n getById,\n getVerifications,\n cancelUserInvitation,\n updateStatusById,\n signUp,\n inviteMember,\n cancelInviteMember,\n forgetPassword,\n orgSetupFee,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TVerificationMetadata = {\n name?: string;\n app?: string;\n role?: string | ObjectId;\n roleName?: string;\n referralCode?: string;\n org?: string | ObjectId;\n orgName?: string;\n contact?: string;\n seats?: number;\n createdBy?: string | ObjectId;\n amount?: number;\n};\n\nexport type TVerification = {\n _id?: ObjectId;\n type: string;\n email: string;\n metadata?: TVerificationMetadata;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n expireAt?: string | Date;\n};\n\nexport const schemaInviteMember = Joi.object({\n email: Joi.string().email().required(),\n role: Joi.string().hex().required(),\n app: Joi.string().required(),\n org: Joi.string().hex().optional().allow(\"\", null),\n});\n\nexport const schemaVerification = Joi.object({\n type: Joi.string().required(),\n email: Joi.string().email().required(),\n metadata: Joi.object({\n name: Joi.string().optional().allow(\"\", null),\n app: Joi.string().optional().allow(\"\", null),\n role: Joi.string().optional().allow(\"\", null),\n roleName: Joi.string().optional().allow(\"\", null),\n referralCode: Joi.string().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n orgName: Joi.string().optional().allow(\"\", null),\n contact: Joi.string().optional().allow(\"\", null),\n seats: Joi.number().optional().allow(\"\", null),\n createdBy: Joi.string().optional().allow(\"\", null),\n amount: Joi.number().optional().allow(\"\", null),\n }).optional(),\n expireAt: Joi.date().optional().allow(\"\", null),\n});\n\nexport function modelVerification(value: TVerification): TVerification {\n const { error } = schemaVerification.validate(value);\n if (error) {\n throw new BadRequestError(\n `Verification model validation error: ${error.message}`\n );\n }\n\n if (value._id && typeof value._id === \"string\") {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new BadRequestError(`Invalid _id format: ${value._id}`);\n }\n }\n\n if (value.metadata?.org && typeof value.metadata.org === \"string\") {\n try {\n value.metadata.org = new ObjectId(value.metadata.org);\n } catch (error) {\n throw new BadRequestError(`Invalid org ID format: ${value.metadata.org}`);\n }\n }\n\n if (value.metadata?.role && typeof value.metadata.role === \"string\") {\n try {\n value.metadata.role = new ObjectId(value.metadata.role);\n } catch (error) {\n throw new BadRequestError(\n `Invalid role ID format: ${value.metadata.role}`\n );\n }\n }\n\n return {\n _id: value._id,\n type: value.type,\n email: value.email,\n metadata: value.metadata,\n status: value.status ?? \"pending\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt ?? \"\",\n expireAt: value.expireAt ?? new Date(Date.now() + 3600 * 1000),\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { modelVerification, TVerification } from \"./verification.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function useVerificationRepo() {\n const db = useAtlas.getDb();\n\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"verifications\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { email: 1 } },\n { key: { type: 1 } },\n { key: { status: 1 } },\n { key: { \"metadata.org\": 1 } },\n { key: { email: \"text\" } },\n {\n key: { expiredAt: 1 },\n expireAfterSeconds: 0,\n name: \"ttl_expiredAt_index\",\n },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create indexes.\");\n }\n }\n\n async function createIndex() {\n try {\n await collection.createIndex([\n { email: 1 },\n { type: 1 },\n { status: 1 },\n { \"metadata.org\": 1 },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({\n email: \"text\",\n });\n } catch (error) {\n throw new Error(\"Failed to create text index on email.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n {\n email: 1,\n type: 1,\n \"metadata.app\": 1,\n \"metadata.org\": 1,\n status: 1,\n },\n { unique: true, partialFilterExpression: { status: \"pending\" } }\n );\n } catch (error) {\n throw new Error(\"Failed to create text index on email.\");\n }\n }\n\n async function add(value: TVerification, session?: ClientSession) {\n value = modelVerification(value);\n try {\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({ level: \"error\", message: `${error}` });\n\n const isDuplicated = error.message.includes(\"duplicate\");\n const isDuplicatedEmail = error.message.includes(\"email\");\n const isDuplicatedUserInvite = error.message.includes(\"user-invite\");\n\n if (isDuplicated && isDuplicatedEmail && isDuplicatedUserInvite) {\n throw new BadRequestError(\"User has a pending invitation.\");\n }\n\n if (isDuplicated) {\n throw new BadRequestError(\"Item name already exists.\");\n }\n\n throw new InternalServerError(\"Server internal error.\");\n }\n }\n\n async function getById(_id: ObjectId | string) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n id: _id.toString(),\n });\n const cached = await getCache<TVerification>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById verification: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TVerification>({ _id });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for verification by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for verification by id: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve verification.\"\n );\n }\n }\n\n async function getVerifications(\n {\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n status = \"active\",\n type = \"\",\n email = \"\",\n app = \"\",\n org = \"\",\n } = {} as {\n search?: string;\n page?: number;\n limit?: number;\n sort?: Record<string, number>;\n status?: string;\n type?: string | Array<string>;\n email?: string;\n app?: string;\n org?: string | ObjectId;\n }\n ) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status };\n const cacheKeyOptions: Record<string, any> = { status, limit, page };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n cacheKeyOptions.sort = JSON.stringify(sort);\n\n if (app) {\n query[\"metadata.app\"] = app;\n cacheKeyOptions.app = app;\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheKeyOptions.search = search;\n }\n\n if (Array.isArray(type)) {\n query.type = { $in: type };\n cacheKeyOptions.type = JSON.stringify(type);\n } else if (type) {\n query.type = type;\n cacheKeyOptions.type = type;\n }\n\n if (email) {\n query.email = email;\n cacheKeyOptions.email = email;\n }\n\n if (org) {\n try {\n query[\"metadata.org\"] = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n cacheKeyOptions.org = org;\n }\n\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<TVerification[]>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getVerifications: ${cacheKey}`,\n });\n return cached;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n {\n $project: {\n _id: 1,\n createdAt: 1,\n email: 1,\n type: 1,\n metadata: 1,\n status: 1,\n },\n },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getVerifications: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getVerifications: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getByIdByType(type: string) {\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n type: type,\n });\n const cached = await getCache<Array<TVerification>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByIdByType verification: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection\n .find<Array<TVerification>>({ type })\n .toArray();\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for verification by type: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for verification by type: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n async function updateStatusById(\n _id: ObjectId | string,\n status: string,\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { status, updatedAt: new Date().toISOString() } },\n { session }\n );\n delCachedData();\n return result;\n } catch (error) {\n throw new InternalServerError(\"Error updating verification status.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getVerifications,\n getById,\n getByIdByType,\n updateStatusById,\n };\n}\n","import * as dotenv from \"dotenv\";\ndotenv.config();\n\nexport const MONGO_URI = (process.env.MONGO_URI ||\n \"mongodb://localhost:27017\") as string;\nexport const MONGO_DB = (process.env.MONGO_DB || \"default\") as string;\n\nexport const PORT = Number(process.env.PORT || 3001);\nexport const SECRET_KEY = process.env.SECRET_KEY as string;\nexport const isDev = process.env.NODE_ENV !== \"production\";\n\nexport const MAILER_TRANSPORT_HOST = process.env\n .MAILER_TRANSPORT_HOST as string;\nexport const MAILER_TRANSPORT_PORT = Number(\n process.env.MAILER_TRANSPORT_PORT || 465\n);\nexport const MAILER_TRANSPORT_SECURE =\n process.env.MAILER_TRANSPORT_SECURE === \"true\";\nexport const MAILER_EMAIL = process.env.MAILER_EMAIL as string;\nexport const MAILER_PASSWORD = process.env.MAILER_PASSWORD as string;\n\nexport const ACCESS_TOKEN_SECRET =\n (process.env.ACCESS_TOKEN_SECRET as string) || \"access_token_secret\";\nexport const REFRESH_TOKEN_SECRET =\n (process.env.REFRESH_TOKEN_SECRET as string) || \"refresh_token_secret\";\nexport const ACCESS_TOKEN_EXPIRY =\n (process.env.ACCESS_TOKEN_EXPIRY as string) || \"15s\";\nexport const REFRESH_TOKEN_EXPIRY =\n (process.env.REFRESH_TOKEN_EXPIRY as string) || \"30d\";\n\nexport const APP_ACCOUNT =\n (process.env.APP_ACCOUNT as string) || \"http://localhost:3001\";\nexport const APP_MAIN =\n (process.env.APP_MAIN as string) || \"http://localhost:3000\";\nexport const VERIFICATION_FORGET_PASSWORD_DURATION =\n (process.env.VERIFICATION_FORGET_PASSWORD_DURATION as string) || \"10 minutes\";\nexport const VERIFICATION_USER_INVITE_DURATION =\n (process.env.VERIFICATION_USER_INVITE_DURATION as string) || \"3 days\";\n\nexport const REDIS_HOST = process.env.REDIS_HOST as string;\nexport const REDIS_PORT = Number(process.env.REDIS_PORT || 6379);\nexport const REDIS_PASSWORD = process.env.REDIS_PASSWORD as string;\n\nexport const DEFAULT_USER_EMAIL = process.env.DEFAULT_USER_EMAIL as string;\nexport const DEFAULT_USER_PASSWORD = process.env\n .DEFAULT_USER_PASSWORD as string;\nexport const DEFAULT_USER_FIRST_NAME = process.env\n .DEFAULT_USER_FIRST_NAME as string;\nexport const DEFAULT_USER_LAST_NAME = process.env\n .DEFAULT_USER_LAST_NAME as string;\n\nexport const SPACES_ACCESS_KEY = process.env.SPACES_ACCESS_KEY as string;\nexport const SPACES_SECRET_KEY = process.env.SPACES_SECRET_KEY as string;\nexport const SPACES_ENDPOINT = process.env.SPACES_ENDPOINT as string;\nexport const SPACES_REGION = process.env.SPACES_REGION as string;\nexport const SPACES_BUCKET = process.env.SPACES_BUCKET as string;\n\nexport const PAYPAL_CLIENT_ID = (process.env.PAYPAL_CLIENT_ID as string) ?? \"\";\nexport const PAYPAL_CLIENT_SECRET =\n (process.env.PAYPAL_CLIENT_SECRET as string) ?? \"\";\nexport const PAYPAL_API_URL =\n (process.env.PAYPAL_API_URL as string) ?? \"https://api-m.sandbox.paypal.com\";\nexport const PAYPAL_WEBHOOK_ID =\n (process.env.PAYPAL_WEBHOOK_ID as string) ?? \"\";\n\nexport const XENDIT_SECRET_KEY =\n (process.env.XENDIT_SECRET_KEY as string) ?? \"\";\nexport const XENDIT_BASE_URL =\n (process.env.XENDIT_BASE_URL as string) ?? \"https://api.xendit.co\";\n\nexport const DOMAIN = (process.env.DOMAIN as string) || \"localhost\";\nexport const APP_ORG =\n (process.env.APP_ORG as string) || \"http://localhost/organizations/create\";\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n NotFoundError,\n hashPassword,\n logger,\n makeCacheKey,\n useAtlas,\n useCache,\n useS3,\n} from \"@goweekdays/utils\";\nimport { useUserRepo } from \"../user/user.repository\";\nimport { TUser } from \"./user.model\";\nimport { TFile } from \"../file/file.model\";\nimport { useFileRepo } from \"../file/file.repository\";\nimport {\n DEFAULT_USER_EMAIL,\n DEFAULT_USER_FIRST_NAME,\n DEFAULT_USER_LAST_NAME,\n DEFAULT_USER_PASSWORD,\n SPACES_ACCESS_KEY,\n SPACES_BUCKET,\n SPACES_ENDPOINT,\n SPACES_REGION,\n SPACES_SECRET_KEY,\n} from \"../../config\";\nimport { useVerificationRepo } from \"../verification/verification.repository\";\nimport { useVerificationService } from \"../verification/verification.service\";\nimport \"multer\";\nimport { useMemberRepo } from \"../member/member.repository\";\nimport { useRoleRepo } from \"../role/role.repository\";\nimport { TPermission, usePermissionRepo } from \"../permission\";\nimport { useOrgRepo } from \"../organization\";\n\nexport function useUserService() {\n const {\n add: addUser,\n getUserByEmail,\n getUserById: _getById,\n updateName: _updateName,\n updateBirthday: _updateBirthday,\n updateUserFieldById: _updateUserFieldById,\n } = useUserRepo();\n\n const { addRole, getById: getRoleById } = useRoleRepo();\n const { add: addMember } = useMemberRepo();\n const { getAll: getAllPermission } = usePermissionRepo();\n const { getById: getOrgById } = useOrgRepo();\n\n async function createDefaultUser() {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n const _user = await getUserByEmail(DEFAULT_USER_EMAIL);\n if (_user) {\n throw new BadRequestError(\n `User already exists: ${DEFAULT_USER_EMAIL}.`\n );\n }\n\n const hashedPassword = await hashPassword(DEFAULT_USER_PASSWORD);\n\n const userId = await addUser(\n {\n email: DEFAULT_USER_EMAIL,\n password: hashedPassword,\n firstName: DEFAULT_USER_FIRST_NAME,\n lastName: DEFAULT_USER_LAST_NAME,\n },\n session\n );\n\n const permissions = await getAllPermission({ app: \"admin\", limit: 200 });\n\n const roleData = {\n name: \"Super Admin\",\n app: \"admin\",\n permissions: [],\n createdBy: String(userId),\n };\n\n if (permissions && permissions.items && permissions.items.length > 0) {\n roleData.permissions = permissions.items.map(\n (permission: TPermission) => permission.key\n );\n }\n\n const roleId = await addRole(roleData, session);\n\n await addMember(\n {\n user: userId.toString(),\n name: `${DEFAULT_USER_FIRST_NAME} ${DEFAULT_USER_LAST_NAME}`,\n role: roleId.toString(),\n roleName: \"Super Admin\",\n app: \"admin\",\n },\n session\n );\n\n await session?.commitTransaction();\n return \"Successfully created default user.\";\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function createUser(value: TUser) {\n try {\n const _user = await getUserByEmail(value.email);\n if (_user) {\n throw new BadRequestError(`User already exists: ${value.email}.`);\n }\n\n const hashedPassword = await hashPassword(value.password);\n\n const insertedId = await addUser({\n email: value.email,\n password: hashedPassword,\n firstName: value.firstName,\n middleName: value.middleName,\n lastName: value.lastName,\n });\n\n return insertedId;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(`Error creating user: ${error}`);\n }\n }\n }\n\n const { getById: _getVerificationById, updateStatusById: _updateStatusById } =\n useVerificationRepo();\n\n async function addViaInvite({\n id = \"\",\n firstName = \"\",\n lastName = \"\",\n password = \"\",\n } = {}) {\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\n try {\n const invitation = await _getVerificationById(id);\n if (\n !invitation ||\n !invitation.metadata?.app ||\n !invitation.metadata?.role\n ) {\n throw new BadRequestError(\"Invalid invitation.\");\n }\n\n if (invitation.status === \"complete\") {\n throw new BadRequestError(\"Invitation already used.\");\n }\n\n if (!invitation.expireAt) {\n throw new BadRequestError(\"Expiration date is required.\");\n }\n\n const expired = new Date(invitation.expireAt) < new Date();\n\n if (invitation.status === \"expired\" || expired) {\n throw new BadRequestError(\"Invitation expired.\");\n }\n\n const email = invitation.email;\n\n const user = await getUserByEmail(invitation.email);\n\n let userId = user?._id ?? \"\";\n\n if (!user) {\n const hashedPassword = await hashPassword(password);\n\n userId = await addUser(\n {\n email,\n password: hashedPassword,\n firstName,\n lastName,\n defaultOrg: String(invitation.metadata?.org ?? \"\"),\n },\n session\n );\n }\n\n await _updateStatusById(id, \"complete\", session);\n\n let orgName = \"\";\n\n if (invitation.metadata?.org) {\n const org = await getOrgById(String(invitation.metadata.org));\n if (!org) {\n throw new NotFoundError(\"Organization not found.\");\n }\n\n orgName = org.name;\n }\n\n let roleName = \"\";\n\n if (invitation.metadata.role) {\n const role = await getRoleById(String(invitation.metadata.role));\n if (!role) {\n throw new NotFoundError(\"Role not found.\");\n }\n\n roleName = role.name;\n }\n\n await addMember(\n {\n user: userId.toString(),\n name: `${firstName} ${lastName}`,\n role: invitation.metadata?.role,\n roleName,\n app: invitation.metadata?.app,\n org: invitation.metadata?.org ?? \"\",\n orgName,\n },\n session\n );\n\n await session?.commitTransaction();\n return userId;\n } catch (error) {\n await session?.abortTransaction();\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to create user by invite.\");\n }\n } finally {\n session?.endSession();\n }\n }\n\n async function createUserBySignUp({\n id = \"\",\n firstName = \"\",\n lastName = \"\",\n password = \"\",\n } = {}) {\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\n try {\n const signUp = await _getVerificationById(id);\n if (!signUp) {\n throw new BadRequestError(\"Invalid sign up link.\");\n }\n\n if (signUp.status === \"complete\") {\n throw new BadRequestError(\n \"You have already an account created using this link.\"\n );\n }\n\n if (!signUp.expireAt) {\n throw new BadRequestError(\"Expiration date is required.\");\n }\n\n const expired = new Date(signUp.expireAt) < new Date();\n\n if (signUp.status === \"expired\" || expired) {\n throw new BadRequestError(\"Sign up link expired.\");\n }\n\n const email = signUp.email;\n\n const _user = await getUserByEmail(signUp.email);\n if (_user) {\n throw new BadRequestError(`User already exists: ${email}.`);\n }\n\n const hashedPassword = await hashPassword(password);\n\n const userId = await addUser(\n {\n email,\n password: hashedPassword,\n firstName,\n lastName,\n },\n session\n );\n await _updateStatusById(id, \"complete\", session);\n\n await session?.commitTransaction();\n return userId;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n const { getById } = useVerificationService();\n const { updateStatusById: updateVerificationStatusById } =\n useVerificationRepo();\n\n async function resetPassword(value: {\n id: string;\n newPassword: string;\n confirmPassword: string;\n }) {\n if (value.newPassword !== value.confirmPassword) {\n throw new BadRequestError(\"Passwords do not match.\");\n }\n\n let hashedPassword = \"\";\n\n try {\n hashedPassword = await hashPassword(value.newPassword);\n } catch (error) {\n throw new InternalServerError(`Error hashing password: ${error}`);\n }\n\n const session = useAtlas.getClient()?.startSession();\n\n if (!session) {\n throw new InternalServerError(\"Failed to start database session.\");\n }\n\n try {\n session.startTransaction();\n\n const otpDoc = await getById(value.id);\n if (!otpDoc) {\n throw new NotFoundError(\"You are using an invalid reset link.\");\n }\n\n const user = await getUserByEmail(otpDoc.email);\n if (!user) {\n throw new NotFoundError(\"User not found.\");\n }\n\n if (!user._id) {\n throw new NotFoundError(\"User ID is invalid.\");\n }\n\n if (otpDoc.status === \"used\") {\n throw new BadRequestError(\"This link has already been invalidated.\");\n }\n\n await updateVerificationStatusById(value.id, \"used\", session);\n\n await _updateUserFieldById(\n { _id: String(user._id), field: \"password\", value: hashedPassword },\n session\n );\n\n await session.commitTransaction();\n\n return \"Successfully reset password.\";\n } catch (error) {\n await session.abortTransaction();\n if (error instanceof AppError) {\n throw error;\n }\n throw new InternalServerError(\"Failed to reset password.\");\n }\n }\n\n const { updateName: updateMemberName } = useMemberRepo();\n\n async function updateName(\n _id: string,\n firstName?: string,\n lastName?: string\n ) {\n if (!_id) {\n throw new BadRequestError(\"Invalid user ID\");\n }\n\n if (!firstName) {\n throw new BadRequestError(\"Invalid firstName\");\n }\n\n if (!lastName) {\n throw new BadRequestError(\"Invalid lastName\");\n }\n\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\n const cacheKey = makeCacheKey(\"users\", { user: _id });\n\n try {\n useCache()\n .delCache(cacheKey)\n .then(() => {\n logger.info(`Cache cleared for user: ${_id}`);\n })\n .catch((error) => {\n logger.error(`Failed to clear cache for user: ${_id}`, error);\n });\n\n await _updateName({ _id, firstName, lastName }, session);\n await updateMemberName(\n { user: _id, name: `${firstName} ${lastName}` },\n session\n );\n await session?.commitTransaction();\n return \"Successfully updated name.\";\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function updateBirthday(\n _id: string,\n month: string,\n day: number,\n year: number\n ) {\n if (!_id) {\n throw new BadRequestError(\"Invalid user ID\");\n }\n\n if (!month) {\n throw new BadRequestError(\"Invalid birth month.\");\n }\n\n if (!day) {\n throw new BadRequestError(\"Invalid birthday.\");\n }\n\n if (!year) {\n throw new BadRequestError(\"Invalid birth year.\");\n }\n\n try {\n await _updateBirthday({ _id, month, day, year });\n return \"Successfully updated birthday.\";\n } catch (error) {\n throw error;\n }\n }\n\n async function updateUserFieldById(\n { _id, field, value } = {} as {\n _id: string;\n field: string;\n value: string;\n }\n ) {\n try {\n return await _updateUserFieldById({ _id, field, value });\n } catch (error) {\n throw error;\n }\n }\n\n const { createFile: _createFile, deleteFileById } = useFileRepo();\n\n const s3 = new useS3({\n accessKeyId: SPACES_ACCESS_KEY,\n secretAccessKey: SPACES_SECRET_KEY,\n endpoint: SPACES_ENDPOINT,\n region: SPACES_REGION,\n bucket: SPACES_BUCKET,\n });\n\n async function updateUserProfile(\n { file, user, previousProfile } = {} as {\n file: Express.Multer.File;\n user: string;\n previousProfile?: string;\n }\n ) {\n const session = useAtlas.getClient()?.startSession();\n\n session?.startTransaction();\n\n const _file: TFile = {\n name: file.originalname,\n createdAt: new Date().toISOString(),\n };\n\n try {\n const id = await _createFile(_file, session);\n await s3.uploadObject({\n key: id,\n body: file.buffer,\n contentType: file.mimetype,\n });\n\n if (previousProfile) {\n await deleteFileById(previousProfile, session);\n await s3.deleteObject(previousProfile);\n }\n\n await _updateUserFieldById(\n { _id: user, field: \"profile\", value: id },\n session\n );\n\n await session?.commitTransaction();\n\n return id;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n return {\n createUser,\n resetPassword,\n updateName,\n updateBirthday,\n updateUserFieldById,\n updateUserProfile,\n addViaInvite,\n createUserBySignUp,\n createDefaultUser,\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { MFile, TFile } from \"./file.model\";\nimport { ObjectId, ClientSession } from \"mongodb\";\n\nexport function useFileRepo() {\n const db = useAtlas.getDb();\n\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"files\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { name: 1 } },\n { key: { status: 1 } },\n { key: { name: \"text\" }, name: \"text_index\" },\n ]);\n return \"Successfully created file indexes.\";\n } catch (error) {\n throw new BadRequestError(\"Failed to create file indexes.\");\n }\n }\n\n async function createFile(value: TFile, session?: ClientSession) {\n try {\n value = new MFile(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId.toString();\n } catch (error) {\n throw new InternalServerError(\"Failed to create file.\");\n }\n }\n\n async function deleteFileById(\n _id: string | ObjectId,\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid file id.\");\n }\n\n try {\n await collection.deleteOne({ _id }, { session });\n delCachedData();\n return \"File deleted successfully\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete file.\");\n }\n }\n\n async function getAllDraftedFiles() {\n const cacheKey = makeCacheKey(namespace_collection, { status: \"draft\" });\n\n try {\n // Check cache first\n const cached = await getCache<any[]>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAllDraftedFiles: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection\n .find({ $and: [{ status: \"draft\" }, { status: null }] })\n .toArray();\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAllDraftedFiles: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAllDraftedFiles: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get drafted files.\");\n }\n }\n\n return {\n createIndexes,\n createFile,\n deleteFileById,\n getAllDraftedFiles,\n };\n}\n","import { ObjectId } from \"mongodb\";\n\nexport type TFile = {\n _id?: ObjectId;\n name: string;\n type?: string;\n status?: string;\n createdAt: string;\n};\n\nexport class MFile implements TFile {\n _id?: ObjectId;\n name: string;\n type?: string;\n status?: string;\n createdAt: string;\n\n constructor(value: TFile) {\n this._id = value._id;\n this.name = value.name ?? \"\";\n this.type = value.type ?? \"public\";\n this.status = value.status ?? \"active\";\n this.createdAt = value.createdAt ?? new Date().toISOString();\n }\n}","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelMember,\n schemaMemberRole,\n schemaMemberStatus,\n TMember,\n} from \"./member.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function useMemberRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"members\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { name: 1 } },\n { key: { status: 1 } },\n { key: { name: \"text\", orgName: \"text\" }, name: \"text_index\" },\n {\n key: {\n org: 1,\n user: 1,\n type: 1,\n },\n partialFilterExpression: { deletedAt: \"\" },\n name: \"unique_member\",\n },\n ]);\n return \"Successfully created member indexes.\";\n } catch (error) {\n throw new BadRequestError(\"Failed to create member indexes.\");\n }\n }\n\n async function add(value: TMember, session?: ClientSession) {\n try {\n value = modelMember(value);\n\n await collection.insertOne(value, { session });\n delCachedData();\n return \"Successfully added member.\";\n } catch (error) {\n logger.log({\n level: \"error\",\n message: `Failed to create member: ${error}`,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to create member.\");\n }\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n id: _id.toString(),\n });\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>({ _id });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by id: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve member.\"\n );\n }\n }\n\n async function getByRole(role: string | ObjectId) {\n try {\n role = new ObjectId(role);\n } catch (error) {\n throw new BadRequestError(\"Invalid role ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n role: role.toString(),\n });\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>({ role });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by role: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by role: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve member.\"\n );\n }\n }\n\n async function getByUserId(user: string | ObjectId) {\n try {\n user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n user: String(user),\n });\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByUserId member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>({ user });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by user ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by user ID: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve member.\"\n );\n }\n }\n\n async function getByUserType(\n user: string | ObjectId,\n type: string,\n org?: string | ObjectId\n ) {\n const query: Record<string, any> = {\n type,\n status: \"active\",\n };\n\n const cacheKeyOptions: Record<string, any> = {\n type,\n };\n\n if (org) {\n try {\n org = new ObjectId(org);\n cacheKeyOptions.org = String(org);\n query.org = org;\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n }\n\n try {\n user = new ObjectId(user);\n cacheKeyOptions.user = String(user);\n query.user = user;\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByUserId member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>(query);\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by user ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by user ID: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve member.\"\n );\n }\n }\n\n async function getByApp(options: {\n app: string;\n user?: string | ObjectId;\n org?: string | ObjectId;\n }) {\n const query: Record<string, any> = {\n app: options.app,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKeyOptions: Record<string, any> = {\n app: options.app,\n tag: \"getByApp\",\n };\n\n if (options.org) {\n try {\n query.org = new ObjectId(options.org);\n cacheKeyOptions.org = String(options.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n }\n\n if (options.user) {\n try {\n query.user = new ObjectId(options.user);\n cacheKeyOptions.user = String(options.user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for get by app member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>(query);\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by user ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by user ID: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve member.\"\n );\n }\n }\n\n type TUpdateName = Pick<TMember, \"user\" | \"name\">;\n\n async function updateName(value: TUpdateName, session?: ClientSession) {\n try {\n value.user = new ObjectId(value.user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n try {\n await collection.updateOne(\n { user: value.user },\n { $set: { name: value.name } },\n { session }\n );\n delCachedData();\n return \"Successfully updated member name.\";\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to update member name.\"\n );\n }\n }\n\n async function updateRoleById(\n _id: string | ObjectId,\n value: { role: string | ObjectId; roleName: string },\n session?: ClientSession\n ) {\n const { error } = schemaMemberRole.validate({\n _id,\n role: value.role,\n roleName: value.roleName,\n });\n\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n value.role = new ObjectId(value.role);\n } catch (error) {\n throw new BadRequestError(\"Invalid role.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n {\n $set: {\n role: value.role,\n roleName: value.roleName,\n updatedAt: new Date(),\n },\n },\n { session }\n );\n delCachedData();\n return \"Successfully updated member role.\";\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to update member role.\"\n );\n }\n }\n\n async function updateStatusById(\n _id: string | ObjectId,\n status: string,\n session?: ClientSession\n ) {\n const { error } = schemaMemberStatus.validate({\n _id,\n status,\n });\n\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n {\n $set: {\n status,\n updatedAt: new Date(),\n },\n },\n { session }\n );\n delCachedData();\n return \"Successfully updated member status.\";\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to update member status.\"\n );\n }\n }\n\n async function getAll(\n { search, limit, page, user, org, app, status } = {} as {\n search?: string;\n limit?: number;\n page?: number;\n user?: string | ObjectId;\n org?: string | ObjectId;\n app: string;\n status?: string;\n }\n ) {\n limit = limit && limit > 0 ? limit : 10;\n search = search || \"\";\n page = page && page > 0 ? page - 1 : 0;\n\n status = status ?? \"active\";\n\n const query: Record<string, any> = { app, status };\n\n const cacheKeyOptions: Record<string, any> = { app, status, limit, page };\n\n if (user) {\n cacheKeyOptions.user = String(user);\n try {\n query.user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n }\n\n if (org) {\n cacheKeyOptions.org = String(org);\n try {\n query.org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n }\n\n if (search) {\n cacheKeyOptions.search = search;\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll members: ${cacheKey}`,\n });\n\n // Check cache first\n const cached = await getCache<Record<string, any>>(cacheKey);\n\n if (cached && cached.items.length) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll members: ${cacheKey}`,\n });\n return cached;\n }\n\n try {\n const items = await collection\n .aggregate([\n {\n $match: query,\n },\n {\n $limit: limit,\n },\n {\n $project: {\n _id: 1,\n name: 1,\n user: 1,\n status: 1,\n role: 1,\n roleName: 1,\n org: 1,\n orgName: 1,\n type: 1,\n },\n },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll members: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll members: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve members.\"\n );\n }\n }\n\n async function countByOrg(org: string | ObjectId) {\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, { org: String(org) });\n const cached = await getCache<number>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for countByOrg members: ${cacheKey}`,\n });\n return cached;\n }\n const data = await collection.countDocuments({ org, status: \"active\" });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for countByOrg members: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for countByOrg members: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to count members.\"\n );\n }\n }\n\n async function countByUser(user: string | ObjectId) {\n try {\n user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n user: String(user),\n });\n const cached = await getCache<number>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for countByUser members: ${cacheKey}`,\n });\n return cached;\n }\n const data = await collection.countDocuments({ user, status: \"active\" });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for countByUser members: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for countByUser members: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to count members.\"\n );\n }\n }\n\n async function getOrgsByMembership(\n { search, limit, page, user } = {} as {\n search: string;\n limit: number;\n page: number;\n user?: string | ObjectId;\n }\n ) {\n limit = limit > 0 ? limit : 10;\n search = search || \"\";\n page = page > 0 ? page - 1 : 0;\n\n try {\n user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n const query: Record<string, any> = {\n user,\n status: { $ne: \"deleted\" },\n org: { $nin: [null, \"\"] },\n };\n\n const cacheKeyOptions: Record<string, any> = {\n user: String(user),\n org: JSON.stringify(query.org),\n limit,\n page,\n };\n\n if (search) {\n cacheKeyOptions.search = search;\n query.$text = { $search: search };\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<{ text: string; value: ObjectId }[]>(\n cacheKey\n );\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getOrgsByMembership members: ${cacheKey}`,\n });\n return cached;\n }\n const items = await collection\n .aggregate([\n {\n $match: query,\n },\n {\n $sort: { _id: -1 },\n },\n {\n $limit: limit,\n },\n {\n $project: {\n _id: 0,\n text: \"$orgName\",\n value: \"$org\",\n },\n },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getOrgsByMembership members: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getOrgsByMembership members: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve members.\"\n );\n }\n }\n\n async function getOrgsByUserId(\n {\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n user = \"\",\n status = \"active\",\n } = {} as {\n user: string | ObjectId;\n page: number;\n limit?: number;\n search?: string;\n sort?: Record<string, number>;\n status?: string;\n }\n ) {\n page = page > 0 ? page - 1 : 0;\n try {\n user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n const query: Record<string, any> = { user, status };\n const cacheKeyOptions: Record<string, any> = {\n user: String(user),\n status,\n limit,\n page,\n sort: JSON.stringify(sort),\n };\n\n if (search) {\n cacheKeyOptions.search = search;\n query.$text = { $search: search };\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<{ _id: ObjectId; name: string }[]>(\n cacheKey\n );\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getOrgsByUserId members: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n {\n $lookup: {\n from: \"orgs\",\n localField: \"org\",\n foreignField: \"_id\",\n as: \"organization\",\n },\n },\n { $unwind: \"$organization\" }, // Flatten the array\n {\n $project: { _id: \"$organization._id\", name: \"$organization.name\" },\n }, // Extract required fields\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getOrgsByUserId members: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getOrgsByUserId members: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve organizations.\"\n );\n }\n }\n\n async function updateStatusByUserId(user: string | ObjectId, status: string) {\n try {\n user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n const options: Record<string, any> = {\n status,\n updatedAt: new Date(),\n };\n\n if (status === \"deleted\") {\n options.deletedAt = new Date();\n }\n\n try {\n await collection.updateMany(\n { user },\n {\n $set: options,\n }\n );\n delCachedData();\n return \"Successfully updated member status.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to update member status.\");\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n const { error } = Joi.string().hex().required().validate(_id);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n {\n $set: {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n },\n },\n { session }\n );\n delCachedData();\n return \"Successfully deleted member.\";\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to deleted member.\"\n );\n }\n }\n\n return {\n createIndexes,\n add,\n getById,\n getByRole,\n getAll,\n getOrgsByUserId,\n updateStatusByUserId,\n updateName,\n getByUserId,\n getOrgsByMembership,\n countByOrg,\n countByUser,\n getByUserType,\n getByApp,\n updateRoleById,\n updateStatusById,\n deleteById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TMember = {\n _id?: ObjectId;\n org?: string | ObjectId;\n orgName?: string;\n name: string;\n user: string | ObjectId;\n role: string | ObjectId;\n roleName?: string;\n app: string;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaMember = Joi.object({\n org: Joi.string().hex().optional().allow(\"\", null),\n orgName: Joi.string().optional().allow(\"\", null),\n name: Joi.string().required(),\n user: Joi.string().hex().required(),\n role: Joi.string().hex().required(),\n roleName: Joi.string().optional().allow(\"\", null),\n app: Joi.string().required(),\n});\n\nexport const schemaMemberRole = Joi.object({\n _id: Joi.string().hex().required(),\n role: Joi.string().hex().required(),\n roleName: Joi.string().optional().allow(\"\", null),\n});\n\nexport const schemaMemberStatus = Joi.object({\n _id: Joi.string().hex().required(),\n status: Joi.string().valid(\"active\", \"suspended\").required(),\n});\n\nexport function modelMember(value: TMember): TMember {\n const { error } = schemaMember.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n if (value.org) {\n try {\n value.org = new ObjectId(value.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n }\n\n if (value.user) {\n try {\n value.user = new ObjectId(value.user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n }\n\n if (value.role) {\n try {\n value.role = new ObjectId(value.role);\n } catch (error) {\n throw new BadRequestError(\"Invalid role ID.\");\n }\n }\n\n return {\n _id: value._id,\n org: value.org ?? \"\",\n orgName: value.orgName ?? \"\",\n name: value.name,\n user: value.user,\n app: value.app,\n role: value.role,\n roleName: value.roleName ?? \"\",\n status: value.status ?? \"active\",\n createdAt: value.createdAt || new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n useAtlas,\n paginate,\n logger,\n makeCacheKey,\n useCache,\n AppError,\n} from \"@goweekdays/utils\";\nimport { modelRole, schemaRoleUpdate, TRole } from \"./role.model\";\nimport { ObjectId, ClientSession } from \"mongodb\";\n\nexport function useRoleRepo() {\n const db = useAtlas.getDb();\n\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"roles\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { name: 1 } },\n { key: { status: 1 } },\n { key: { name: \"text\" } },\n { key: { name: 1, app: 1, org: 1, status: 1 }, unique: true },\n ]);\n } catch (error) {}\n }\n\n async function addRole(\n value: TRole,\n session?: ClientSession,\n clearCache = true\n ) {\n try {\n value = modelRole(value);\n\n const res = await collection.insertOne(value, { session });\n\n if (clearCache) {\n delCachedData();\n }\n\n return res.insertedId;\n } catch (error: any) {\n logger.log({ level: \"error\", message: `${error}` });\n\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Role already exists\");\n }\n\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to create role.\");\n }\n }\n }\n\n async function getRoleByUserId(value: ObjectId | string) {\n try {\n value = new ObjectId(value);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n user: String(value),\n });\n const cached = await getCache<TRole>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getRoleByUserId role: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TRole>({ user: value });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for role by user ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for role by user ID: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to retrieve role by user ID.\");\n }\n }\n\n async function getById(_id: ObjectId | string) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n id: _id.toString(),\n });\n const cached = await getCache<TRole>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById role: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne({ _id });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for role by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for role by id: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to retrieve role by ID.\");\n }\n }\n\n async function getRoleByName(name: string) {\n if (!name) {\n throw new BadRequestError(\"Role name is required.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n name: name,\n });\n const cached = await getCache<TRole>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getRoleByName role: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne({ name });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for role by name: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for role by name: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to retrieve role by name.\");\n }\n }\n\n async function getRoles(\n {\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n app = \"\",\n org = \"\",\n } = {} as {\n search?: string;\n page?: number;\n limit?: number;\n sort?: any;\n app?: string;\n org?: string | ObjectId;\n }\n ) {\n limit = limit > 0 ? limit : 10;\n search = search || \"\";\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status: \"active\" };\n\n const cacheKeyOptions: Record<string, any> = {\n status: \"active\",\n limit,\n page,\n };\n\n if (org && typeof org === \"string\" && org.length === 24) {\n try {\n query.org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n cacheKeyOptions.org = org;\n }\n\n if (app) {\n cacheKeyOptions.app = app;\n query.app = app;\n }\n\n if (search) {\n cacheKeyOptions.search = search;\n query.$text = { $search: search };\n }\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n cacheKeyOptions.sort = JSON.stringify(sort);\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n // Check cache first\n const cached = await getCache<TRole[]>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getRoles: ${cacheKey}`,\n });\n return cached;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getRoles: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getRoles: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function updateRole(\n _id: string | ObjectId,\n value: Pick<TRole, \"name\" | \"permissions\" | \"description\">,\n session?: ClientSession\n ) {\n const { error } = schemaRoleUpdate.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid role ID.\");\n }\n\n try {\n await collection.updateOne({ _id }, { $set: value }, { session });\n delCachedData();\n return \"Successfully updated role.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to update role.\");\n }\n }\n\n async function updatePermissionsById(\n _id: string | ObjectId,\n permissions: TRole[\"permissions\"],\n session?: ClientSession\n ) {\n if (!_id) {\n throw new BadRequestError(\"Role ID is required.\");\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid role ID.\");\n }\n\n if (!permissions) {\n throw new BadRequestError(\"Permissions are required.\");\n }\n\n if (permissions.length === 0) {\n throw new BadRequestError(\"Permissions cannot be empty.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n { $set: { permissions } },\n { session }\n );\n delCachedData();\n return \"Successfully updated role permissions.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to update role permissions.\");\n }\n }\n\n async function deleteById(_id: ObjectId | string, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.deleteOne(\n { _id },\n {\n session,\n }\n );\n delCachedData();\n return \"Successfully deleted role.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete role.\");\n }\n }\n\n return {\n createIndexes,\n addRole,\n getRoles,\n getRoleByUserId,\n getById,\n getRoleByName,\n updateRole,\n deleteById,\n updatePermissionsById,\n delCachedData,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TRole = {\n _id?: ObjectId;\n id?: string | ObjectId;\n name: string;\n description?: string;\n permissions?: Array<string>;\n org?: string | ObjectId;\n app: string;\n status?: string;\n createdBy?: string | ObjectId;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaRole = Joi.object({\n name: Joi.string().required(),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n permissions: Joi.array().items(Joi.string()).required(),\n org: Joi.string().hex().optional().allow(\"\", null),\n app: Joi.string().required(),\n createdBy: Joi.string().hex().required(),\n});\n\nexport const schemaRoleUpdate = Joi.object({\n name: Joi.string().optional().allow(\"\", null),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n permissions: Joi.array().items(Joi.string()).optional().allow(\"\", null),\n});\n\nexport function modelRole(value: TRole): TRole {\n const { error } = schemaRole.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n if (value._id && typeof value._id === \"string\") {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid _id.\");\n }\n }\n\n if (value.org && typeof value.org === \"string\" && value.org.length === 24) {\n try {\n value.org = new ObjectId(value.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org.\");\n }\n }\n\n if (\n value.createdBy &&\n typeof value.createdBy === \"string\" &&\n value.createdBy.length === 24\n ) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy.\");\n }\n }\n\n return {\n _id: value._id,\n name: value.name,\n description: value.description ?? \"\",\n permissions: value.permissions,\n org: value.org,\n app: value.app,\n status: value.status ?? \"active\",\n createdBy: value.createdBy,\n createdAt: value.createdAt ?? new Date().toISOString(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TPermission = {\n _id?: ObjectId;\n app: string;\n key: string;\n name: string;\n group: string;\n description: string;\n deprecated?: boolean;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaPermission = Joi.object({\n app: Joi.string().required(),\n key: Joi.string().required(),\n name: Joi.string().required(),\n group: Joi.string().required(),\n description: Joi.string().required(),\n deprecated: Joi.boolean().optional().allow(null),\n});\n\nexport const schemaPermissionUpdate = Joi.object({\n key: Joi.string().optional().allow(\"\", null),\n name: Joi.string().optional().allow(\"\", null),\n group: Joi.string().optional().allow(\"\", null),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n});\n\nexport function modelPermission(value: TPermission): TPermission {\n const { error } = schemaPermission.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n return {\n _id: value._id,\n app: value.app,\n key: value.key,\n name: value.name,\n group: value.group,\n description: value.description,\n deprecated: value.deprecated ?? false,\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelPermission,\n schemaPermissionUpdate,\n TPermission,\n} from \"./permission.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function usePermissionRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"permissions\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { app: 1 } },\n { key: { name: 1 } },\n { key: { key: 1 } },\n { key: { group: 1 } },\n {\n key: {\n app: \"text\",\n name: \"text\",\n key: \"text\",\n description: \"text\",\n group: \"text\",\n },\n name: \"text_index\",\n },\n {\n key: { app: 1, name: 1, key: 1, group: 1 },\n unique: true,\n name: \"unique_permission\",\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on permissions.\");\n }\n }\n\n async function add(value: TPermission, session?: ClientSession) {\n try {\n value = modelPermission(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Permission already exists.\");\n }\n\n throw new Error(\"Failed to create permission.\");\n }\n }\n }\n\n async function updateById(\n _id: ObjectId | string,\n value: { key?: string; group?: string; description?: string },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const { error } = schemaPermissionUpdate.validate(value);\n if (error) {\n throw new BadRequestError(`Invalid data: ${error.message}`);\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to update permission.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n app = \"\",\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n // Create cache key only with provided parameters\n const cacheParams: Record<string, any> = {\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n query.status = status;\n cacheParams.status = status;\n\n if (search) {\n query.$text = { $search: search };\n cacheParams.search = search;\n }\n\n if (app) {\n query.app = app;\n cacheParams.app = app;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheParams);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll permissions: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll permissions: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll permissions: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll permissions: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TPermission>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById permission: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPermission>({\n _id,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for permission by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for permission by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get permission.\");\n }\n }\n }\n\n async function getByKey(key: string, group?: string, app?: string) {\n const validation = Joi.object({\n key: Joi.string().required(),\n group: Joi.string().optional().allow(\"\", null),\n app: Joi.string().optional().allow(\"\", null),\n });\n const { error } = validation.validate({ key, group });\n if (error) {\n throw new BadRequestError(`Invalid data: ${error.message}`);\n }\n\n const query: Record<string, any> = {};\n const cacheKeyOptions: Record<string, any> = {};\n\n query.key = key;\n cacheKeyOptions.key = key;\n\n if (group) {\n query.group = group;\n cacheKeyOptions.group = group;\n }\n\n if (app) {\n query.app = app;\n cacheKeyOptions.app = app;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n try {\n const cached = await getCache<TPermission>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById permission: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPermission>(query);\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for permission by key: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for permission by key: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get permission.\");\n }\n }\n }\n\n async function countByGroup(group: string) {\n const cacheKey = makeCacheKey(namespace_collection, {\n group,\n tag: \"countByGroup\",\n });\n\n try {\n const cached = await getCache<number>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById permission: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.countDocuments({\n group,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for permission count by group: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for permission by group: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to count permission by group.\");\n }\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date() } }\n );\n\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete permission.\");\n }\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n getByKey,\n updateById,\n deleteById,\n countByGroup,\n };\n}\n","import { usePermissionRepo } from \"./permission.repository\";\n\nexport function usePermissionService() {\n const {\n updateById: _updateById,\n getById: _getById,\n deleteById: _deleteById,\n } = usePermissionRepo();\n\n async function deleteById(id: string) {\n try {\n await _deleteById(id);\n return \"Permission deleted successfully.\";\n } catch (error) {\n throw error;\n }\n }\n\n return {\n deleteById,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { usePermissionRepo } from \"./permission.repository\";\nimport { usePermissionService } from \"./permission.service\";\nimport { schemaPermission, schemaPermissionUpdate } from \"./permission.model\";\n\nexport function usePermissionController() {\n const {\n getAll: _getAll,\n getById: _getById,\n add: _add,\n updateById: _updateById,\n } = usePermissionRepo();\n\n const { deleteById: _deleteById } = usePermissionService();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaPermission.validate(value);\n\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 _add(value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\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 app: Joi.string().optional().allow(\"\", null),\n status: Joi.string().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 app = (req.query.app as string) ?? \"\";\n const search = (req.query.search as string) ?? \"\";\n const status = (req.query.status as string) ?? \"active\";\n\n try {\n const buildings = await _getAll({\n page,\n limit,\n sort: sortObj,\n app,\n search,\n status,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getById(id);\n res.json({\n message: \"Successfully retrieved permission.\",\n data,\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(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\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 updateById(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const { error: errorId } = Joi.string().hex().required().validate(id);\n\n if (errorId) {\n next(new BadRequestError(errorId.message));\n return;\n }\n\n const payload = req.body;\n\n const { error } = schemaPermissionUpdate.validate(payload);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateById(id, payload);\n res.json(message);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n add,\n getAll,\n getById,\n deleteById,\n updateById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TPermissionGroup = {\n _id?: ObjectId;\n app: string;\n key: string;\n label: string;\n order?: number;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaPermissionGroup = Joi.object({\n app: Joi.string().required(),\n key: Joi.string().required(),\n label: Joi.string().required(),\n order: Joi.number().integer().optional().allow(\"\", null),\n});\n\nexport const schemaPermissionGroupUpdate = Joi.object({\n key: Joi.string().optional().allow(\"\", null),\n label: Joi.string().optional().allow(\"\", null),\n order: Joi.number().integer().optional().allow(\"\", null),\n});\n\nexport function modelPermissionGroup(\n value: TPermissionGroup\n): TPermissionGroup {\n const { error } = schemaPermissionGroup.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n return {\n _id: value._id,\n app: value.app,\n key: value.key,\n label: value.label,\n order: value.order ?? Date.now(),\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelPermissionGroup,\n schemaPermissionGroupUpdate,\n TPermissionGroup,\n} from \"./permission.group.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function usePermissionGroupRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"permission.groups\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { app: 1 } },\n { key: { key: 1 } },\n { key: { label: 1 } },\n {\n key: { app: \"text\", key: \"text\", label: \"text\" },\n name: \"text_index\",\n },\n {\n key: { app: 1, key: 1, label: 1 },\n unique: true,\n name: \"unique_permission_group\",\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on permission groups.\");\n }\n }\n\n async function add(value: TPermissionGroup, session?: ClientSession) {\n try {\n value = modelPermissionGroup(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Permission group already exists.\");\n }\n\n throw new Error(\"Failed to create permission group.\");\n }\n }\n }\n\n async function updateById(\n _id: ObjectId | string,\n value: { name: string; serial: string; levels: number },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const { error } = schemaPermissionGroupUpdate.validate(value);\n if (error) {\n throw new BadRequestError(`Invalid data: ${error.message}`);\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to update permission group.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n app = \"\",\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheParams: Record<string, any> = {\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n query.status = status;\n cacheParams.status = status;\n\n if (search) {\n query.$text = { $search: search };\n cacheParams.search = search;\n }\n\n if (app) {\n query.app = app;\n cacheParams.app = app;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheParams);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll permission groups: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll permission groups: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll permission groups: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll permission groups: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TPermissionGroup>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById permission group: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPermissionGroup>({\n _id,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for permission group by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for permission group by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get permission group.\");\n }\n }\n }\n\n async function getByKey(key: string, app?: string) {\n const validation = Joi.object({\n key: Joi.string().required(),\n app: Joi.string().optional().allow(null, \"\"),\n });\n const { error } = validation.validate({ key, app });\n\n if (error) {\n throw new BadRequestError(\"Invalid key.\");\n }\n\n const query: Record<string, any> = { key };\n const cacheKeyOptions: Record<string, any> = { key, tag: \"byKey\" };\n\n if (app) {\n query.app = app;\n cacheKeyOptions.app = app;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n try {\n const cached = await getCache<TPermissionGroup>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById permission group: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPermissionGroup>(query);\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for permission group by key: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for permission group by key: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get permission group.\");\n }\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date() } }\n );\n\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete permission group.\");\n }\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n getByKey,\n updateById,\n deleteById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n useAtlas,\n} from \"@goweekdays/utils\";\nimport { usePermissionGroupRepo } from \"./permission.group.repository\";\nimport { usePermissionRepo } from \"./permission.repository\";\nimport { useAppRepo } from \"../app\";\n\nlet init = false;\n\nexport function usePermissionGroupService() {\n const {\n updateById: _updateById,\n getById: _getById,\n deleteById: _deleteById,\n getByKey: _getByKey,\n add: _add,\n } = usePermissionGroupRepo();\n\n const { getAll: getAllApps } = useAppRepo();\n\n const {\n countByGroup,\n getByKey: getPermissionByKey,\n add: addPermission,\n } = usePermissionRepo();\n\n async function addDefaultModule() {\n const session = useAtlas.getClient()?.startSession();\n\n if (!session) {\n throw new Error(\"Failed to start database session.\");\n }\n\n try {\n session?.startTransaction();\n\n const apps = await getAllApps({\n limit: 20,\n type: [\"default\", \"standard\"],\n });\n\n if (apps && apps.items && apps.items.length) {\n const modules = [\n {\n key: \"members\",\n label: \"Members\",\n permissions: [\n {\n key: \"members.view\",\n name: \"View Members\",\n description: \"Allow user to view members\",\n },\n {\n key: \"members.view.details\",\n name: \"View Member Details\",\n description: \"Allow user to view member details\",\n },\n {\n key: \"members.add\",\n name: \"Add Members\",\n description: \"Allow user to add new members\",\n },\n {\n key: \"members.edit.details\",\n name: \"Edit Member Details\",\n description: \"Allow user to edit member details\",\n },\n {\n key: \"members.delete\",\n name: \"Delete Members\",\n description: \"Allow user to delete members\",\n },\n ],\n },\n {\n key: \"roles\",\n label: \"Roles\",\n permissions: [\n {\n key: \"roles.view\",\n name: \"View Roles\",\n description: \"Allow user to view roles\",\n },\n {\n key: \"roles.view.details\",\n name: \"View Role Details\",\n description: \"Allow user to view role details\",\n },\n {\n key: \"roles.add\",\n name: \"Add Roles\",\n description: \"Allow user to add new roles\",\n },\n {\n key: \"roles.edit.details\",\n name: \"Edit Role Details\",\n description: \"Allow user to edit role details\",\n },\n {\n key: \"roles.delete\",\n name: \"Delete Roles\",\n description: \"Allow user to delete roles\",\n },\n ],\n },\n {\n key: \"invitations\",\n label: \"Invitations\",\n permissions: [\n {\n key: \"invitations.view\",\n name: \"View Invitations\",\n description: \"Allow user to view invitations\",\n },\n {\n key: \"invitations.view.details\",\n name: \"View Invitation Details\",\n description: \"Allow user to view invitation details\",\n },\n {\n key: \"invitations.send\",\n name: \"Send Invitations\",\n description: \"Allow user to send invitations\",\n },\n {\n key: \"invitations.revoke\",\n name: \"Revoke Invitations\",\n description: \"Allow user to revoke invitations\",\n },\n ],\n },\n ];\n\n for (const app of apps.items) {\n for (const module of modules) {\n const existingGroup = await _getByKey(module.key, app.code);\n\n if (!existingGroup) {\n await _add({\n app: app.code,\n key: module.key,\n label: module.label,\n });\n\n logger.log({\n level: \"info\",\n message: `Default permission group added: ${app.code} - ${module.key}`,\n });\n }\n\n for (const permission of module.permissions) {\n const existingPermission = await getPermissionByKey(\n permission.key,\n module.key,\n app.code\n );\n\n if (!existingPermission) {\n await addPermission({\n app: app.code,\n group: module.key,\n key: permission.key,\n name: permission.name,\n description: permission.description,\n });\n }\n }\n }\n\n if (app.code === \"org\") {\n const modules = [\n {\n key: \"subscriptions\",\n label: \"Subscriptions\",\n permissions: [\n {\n key: \"subscriptions.view.details\",\n name: \"View Subscription Details\",\n description: \"Allow user to view subscription details\",\n },\n {\n key: \"subscriptions.edit.details\",\n name: \"Edit Subscription Details\",\n description: \"Allow user to edit subscription details\",\n },\n {\n key: \"subscriptions.edit.status.cancel\",\n name: \"Edit Subscription Status - Cancel\",\n description:\n \"Allow user to edit subscription status to cancel\",\n },\n ],\n },\n {\n key: \"billing\",\n label: \"Billing\",\n permissions: [\n {\n key: \"billing.view\",\n name: \"View Billing\",\n description: \"Allow user to view billing\",\n },\n ],\n },\n {\n key: \"setting\",\n label: \"Setting\",\n permissions: [\n {\n key: \"setting.view\",\n name: \"View Setting\",\n description: \"Allow user to view setting\",\n },\n {\n key: \"setting.edit.details\",\n name: \"Edit Setting Details\",\n description: \"Allow user to edit setting details\",\n },\n ],\n },\n ];\n\n for (const module of modules) {\n const existingGroup = await _getByKey(module.key, app.code);\n\n if (!existingGroup) {\n await _add({\n app: app.code,\n key: module.key,\n label: module.label,\n });\n\n logger.log({\n level: \"info\",\n message: `Default permission group added: ${app.code} - ${module.key}`,\n });\n }\n\n for (const permission of module.permissions) {\n const existingPermission = await getPermissionByKey(\n permission.key,\n module.key\n );\n\n if (!existingPermission) {\n await addPermission({\n app: app.code,\n group: module.key,\n key: permission.key,\n name: permission.name,\n description: permission.description,\n });\n }\n }\n }\n }\n\n if (app.code === \"admin\") {\n const modules = [\n {\n key: \"applications\",\n label: \"Applications\",\n permissions: [\n {\n key: \"applications.add\",\n name: \"Add Applications\",\n description: \"Allow user to add new applications\",\n },\n {\n key: \"applications.view\",\n name: \"View Applications\",\n description: \"Allow user to view applications\",\n },\n {\n key: \"applications.view.details\",\n name: \"View Application Details\",\n description: \"Allow user to view application details\",\n },\n {\n key: \"applications.edit\",\n name: \"Edit Applications\",\n description: \"Allow user to edit existing applications\",\n },\n {\n key: \"applications.update.details\",\n name: \"Update Application Details\",\n description: \"Allow user to update application details\",\n },\n {\n key: \"applications.delete\",\n name: \"Delete Applications\",\n description: \"Allow user to delete applications\",\n },\n ],\n },\n {\n key: \"organizations\",\n label: \"Organizations\",\n permissions: [\n {\n key: \"organizations.add\",\n name: \"Add Organizations\",\n description: \"Allow user to add new organizations\",\n },\n {\n key: \"organizations.view\",\n name: \"View Organizations\",\n description: \"Allow user to view organizations\",\n },\n {\n key: \"organizations.view.details\",\n name: \"View Organization Details\",\n description: \"Allow user to view organization details\",\n },\n {\n key: \"organizations.edit.status\",\n name: \"Edit Organization Status\",\n description: \"Allow user to edit organization status\",\n },\n {\n key: \"organizations.delete\",\n name: \"Delete Organizations\",\n description: \"Allow user to delete organizations\",\n },\n ],\n },\n {\n key: \"users\",\n label: \"Users\",\n permissions: [\n {\n key: \"users.add\",\n name: \"Add Users\",\n description: \"Allow user to add new users\",\n },\n {\n key: \"users.view\",\n name: \"View Users\",\n description: \"Allow user to view users\",\n },\n {\n key: \"users.view.details\",\n name: \"View User Details\",\n description: \"Allow user to view user details\",\n },\n {\n key: \"users.edit.status\",\n name: \"Edit User Status\",\n description: \"Allow user to edit user status\",\n },\n {\n key: \"users.delete\",\n name: \"Delete Users\",\n description: \"Allow user to delete users\",\n },\n ],\n },\n {\n key: \"subscriptions\",\n label: \"Subscriptions\",\n permissions: [\n {\n key: \"subscriptions.view\",\n name: \"View Subscriptions\",\n description: \"Allow user to view subscriptions\",\n },\n {\n key: \"subscriptions.view.details\",\n name: \"View Subscription Details\",\n description: \"Allow user to view subscription details\",\n },\n {\n key: \"subscriptions.edit.status.suspend\",\n name: \"Edit Subscription Status - Suspend\",\n description:\n \"Allow user to edit subscription status to suspend\",\n },\n {\n key: \"subscriptions.edit.status.activate\",\n name: \"Edit Subscription Status - Activate\",\n description:\n \"Allow user to edit subscription status to activate\",\n },\n ],\n },\n {\n key: \"promo.codes\",\n label: \"Promo Codes\",\n permissions: [\n {\n key: \"promo.codes.view\",\n name: \"View Promo Codes\",\n description: \"Allow user to view promo codes\",\n },\n {\n key: \"promo.codes.view.details\",\n name: \"View Promo Code Details\",\n description: \"Allow user to view promo code details\",\n },\n {\n key: \"promo.codes.add\",\n name: \"Add Promo Codes\",\n description: \"Allow user to add new promo codes\",\n },\n {\n key: \"promo.codes.edit.details\",\n name: \"Edit Promo Code Details\",\n description: \"Allow user to edit promo code details\",\n },\n {\n key: \"promo.codes.update.status\",\n name: \"Update Promo Code Status\",\n description: \"Allow user to update promo code status\",\n },\n {\n key: \"promo.codes.delete\",\n name: \"Delete Promo Codes\",\n description: \"Allow user to delete promo codes\",\n },\n ],\n },\n {\n key: \"affiliates\",\n label: \"Affiliates\",\n permissions: [\n {\n key: \"affiliates.view\",\n name: \"View Affiliates\",\n description: \"Allow user to view affiliates\",\n },\n {\n key: \"affiliates.view.details\",\n name: \"View Affiliate Details\",\n description: \"Allow user to view affiliate details\",\n },\n {\n key: \"affiliates.edit.status\",\n name: \"Edit Affiliate Status\",\n description: \"Allow user to edit affiliate status\",\n },\n ],\n },\n ];\n\n for (const module of modules) {\n const existingGroup = await _getByKey(module.key, app.code);\n\n if (!existingGroup) {\n await _add({\n app: app.code,\n key: module.key,\n label: module.label,\n });\n\n logger.log({\n level: \"info\",\n message: `Default permission group added: ${app.code} - ${module.key}`,\n });\n }\n\n for (const permission of module.permissions) {\n const existingPermission = await getPermissionByKey(\n permission.key,\n module.key\n );\n\n if (!existingPermission) {\n await addPermission({\n app: app.code,\n group: module.key,\n key: permission.key,\n name: permission.name,\n description: permission.description,\n });\n }\n }\n }\n }\n }\n\n await session.commitTransaction();\n }\n\n logger.log({\n level: \"info\",\n message: \"Default permission groups added successfully.\",\n });\n return;\n } catch (error) {\n console.log(error);\n\n await session.abortTransaction();\n throw error;\n } finally {\n await session.endSession();\n }\n }\n\n async function deleteById(id: string) {\n const permission = await _getById(id);\n if (!permission) {\n throw new Error(\"Permission Group not found.\");\n }\n\n const associatedPermissionsCount = await countByGroup(permission.key);\n\n if (associatedPermissionsCount > 0) {\n throw new BadRequestError(\n \"Cannot delete Permission Group with associated Permissions.\"\n );\n }\n\n try {\n await _deleteById(id);\n return \"Permission deleted successfully.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete Permission Group.\");\n }\n }\n }\n\n return {\n addDefaultModule,\n deleteById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TApp = {\n _id?: ObjectId;\n code: string;\n name: string;\n description: string;\n type?: string;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaApp = Joi.object({\n code: Joi.string().alphanum().max(20).required(),\n name: Joi.string().max(255).required(),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n type: Joi.string().allow(\"default\", \"standard\").optional().allow(\"\", null),\n});\n\nexport const schemaAppUpdate = Joi.object({\n code: Joi.string().alphanum().max(20).optional().allow(\"\", null),\n name: Joi.string().max(255).optional().allow(\"\", null),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n});\n\nexport function modelApp(value: TApp): TApp {\n const { error } = schemaApp.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n return {\n _id: value._id,\n code: value.code,\n name: value.name,\n description: value.description,\n type: value.type ?? \"standard\",\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { modelApp, TApp } from \"./app.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function useAppRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"apps\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { code: 1 } },\n { key: { status: 1 } },\n {\n key: { code: \"text\", name: \"text\", description: \"text\" },\n name: \"text_index\",\n },\n {\n key: { code: 1, status: 1 },\n unique: true,\n name: \"unique_code\",\n partialFilterExpression: { status: { $in: [\"active\", \"draft\"] } },\n },\n {\n key: { name: 1, status: 1 },\n unique: true,\n name: \"unique_name\",\n partialFilterExpression: { status: { $in: [\"active\", \"draft\"] } },\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on apps.\");\n }\n }\n\n async function add(value: TApp, session?: ClientSession) {\n try {\n value = modelApp(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"App already exists.\");\n }\n\n throw new Error(\"Failed to create app.\");\n }\n }\n }\n\n async function updateById(\n _id: ObjectId | string,\n value: { name: string; description: string },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to update app.\");\n }\n }\n }\n\n async function getAll(\n {\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n status = \"active\",\n type = \"standard\",\n } = {} as {\n search?: string;\n page?: number;\n limit?: number;\n sort?: Record<string, any>;\n status?: string;\n type?: string | string[];\n }\n ) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status,\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n // Create cache key only with provided parameters\n const cacheParams: Record<string, any> = {\n status,\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n if (search) {\n query.$text = { $search: search };\n cacheParams.search = search;\n }\n\n if (type) {\n if (Array.isArray(type)) {\n query.type = { $in: type };\n } else {\n query.type = type;\n }\n\n cacheParams.type = type;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheParams);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll apps: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll apps: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll apps: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll apps: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TApp>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById app: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TApp>({\n _id,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for app by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for app by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get app.\");\n }\n }\n }\n\n async function getByCode(code: string) {\n const validate = Joi.string().required();\n const { error } = validate.validate(code);\n if (error) {\n throw new BadRequestError(\"Invalid code.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n code,\n tag: \"byCode\",\n });\n\n try {\n const cached = await getCache<TApp>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByCode app: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TApp>({\n code,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for app by code: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for app by code: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get app.\");\n }\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date() } }\n );\n\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete app.\");\n }\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n getByCode,\n updateById,\n deleteById,\n };\n}\n","import { logger, useAtlas } from \"@goweekdays/utils\";\nimport { useAppRepo } from \"./app.repository\";\nimport { usePermissionGroupService } from \"../permission\";\nimport { useUserService } from \"../../services/user.service\";\n\nlet init = false;\n\nexport function useAppService() {\n const {\n updateById: _updateById,\n getById: _getById,\n deleteById: _deleteById,\n getByCode: _getByCode,\n add: _add,\n } = useAppRepo();\n\n async function addDefaultApps() {\n const apps = [\n {\n code: \"admin\",\n name: \"Admin\",\n description: \"Administrative application.\",\n type: \"default\",\n },\n {\n code: \"org\",\n name: \"Organization\",\n description: \"Organization application.\",\n type: \"standard\",\n },\n {\n code: \"marketplace\",\n name: \"Marketplace\",\n description: \"Marketplace for product listings.\",\n },\n {\n code: \"service\",\n name: \"Services\",\n description: \"Service offerings and management.\",\n },\n {\n code: \"stay\",\n name: \"Stay\",\n description: \"Accommodation and lodging services.\",\n },\n { code: \"eat\", name: \"Eat\", description: \"Food and dining services.\" },\n {\n code: \"experience\",\n name: \"Experience\",\n description: \"Experiential touring, travel, activities and events.\",\n },\n {\n code: \"ride\",\n name: \"Ride\",\n description: \"Transportation and ride services.\",\n },\n {\n code: \"job\",\n name: \"jobs\",\n description: \"Job listings and recruitment services.\",\n },\n ];\n\n const session = useAtlas.getClient()?.startSession();\n\n if (!session) {\n throw new Error(\"Failed to start database session.\");\n }\n\n try {\n session?.startTransaction();\n\n for (const app of apps) {\n const existingApp = await _getByCode(app.code);\n\n if (!existingApp) {\n await _add(app, session);\n }\n }\n\n await session.commitTransaction();\n logger.log({\n level: \"info\",\n message: \"Default apps added successfully.\",\n });\n return;\n } catch (error) {\n await session.abortTransaction();\n logger.log({\n level: \"error\",\n message: `Failed to add default apps: ${error}`,\n });\n throw error;\n } finally {\n await session.endSession();\n }\n }\n\n async function deleteById(id: string) {\n try {\n await _deleteById(id);\n return \"App deleted successfully.\";\n } catch (error) {\n throw error;\n }\n }\n\n return {\n addDefaultApps,\n deleteById,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { useAppRepo } from \"./app.repository\";\nimport { useAppService } from \"./app.service\";\nimport { schemaApp, schemaAppUpdate } from \"./app.model\";\n\nexport function useAppController() {\n const {\n getAll: _getAll,\n getById: _getById,\n add: _add,\n updateById: _updateById,\n } = useAppRepo();\n\n const { deleteById: _deleteById } = useAppService();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaApp.validate(value);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const result = await _add(value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateById(req: Request, res: Response, next: NextFunction) {\n const id = (req.params.id as string) ?? \"\";\n const { error: errorId } = Joi.string().hex().required().validate(id);\n if (errorId) {\n next(new BadRequestError(errorId.message));\n return;\n }\n\n const value = req.body;\n\n const { error } = schemaAppUpdate.validate(value);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const result = await _updateById(req.params.id, value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\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 status: Joi.string().optional().allow(\"\", null),\n type: Joi.string().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 status = (req.query.status as string) ?? \"active\";\n const search = (req.query.search as string) ?? \"\";\n let type = (req.query.type as string)\n ? (req.query.type as string).split(\",\")\n : \"standard\";\n\n try {\n const buildings = await _getAll({\n page,\n limit,\n sort: sortObj,\n status,\n search,\n type,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getById(id);\n res.json({\n message: \"Successfully retrieved app.\",\n data,\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(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\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 add,\n updateById,\n getAll,\n getById,\n deleteById,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { usePermissionGroupRepo } from \"./permission.group.repository\";\nimport { usePermissionGroupService } from \"./permission.group.service\";\nimport {\n schemaPermissionGroup,\n schemaPermissionGroupUpdate,\n} from \"./permission.group.model\";\n\nexport function usePermissionGroupController() {\n const {\n getAll: _getAll,\n getById: _getById,\n add: _add,\n updateById: _updateById,\n } = usePermissionGroupRepo();\n\n const { deleteById: _deleteById } = usePermissionGroupService();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaPermissionGroup.validate(value);\n\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 _add(value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\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 app: Joi.string().optional().allow(\"\", null),\n status: Joi.string().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 app = (req.query.app as string) ?? \"\";\n const search = (req.query.search as string) ?? \"\";\n const status = (req.query.status as string) ?? \"active\";\n\n try {\n const buildings = await _getAll({\n page,\n limit,\n sort: sortObj,\n app,\n search,\n status,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getById(id);\n res.json({\n message: \"Successfully retrieved permission group.\",\n data,\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(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\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 updateById(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const { error: errorId } = Joi.string().hex().required().validate(id);\n\n if (errorId) {\n next(new BadRequestError(errorId.message));\n return;\n }\n\n const payload = req.body;\n\n const { error } = schemaPermissionGroupUpdate.validate(payload);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateById(id, payload);\n res.json(message);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n add,\n getAll,\n getById,\n deleteById,\n updateById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TOrg = {\n _id?: ObjectId;\n name: string;\n description?: string;\n email: string;\n contact?: string;\n createdBy: string | ObjectId;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nconst schema = {\n name: Joi.string().max(255).required(),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n email: Joi.string().email().max(255).required(),\n contact: Joi.string().max(50).optional().allow(\"\", null),\n};\n\nexport const schemaOrg = Joi.object({\n ...schema,\n createdBy: Joi.string().hex().required(),\n});\n\nexport const schemaOrgAdd = Joi.object({\n ...schema,\n createdBy: Joi.string().hex().required(),\n seats: Joi.number().required(),\n});\n\nexport const schemaOrgUpdate = Joi.object({\n ...schema,\n _id: Joi.string().hex().required(),\n});\n\nexport function modelOrg(value: TOrg): TOrg {\n const { error } = schemaOrg.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n if (value.createdBy && typeof value.createdBy === \"string\") {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ObjectId\");\n }\n }\n\n return {\n _id: value._id,\n name: value.name,\n description: value.description ?? \"\",\n email: value.email,\n contact: value.contact,\n createdBy: value.createdBy,\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { modelOrg, schemaOrgUpdate, TOrg } from \"./organization.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function useOrgRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"organizations\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { name: 1 } },\n { key: { description: 1 } },\n { key: { status: 1 } },\n { key: { name: \"text\", description: \"text\" }, name: \"text_index\" },\n { key: { name: 1, status: 1 }, unique: true, name: \"unique_name\" },\n { key: { email: 1, status: 1 }, unique: true, name: \"unique_email\" },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index.\");\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function add(value: TOrg, session?: ClientSession) {\n try {\n value = modelOrg(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Organization already exist.\");\n }\n\n throw new Error(\"Failed to create organization.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n search,\n page,\n limit,\n sort: JSON.stringify(sort),\n status,\n });\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll organizations: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll organizations: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n {\n $project: {\n _id: 1,\n name: 1,\n description: 1,\n status: 1,\n createdAt: 1,\n },\n },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll organizations: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll organizations: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TOrg>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById organization: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TOrg>({ _id });\n if (!result) {\n throw new BadRequestError(\"Organization not found.\");\n }\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for organization by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for organization by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get organization.\");\n }\n }\n }\n\n async function getByName(name: string) {\n const cacheKey = makeCacheKey(namespace_collection, { name });\n\n try {\n const cached = await getCache<TOrg>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByName organization: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TOrg>({\n name: { $regex: name, $options: \"i\" },\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for organization by name: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for organization by name: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get organization.\");\n }\n }\n }\n\n async function getByEmail(email: string) {\n const { error } = Joi.string().email().required().validate(email);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { email });\n\n try {\n const cached = await getCache<TOrg>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByEmail organization: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TOrg>({ email });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for organization by email: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for organization by email: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get organization.\");\n }\n }\n }\n\n async function updateFieldById(\n { _id, field, value } = {} as {\n _id: string | ObjectId;\n field: string;\n value: string;\n },\n session?: ClientSession\n ) {\n // Allowed fields to prevent arbitrary updates\n const allowedFields = [\"name\", \"description\"];\n\n if (!allowedFields.includes(field)) {\n throw new BadRequestError(\n `Field \"${field}\" is not allowed to be updated.`\n );\n }\n\n // Validate ID\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n { $set: { [field]: value } }, // Dynamically set the field\n { session }\n );\n\n delCachedData();\n\n return `Successfully updated user ${field}.`;\n } catch (error) {\n throw new InternalServerError(`Failed to update organization ${field}.`);\n }\n }\n\n async function deleteById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date().toISOString() } }\n );\n delCachedData();\n return \"Successfully deleted organization.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete organization.\");\n }\n }\n\n async function updateById(\n _id: string | ObjectId,\n options: Pick<TOrg, \"name\" | \"description\" | \"email\" | \"contact\">\n ) {\n const { error } = schemaOrgUpdate.validate({ ...options, _id });\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n { $set: { ...options, updatedAt: new Date() } }\n );\n delCachedData();\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Organization name already exist.\");\n }\n\n throw new InternalServerError(\"Failed to update org info.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n updateFieldById,\n deleteById,\n getByName,\n getByEmail,\n updateById,\n };\n}\n","import { BadRequestError, useAtlas } from \"@goweekdays/utils\";\nimport { useOrgRepo } from \"./organization.repository\";\nimport { useRoleRepo } from \"../role/role.repository\";\nimport { schemaOrgAdd, TOrg } from \"./organization.model\";\nimport { TPermission, usePermissionRepo } from \"../permission\";\nimport { useMemberRepo } from \"../member\";\nimport { useUserRepo } from \"../user\";\nimport {\n useSubscriptionRepo,\n useSubscriptionTransactionRepo,\n} from \"../subscription\";\nimport { usePlanRepo } from \"../plan\";\nimport { usePaypalService } from \"../utils/paypal.service\";\nimport { APP_ORG } from \"../../config\";\nimport Joi from \"joi\";\nimport { useVerificationRepo } from \"../verification\";\nimport { useLedgerBillingRepo } from \"../ledger\";\n\nexport function useOrgService() {\n const { add: addOrg } = useOrgRepo();\n const { addRole } = useRoleRepo();\n const { getAll: getAllPermission } = usePermissionRepo();\n const { add: addMember, updateRoleById: _updateRoleById } = useMemberRepo();\n const { getUserById } = useUserRepo();\n const { getDefault } = usePlanRepo();\n const { add: addSubscription } = useSubscriptionRepo();\n const { add: addSubscriptionTransaction } = useSubscriptionTransactionRepo();\n const { addOrder: addPaypalOrder } = usePaypalService();\n\n async function add(\n value: TOrg & {\n seats: number;\n }\n ) {\n const { error } = schemaOrgAdd.validate(value);\n\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n const session = useAtlas.getClient()?.startSession();\n\n if (!session) {\n throw new BadRequestError(\"Unable to start database session.\");\n }\n\n try {\n session?.startTransaction();\n // Create organization\n const org = await addOrg(\n {\n email: value.email,\n name: value.name,\n contact: value.contact,\n createdBy: value.createdBy,\n },\n session\n );\n\n const plan = await getDefault();\n\n if (!plan) {\n throw new BadRequestError(\n \"Failed to create organization, plan not found.\"\n );\n }\n\n const currentDate = new Date();\n const nextBillingDate = new Date(currentDate);\n nextBillingDate.setMonth(currentDate.getMonth() + 1);\n\n const amount = plan.price * value.seats;\n\n const subscriptionId = await addSubscription(\n {\n amount,\n org: String(org),\n seats: value.seats,\n paidSeats: value.seats,\n currency: plan.currency,\n billingCycle: plan.billingCycle,\n nextBillingDate: nextBillingDate,\n },\n session\n );\n\n const createdBy = String(value.createdBy);\n const user = await getUserById(createdBy);\n\n if (!user) {\n throw new BadRequestError(\"User is required to create org member.\");\n }\n\n await addSubscriptionTransaction(\n {\n subscription: subscriptionId,\n type: \"initiate\",\n amount,\n currency: plan.currency,\n description: \"Initial subscription transaction\",\n createdBy: value.createdBy,\n createdByName: `${user.firstName} ${user.lastName}`,\n },\n session\n );\n\n const allPermissions = await getAllPermission({\n app: \"org\",\n limit: 100,\n });\n\n let permissions: string[] = [];\n\n if (\n allPermissions &&\n allPermissions.items &&\n allPermissions.items.length\n ) {\n permissions = allPermissions.items.map((perm: TPermission) => perm.key);\n }\n\n if (permissions.length === 0) {\n throw new Error(\"No permissions found for the organization type.\");\n }\n\n const roleData = {\n org: String(org),\n name: \"Owner\",\n description: \"Owner of the organization\",\n permissions,\n createdBy,\n app: \"org\",\n };\n\n // Create roles\n const role = await addRole(roleData, session);\n\n if (!role) {\n throw new BadRequestError(\"Role is required to create org member.\");\n }\n\n await addMember(\n {\n role: String(role),\n roleName: roleData.name,\n org: String(org),\n orgName: value.name,\n name: `${user.firstName} ${user.lastName}`,\n user: createdBy,\n app: \"org\",\n },\n session\n );\n\n const order = await addPaypalOrder({\n amount,\n currency: plan.currency,\n customId: subscriptionId,\n returnUrl: `${APP_ORG}/organizations/success`,\n cancelUrl: `${APP_ORG}/organizations/cancel`,\n action: \"pay\",\n });\n\n // Commit transaction\n await session?.commitTransaction();\n\n const paypalOrderLink = JSON.parse(order.body.toString()).links.find(\n (link: any) => link.rel === \"approve\"\n );\n\n return {\n org: String(org),\n paypalOrderLink: paypalOrderLink ? paypalOrderLink.href : \"\",\n };\n } catch (error) {\n // Rollback transaction\n await session?.abortTransaction();\n throw error;\n } finally {\n await session?.endSession();\n }\n }\n\n const { getById, updateStatusById: updateVerificationStatus } =\n useVerificationRepo();\n\n const { add: addLedgerBilling } = useLedgerBillingRepo();\n\n async function addWithVerification(id: string) {\n const { error } = Joi.string().hex().required().validate(id);\n\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n const session = useAtlas.getClient()?.startSession();\n\n if (!session) {\n throw new BadRequestError(\"Unable to start database session.\");\n }\n\n try {\n session?.startTransaction();\n\n const verification = await getById(id);\n await updateVerificationStatus(id, \"complete\", session);\n\n if (!verification) {\n throw new BadRequestError(\"Verification not found.\");\n }\n\n if (!verification.metadata?.orgName) {\n throw new BadRequestError(\"Organization name is required.\");\n }\n\n if (!verification.metadata?.seats) {\n throw new BadRequestError(\"Number of seats is required.\");\n }\n\n if (!verification.metadata?.createdBy) {\n throw new BadRequestError(\"CreatedBy is required.\");\n }\n\n if (!verification.metadata?.contact) {\n throw new BadRequestError(\"Contact is required.\");\n }\n\n // Create organization\n const org = await addOrg(\n {\n email: verification.email,\n name: verification.metadata.orgName,\n contact: verification.metadata.contact,\n createdBy: verification.metadata.createdBy,\n },\n session\n );\n\n const plan = await getDefault();\n\n if (!plan) {\n throw new BadRequestError(\n \"Failed to create organization, plan not found.\"\n );\n }\n\n const currentDate = new Date();\n const nextBillingDate = new Date(currentDate);\n nextBillingDate.setMonth(currentDate.getMonth() + 1);\n\n const amount = plan.price * verification.metadata.seats;\n\n const subscriptionId = await addSubscription(\n {\n amount,\n org: String(org),\n seats: verification.metadata.seats,\n paidSeats: verification.metadata.seats,\n currency: plan.currency,\n billingCycle: plan.billingCycle,\n nextBillingDate: nextBillingDate,\n },\n session\n );\n\n const createdBy = String(verification.metadata.createdBy);\n const user = await getUserById(createdBy);\n\n if (!user) {\n throw new BadRequestError(\"User is required to create org member.\");\n }\n\n await addSubscriptionTransaction(\n {\n subscription: subscriptionId,\n type: \"initiate\",\n amount,\n currency: plan.currency,\n description: \"Initial subscription transaction\",\n createdBy,\n createdByName: `${user.firstName} ${user.lastName}`,\n },\n session\n );\n\n await addLedgerBilling(\n {\n org: String(org),\n amount: verification.metadata?.amount ?? 0,\n description: \"Setup payment during organization creation\",\n currency: plan.currency,\n type: \"setup-fee\",\n status: \"paid\",\n },\n session\n );\n\n const allPermissions = await getAllPermission({\n app: \"org\",\n limit: 100,\n });\n\n let permissions: string[] = [];\n\n if (\n allPermissions &&\n allPermissions.items &&\n allPermissions.items.length\n ) {\n permissions = allPermissions.items.map((perm: TPermission) => perm.key);\n }\n\n if (permissions.length === 0) {\n throw new Error(\"No permissions found for the organization type.\");\n }\n\n const roleData = {\n org: String(org),\n name: \"Owner\",\n description: \"Owner of the organization\",\n permissions,\n createdBy,\n app: \"org\",\n };\n\n // Create roles\n const role = await addRole(roleData, session);\n\n if (!role) {\n throw new BadRequestError(\"Role is required to create org member.\");\n }\n\n await addMember(\n {\n role: String(role),\n roleName: roleData.name,\n org: String(org),\n orgName: verification.metadata.orgName,\n name: `${user.firstName} ${user.lastName}`,\n user: createdBy,\n app: \"org\",\n },\n session\n );\n\n // Commit transaction\n await session?.commitTransaction();\n\n return \"Successfully created organization with verification.\";\n } catch (error) {\n // Rollback transaction\n await session?.abortTransaction();\n throw error;\n } finally {\n await session?.endSession();\n }\n }\n\n return {\n add,\n addWithVerification,\n };\n}\n","import Joi from \"joi\";\nimport { useMemberRepo } from \"./member.repository\";\nimport { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport { schemaMemberRole, schemaMemberStatus } from \"./member.model\";\nimport { useMemberService } from \"./member.service\";\n\nexport function useMemberController() {\n const {\n getByUserId: _getByUserId,\n getAll: _getAll,\n getOrgsByMembership: _getOrgsByMembership,\n updateStatusByUserId: _updateStatusByUserId,\n getByUserType: _getByUserType,\n getByApp: _getByApp,\n } = useMemberRepo();\n\n const {\n updateRoleById: _updateRoleById,\n updateStatusById: _updateStatusById,\n deleteById: _deleteById,\n } = useMemberService();\n\n async function getByUserId(req: Request, res: Response, next: NextFunction) {\n const userId = req.params.id as string;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate({ id: userId });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const member = await _getByUserId(userId);\n if (!member) {\n res.status(404).json({ message: \"Member not found.\" });\n return;\n }\n\n res.json(member);\n } catch (error) {\n next(error);\n }\n }\n\n async function getByUserType(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const validation = Joi.object({\n org: Joi.string().hex().optional().allow(\"\", null),\n user: Joi.string().hex().required(),\n app: Joi.string().required(),\n });\n\n const { error } = validation.validate({ ...req.params, ...req.query });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const orgId = req.query.org as string;\n const userId = req.params.user as string;\n const type = req.params.type as string;\n\n try {\n const member = await _getByUserType(userId, type, orgId);\n if (!member) {\n res.status(404).json({ message: \"Member not found.\" });\n return;\n }\n\n res.json(member);\n } catch (error) {\n next(error);\n }\n }\n\n async function getByApp(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.object({\n org: Joi.string().hex().optional().allow(\"\", null),\n user: Joi.string().hex().required(),\n app: Joi.string().required(),\n });\n\n const app = (req.params.app as string) ?? \"\";\n const org = req.query.org as string;\n const user = req.params.user as string;\n\n const { error } = validation.validate({ org, user, app });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const member = await _getByApp({ app, user, org });\n if (!member) {\n res.status(404).json({ message: \"Member not found.\" });\n return;\n }\n\n res.json(member);\n } catch (error) {\n next(error);\n }\n }\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const limit = Number(req.query.limit) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n const user = (req.query.user as string) ?? \"\";\n const org = (req.query.org as string) ?? \"\";\n const app = (req.params.app as string) ?? \"\";\n const status = (req.query.status as string) ?? \"active\";\n\n const validation = Joi.object({\n limit: Joi.number().min(10).max(50).required(),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n user: Joi.string().hex().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n app: Joi.string().required(),\n status: Joi.string().required(),\n });\n\n const { error } = validation.validate({\n search,\n page,\n user,\n org,\n app,\n limit,\n status,\n });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const items = await _getAll({\n search,\n page,\n user,\n org,\n app,\n limit,\n status,\n });\n\n res.json(items);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getAllByAppUser(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const limit = Number(req.query.limit) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n const user = (req.params.user as string) ?? \"\";\n const app = (req.params.app as string) ?? \"\";\n\n const validation = Joi.object({\n limit: Joi.number().min(10).max(200).allow(null, \"\"),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().optional().allow(null, \"\"),\n app: Joi.string().required(),\n user: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate({\n search,\n page,\n limit,\n user,\n app,\n });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const items = await _getAll({\n search,\n page,\n limit,\n user,\n app,\n });\n\n res.json(items);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getOrgsByMembership(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const limit = Number(req.query.limit) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n const user = (req.query.user as string) ?? \"\";\n\n const validation = Joi.object({\n limit: Joi.number().min(10).max(50).required(),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n user: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({\n search,\n page,\n user,\n limit,\n });\n\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const items = await _getOrgsByMembership({\n search,\n page,\n user,\n limit,\n });\n\n res.json(items);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateStatusByUserId(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n status: Joi.string().valid(\"active\", \"suspended\", \"deleted\").required(),\n });\n\n const { error } = validation.validate(req.params);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const id = req.params.id as string;\n const status = req.params.status as string;\n\n try {\n const message = await _updateStatusByUserId(id, status);\n res.json({ message });\n } catch (error) {\n next(error);\n }\n }\n\n async function updateRoleById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = req.body;\n const _id = (req.params.id as string) ?? \"\";\n\n const { error } = schemaMemberRole.validate({ ...payload, _id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateRoleById({ role: payload.role, _id });\n res.json({ message });\n } catch (error) {\n next(error);\n }\n }\n\n async function updateStatusById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = req.body;\n const _id = (req.params.id as string) ?? \"\";\n\n const { error } = schemaMemberStatus.validate({ ...payload, _id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateStatusById({ status: payload.status, _id });\n res.json({ message });\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(req: Request, res: Response, next: NextFunction) {\n const payload = req.body;\n const _id = (req.params.id as string) ?? \"\";\n\n const { error } = Joi.string().hex().required().validate(_id);\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 } catch (error) {\n next(error);\n }\n }\n\n return {\n getByApp,\n getByUserId,\n getAll,\n getOrgsByMembership,\n updateStatusByUserId,\n getByUserType,\n updateRoleById,\n updateStatusById,\n deleteById,\n getAllByAppUser,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { useRoleRepo } from \"../role\";\nimport { schemaMemberRole, schemaMemberStatus } from \"./member.model\";\nimport { useMemberRepo } from \"./member.repository\";\nimport Joi from \"joi\";\n\nexport function useMemberService() {\n const { getById: getRoleById } = useRoleRepo();\n const {\n updateRoleById: _updateRoleById,\n updateStatusById: _updateStatusById,\n getById: getMemberById,\n deleteById: _deleteById,\n } = useMemberRepo();\n\n async function updateRoleById(value: { _id: string; role: string }) {\n const { error } = schemaMemberRole.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n const role = await getRoleById(value.role);\n if (!role) {\n throw new BadRequestError(\"Role not found.\");\n }\n\n await _updateRoleById(value._id, {\n role: value.role,\n roleName: role.name,\n });\n\n return \"Successfully updated member role.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to update member role.\");\n }\n }\n }\n\n async function updateStatusById(value: { _id: string; status: string }) {\n const { error } = schemaMemberStatus.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n const member = await getMemberById(value._id);\n if (!member) {\n throw new BadRequestError(\"Member not found.\");\n }\n\n await _updateStatusById(value._id, value.status);\n\n return \"Successfully updated member status.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to update member status.\");\n }\n }\n }\n\n async function deleteById(id: string) {\n const { error } = Joi.string().hex().required().validate(id);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n const member = await getMemberById(id);\n if (!member) {\n throw new BadRequestError(\"Member not found.\");\n }\n\n await _deleteById(id);\n\n return \"Successfully deleted member.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to deleted member.\");\n }\n }\n }\n\n return {\n updateRoleById,\n updateStatusById,\n deleteById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { useMemberRepo } from \"../member\";\nimport { useRoleRepo } from \"./role.repository\";\n\nexport function useRoleService() {\n const { getByRole } = useMemberRepo();\n const { deleteById: _deleteById } = useRoleRepo();\n\n async function deleteById(id: string) {\n try {\n const role = await getByRole(id);\n if (role) {\n throw new BadRequestError(\"Cannot delete role assigned to members.\");\n }\n\n await _deleteById(id);\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete role.\");\n }\n }\n }\n\n return {\n deleteById,\n };\n}\n","import { NextFunction, Request, Response } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, InternalServerError } from \"@goweekdays/utils\";\nimport { useRoleRepo } from \"./role.repository\";\nimport { schemaRole } from \"./role.model\";\nimport { useRoleService } from \"./role.service\";\n\nexport function useRoleController() {\n const {\n addRole: _createRole,\n getById: getById,\n getRoleByUserId: _getRoleByUserId,\n getRoles: _getRoles,\n updateRole: _updateRole,\n updatePermissionsById: _updatePermissionsById,\n } = useRoleRepo();\n\n const { deleteById: _deleteById } = useRoleService();\n\n async function createRole(req: Request, res: Response, next: NextFunction) {\n const payload = req.body;\n\n const { error } = schemaRole.validate(payload);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const role = await _createRole(payload);\n res.json({ message: \"Successfully created role.\", data: { role } });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getRoles(req: Request, res: Response, next: NextFunction) {\n const search = (req.query.search as string) ?? \"\";\n const page = parseInt((req.query.page as string) ?? \"1\");\n const limit = parseInt((req.query.limit as string) ?? \"10\");\n const app = (req.query.app as string) ?? \"\";\n const org = (req.query.org as string) ?? \"\";\n\n const validation = Joi.object({\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n limit: Joi.number().required(),\n app: Joi.string().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ search, page, limit, app, org });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getRoles({ search, page, limit, app, org });\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getRoleByUserId(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const userId = req.params.userId;\n\n const validation = Joi.object({\n userId: Joi.string().required(),\n });\n\n const { error } = validation.validate({ userId });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const role = await _getRoleByUserId(userId);\n res.json({ message: \"Successfully retrieved role.\", data: { role } });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getRoleById(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 next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await getById(_id);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateRole(req: Request, res: Response, next: NextFunction) {\n const _id = req.params.id;\n const name = (req.body.name as string) ?? \"\";\n const permissions = (req.body.permissions as Array<string>) ?? [];\n const validation = Joi.object({\n _id: Joi.string().required(),\n name: Joi.string().required(),\n permissions: Joi.array().items(Joi.string()).required(),\n });\n\n const { error } = validation.validate({ _id, name, permissions });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const role = await _updateRole(_id, { name, permissions });\n res.json({ message: \"Successfully updated role.\", data: { role } });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updatePermissionsById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const _id = req.params.id;\n const permissions = (req.body.permissions as Array<string>) ?? [];\n const validation = Joi.object({\n _id: Joi.string().required(),\n permissions: Joi.array().items(Joi.string()).required(),\n });\n\n const { error } = validation.validate({ _id, permissions });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _updatePermissionsById(_id, permissions);\n res.json({ message: \"Successfully updated role permissions.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteRole(req: Request, res: Response, next: NextFunction) {\n const _id = req.params.id;\n\n const validation = Joi.object({\n _id: Joi.string().required(),\n });\n\n const { error } = validation.validate({ _id });\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 createRole,\n getRoles,\n getRoleByUserId,\n getRoleById,\n updateRole,\n deleteRole,\n updatePermissionsById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TSubscription = {\n _id?: ObjectId;\n org: string | ObjectId;\n seats: number;\n paidSeats: number;\n amount: number;\n currency: string;\n billingCycle: \"monthly\" | \"yearly\"; // e.g., 'monthly', 'yearly'\n promoCode?: string;\n status?: string;\n nextBillingDate: Date | string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nconst schema = {\n seats: Joi.number().integer().min(1).required(),\n paidSeats: Joi.number().integer().min(0).required(),\n amount: Joi.number().positive().required(),\n promoCode: Joi.string().optional().allow(\"\", null),\n nextBillingDate: Joi.date().optional().allow(\"\", null),\n};\n\nexport const schemaSubscription = Joi.object({\n ...schema,\n org: Joi.string().hex().length(24).required(),\n currency: Joi.string().length(3).required(),\n billingCycle: Joi.string().valid(\"monthly\", \"yearly\").required(),\n});\n\nexport const schemaSubscriptionUpdate = Joi.object({\n ...schema,\n status: Joi.string().optional().allow(\"\", null),\n});\n\nexport const schemaSubscriptionSeats = Joi.object({\n id: Joi.string().hex().length(24).required(),\n seats: Joi.number().integer().min(1).required(),\n amount: Joi.number().positive().optional().allow(null, 0),\n user: Joi.string().hex().length(24).required(),\n});\n\nexport function modelSubscription(data: any): TSubscription {\n const { error } = schemaSubscription.validate(data);\n\n if (error) {\n throw new BadRequestError(`Invalid subscription data: ${error.message}`);\n }\n\n if (data._id && typeof data._id === \"string\") {\n try {\n data._id = new ObjectId(data._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n }\n\n try {\n data.org = new ObjectId(data.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n\n return {\n _id: data._id,\n org: data.org,\n seats: data.seats,\n paidSeats: data.paidSeats,\n amount: data.amount,\n currency: data.currency,\n billingCycle: data.billingCycle,\n promoCode: data.promoCode,\n status: data.status ?? \"active\",\n nextBillingDate: data.nextBillingDate,\n createdAt: data.createdAt ?? new Date(),\n updatedAt: data.updatedAt ?? \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelSubscription,\n schemaSubscriptionUpdate,\n TSubscription,\n} from \"./subscription.model\";\nimport Joi from \"joi\";\nimport { ObjectId, ClientSession } from \"mongodb\";\n\nexport function useSubscriptionRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"subscriptions\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: {\n org: 1,\n },\n name: \"org_index\",\n },\n {\n key: { org: 1, status: 1 },\n name: \"org_status_index\",\n },\n ]);\n } catch (error) {}\n }\n\n async function add(value: TSubscription, session?: ClientSession) {\n try {\n value = modelSubscription(value);\n const result = await collection.insertOne(value, { session });\n delCachedData();\n return result.insertedId.toString();\n } catch (error) {\n logger.log({\n level: \"error\",\n message: `${error}`,\n });\n\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to add subscription.\");\n }\n }\n\n async function getAll({\n page = 1,\n limit = 10,\n search = \"\",\n status = \"active\",\n } = {}) {\n page = page < 1 ? page - 1 : page;\n\n const query: Record<string, any> = { status };\n const cacheKeyOptions: Record<string, any> = {\n page,\n limit,\n search,\n status,\n tag: \"getAll\",\n };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n try {\n const cachedData = await getCache<TPaginate<TSubscription>>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data: TPaginate<TSubscription> = paginate(\n items,\n page,\n limit,\n length\n );\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll subscription: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll subscription: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get subscriptions.\");\n }\n }\n\n async function getByOrg(org: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(org);\n if (error) {\n throw new Error(`Invalid org ID: ${error.message}`);\n }\n\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n org: String(org),\n tag: \"getByOrg\",\n });\n const cachedData = await getCache<TSubscription>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TSubscription>({\n org,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getByOrg subscription: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getByOrg subscription: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get subscription.\");\n }\n }\n\n async function getById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid subscription ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: String(_id),\n tag: \"getById\",\n });\n const cachedData = await getCache<TSubscription>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TSubscription>({\n _id,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getById subscription: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getById subscription: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get subscription.\");\n }\n }\n\n async function deleteById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid subscription ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\" } }\n );\n\n if (result.modifiedCount === 0) {\n throw new InternalServerError(\"Failed to delete subscription.\");\n }\n\n delCachedData();\n return \"Successfully deleted subscription.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to delete subscription.\");\n }\n }\n\n async function updateById(\n _id: string | ObjectId,\n options: {\n seats: number;\n paidSeats?: number;\n amount?: number;\n promoCode?: string;\n },\n session?: ClientSession\n ) {\n const { error: errorId } = Joi.string()\n .hex()\n .length(24)\n .required()\n .validate(_id);\n if (errorId) {\n throw new Error(`Invalid subscription ID: ${errorId.message}`);\n }\n\n const { error } = schemaSubscriptionUpdate.validate(options);\n if (error) {\n throw new BadRequestError(\n `Invalid subscription update data: ${error.message}`\n );\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { ...options, updatedAt: new Date() } },\n { session }\n );\n\n if (result.modifiedCount === 0) {\n throw new InternalServerError(\"Failed to update subscription.\");\n }\n\n delCachedData();\n return \"Successfully updated subscription.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to update subscription.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getByOrg,\n getById,\n deleteById,\n updateById,\n };\n}\n","import Joi from \"joi\";\nimport { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport { useSubscriptionRepo } from \"./subscription.repository\";\nimport { schemaSubscriptionSeats } from \"./subscription.model\";\nimport { useSubscriptionService } from \"./subscription.service\";\n\nexport function useSubscriptionController() {\n const {\n getAll: _getAll,\n getById: _getById,\n getByOrg: _getByOrg,\n } = useSubscriptionRepo();\n\n const { updateSeats: _updateSeats } = useSubscriptionService();\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.object({\n page: Joi.number().min(1).max(100).optional().allow(null, \"\").default(1),\n limit: Joi.number()\n .min(1)\n .max(100)\n .optional()\n .allow(null, \"\")\n .default(10),\n status: Joi.string()\n .valid(\"active\", \"suspended\")\n .optional()\n .default(\"active\"),\n });\n\n const query = req.query;\n\n const { error, value } = validation.validate(query);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAll(value);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(req: Request, res: Response, next: NextFunction) {\n const id = (req.params.id as string) ?? \"\";\n const validation = Joi.object({\n id: Joi.string().hex().length(24).required(),\n });\n\n const { error, value } = validation.validate({ id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getById(value.id);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getByOrg(req: Request, res: Response, next: NextFunction) {\n const org = (req.params.org as string) ?? \"\";\n\n const validation = Joi.object({\n org: Joi.string().hex().length(24).required(),\n });\n\n const { error, value } = validation.validate({ org });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getByOrg(value.org);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateSeats(req: Request, res: Response, next: NextFunction) {\n const id = (req.params.id as string) ?? \"\";\n const payload = req.body;\n const { error } = schemaSubscriptionSeats.validate({ ...payload, id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const user = (payload.user as string) ?? \"\";\n const seats = (payload.seats as number) ?? 0;\n const amount = (payload.amount as number) ?? 0;\n\n try {\n const message = await _updateSeats({ id, seats, amount, user });\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n getAll,\n getById,\n getByOrg,\n updateSeats,\n };\n}\n","import { BadRequestError, useAtlas } from \"@goweekdays/utils\";\nimport { useSubscriptionRepo } from \"./subscription.repository\";\nimport { useSubscriptionTransactionRepo } from \"./subscription.transaction.repository\";\nimport { useUserRepo } from \"../user\";\nimport { schemaSubscriptionSeats } from \"./subscription.model\";\n\nexport function useSubscriptionService() {\n const { getById, updateById } = useSubscriptionRepo();\n const { add: addTransaction } = useSubscriptionTransactionRepo();\n const { getUserById: getUserById } = useUserRepo();\n\n async function updateSeats({\n id = \"\",\n user = \"\",\n amount = 0,\n seats = 0,\n } = {}) {\n const { error } = schemaSubscriptionSeats.validate({\n id,\n seats,\n amount,\n user,\n });\n\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n const subscription = await getById(id);\n if (!subscription) {\n throw new Error(\"Subscription not found\");\n }\n\n if (subscription.seats === seats) {\n throw new Error(\"Failed to update subscription, no changes detected.\");\n }\n\n const userData = await getUserById(user);\n if (!userData) {\n throw new Error(\"User not found.\");\n }\n\n const session = useAtlas.getClient()?.startSession();\n if (!session) {\n throw new Error(\"Unable to start database session.\");\n }\n\n let subscriptionAmount = subscription.amount;\n\n const seatIncreased = seats > subscription.paidSeats;\n\n let paidSeats = subscription.paidSeats;\n\n if (seatIncreased) {\n subscriptionAmount += amount ?? 0;\n paidSeats = seats;\n }\n\n try {\n session.startTransaction();\n await updateById(\n id,\n { seats, amount: subscriptionAmount, paidSeats },\n session\n );\n if (seatIncreased) {\n await addTransaction(\n {\n type: \"add-seat\",\n description: `Added ${seats - subscription.paidSeats} seats.`,\n amount: amount ?? 0,\n currency: subscription.currency,\n subscription: id,\n createdBy: user,\n createdByName: `${userData.firstName} ${userData.lastName}`,\n },\n session\n );\n }\n await session.commitTransaction();\n return \"Successfully updated subscription seats.\";\n } catch (error) {\n await session.abortTransaction();\n throw error;\n } finally {\n session.endSession();\n }\n }\n\n return {\n updateSeats,\n };\n}\n","import {\n AppError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelSubscriptionTransaction,\n TSubscriptionTransaction,\n} from \"./subscription.transaction.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function useSubscriptionTransactionRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"subscription.transactions\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: {\n subscription: 1,\n },\n name: \"subscription_index\",\n },\n {\n key: { subscription: 1, type: 1 },\n name: \"subscription_type_index\",\n },\n {\n key: { createdAt: -1 },\n name: \"createdAt_index\",\n },\n ]);\n } catch (error) {}\n }\n\n async function add(value: TSubscriptionTransaction, session?: ClientSession) {\n try {\n value = modelSubscriptionTransaction(value);\n await collection.insertOne(value, { session });\n delCachedData();\n return \"Successfully added subscription transaction.\";\n } catch (error) {\n logger.log({\n level: \"error\",\n message: `${error}`,\n });\n\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to add subscription transaction.\");\n }\n }\n\n async function getAll({ page = 1, limit = 10, search = \"\", id = \"\" } = {}) {\n page = page > 0 ? page - 1 : page;\n\n const query: Record<string, any> = {};\n const cacheKeyOptions: Record<string, any> = {\n page,\n limit,\n search,\n tag: \"getAll\",\n };\n\n try {\n query.subscription = new ObjectId(id);\n cacheKeyOptions.subscription = id;\n } catch (error) {\n throw new InternalServerError(\"Invalid organization ID.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n try {\n const cachedData = await getCache<TPaginate<TSubscriptionTransaction>>(\n cacheKey\n );\n if (cachedData) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll subscription transaction: ${cacheKey}`,\n });\n return cachedData;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data: TPaginate<TSubscriptionTransaction> = paginate(\n items,\n page,\n limit,\n length\n );\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll subscription transaction: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll subscription transaction: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get subscription transactions.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TSubscriptionTransaction = {\n _id?: ObjectId;\n subscription: string | ObjectId;\n amount: number;\n currency: string;\n type: \"initiate\" | \"add-seat\" | \"remove-seat\" | \"renewal\";\n description?: string;\n createdBy: string | ObjectId;\n createdByName?: string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport const schemaSubscriptionTransaction = Joi.object({\n subscription: Joi.string().hex().length(24).required(),\n amount: Joi.number().positive().required(),\n currency: Joi.string().length(3).required(),\n type: Joi.string()\n .valid(\"initiate\", \"add-seat\", \"remove-seat\", \"renewal\")\n .required(),\n description: Joi.string().max(255).optional().allow(\"\", null),\n createdBy: Joi.string().hex().length(24).required(),\n createdByName: Joi.string().optional().allow(\"\", null),\n});\n\nexport function modelSubscriptionTransaction(\n data: TSubscriptionTransaction\n): TSubscriptionTransaction {\n const { error } = schemaSubscriptionTransaction.validate(data);\n\n if (error) {\n throw new BadRequestError(\n `Invalid subscription transaction data: ${error.message}`\n );\n }\n\n if (data._id && typeof data._id === \"string\") {\n try {\n data._id = new ObjectId(data._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription transaction ID.\");\n }\n }\n\n if (data.subscription && typeof data.subscription === \"string\") {\n try {\n data.subscription = new ObjectId(data.subscription);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n }\n\n if (data.createdBy && typeof data.createdBy === \"string\") {\n try {\n data.createdBy = new ObjectId(data.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID.\");\n }\n }\n\n return {\n _id: data._id,\n subscription: data.subscription,\n amount: data.amount,\n currency: data.currency,\n type: data.type,\n description: data.description ?? \"\",\n createdBy: data.createdBy,\n createdByName: data.createdByName,\n createdAt: data.createdAt ?? new Date(),\n updatedAt: data.updatedAt ?? \"\",\n };\n}\n","import Joi from \"joi\";\nimport { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport { useSubscriptionTransactionRepo } from \"./subscription.transaction.repository\";\n\nexport function useSubscriptionTransactionController() {\n const { getAll: _getAll } = useSubscriptionTransactionRepo();\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.object({\n id: Joi.string().hex().length(24).required(),\n page: Joi.number().min(1).max(100).optional().allow(null, \"\").default(1),\n limit: Joi.number()\n .min(1)\n .max(100)\n .optional()\n .allow(null, \"\")\n .default(10),\n });\n\n const query = req.query;\n const id = (req.params.id as string) ?? \"\";\n\n const { error, value } = validation.validate({ ...query, id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAll(value);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n getAll,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TPlan = {\n _id?: ObjectId;\n name: string;\n description?: string;\n features?: string[];\n price: number;\n currency: string;\n billingCycle: \"monthly\" | \"yearly\";\n default?: boolean;\n status?: \"active\" | \"inactive\";\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport const currencies = [\"USD\", \"PHP\"];\n\nexport const schemaPlan = Joi.object({\n name: Joi.string().min(3).max(100).required(),\n description: Joi.string().max(255).optional().allow(\"\", null),\n features: Joi.array().items(Joi.string().max(100)).optional(),\n price: Joi.number().positive().required(),\n currency: Joi.string()\n .length(3)\n .allow(...currencies)\n .required(),\n default: Joi.boolean().optional().allow(null, \"\"),\n billingCycle: Joi.string().valid(\"monthly\", \"yearly\").required(),\n});\n\nexport function modelPlan(data: any): TPlan {\n const { error } = schemaPlan.validate(data);\n\n if (error) {\n throw new Error(`Invalid plan data: ${error.message}`);\n }\n\n return {\n _id: data._id,\n name: data.name,\n description: data.description,\n features: data.features,\n price: data.price,\n currency: data.currency,\n billingCycle: data.billingCycle,\n status: data.status ?? \"active\",\n default: data.default ?? false,\n createdAt: data.createdAt ?? new Date(),\n updatedAt: data.updatedAt ?? \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { modelPlan, TPlan } from \"./plan.model\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport function usePlanRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"plans\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: {\n status: 1,\n },\n },\n {\n key: {\n name: 1,\n },\n },\n {\n key: { billingCycle: 1 },\n },\n {\n key: { name: \"text\", description: \"text\" },\n name: \"name_description_text_index\",\n },\n {\n key: { name: 1, status: 1 },\n partialFilterExpression: { status: \"active\" },\n unique: true,\n name: \"unique_name_index\",\n },\n {\n key: { default: 1 },\n unique: true,\n partialFilterExpression: { status: \"active\" },\n },\n ]);\n } catch (error) {}\n }\n\n async function add(value: TPlan) {\n try {\n value = modelPlan(value);\n await collection.insertOne(value);\n delCachedData();\n return \"Successfully added plan.\";\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Plan name already exist.\");\n }\n\n throw new InternalServerError(\"Failed to add plan.\");\n }\n }\n\n async function getAll({\n page = 1,\n limit = 10,\n search = \"\",\n status = \"active\",\n } = {}) {\n page = page < 1 ? page - 1 : page;\n\n const query: Record<string, any> = { status };\n const cacheKeyOptions: Record<string, any> = {\n page,\n limit,\n search,\n status,\n tag: \"getAll\",\n };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n try {\n const cachedData = await getCache<TPaginate<TPlan>>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data: TPaginate<TPlan> = paginate(items, page, limit, length);\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll plan: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll plan: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get plans.\");\n }\n }\n\n async function getById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid plan ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid plan ID.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: String(_id),\n tag: \"getById\",\n });\n const cachedData = await getCache<TPlan>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TPlan>({\n _id,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getById plan: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getById plan: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get plan.\");\n }\n }\n\n async function getDefault() {\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n default: true,\n tag: \"getDefault\",\n });\n const cachedData = await getCache<TPlan>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TPlan>({\n default: true,\n status: \"active\",\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for default plan: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for default plan: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get default plan.\");\n }\n }\n\n async function deleteById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid plan ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid plan ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\" } }\n );\n\n if (result.modifiedCount === 0) {\n throw new InternalServerError(\"Failed to delete plan.\");\n }\n\n delCachedData();\n return \"Successfully deleted plan.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to delete plan.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n getDefault,\n deleteById,\n };\n}\n","import { usePlanRepo } from \"./plan.repository\";\n\nexport function usePlanService() {\n const { add } = usePlanRepo();\n\n async function addDefaultPlan() {\n try {\n await add({\n name: \"Standard\",\n description: \"Default standard plan\",\n price: 1000,\n currency: \"PHP\",\n billingCycle: \"monthly\",\n default: true,\n });\n } catch (error) {\n throw error;\n }\n }\n\n return {\n addDefaultPlan,\n };\n}\n","import Joi from \"joi\";\nimport { usePlanRepo } from \"./plan.repository\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\n\nexport function usePlanController() {\n const {\n add: _add,\n getAll: _getAll,\n getById: _getById,\n deleteById: _deleteById,\n getDefault: _getDefault,\n } = usePlanRepo();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const validation = Joi.object({\n name: Joi.string().min(3).max(100).required(),\n description: Joi.string().max(255).optional().allow(\"\", null),\n features: Joi.array().items(Joi.string().max(100)).optional(),\n price: Joi.number().positive().required(),\n currency: Joi.string().length(3).required(),\n billingCycle: Joi.string().valid(\"monthly\", \"yearly\").required(),\n });\n\n const { error } = validation.validate(value);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _add(value);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const status = (req.query.status as string) ?? \"active\";\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n const limit = Number(req.query.limit) ?? 10;\n\n const validation = Joi.object({\n status: Joi.string().required(),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n limit: Joi.number().required(),\n });\n\n const { error } = validation.validate({ status, search, page, limit });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const plans = await _getAll({ status, search, page, limit });\n res.json(plans);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id as string;\n\n const validation = Joi.string().hex().length(24).required();\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const plan = await _getById(id);\n res.json(plan);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id as string;\n\n const validation = Joi.string().hex().length(24).required();\n const { error } = validation.validate(id);\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 getDefault(req: Request, res: Response, next: NextFunction) {\n try {\n const plan = await _getDefault();\n res.json(plan);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n add,\n getAll,\n getById,\n deleteById,\n getDefault,\n };\n}\n","import {\n Client,\n Environment,\n OrdersController,\n CheckoutPaymentIntent,\n OrderApplicationContextUserAction,\n} from \"@paypal/paypal-server-sdk\";\nimport crypto from \"crypto\";\nimport crc32 from \"buffer-crc32\";\nimport {\n isDev,\n PAYPAL_CLIENT_ID,\n PAYPAL_CLIENT_SECRET,\n PAYPAL_WEBHOOK_ID,\n} from \"../../config\";\nimport { logger } from \"@goweekdays/utils\";\n\nexport interface PaypalWebhookHeaders {\n \"paypal-auth-algo\"?: string;\n \"paypal-cert-url\": string;\n \"paypal-transmission-id\": string;\n \"paypal-transmission-sig\": string;\n \"paypal-transmission-time\": string;\n}\n\n// Cache for downloaded certificates\nconst certCache: Map<string, string> = new Map();\n\nexport function usePaypalService() {\n const paypalClient = new Client({\n clientCredentialsAuthCredentials: {\n oAuthClientId: PAYPAL_CLIENT_ID,\n oAuthClientSecret: PAYPAL_CLIENT_SECRET,\n },\n timeout: 0,\n environment: isDev ? Environment.Sandbox : Environment.Production,\n });\n\n function addOrder({\n amount = 0,\n currency = \"PHP\",\n customId = \"\",\n returnUrl = \"\",\n cancelUrl = \"\",\n action = \"pay\",\n } = {}) {\n return new OrdersController(paypalClient).createOrder({\n body: {\n intent: CheckoutPaymentIntent.Capture,\n purchaseUnits: [\n {\n amount: {\n currencyCode: currency,\n value: amount.toFixed(2),\n },\n customId,\n },\n ],\n applicationContext: {\n returnUrl,\n cancelUrl,\n userAction:\n action === \"pay\"\n ? OrderApplicationContextUserAction.PayNow\n : action === \"continue\"\n ? OrderApplicationContextUserAction.Continue\n : undefined,\n },\n },\n prefer: \"return=minimal\",\n });\n }\n\n function captureOrder(id: string) {\n return new OrdersController(paypalClient).captureOrder({ id });\n }\n\n /**\n * Downloads and caches a PayPal certificate from the given URL.\n * @param url - The URL of the certificate to download\n * @returns The certificate PEM content\n */\n async function downloadAndCacheCert(url: string): Promise<string> {\n // Check if certificate is already cached\n const cachedCert = certCache.get(url);\n if (cachedCert) {\n return cachedCert;\n }\n\n // Download the certificate\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `Failed to download PayPal certificate: ${response.statusText}`\n );\n }\n\n const certPem = await response.text();\n certCache.set(url, certPem);\n\n return certPem;\n }\n\n /**\n * Verifies a PayPal webhook signature locally using cryptographic verification.\n * This validates that the webhook notification is authentic and was sent by PayPal.\n *\n * @param rawBody - The raw webhook event body as a Buffer or string\n * @param headers - The PayPal webhook headers from the incoming request\n * @param webhookId - Optional webhook ID, defaults to PAYPAL_WEBHOOK_ID from config\n * @returns Promise resolving to true if signature is valid, false otherwise\n */\n async function verifySignature(\n rawBody: Buffer | string,\n headers: PaypalWebhookHeaders,\n webhookId: string = PAYPAL_WEBHOOK_ID\n ): Promise<boolean> {\n const transmissionId = headers[\"paypal-transmission-id\"];\n const timeStamp = headers[\"paypal-transmission-time\"];\n const certUrl = headers[\"paypal-cert-url\"];\n const transmissionSig = headers[\"paypal-transmission-sig\"];\n\n if (!transmissionId || !timeStamp || !certUrl || !transmissionSig) {\n logger.log({\n level: \"error\",\n message: \"Missing required PayPal webhook headers\",\n });\n return false;\n }\n\n // Calculate CRC32 of raw event data, hex to decimal (matching PayPal reference implementation)\n const crc = parseInt(\"0x\" + crc32(rawBody).toString(\"hex\"));\n\n // Construct the expected signed message\n const message = `${transmissionId}|${timeStamp}|${webhookId}|${crc}`;\n\n try {\n // Download the PayPal certificate\n const certPem = await downloadAndCacheCert(certUrl);\n\n // Create buffer from base64-encoded signature\n const signatureBuffer = Buffer.from(transmissionSig, \"base64\");\n\n // Create a verification object and verify the signature\n const verifier = crypto.createVerify(\"SHA256\");\n verifier.update(message);\n\n return verifier.verify(certPem, signatureBuffer);\n } catch (error) {\n logger.log({\n level: \"error\",\n message: `PayPal webhook verification error: ${error}`,\n });\n throw new Error(\"Failed to verify PayPal webhook signature.\");\n }\n }\n\n return {\n addOrder,\n captureOrder,\n verifySignature,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useVerificationService } from \"./verification.service\";\nimport { useVerificationRepo } from \"./verification.repository\";\nimport { schemaInviteMember } from \"./verification.model\";\nimport { schemaOrgAdd } from \"../organization\";\n\nexport function useVerificationController() {\n const {\n createUserInvite: _createUserInvite,\n createForgetPassword: _createForgetPassword,\n cancelUserInvitation: _cancelUserInvitation,\n verify: _verify,\n inviteMember: _inviteMember,\n signUp: _signUp,\n cancelInviteMember: _cancelInviteMember,\n forgetPassword: _forgetPassword,\n orgSetupFee: _orgSetupFee,\n } = useVerificationService();\n\n const { getVerifications: _getVerifications } = useVerificationRepo();\n\n async function createUserInvite(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const validation = Joi.object({\n email: Joi.string().email().required(),\n app: Joi.string().required(),\n role: Joi.string().hex().required(),\n roleName: Joi.string().required(),\n org: Joi.string().hex().optional().optional().allow(\"\", null),\n orgName: Joi.string().optional().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const email = (req.body.email as string) ?? \"\";\n const app = (req.body.app as string) ?? \"\";\n const role = (req.body.role as string) ?? \"\";\n const roleName = (req.body.roleName as string) ?? \"\";\n const org = (req.body.org as string) ?? \"\";\n const orgName = (req.body.orgName as string) ?? \"\";\n\n try {\n await _createUserInvite({\n email,\n metadata: {\n app,\n role,\n roleName,\n org,\n orgName,\n },\n });\n\n res.json({ message: \"Successfully invited user.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function createForgetPassword(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const email = (req.body.email as string) || \"\";\n\n const validation = Joi.string().email().required();\n\n const { error } = validation.validate(email);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createForgetPassword(email);\n res.json({\n message:\n \"Check your email to verify it before resetting your password.\",\n });\n return;\n } catch (error) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(\"An unexpected error occurred\"));\n }\n }\n }\n\n async function getVerifications(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const validation = Joi.object({\n status: Joi.string().required(),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n type: Joi.string().optional().allow(\"\", null),\n email: Joi.string().optional().allow(\"\", null),\n app: Joi.string().optional().allow(\"\", null),\n org: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(req.query);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const status = (req.query.status as string) ?? \"\";\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n let type = (req.query.type as string) ?? \"\";\n const email = (req.query.email as string) ?? \"\";\n const app = (req.query.app as string) ?? \"\";\n const org = (req.query.org as string) ?? \"\";\n\n const hasMultipleTypes = type.includes(\",\");\n\n let splitType: Array<string> = [];\n\n if (hasMultipleTypes) {\n splitType = type.split(\",\");\n }\n\n try {\n const items = await _getVerifications({\n status,\n search,\n page,\n type: hasMultipleTypes ? splitType : type,\n email,\n app,\n org,\n });\n res.json(items);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function verify(req: Request, res: Response, next: NextFunction) {\n const id = (req.params.id as string) || \"\";\n\n const validation = Joi.string().hex().required();\n\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _verify(id);\n res.json(message);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function cancelUserInvitation(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const otpId = (req.params.id as string) || \"\";\n\n const validation = Joi.string().hex().required();\n\n const { error } = validation.validate(otpId);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _cancelUserInvitation(otpId);\n return res.json({\n message: \"User invite has been cancelled.\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n async function signUp(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.string().email().required();\n\n const { error } = validation.validate(req.body.email);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const email = (req.body.email as string) ?? \"\";\n\n try {\n await _signUp({ email });\n res.json({ message: \"Successfully signed up user.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function inviteMember(req: Request, res: Response, next: NextFunction) {\n const { error } = schemaInviteMember.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _inviteMember(req.body);\n res.json({ message: \"Successfully invited member.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function cancelInviteMember(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const id = (req.params.id as string) || \"\";\n\n const validation = Joi.string().hex().required();\n\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _cancelInviteMember(id);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function forgetPassword(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const email = (req.body.email as string) ?? \"\";\n\n const validation = Joi.string().email().required();\n\n const { error } = validation.validate(email);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _forgetPassword(email);\n res.json({\n message,\n });\n return;\n } catch (error) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(\"An unexpected error occurred\"));\n }\n }\n }\n\n async function orgSetupFee(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaOrgAdd.validate(value);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _orgSetupFee(value);\n\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n getVerifications,\n createUserInvite,\n createForgetPassword,\n verify,\n cancelUserInvitation,\n inviteMember,\n signUp,\n cancelInviteMember,\n forgetPassword,\n orgSetupFee,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TLedgerBill = {\n _id?: ObjectId;\n org: string | ObjectId;\n type: \"setup-fee\" | \"subscription\";\n description: string;\n amount: number;\n currency: string;\n status: \"pending\" | \"paid\" | \"overdue\";\n billingFrom?: string | Date;\n billingTo?: string | Date;\n paidAt?: string | Date; // only if completed\n dueDate?: string | Date; // required for pending/overdue\n createdAt?: string | Date;\n};\n\nexport const ledgerBillTypes = [\"setup-fee\", \"subscription\"];\nexport const ledgerBillStatuses = [\"pending\", \"paid\", \"overdue\"];\n\nexport const schemaLedgerBill = Joi.object({\n org: Joi.string().hex().length(24).required(),\n type: Joi.string()\n .valid(...ledgerBillTypes)\n .required(),\n description: Joi.string().max(255).required(),\n amount: Joi.number().positive().required(),\n currency: Joi.string().length(3).required(),\n status: Joi.string()\n .valid(...ledgerBillStatuses)\n .required(),\n billingFrom: Joi.date().optional().allow(\"\", null),\n billingTo: Joi.date().optional().allow(\"\", null),\n paidAt: Joi.date().optional().allow(\"\", null),\n dueDate: Joi.date().optional().allow(\"\", null),\n});\n\nexport const schemaLedgerBillingSummary = Joi.object({\n status: Joi.string()\n .valid(...ledgerBillStatuses)\n .required(),\n org: Joi.string().hex().length(24).required(),\n});\n\nexport function modelLedgerBill(value: TLedgerBill): TLedgerBill {\n const { error } = schemaLedgerBill.validate(value);\n if (error) {\n throw new Error(`Ledger bill model validation error: ${error.message}`);\n }\n\n try {\n value.org = new ObjectId(value.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n\n return {\n _id: value._id,\n org: value.org,\n type: value.type,\n description: value.description,\n amount: value.amount,\n currency: value.currency,\n status: value.status,\n billingFrom: value.billingFrom ?? \"\",\n billingTo: value.billingTo ?? \"\",\n paidAt: value.paidAt ?? \"\",\n dueDate: value.dueDate ?? \"\",\n createdAt: value.createdAt ?? new Date(),\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelLedgerBill,\n schemaLedgerBillingSummary,\n TLedgerBill,\n} from \"./ledger.billing.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function useLedgerBillingRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"ledger.billings\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { org: 1 } },\n { key: { status: 1 } },\n { key: { description: \"text\" }, name: \"text_index\" },\n ]);\n return \"Successfully created ledger billing indexes.\";\n } catch (error) {\n throw new BadRequestError(\"Failed to create ledger billing indexes.\");\n }\n }\n\n async function add(value: TLedgerBill, session?: ClientSession) {\n try {\n value = modelLedgerBill(value);\n const result = await collection.insertOne(value, { session });\n delCachedData();\n return result.insertedId;\n } catch (error: any) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new BadRequestError(\n `Failed to add ledger billing: ${error.message}`\n );\n }\n }\n\n async function getAll({\n org = \"\",\n search = \"\",\n page = 1,\n limit = 10,\n status = \"\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status: { $ne: \"deleted\" } };\n const cacheKeyOptions: Record<string, any> = {\n search,\n page,\n limit,\n tag: \"getAll\",\n };\n\n try {\n query.org = new ObjectId(org);\n cacheKeyOptions.org = org;\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n\n if (status) {\n query.status = status;\n cacheKeyOptions.status = status;\n }\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll ledger billings: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll ledger billings: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll ledger billings: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll ledger billings: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid ledger billing ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ledger billing ID.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: String(_id),\n tag: \"getById\",\n });\n const cachedData = await getCache<TLedgerBill>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TLedgerBill>({\n _id,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getById ledger billing: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getById ledger billing: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get ledger billing.\");\n }\n }\n\n async function getSummary(status: string, org: string | ObjectId) {\n const { error } = schemaLedgerBillingSummary.validate({ status, org });\n if (error) {\n throw new Error(`Invalid ledger billing ID: ${error.message}`);\n }\n\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid ledger billing org.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n org: String(org),\n status,\n tag: \"getSummaryByOrgStatus\",\n });\n const cachedData = await getCache<TLedgerBill>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection\n .aggregate([\n { $match: { org, status } },\n {\n $group: {\n _id: \"$status\",\n totalAmount: { $sum: \"$amount\" },\n count: { $sum: 1 },\n },\n },\n ])\n .toArray();\n\n setCache(cacheKey, data[0])\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for ledger billing summary: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for ledger billing summary: ${err.message}`,\n });\n });\n\n return data[0];\n } catch (error) {\n throw new InternalServerError(\"Failed to get ledger billing summary.\");\n }\n }\n\n return {\n delCachedData,\n createIndexes,\n add,\n getAll,\n getById,\n getSummary,\n };\n}\n","import { useLedgerBillingRepo } from \"./ledger.billing.repository\";\nimport { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport { schemaLedgerBillingSummary } from \"./ledger.billing.model\";\n\nexport function useLedgerBillingController() {\n const {\n getAll: _getAll,\n getById: _getById,\n getSummary: _getSummary,\n } = useLedgerBillingRepo();\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const query = req.query;\n\n const validation = Joi.object({\n org: Joi.string().hex().optional().allow(\"\", null),\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 status: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n\n const page =\n typeof req.query.page === \"string\" ? Number(req.query.page) : 1;\n const limit =\n typeof req.query.limit === \"string\" ? Number(req.query.limit) : 10;\n const search = (req.query.search as string) ?? \"\";\n const org = (req.query.org as string) ?? \"\";\n const status = (req.query.status as string) ?? \"\";\n\n const isPageNumber = isFinite(page);\n if (!isPageNumber) {\n next(new BadRequestError(\"Invalid page number.\"));\n return;\n }\n\n const isLimitNumber = isFinite(limit);\n\n if (!isLimitNumber) {\n next(new BadRequestError(\"Invalid limit number.\"));\n return;\n }\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const orgs = await _getAll({ org, page, limit, search, status });\n res.json(orgs);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const org = await _getById(id);\n res.json(org);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getSummary(req: Request, res: Response, next: NextFunction) {\n const params = req.params;\n\n const { error } = schemaLedgerBillingSummary.validate(params);\n const org = (req.params.org as string) ?? \"\";\n const status = (req.params.status as string) ?? \"\";\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const summary = await _getSummary(status, org);\n res.json(summary);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n getAll,\n getById,\n getSummary,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { useOrgService } from \"./organization.service\";\nimport { useMemberRepo } from \"../member/member.repository\";\nimport { useOrgRepo } from \"./organization.repository\";\nimport { schemaOrgAdd, schemaOrgUpdate } from \"./organization.model\";\n\nexport function useOrgController() {\n const { add: _add } = useOrgService();\n const { getOrgsByMembership } = useMemberRepo();\n const {\n getByName: _getByName,\n getAll: getAllOrg,\n getById: _getById,\n updateById: _updateById,\n } = useOrgRepo();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaOrgAdd.validate(value);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _add(value);\n\n res.json({\n message: \"Organization created successfully.\",\n data,\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getOrgsByUserId(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const page =\n typeof req.query.page === \"string\" ? Number(req.query.page) : 1;\n const limit =\n typeof req.query.limit === \"string\" ? Number(req.query.limit) : 10;\n const search = (req.query.search as string) ?? \"\";\n\n const user = (req.params.user as string) ?? \"\";\n\n const isPageNumber = isFinite(page);\n if (!isPageNumber) {\n next(new BadRequestError(\"Invalid page number.\"));\n return;\n }\n\n const isLimitNumber = isFinite(limit);\n\n if (!isLimitNumber) {\n next(new BadRequestError(\"Invalid limit number.\"));\n return;\n }\n\n const validation = Joi.object({\n user: Joi.string().hex().required(),\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 });\n\n const { error } = validation.validate({ user, page, limit, search });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const orgs = await getOrgsByMembership({ user, page, limit, search });\n res.json(orgs);\n return;\n } catch (error) {\n next(error);\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 status: Joi.string()\n .valid(\"active\", \"suspended\", \"inactive\", \"deleted\")\n .optional(),\n });\n\n const { error } = validation.validate(query);\n\n const page =\n typeof req.query.page === \"string\" ? Number(req.query.page) : 1;\n const limit =\n typeof req.query.limit === \"string\" ? Number(req.query.limit) : 10;\n const search = (req.query.search as string) ?? \"\";\n const status = (req.query.status as string) ?? \"active\";\n\n const isPageNumber = isFinite(page);\n if (!isPageNumber) {\n next(new BadRequestError(\"Invalid page number.\"));\n return;\n }\n\n const isLimitNumber = isFinite(limit);\n\n if (!isLimitNumber) {\n next(new BadRequestError(\"Invalid limit number.\"));\n return;\n }\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const orgs = await getAllOrg({ page, limit, search, status });\n res.json(orgs);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getByName(req: Request, res: Response, next: NextFunction) {\n const name = req.params.name;\n\n const validation = Joi.object({\n name: Joi.string().required(),\n });\n\n const { error } = validation.validate({ name });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const org = await _getByName(name);\n res.json(org);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const org = await _getById(id);\n res.json(org);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateById(req: Request, res: Response, next: NextFunction) {\n const _id = (req.params.id as string) ?? \"\";\n const payload = req.body;\n const { error } = schemaOrgUpdate.validate({ _id, ...payload });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateById(_id, payload);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n add,\n getOrgsByUserId,\n getByName,\n getAll,\n getById,\n updateById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useUserService } from \"./user.service\";\nimport { useUserRepo } from \"../user/user.repository\";\n\nexport function useUserController() {\n const {\n updateName: _updateName,\n updateBirthday: _updateBirthday,\n updateUserFieldById: _updateUserFieldById,\n updateUserProfile: _updateUserProfile,\n addViaInvite: _addViaInvite,\n createUserBySignUp: _createUserBySignUp,\n resetPassword: _resetPassword,\n } = useUserService();\n\n const { getUserById: _getUserById, getAll: _getAll } = useUserRepo();\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const status = (req.query.status as string) ?? \"\";\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n\n const validation = Joi.object({\n status: Joi.string().required(),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n });\n\n const { error } = validation.validate({ status, search, page });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const items = await _getAll({ status, search, page });\n\n res.json(items);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getUserById(req: Request, res: Response, next: NextFunction) {\n const id = (req.params.id as string) || \"\";\n\n const validation = Joi.string().hex().validate(id);\n if (validation.error) {\n throw new BadRequestError(\"Invalid id.\");\n }\n\n try {\n const user = await _getUserById(id);\n if (!user) {\n throw new BadRequestError(\"User not found.\");\n }\n\n res.json(user);\n } catch (error) {\n next(error);\n }\n }\n\n async function updateName(req: Request, res: Response, next: NextFunction) {\n const id = (req.headers.user as any) ?? \"\";\n const firstName = (req.body.firstName as string) ?? \"\";\n const lastName = (req.body.lastName as string) ?? \"\";\n\n const validation = Joi.object({\n firstName: Joi.string().required(),\n lastName: Joi.string().required(),\n });\n\n const { error } = validation.validate({ firstName, lastName });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateName(id, firstName, lastName);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateBirthday(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const id = (req.headers.user as any) ?? \"\";\n const month = (req.body.month as string) ?? \"\";\n const day = (req.body.day as number) ?? 0;\n const year = (req.body.year as number) ?? 0;\n\n const validation = Joi.object({\n month: Joi.string().required(),\n day: Joi.number().integer().min(1).max(31).required(),\n year: Joi.number()\n .integer()\n .min(1900)\n .max(new Date().getFullYear())\n .required(),\n });\n\n const { error } = validation.validate({ month, day, year });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateBirthday(id, month, day, year);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateUserFieldById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const _id = req.params.id as string;\n const { field, value } = req.body;\n\n // Runtime validation using Joi\n const validation = Joi.object({\n _id: Joi.string().hex().required(),\n field: Joi.string()\n .valid(\"gender\", \"email\", \"contact\", \"profile\")\n .required(),\n value: Joi.alternatives().conditional(\"field\", {\n is: \"email\",\n then: Joi.string().email().required(),\n otherwise: Joi.string().required(),\n }),\n });\n\n const { error } = validation.validate({ _id, field, value });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateUserFieldById({ _id, field, value });\n res.json({ message });\n } catch (error) {\n next(error);\n }\n }\n\n async function updateUserProfile(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n res.status(400).send(\"File is required!\");\n return;\n }\n\n const previousProfile = (req.body.previousProfile as string) ?? \"\";\n\n const validation = Joi.object({\n previousProfile: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ previousProfile });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const user = (req.headers[\"user\"] as string) ?? \"\";\n\n try {\n await _updateUserProfile({\n file: req.file,\n user,\n previousProfile,\n });\n res.json({ message: \"Successfully updated profile picture.\" });\n return;\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(error));\n }\n }\n }\n\n async function addViaInvite(req: Request, res: Response, next: NextFunction) {\n const firstName = (req.body.firstName as string) ?? \"\";\n const lastName = (req.body.lastName as string) ?? \"\";\n const password = (req.body.password as string) ?? \"\";\n const id = (req.params.id as string) ?? \"\";\n const type = (req.body.type as string) ?? \"\";\n\n const validation = Joi.object({\n firstName: Joi.string().required(),\n lastName: Joi.string().required(),\n password: Joi.string().required(),\n id: Joi.string().hex().required(),\n type: Joi.string().required(),\n });\n\n const { error } = validation.validate({\n firstName,\n lastName,\n password,\n id,\n type,\n });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n if (type === \"user-invite\") {\n await _addViaInvite({ firstName, lastName, password, id });\n }\n\n if (type === \"user-sign-up\") {\n await _createUserBySignUp({\n firstName,\n lastName,\n password,\n id,\n });\n }\n\n res.json({ message: \"Successfully created account.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function resetPassword(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = req.body;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n newPassword: Joi.string().min(8).required(),\n confirmPassword: Joi.string().min(8).required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _resetPassword(payload);\n res.json({ message: \"Password reset successfully.\" });\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n return {\n getAll,\n getUserById,\n updateName,\n updateBirthday,\n updateUserFieldById,\n updateUserProfile,\n addViaInvite,\n resetPassword,\n };\n}\n","import { BadRequestError, logger } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TBuilding = {\n _id?: ObjectId;\n school: ObjectId;\n serial?: string;\n name: string;\n levels: number;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n status?: string;\n};\n\nexport const schemaBuilding = Joi.object({\n _id: Joi.string().hex().optional(),\n school: Joi.string().hex().required(),\n serial: Joi.string().optional().allow(\"\", null),\n name: Joi.string().required(),\n levels: Joi.number().integer().min(1).required(),\n createdAt: Joi.date().optional().allow(\"\", null),\n updatedAt: Joi.date().optional().allow(\"\", null),\n deletedAt: Joi.date().optional().allow(\"\", null),\n status: Joi.string().optional().allow(\"\", null),\n});\n\nexport type TBuildingUnit = {\n _id?: ObjectId;\n school: ObjectId | string;\n name?: string;\n building: ObjectId | string;\n buildingName?: string;\n level: number;\n category: string;\n type: string;\n seating_capacity: number;\n standing_capacity: number;\n description?: string;\n unit_of_measurement: string;\n area: number;\n status: string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n};\n\nexport const schemaBuildingUnit = Joi.object({\n _id: Joi.string().hex().optional(),\n school: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n building: Joi.string().hex().required(),\n buildingName: Joi.string().optional().allow(\"\", null),\n level: Joi.number().integer().min(1).required(),\n category: Joi.string().required(),\n type: Joi.string().required(),\n seating_capacity: Joi.number().integer().min(0).required(),\n standing_capacity: Joi.number().integer().min(0).required(),\n description: Joi.string().optional().allow(\"\", null),\n unit_of_measurement: Joi.string().valid(\"sqm\").required(),\n area: Joi.number().positive().required(),\n status: Joi.string().optional().allow(\"\", null),\n});\n\nexport const schemaUpdateOptions = Joi.object({\n name: Joi.string().optional().allow(\"\", null),\n building: Joi.string().hex().optional().allow(\"\", null),\n buildingName: Joi.string().optional().allow(\"\", null),\n level: Joi.number().integer().min(1).optional().allow(\"\", null),\n category: Joi.string().optional().allow(\"\", null),\n type: Joi.string().optional().allow(\"\", null),\n seating_capacity: Joi.number().integer().min(0).optional().allow(\"\", null),\n standing_capacity: Joi.number().integer().min(0).optional().allow(\"\", null),\n area: Joi.number().positive().optional().allow(\"\", null),\n});\n\nexport function MBuilding(value: TBuilding) {\n const { error } = schemaBuilding.validate(value);\n if (error) {\n logger.info(`Building Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value._id && typeof value._id === \"string\") {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid _id format\");\n }\n }\n\n try {\n value.school = new ObjectId(value.school);\n } catch (error) {\n throw new BadRequestError(\"Invalid school format\");\n }\n\n return {\n _id: value._id ?? undefined,\n school: value.school,\n serial: value.serial ?? \"\",\n name: value.name ?? \"\",\n levels: value.levels ?? 0,\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt ?? \"\",\n deletedAt: value.deletedAt ?? \"\",\n };\n}\n\nexport function MBuildingUnit(value: TBuildingUnit) {\n const { error } = schemaBuildingUnit.validate(value);\n if (error) {\n logger.info(`Building Unit Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value._id && typeof value._id === \"string\") {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID\");\n }\n }\n\n try {\n value.school = new ObjectId(value.school);\n } catch (error) {\n throw new BadRequestError(\"Invalid school ID\");\n }\n\n try {\n value.building = new ObjectId(value.building);\n } catch (error) {\n throw new BadRequestError(\"Invalid building ID\");\n }\n\n return {\n _id: value._id ?? undefined,\n school: value.school,\n name: value.name ?? \"\",\n building: value.building,\n buildingName: value.buildingName ?? \"\",\n level: value.level ?? 0,\n category: value.category ?? \"\",\n type: value.type ?? \"\",\n seating_capacity: value.seating_capacity ?? 0,\n standing_capacity: value.standing_capacity ?? 0,\n description: value.description ?? \"\",\n unit_of_measurement: value.unit_of_measurement ?? \"sqm\",\n area: value.area ?? 0,\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt ?? \"\",\n deletedAt: value.deletedAt ?? \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { MBuilding, TBuilding } from \"./building.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function useBuildingRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"school.buildings\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { name: 1 }, unique: true, name: \"unique_name_index\" },\n { key: { school: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on buildings.\");\n }\n }\n\n async function add(value: TBuilding, session?: ClientSession) {\n try {\n value = MBuilding(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Building already exists.\");\n }\n\n throw new Error(\"Failed to create building.\");\n }\n }\n }\n\n async function updateById(\n _id: ObjectId | string,\n value: { name: string; serial: string; levels: number },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to update building.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n school = \"\",\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status,\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n if (school) {\n try {\n query.school = new ObjectId(school);\n } catch (error) {\n throw new BadRequestError(\"Invalid school ID.\");\n }\n }\n\n // Create cache key only with provided parameters\n const cacheParams: Record<string, any> = {\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n if (search) cacheParams.search = search;\n if (school) cacheParams.school = school;\n if (status !== \"active\") cacheParams.status = status;\n\n const cacheKey = makeCacheKey(namespace_collection, cacheParams);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll buildings: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll buildings: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll buildings: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll buildings: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TBuilding>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById building: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TBuilding>({\n _id,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for building by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for building by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get building.\");\n }\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date() } }\n );\n\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete building.\");\n }\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n updateById,\n deleteById,\n };\n}\n","import { BadRequestError, NotFoundError, useAtlas } from \"@goweekdays/utils\";\nimport { useBuildingRepo } from \"./building.repository\";\nimport { useBuildingUnitRepo } from \"./building-unit.repository\";\n\nexport function useBuildingService() {\n const {\n updateById: _updateById,\n getById: _getById,\n deleteById: _deleteById,\n } = useBuildingRepo();\n const { getByBuildingLevel, getByBuilding, updateByBuildingId } =\n useBuildingUnitRepo();\n\n async function updateById(\n id: string,\n data: { name: string; levels: number; serial: string }\n ) {\n data.levels = Number(data.levels);\n\n const session = useAtlas.getClient()?.startSession();\n\n try {\n const building = await _getById(id);\n\n if (!building) {\n throw new NotFoundError(\"Building not found.\");\n }\n\n if (data.levels < building.levels) {\n const unit = await getByBuildingLevel(id, building.levels);\n if (unit) {\n throw new BadRequestError(\n \"Cannot reduce floors, there are existing building units at higher floors.\"\n );\n }\n }\n\n session?.startTransaction();\n\n if (building.name !== data.name) {\n await updateByBuildingId(id, { buildingName: data.name }, session);\n }\n\n const result = await _updateById(id, data, session);\n\n await session?.commitTransaction();\n\n return result;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function deleteById(id: string) {\n const building = await getByBuilding(id);\n if (building) {\n throw new BadRequestError(\n \"Cannot delete building with existing room/facility. Please delete room/facility first.\"\n );\n }\n\n try {\n await _deleteById(id);\n return \"Building deleted successfully.\";\n } catch (error) {\n throw error;\n }\n }\n\n return {\n updateById,\n deleteById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n MBuildingUnit,\n schemaUpdateOptions,\n TBuildingUnit,\n} from \"./building.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function useBuildingUnitRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"school.building-units\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: { name: 1, building: 1, level: 1 },\n unique: true,\n name: \"unique_name_index\",\n },\n { key: { school: 1 } },\n { key: { building: 1 } },\n { key: { status: 1 } },\n { key: { createdAt: 1 } },\n {\n key: {\n name: \"text\",\n buildingName: \"text\",\n category: \"text\",\n type: \"text\",\n },\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on building units.\");\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function add(value: TBuildingUnit, session?: ClientSession) {\n try {\n value = MBuildingUnit(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to create building unit.\");\n }\n }\n }\n\n type TUpdateOptions = {\n name?: string;\n building?: string;\n level?: number;\n category?: string;\n type?: string;\n seating_capacity?: number;\n standing_capacity?: number;\n area?: number;\n };\n\n async function updateById(\n _id: string | ObjectId,\n value: TUpdateOptions,\n session?: ClientSession\n ) {\n const { error } = schemaUpdateOptions.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to create building unit.\");\n }\n }\n }\n\n async function updateByBuildingId(\n building: string | ObjectId,\n value: Partial<Pick<TBuildingUnit, \"buildingName\">>,\n session?: ClientSession\n ) {\n const { error } = schemaUpdateOptions.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n building = new ObjectId(building);\n } catch (error) {\n throw new BadRequestError(\"Invalid building ID.\");\n }\n\n try {\n const res = await collection.updateMany(\n { building },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to update building unit.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n school = \"\",\n building = \"\",\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n deletedAt: { $in: [\"\", null] },\n status: { $in: [status, \"\", null] },\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n if (school) {\n try {\n query.school = new ObjectId(school);\n } catch (error) {\n throw new BadRequestError(\"Invalid school ID.\");\n }\n }\n\n if (building) {\n try {\n query.building = new ObjectId(building);\n } catch (error) {\n throw new BadRequestError(\"Invalid building ID.\");\n }\n }\n\n // Create cache key only with provided parameters\n const cacheParams: Record<string, any> = {\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n if (search) cacheParams.search = search;\n if (school) cacheParams.school = school;\n if (building) cacheParams.building = building;\n if (status !== \"active\") cacheParams.status = status;\n\n const cacheKey = makeCacheKey(namespace_collection, cacheParams);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll building units: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll building units: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll building units: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll building units: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TBuildingUnit>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById building unit: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TBuildingUnit>({\n _id,\n deletedAt: { $in: [\"\", null] },\n });\n if (!result) {\n throw new BadRequestError(\"Building unit not found.\");\n }\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for building unit by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for building unit by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get building unit.\");\n }\n }\n }\n\n async function getByBuildingLevel(\n building: string | ObjectId,\n level: number\n ) {\n try {\n building = new ObjectId(building);\n } catch (error) {\n throw new BadRequestError(\"Invalid building ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n building: String(building),\n level,\n });\n\n try {\n const cached = await getCache<TBuildingUnit>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById building unit: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TBuildingUnit>({\n building,\n level,\n status: \"active\",\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for building unit by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for building unit by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get building unit.\");\n }\n }\n }\n\n async function getByBuilding(building: string | ObjectId) {\n try {\n building = new ObjectId(building);\n } catch (error) {\n throw new BadRequestError(\"Invalid building ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n building: String(building),\n });\n\n try {\n const cached = await getCache<TBuildingUnit>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById building unit: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TBuildingUnit>({\n building,\n status: \"active\",\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for building unit by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for building unit by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get building unit.\");\n }\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date() } },\n { session }\n );\n delCachedData();\n return \"Room/Facility deleted successfully.\";\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to deleted room/facility.\");\n }\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n getByBuildingLevel,\n updateById,\n getByBuilding,\n deleteById,\n updateByBuildingId,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { useBuildingRepo } from \"./building.repository\";\nimport { useBuildingService } from \"./building.service\";\n\nexport function useBuildingController() {\n const { getAll: _getAll, getById: _getById, add: _add } = useBuildingRepo();\n\n const { updateById: _updateById, deleteById: _deleteById } =\n useBuildingService();\n\n async function createBuilding(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const value = req.body;\n\n const validation = Joi.object({\n name: Joi.string().required(),\n school: Joi.string().hex().required(),\n levels: Joi.number().integer().min(1).required(),\n serial: Joi.string().optional().allow(\"\", null),\n status: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(value);\n\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 _add(value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateById(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n const id = req.params.id ?? \"\";\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n value: Joi.object({\n name: Joi.string().required(),\n serial: Joi.string().optional().allow(\"\", null),\n levels: Joi.number().integer().min(1).required(),\n }),\n });\n\n const { error } = validation.validate({ id, value });\n\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 _updateById(id, value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\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 school: Joi.string().hex().optional().allow(\"\", null),\n status: Joi.string().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 status = (req.query.status as string) ?? \"active\";\n const school = (req.query.school 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 status,\n school,\n search,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const building = await _getById(id);\n res.json({\n message: \"Successfully retrieved building.\",\n data: { building },\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(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\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 createBuilding,\n getAll,\n getById,\n updateById,\n deleteById,\n };\n}\n","import { useAtlas } from \"@goweekdays/utils\";\nimport { TBuildingUnit } from \"./building.model\";\nimport { useBuildingUnitRepo } from \"./building-unit.repository\";\n\nexport function useBuildingUnitService() {\n const { add: _add } = useBuildingUnitRepo();\n\n async function add(value: { building: TBuildingUnit; qty: number }) {\n const session = useAtlas.getClient()?.startSession();\n if (!session) {\n throw new Error(\"Unable to start session for building unit service.\");\n }\n\n try {\n await session.startTransaction();\n for (let index = 0; index < value.qty; index++) {\n await _add(\n { ...value.building, name: `${value.building.name} ${index + 1}` },\n session\n );\n }\n\n await session.commitTransaction();\n return \"Building unit added successfully.\";\n } catch (error) {\n await session.abortTransaction();\n throw error;\n } finally {\n session.endSession();\n }\n }\n\n return {\n add,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { useBuildingUnitRepo } from \"./building-unit.repository\";\nimport { useBuildingUnitService } from \"./building-unit.service\";\nimport { schemaUpdateOptions } from \"./building.model\";\n\nexport function useBuildingUnitController() {\n const {\n getAll: _getAll,\n getById: _getById,\n updateById: _updateById,\n deleteById: _deleteById,\n } = useBuildingUnitRepo();\n\n const { add: _add } = useBuildingUnitService();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const data = req.body;\n\n const validation = Joi.object({\n building: Joi.object({\n school: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n building: Joi.string().hex().required(),\n buildingName: Joi.string().optional().allow(\"\", null),\n level: Joi.number().integer().min(1).required(),\n category: Joi.string().required(),\n type: Joi.string().required(),\n seating_capacity: Joi.number().integer().min(0).required(),\n standing_capacity: Joi.number().integer().min(0).required(),\n description: Joi.string().optional().allow(\"\", null),\n unit_of_measurement: Joi.string().valid(\"sqm\").required(),\n area: Joi.number().positive().required(),\n status: Joi.string().optional().allow(\"\", null),\n }),\n qty: Joi.number().integer().min(1).max(20).optional().default(1),\n });\n\n const { error } = validation.validate(data);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const buildingUnit = await _add(data);\n res.json({\n message: \"Building unit added successfully.\",\n data: { buildingUnit },\n });\n } catch (error) {\n next(error);\n }\n }\n\n async function updateById(req: Request, res: Response, next: NextFunction) {\n const data = req.body;\n const id = req.params.id ?? \"\";\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n value: schemaUpdateOptions,\n });\n\n const { error } = validation.validate({ id, value: data });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const buildingUnit = await _updateById(id, data);\n res.json({\n message: \"Building unit updated successfully.\",\n data: { buildingUnit },\n });\n } catch (error) {\n next(error);\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 school: Joi.string().hex().optional().allow(\"\", null),\n building: Joi.string().hex().optional().allow(\"\", null),\n status: Joi.string().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 status = (req.query.status as string) ?? \"active\";\n const school = (req.query.school as string) ?? \"\";\n const building = (req.query.building 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 status,\n school,\n search,\n building,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const buildingUnit = await _getById(id);\n res.json({\n message: \"Successfully retrieved building unit.\",\n data: { buildingUnit },\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(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\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 add,\n getAll,\n getById,\n updateById,\n deleteById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport { ObjectId, Db, Collection } from \"mongodb\";\nimport { z } from \"zod\";\n\n// Counter Schema\nconst TCounter = z.object({\n _id: z\n .union([\n z.string().length(24, \"Invalid ObjectId hex string\"),\n z.instanceof(ObjectId),\n ])\n .transform((val) => (typeof val === \"string\" ? new ObjectId(val) : val))\n .optional(),\n count: z.number().int().min(0).default(0),\n type: z.string(),\n createdAt: z\n .date()\n .optional()\n .default(() => new Date()),\n updatedAt: z.date().optional(),\n deletedAt: z.date().optional(),\n});\nexport type TCounter = z.infer<typeof TCounter>;\n\n// Counter Model Composable\nexport function useCounterModel(db: Db) {\n const collection: Collection<TCounter> = db.collection<TCounter>(\"counters\");\n\n function createCounter(value: Pick<TCounter, \"type\">) {\n try {\n return TCounter.parse(value);\n } catch (error: any) {\n throw new BadRequestError(error.issues[0].message);\n }\n }\n\n function validateCounter(data: unknown) {\n return TCounter.safeParse(data);\n }\n\n return {\n createCounter,\n validateCounter,\n collection,\n };\n}\n","import { useAtlas, useCache, makeCacheKey, logger } from \"@goweekdays/utils\";\nimport { useCounterModel } from \"./counter.model\";\nimport { ClientSession } from \"mongodb\";\n\nexport function useCounterRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"counters\";\n const { collection, createCounter } = useCounterModel(db);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: { type: 1 },\n },\n {\n key: { type: 1 },\n unique: true,\n name: \"unique_type\",\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index.\");\n }\n }\n\n async function add(type: string) {\n try {\n const value = createCounter({ type });\n await collection.insertOne(value);\n delCachedData();\n } catch (error) {\n throw new Error(\"Failed to add counter.\");\n }\n }\n\n async function incrementByType(type: string, session?: ClientSession) {\n try {\n const res = await collection.updateOne(\n { type },\n { $inc: { count: 1 } },\n { session }\n );\n delCachedData();\n } catch (error) {\n throw new Error(`Failed to increment ${type} counter.`);\n }\n }\n\n async function getByType(type: string) {\n const cacheKey = makeCacheKey(namespace_collection, { type });\n\n try {\n // Check cache first\n const cached = await getCache<any>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByType counter: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne({ type });\n\n if (data) {\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for counter by type: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for counter by type: ${err.message}`,\n });\n });\n }\n\n return data;\n } catch (error) {\n throw new Error(\"Failed to get counter.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getByType,\n incrementByType,\n };\n}\n","import { TFile } from \"./file.model\";\nimport { useFileRepo } from \"./file.repository\";\nimport { logger, useS3, useAtlas } from \"@goweekdays/utils\";\nimport {\n SPACES_ACCESS_KEY,\n SPACES_BUCKET,\n SPACES_ENDPOINT,\n SPACES_REGION,\n SPACES_SECRET_KEY,\n} from \"../../config\";\nimport cron from \"node-cron\";\nimport * as fs from \"fs\";\nexport function useFileService() {\n const {\n createFile: _createFile,\n deleteFileById,\n getAllDraftedFiles,\n } = useFileRepo();\n\n const s3 = new useS3({\n accessKeyId: SPACES_ACCESS_KEY,\n secretAccessKey: SPACES_SECRET_KEY,\n endpoint: SPACES_ENDPOINT,\n region: SPACES_REGION,\n bucket: SPACES_BUCKET,\n forcePathStyle: true,\n });\n\n async function createFile(value: Express.Multer.File) {\n const session = useAtlas.getClient()?.startSession();\n\n session?.startTransaction();\n\n const file: TFile = {\n name: value.originalname,\n createdAt: new Date().toISOString(),\n };\n\n try {\n const id = await _createFile(file, session);\n\n // Read file from disk instead of buffer\n const fileBuffer =\n value.buffer || (await fs.promises.readFile(value.path));\n\n await s3.uploadObject({\n key: id,\n body: fileBuffer,\n contentType: value.mimetype,\n });\n\n await session?.commitTransaction();\n\n // Clean up temporary file\n if (value.path) {\n try {\n await fs.promises.unlink(value.path);\n } catch (cleanupError) {\n console.error(\n `Failed to cleanup temporary file ${value.path}:`,\n cleanupError\n );\n }\n }\n\n return id;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function deleteFile(id: string) {\n const session = useAtlas.getClient()?.startSession();\n\n session?.startTransaction();\n\n try {\n await deleteFileById(id, session);\n await s3.deleteObject(id);\n await session?.commitTransaction();\n\n return \"File deleted successfully\";\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n function deleteDraft() {\n cron.schedule(\"0 0 * * *\", async () => {\n const files = await getAllDraftedFiles();\n for (let index = 0; index < files.length; index++) {\n const file = files[index];\n try {\n await deleteFile(file._id.toString());\n await logger.log({\n level: \"info\",\n message: \"Successfully deleted draft files.\",\n });\n } catch (error) {\n logger.log({\n level: \"info\",\n message: \"Successfully deleted draft files.\",\n });\n return;\n }\n }\n });\n }\n\n return {\n createFile,\n deleteFile,\n deleteDraft,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { useFileService } from \"./file.service\";\nimport {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport Joi from \"joi\";\n\nexport function useFileController() {\n const { createFile, deleteFile: _deleteFile } = useFileService();\n async function upload(req: Request, res: Response, next: NextFunction) {\n if (!req.file) {\n res.status(400).send(\"File is required!\");\n return;\n }\n\n try {\n const id = await createFile(req.file);\n res.json({ message: \"Successfully uploaded file\", id });\n return;\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(error));\n }\n }\n }\n\n async function deleteFile(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id as string;\n\n const validation = Joi.string().required();\n\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const message = await _deleteFile(id);\n res.json({ message });\n return;\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(error));\n }\n }\n }\n\n return {\n upload,\n deleteFile,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TPromo = {\n _id?: ObjectId;\n code: string;\n description?: string;\n type: \"flat\" | \"fixed\" | \"tiered\";\n flatRate?: number; // regardless of seats\n fixedRate?: number; // per seat\n tiers?: Array<{\n minSeats: number;\n maxSeats: number;\n rate: number;\n }>;\n currency: string;\n startDate: Date | string;\n endDate?: Date | string;\n assignedTo?: string | ObjectId; // org id\n status: \"active\" | \"inactive\" | \"expired\";\n assignedAt?: Date | string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n};\n\nexport const schemaPromo = Joi.object({\n code: Joi.string().min(3).max(50).required(),\n description: Joi.string().max(255).optional().allow(\"\", null),\n type: Joi.string().valid(\"flat\", \"fixed\", \"tiered\").required(),\n flatRate: Joi.number()\n .positive()\n .when(\"type\", {\n is: \"flat\",\n then: Joi.required(),\n otherwise: Joi.forbidden(),\n })\n .optional()\n .allow(null, 0),\n fixedRate: Joi.number()\n .positive()\n .when(\"type\", {\n is: \"fixed\",\n then: Joi.required(),\n otherwise: Joi.forbidden(),\n })\n .optional()\n .allow(null, 0),\n tiers: Joi.array()\n .items(\n Joi.object({\n minSeats: Joi.number().integer().min(1).required(),\n maxSeats: Joi.number().integer().min(Joi.ref(\"minSeats\")).required(),\n rate: Joi.number().positive().required(),\n })\n )\n .when(\"type\", {\n is: \"tiered\",\n then: Joi.required(),\n otherwise: Joi.forbidden(),\n }),\n currency: Joi.string().length(3).required(),\n startDate: Joi.date().required(),\n endDate: Joi.date().greater(Joi.ref(\"startDate\")).optional().allow(null, \"\"),\n});\n\nexport function modelPromo(data: TPromo): TPromo {\n const { error } = schemaPromo.validate(data);\n\n if (error) {\n throw new Error(`Invalid promo data: ${error.message}`);\n }\n\n return {\n _id: data._id,\n code: data.code,\n description: data.description ?? \"\",\n type: data.type,\n flatRate: data.flatRate ?? 0,\n fixedRate: data.fixedRate ?? 0,\n tiers: data.tiers ?? [],\n currency: data.currency,\n startDate: data.startDate ?? new Date(),\n endDate: data.endDate ?? \"\",\n assignedTo: data.assignedTo ?? \"\",\n status: data.status ?? \"active\",\n assignedAt: data.assignedAt ?? \"\",\n createdAt: data.createdAt ?? new Date(),\n updatedAt: data.updatedAt ?? \"\",\n deletedAt: data.deletedAt ?? \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { modelPromo, TPromo } from \"./promo.model\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport function usePromoRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"users\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: {\n code: \"text\",\n },\n name: \"code_text_index\",\n },\n {\n key: { code: 1, status: 1 },\n unique: true,\n partialFilterExpression: { status: \"active\" },\n name: \"unique_active_code_index\",\n },\n ]);\n } catch (error) {}\n }\n\n async function add(value: TPromo) {\n try {\n value = modelPromo(value);\n await collection.insertOne(value);\n delCachedData();\n return \"Successfully added promo.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to add promo.\");\n }\n }\n\n async function getAll({\n page = 1,\n limit = 10,\n search = \"\",\n status = \"active\",\n } = {}) {\n page = page < 1 ? page - 1 : page;\n\n const query: Record<string, any> = { status };\n const cacheKeyOptions: Record<string, any> = {\n page,\n limit,\n search,\n status,\n tag: \"getAll\",\n };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n try {\n const cachedData = await getCache<TPaginate<TPromo>>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data: TPaginate<TPromo> = paginate(items, page, limit, length);\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll promo: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll promo: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get promos.\");\n }\n }\n\n async function getByCode(code: string) {\n const { error } = Joi.string().min(3).max(50).required().validate(code);\n if (error) {\n throw new Error(`Invalid promo code: ${error.message}`);\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n code,\n tag: \"getByCode\",\n });\n const cachedData = await getCache<TPromo>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TPromo>({\n code,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getByCode promo: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getByCode promo: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get promo.\");\n }\n }\n\n async function getById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid promo ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid promo ID.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: String(_id),\n tag: \"getById\",\n });\n const cachedData = await getCache<TPromo>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TPromo>({\n _id,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getById promo: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getById promo: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get promo.\");\n }\n }\n\n async function deleteById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid promo ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid promo ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\" } }\n );\n\n if (result.modifiedCount === 0) {\n throw new InternalServerError(\"Failed to delete promo.\");\n }\n\n delCachedData();\n return \"Successfully deleted promo.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to delete promo.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getByCode,\n getById,\n deleteById,\n };\n}\n","import { AppError, BadRequestError } from \"@goweekdays/utils\";\nimport { Octokit } from \"@octokit/rest\";\nimport _sodium from \"libsodium-wrappers\";\n\nexport function useGitHubService() {\n // Helper: parse repo URL\n function parseRepoUrl(url: string) {\n const match = url.match(/github\\.com[:\\/]([^\\/]+)\\/(.+)\\.git$/);\n if (!match) throw new Error(\"Invalid GitHub repo URL\");\n return { owner: match[1], repo: match[2] };\n }\n\n // Helper: check admin permissions\n async function checkAdminPermission(\n owner: string,\n repo: string,\n octokit: Octokit\n ) {\n try {\n const { data: repoData } = await octokit.repos.get({ owner, repo });\n if (!repoData.permissions?.admin) {\n throw new BadRequestError(\n \"You do not have admin access to this repository.\"\n );\n }\n } catch (error: any) {\n if (error.status === 404) {\n throw new BadRequestError(\n \"Repository not found or you don't have access to it.\"\n );\n } else if (error.status === 401) {\n throw new BadRequestError(\n \"Invalid GitHub token or insufficient permissions.\"\n );\n } else if (error.message.includes(\"admin access\")) {\n throw error; // Re-throw our custom admin access error\n } else {\n throw new BadRequestError(\n `Failed to check repository permissions: ${error.message}`\n );\n }\n }\n }\n\n // Set environment variables or secrets\n async function setVariables(params: {\n githubToken: string;\n repoUrl: string;\n environment: string;\n type: \"env\" | \"secret\";\n keyValues: string; // multiple lines: KEY=value\n }) {\n try {\n const { githubToken, repoUrl, environment, type, keyValues } = params;\n\n // Create Octokit instance with the provided token\n const octokit = new Octokit({ auth: githubToken });\n const { owner, repo } = parseRepoUrl(repoUrl);\n\n // Check admin permission first\n await checkAdminPermission(owner, repo, octokit);\n\n // Split by various whitespace characters (newlines, spaces, tabs) and filter out empty entries\n const lines = keyValues\n .split(/[\\n\\r\\s\\t]+/)\n .map((l) => l.trim())\n .filter(Boolean);\n\n for (const line of lines) {\n const equalIndex = line.indexOf(\"=\");\n if (equalIndex === -1) continue; // Skip lines without =\n\n const key = line.substring(0, equalIndex).trim();\n const value = line.substring(equalIndex + 1).trim();\n if (!key || !value) continue;\n\n if (type === \"secret\") {\n // Get environment public key\n const { data: publicKeyRes } =\n await octokit.actions.getEnvironmentPublicKey({\n owner,\n repo,\n environment_name: environment,\n });\n\n try {\n // Ensure libsodium is ready\n await _sodium.ready;\n const sodium = _sodium;\n\n // Convert GitHub's base64 public key to Uint8Array\n const publicKeyBase64 = publicKeyRes.key;\n if (!publicKeyBase64) {\n throw new Error(\"No public key received from GitHub\");\n }\n\n // Use Buffer for more reliable base64 decoding\n const keyBytes = new Uint8Array(\n Buffer.from(publicKeyBase64, \"base64\")\n );\n const valueBytes = new Uint8Array(Buffer.from(value, \"utf8\"));\n\n // Encrypt using libsodium sealed box\n const encryptedBytes = sodium.crypto_box_seal(valueBytes, keyBytes);\n const encryptedValue =\n Buffer.from(encryptedBytes).toString(\"base64\");\n\n await octokit.actions.createOrUpdateEnvironmentSecret({\n owner,\n repo,\n environment_name: environment,\n secret_name: key,\n encrypted_value: encryptedValue,\n key_id: publicKeyRes.key_id,\n });\n } catch (encryptionError: any) {\n throw new BadRequestError(\n `Failed to encrypt secret '${key}': ${encryptionError.message}`\n );\n }\n } else if (type === \"env\") {\n // Create or update environment variable (plain)\n try {\n // Try to update first (if variable exists)\n await octokit.actions.updateEnvironmentVariable({\n owner,\n repo,\n environment_name: environment,\n name: key,\n value,\n });\n } catch (updateError: any) {\n if (updateError.status === 404) {\n // Variable doesn't exist, create it\n await octokit.actions.createEnvironmentVariable({\n owner,\n repo,\n environment_name: environment,\n name: key,\n value,\n });\n } else {\n // Re-throw other errors\n throw updateError;\n }\n }\n }\n }\n\n return `Successfully set ${lines.length} ${type} variables/secrets in environment '${environment}'`;\n } catch (error: any) {\n if (error instanceof AppError) throw error;\n\n // Handle specific GitHub API errors\n if (error.status === 422) {\n throw new BadRequestError(\n `GitHub API validation error: ${error.message}`\n );\n } else if (error.status === 404) {\n throw new BadRequestError(\"Environment or repository not found.\");\n } else if (error.status === 403) {\n throw new BadRequestError(\n \"Forbidden: Insufficient permissions or rate limit exceeded.\"\n );\n } else if (\n error.message.includes(\"admin access\") ||\n error.message.includes(\"permissions\")\n ) {\n throw error; // Re-throw permission-related errors as-is\n } else {\n throw new BadRequestError(\n `Failed to set GitHub variables: ${error.message}`\n );\n }\n }\n }\n\n return {\n setVariables,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useGitHubService } from \"./github.service\";\nimport {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n} from \"@goweekdays/utils\";\nimport { usePaypalService } from \"./paypal.service\";\nimport { PAYPAL_WEBHOOK_ID } from \"../../config\";\nimport { useOrgService } from \"../organization\";\n\nexport function useUtilController() {\n async function healthCheck(req: Request, res: Response, next: NextFunction) {\n try {\n res.status(200).json({\n success: true,\n message: \"Util service is healthy\",\n timestamp: new Date().toISOString(),\n data: {\n availableEndpoints: [\n \"POST /github/variables - Set GitHub environment variables or secrets\",\n ],\n keyValueFormat: \"KEY=value pairs separated by semicolons\",\n },\n });\n } catch (error: any) {\n logger.error(\"Health check failed\", { error: error.message });\n next(new InternalServerError(\"Health check failed\"));\n }\n }\n\n async function setGitHubVariables(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n const { githubToken, repoUrl, environment, type, keyValues } = req.body;\n\n // Validation schema\n const validation = Joi.object({\n githubToken: Joi.string().required().messages({\n \"string.empty\": \"GitHub token is required\",\n \"any.required\": \"GitHub token is required\",\n }),\n repoUrl: Joi.string().uri().required().messages({\n \"string.empty\": \"Repository URL is required\",\n \"string.uri\": \"Repository URL must be a valid URL\",\n \"any.required\": \"Repository URL is required\",\n }),\n environment: Joi.string().required().messages({\n \"string.empty\": \"Environment name is required\",\n \"any.required\": \"Environment name is required\",\n }),\n type: Joi.string().valid(\"env\", \"secret\").required().messages({\n \"any.only\": 'Type must be either \"env\" or \"secret\"',\n \"any.required\": \"Type is required\",\n }),\n keyValues: Joi.string().required().messages({\n \"string.empty\": \"Key-value pairs are required\",\n \"any.required\": \"Key-value pairs are required\",\n }),\n });\n\n const { error } = validation.validate({\n githubToken,\n repoUrl,\n environment,\n type,\n keyValues,\n });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n // Validate GitHub repo URL format\n const repoUrlPattern = /github\\.com[:\\/]([^\\/]+)\\/(.+)\\.git$/;\n if (!repoUrlPattern.test(repoUrl)) {\n next(\n new BadRequestError(\n \"Invalid GitHub repository URL format. Expected format: https://github.com/owner/repo.git\"\n )\n );\n return;\n }\n\n // Validate key-value pairs format (support semicolons as separators)\n const lines = keyValues\n .split(\";\")\n .map((l: string) => l.trim())\n .filter(Boolean);\n const invalidLines = lines.filter(\n (line: string) => !line.includes(\"=\") || line.indexOf(\"=\") === -1\n );\n if (invalidLines.length > 0) {\n next(\n new BadRequestError(\n \"Invalid key-value format. Each pair should be in format: KEY=value. Pairs should be separated by semicolons.\"\n )\n );\n return;\n }\n\n const githubService = useGitHubService();\n const result = await githubService.setVariables({\n githubToken,\n repoUrl,\n environment,\n type: type as \"env\" | \"secret\",\n keyValues,\n });\n\n logger.info(`GitHub variables set successfully`, {\n repoUrl,\n environment,\n type,\n count: lines.length,\n });\n\n res.status(200).json({\n success: true,\n message: result,\n data: {\n repoUrl,\n environment,\n type,\n variablesSet: lines.length,\n },\n });\n } catch (error: any) {\n logger.error(\"Failed to set GitHub variables\", {\n error: error.message,\n stack: error.stack,\n });\n\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(\n `Failed to set GitHub variables: ${error.message}`\n )\n );\n }\n }\n }\n\n const { verifySignature, captureOrder } = usePaypalService();\n\n const { addWithVerification } = useOrgService();\n\n async function paypalWebhook(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n const isSignatureValid = await verifySignature(\n req.body,\n req.headers as any,\n PAYPAL_WEBHOOK_ID\n );\n\n if (isSignatureValid) {\n const payload = JSON.parse(req.body);\n const eventType = payload.event_type;\n const resource = payload.resource;\n\n switch (eventType) {\n case \"CHECKOUT.ORDER.APPROVED\": {\n const orderId = resource.id;\n await captureOrder(orderId);\n\n break;\n }\n case \"PAYMENT.CAPTURE.COMPLETED\": {\n const customId =\n resource?.custom_id || resource?.purchase_units?.[0]?.custom_id;\n\n if (!customId) {\n throw new Error(\"Missing PayPal customId\");\n }\n\n await addWithVerification(customId);\n\n break;\n }\n default:\n break;\n }\n } else {\n next(new BadRequestError(\"Invalid PayPal webhook signature.\"));\n return;\n }\n\n // Return a 200 response to mark successful webhook delivery\n res.sendStatus(200);\n return;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `${error}`,\n });\n next(new InternalServerError(`PayPal webhook error: ${error.message}`));\n }\n }\n\n return {\n healthCheck,\n setGitHubVariables,\n paypalWebhook,\n };\n}\n","import Joi from \"joi\";\n\nexport const transactionSchema = Joi.object({\n _id: Joi.string().hex().optional().allow(\"\", null),\n payment: Joi.string().required(),\n user: Joi.string().hex().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n type: Joi.string().required(),\n amount: Joi.number().positive().min(0).required(),\n currency: Joi.string().required(),\n description: Joi.string().optional().allow(\"\", null),\n metadata: Joi.object({\n subscriptionId: Joi.string().hex().optional().allow(\"\", null),\n cycle: Joi.number().optional().allow(\"\", null),\n seats: Joi.number().optional().allow(\"\", null),\n promoCode: Joi.string().optional().allow(\"\", null),\n })\n .optional()\n .allow(\"\", null),\n status: Joi.string().optional().allow(\"\", null),\n createdAt: Joi.string().optional().allow(\"\", null),\n updatedAt: Joi.string().optional().allow(\"\", null),\n deletedAt: Joi.string().optional().allow(\"\", null),\n});\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TJobPost = {\n _id?: ObjectId;\n org: ObjectId | string;\n title: string;\n setup: string;\n location: string;\n type: string;\n description: string;\n status?: string;\n createdAt?: Date;\n updatedAt?: Date;\n deletedAt?: Date;\n};\n\nexport const schemaJobPost = Joi.object({\n _id: Joi.string().hex().optional(),\n org: Joi.string().hex().optional(),\n title: Joi.string().trim().required(),\n setup: Joi.string().trim().required(),\n location: Joi.string().trim().required(),\n type: Joi.string().trim().required(),\n description: Joi.string().trim().required(),\n status: Joi.string().trim().required(),\n createdAt: Joi.date().optional(),\n updatedAt: Joi.date().optional(),\n deletedAt: Joi.date().optional(),\n});\n\nexport function modelJobPost(value: TJobPost): TJobPost {\n const { error } = schemaJobPost.validate(value);\n\n if (error) {\n throw new BadRequestError(`Invalid job post: ${error.message}`);\n }\n if (!value._id) {\n try {\n value._id = new ObjectId();\n } catch (error) {\n throw new BadRequestError(\"Invalid job post ID.\");\n }\n }\n\n try {\n value.org = new ObjectId(value.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid Org ID\");\n }\n\n return {\n _id: value._id,\n org: value.org,\n title: value.title,\n setup: value.setup,\n location: value.location,\n type: value.type,\n description: value.description,\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt,\n deletedAt: value.deletedAt,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@goweekdays/utils\";\nimport { schemaJobPost } from \"./job.post.model\";\nimport { useJobPostRepo } from \"./job.post.repository\";\nimport { useJobPostService } from \"./job.post.service\";\n\nexport function useJobPostController() {\n const { add: _add } = useJobPostRepo();\n const { deleteById: _deleteById } = useJobPostService();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaJobPost.validate(value);\n\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 _add(value);\n res.json({ message: \"Successfully created job post.\", data: { result } });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n if (!id) {\n next(new BadRequestError(\"Job Post ID is required.\"));\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 add,\n deleteById,\n };\n}\n","import { BadRequestError, useAtlas, useCache, logger, InternalServerError } from \"@goweekdays/utils\";\nimport { TJobPost, modelJobPost } from \"./job.post.model\";\nimport { ClientSession, ObjectId, } from \"mongodb\";\n\nexport function useJobPostRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new BadRequestError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"job.posts\";\n const collection = db.collection(namespace_collection);\n const { delNamespace } = useCache(namespace_collection);\n\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { title: 1 } },\n { key: { setup: 1 } },\n { key: { location: 1 } },\n { key: { type: 1 } },\n {\n key: {\n title: \"text\",\n setup: \"text\",\n location: \"text\",\n type: \"text\",\n },\n name: \"jobpost_text_search\",\n },\n ]);\n return \"Successfully created job post indexes.\";\n } catch (error: any) {\n throw new BadRequestError(\"Failed to create job post indexes.\");\n }\n }\n\n async function add(value: TJobPost, session?: ClientSession) {\n try {\n value = modelJobPost(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n throw new BadRequestError(`Failed to create job post: ${error.message}`);\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n {\n $set: {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n },\n },\n { session }\n );\n delCachedData();\n return \"Successfully deleted job post.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete job post.\");\n }\n}\n\n return {\n createIndexes,\n add,\n deleteById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { useJobPostRepo } from \"./job.post.repository\";\nimport Joi from \"joi\";\n\nexport function useJobPostService() {\n const { deleteById: _deleteById } = useJobPostRepo();\n\n async function deleteById(id: string) {\n const { error } = Joi.string().hex().required().validate(id);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n await _deleteById(id);\n return \"Successfully deleted job post.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete job post.\");\n }\n }\n }\n\n return {\n deleteById,\n };\n}"],"mappings":"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","names":["ObjectId","error","ObjectId","BadRequestError","InternalServerError","useCache","crypto","useCache","BadRequestError","InternalServerError","Joi","AppError","BadRequestError","InternalServerError","logger","logger","BadRequestError","NotFoundError","InternalServerError","useAtlas","AppError","BadRequestError","Joi","ObjectId","error","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","paginate","AppError","BadRequestError","InternalServerError","NotFoundError","logger","makeCacheKey","useAtlas","useCache","BadRequestError","InternalServerError","logger","makeCacheKey","useAtlas","useCache","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","BadRequestError","Joi","ObjectId","error","ObjectId","Joi","useAtlas","useCache","logger","BadRequestError","AppError","InternalServerError","makeCacheKey","error","paginate","BadRequestError","InternalServerError","useAtlas","paginate","logger","makeCacheKey","useCache","AppError","BadRequestError","Joi","ObjectId","error","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","AppError","makeCacheKey","paginate","error","BadRequestError","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","Joi","useAtlas","useCache","logger","AppError","BadRequestError","error","makeCacheKey","paginate","InternalServerError","BadRequestError","logger","Joi","BadRequestError","logger","error","Joi","BadRequestError","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","Joi","useAtlas","useCache","logger","AppError","BadRequestError","error","makeCacheKey","paginate","InternalServerError","AppError","BadRequestError","InternalServerError","logger","useAtlas","BadRequestError","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","Joi","useAtlas","useCache","logger","AppError","BadRequestError","makeCacheKey","paginate","InternalServerError","error","logger","useAtlas","useAtlas","logger","BadRequestError","Joi","BadRequestError","error","Joi","useAtlas","logger","modules","BadRequestError","AppError","InternalServerError","BadRequestError","logger","Joi","BadRequestError","logger","error","Joi","BadRequestError","Joi","ObjectId","error","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","Joi","useAtlas","useCache","logger","AppError","BadRequestError","makeCacheKey","paginate","InternalServerError","error","BadRequestError","useAtlas","Joi","BadRequestError","AppError","BadRequestError","InternalServerError","AppError","BadRequestError","InternalServerError","BadRequestError","AppError","InternalServerError","Joi","BadRequestError","BadRequestError","error","Joi","Joi","BadRequestError","error","AppError","InternalServerError","Joi","BadRequestError","error","BadRequestError","Joi","ObjectId","schema","error","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","Joi","ObjectId","useAtlas","InternalServerError","useCache","logger","AppError","makeCacheKey","paginate","error","BadRequestError","Joi","BadRequestError","BadRequestError","useAtlas","AppError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","BadRequestError","Joi","ObjectId","error","ObjectId","useAtlas","InternalServerError","useCache","logger","AppError","makeCacheKey","paginate","BadRequestError","useAtlas","error","Joi","BadRequestError","error","Joi","BadRequestError","Joi","BadRequestError","error","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","Joi","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","paginate","error","AppError","Joi","BadRequestError","Joi","error","crypto","logger","crypto","Joi","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","error","AppError","InternalServerError","BadRequestError","Joi","ObjectId","error","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","Joi","useAtlas","useCache","logger","BadRequestError","AppError","makeCacheKey","paginate","error","InternalServerError","Joi","BadRequestError","Joi","BadRequestError","error","BadRequestError","useAtlas","error","Joi","BadRequestError","Joi","BadRequestError","error","Joi","useAtlas","BadRequestError","AppError","InternalServerError","NotFoundError","makeCacheKey","useCache","logger","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","error","AppError","InternalServerError","Joi","BadRequestError","res","filePath","emailContent","logger","InternalServerError","NotFoundError","useAtlas","verificationId","error","AppError","Joi","Joi","BadRequestError","error","logger","AppError","InternalServerError","BadRequestError","logger","Joi","ObjectId","error","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","useCache","logger","AppError","BadRequestError","makeCacheKey","paginate","InternalServerError","BadRequestError","NotFoundError","useAtlas","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","useCache","logger","AppError","BadRequestError","error","makeCacheKey","paginate","InternalServerError","useAtlas","NotFoundError","BadRequestError","BadRequestError","logger","Joi","Joi","BadRequestError","logger","error","useAtlas","useAtlas","BadRequestError","Joi","Joi","BadRequestError","error","BadRequestError","ObjectId","useAtlas","useCache","makeCacheKey","logger","useAtlas","useCache","logger","makeCacheKey","logger","useS3","useAtlas","useS3","useAtlas","logger","AppError","BadRequestError","InternalServerError","Joi","error","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","Joi","ObjectId","useAtlas","InternalServerError","useCache","logger","makeCacheKey","paginate","error","BadRequestError","AppError","AppError","BadRequestError","Joi","AppError","BadRequestError","InternalServerError","logger","logger","InternalServerError","Joi","BadRequestError","AppError","Joi","BadRequestError","Joi","ObjectId","error","BadRequestError","logger","BadRequestError","useAtlas","useCache","logger","InternalServerError","ObjectId","useAtlas","BadRequestError","useCache","logger","InternalServerError","AppError","BadRequestError","InternalServerError","Joi","BadRequestError","error","AppError","InternalServerError","BadRequestError","logger","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/resources/user/user.repository.ts","../src/resources/user/user.model.ts","../src/resources/auth/auth.service.ts","../node_modules/uuid/dist/esm-node/rng.js","../node_modules/uuid/dist/esm-node/stringify.js","../node_modules/uuid/dist/esm-node/native.js","../node_modules/uuid/dist/esm-node/v4.js","../src/resources/auth/auth.controller.ts","../src/resources/verification/verification.service.ts","../src/resources/verification/verification.model.ts","../src/resources/verification/verification.repository.ts","../src/config.ts","../src/resources/user/user.service.ts","../src/resources/file/file.repository.ts","../src/resources/file/file.model.ts","../src/resources/member/member.repository.ts","../src/resources/member/member.model.ts","../src/resources/role/role.repository.ts","../src/resources/role/role.model.ts","../src/resources/permission/permission.model.ts","../src/resources/permission/permission.repository.ts","../src/resources/permission/permission.service.ts","../src/resources/permission/permission.controller.ts","../src/resources/permission/permission.group.model.ts","../src/resources/permission/permission.group.repository.ts","../src/resources/permission/permission.group.service.ts","../src/resources/app/app.model.ts","../src/resources/app/app.repository.ts","../src/resources/app/app.service.ts","../src/resources/app/app.controller.ts","../src/resources/permission/permission.group.controller.ts","../src/resources/organization/organization.model.ts","../src/resources/organization/organization.repository.ts","../src/resources/organization/organization.service.ts","../src/resources/member/member.controller.ts","../src/resources/member/member.service.ts","../src/resources/role/role.service.ts","../src/resources/role/role.controller.ts","../src/resources/subscription/subscription.model.ts","../src/resources/subscription/subscription.repository.ts","../src/resources/subscription/subscription.controller.ts","../src/resources/subscription/subscription.service.ts","../src/resources/subscription/subscription.transaction.repository.ts","../src/resources/subscription/subscription.transaction.model.ts","../src/resources/ledger/ledger.billing.model.ts","../src/resources/ledger/ledger.billing.repository.ts","../src/resources/ledger/ledger.billing.controller.ts","../src/resources/utils/github.service.ts","../src/resources/utils/util.controller.ts","../src/resources/utils/paypal.service.ts","../src/resources/utils/transaction.schema.ts","../src/resources/plan/plan.model.ts","../src/resources/plan/plan.repository.ts","../src/resources/plan/plan.service.ts","../src/resources/plan/plan.controller.ts","../src/resources/subscription/subscription.transaction.controller.ts","../src/resources/verification/verification.controller.ts","../src/resources/organization/organization.controller.ts","../src/resources/user/user.controller.ts","../src/resources/building/building.model.ts","../src/resources/building/building.repository.ts","../src/resources/building/building.service.ts","../src/resources/building/building-unit.repository.ts","../src/resources/building/building.controller.ts","../src/resources/building/building-unit.service.ts","../src/resources/building/building-unit.controller.ts","../src/resources/counter/counter.model.ts","../src/resources/counter/counter.repository.ts","../src/resources/file/file.service.ts","../src/resources/file/file.controller.ts","../src/resources/promo/promo.model.ts","../src/resources/promo/promo.repository.ts","../src/resources/job-post/job.post.model.ts","../src/resources/job-post/job.post.controller.ts","../src/resources/job-post/job.post.repository.ts","../src/resources/job-post/job.post.service.ts"],"sourcesContent":["import { ClientSession, ObjectId } from \"mongodb\";\nimport { modelUser, TUser } from \"./user.model\";\nimport {\n useAtlas,\n InternalServerError,\n logger,\n BadRequestError,\n paginate,\n useCache,\n makeCacheKey,\n} from \"@goweekdays/utils\";\n\nexport function useUserRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"users\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: {\n firstName: \"text\",\n middleName: \"text\",\n lastName: \"text\",\n email: \"text\",\n },\n },\n { key: { email: 1, deletedAt: 1 }, unique: true },\n ]);\n } catch (error) {}\n }\n\n async function add(value: TUser, session?: ClientSession) {\n try {\n value = modelUser(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({ level: \"error\", message: `${error}` });\n\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Item name already exists\");\n }\n\n throw new InternalServerError(\"Internal server error.\");\n }\n }\n\n async function getUserByEmail(email: string) {\n const cacheKey = makeCacheKey(namespace_collection, { email });\n\n try {\n const cached = await getCache<TUser>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getUserByEmail: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TUser>({ email });\n\n if (result) {\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for user by email: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for user by email: ${err.message}`,\n });\n });\n }\n\n return result;\n } catch (error) {\n throw new Error(\"Failed to get user by email.\");\n }\n }\n\n async function getUserByReferralCode(referralCode: string) {\n const cacheKey = makeCacheKey(namespace_collection, { referralCode });\n\n try {\n const cached = await getCache<TUser>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getUserByReferralCode: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TUser>({ referralCode });\n\n if (result) {\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for user by referral code: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for user by referral code: ${err.message}`,\n });\n });\n }\n\n return result;\n } catch (error) {\n throw new Error(\"Failed to get user by referral code.\");\n }\n }\n\n async function getUserById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new Error(\"Invalid user ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TUser>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getUserById: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TUser>({ _id });\n\n if (result) {\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for user by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for user by id: ${err.message}`,\n });\n });\n }\n\n return result;\n } catch (error) {\n throw new Error(\"Failed to get user by id.\");\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n status = \"active\",\n type = \"\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n if (type) {\n query.type = type;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n search,\n page,\n limit,\n sort: JSON.stringify(sort),\n status,\n type,\n });\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n {\n $project: {\n _id: 1,\n name: {\n $concat: [\"$firstName\", \" \", \"$lastName\"],\n },\n email: 1,\n type: 1,\n status: 1,\n },\n },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function updatePassword(\n { _id, password } = {} as { _id: string | ObjectId; password: string },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new Error(\"Invalid user ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { password } },\n { session }\n );\n delCachedData();\n return result;\n } catch (error) {\n throw new Error(\"Failed to update user password.\");\n }\n }\n\n async function updateName(\n { _id, firstName, lastName } = {} as {\n _id: string | ObjectId;\n firstName?: string;\n lastName?: string;\n },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new Error(\"Invalid user ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { firstName, lastName } },\n { session }\n );\n delCachedData();\n return result;\n } catch (error) {\n throw new Error(\"Failed to update user profile.\");\n }\n }\n\n async function updateBirthday(\n { _id, month, day, year } = {} as {\n _id: string | ObjectId;\n month: string;\n day: number;\n year: number;\n },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new Error(\"Invalid user ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { birthMonth: month, birthDay: day, birthYear: year } },\n { session }\n );\n delCachedData();\n return result;\n } catch (error) {\n throw new Error(\"Failed to update user birthday.\");\n }\n }\n\n async function updateUserFieldById(\n { _id, field, value } = {} as {\n _id: string | ObjectId;\n field: string;\n value: string | ObjectId;\n },\n session?: ClientSession\n ) {\n // Allowed fields to prevent arbitrary updates\n const allowedFields = [\n \"gender\",\n \"email\",\n \"contact\",\n \"profile\",\n \"defaultOrg\",\n \"password\",\n ];\n\n if (!allowedFields.includes(field)) {\n throw new BadRequestError(\n `Field \"${field}\" is not allowed to be updated.`\n );\n }\n\n // Validate ID\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n if (field === \"defaultOrg\") {\n try {\n value = new ObjectId(value);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { [field]: value } },\n { session }\n );\n delCachedData();\n return result;\n } catch (error) {\n throw new BadRequestError(`Failed to update user ${field}.`);\n }\n }\n\n return {\n createIndexes,\n add,\n getUserByEmail,\n getUserById,\n getAll,\n updatePassword,\n updateName,\n updateBirthday,\n updateUserFieldById,\n getUserByReferralCode,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TUser = {\n _id?: ObjectId;\n email: string;\n password: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n defaultOrg?: ObjectId | string;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaUser = Joi.object({\n email: Joi.string().email().required(),\n password: Joi.string().min(8).required(),\n firstName: Joi.string().max(100).required(),\n middleName: Joi.string().max(100).optional().allow(null, \"\"),\n lastName: Joi.string().max(100).required(),\n defaultOrg: Joi.string().optional().allow(null, \"\"),\n});\n\nexport function modelUser(data: TUser) {\n const { error } = schemaUser.validate(data);\n\n if (error) {\n throw new Error(`User model validation error: ${error.message}`);\n }\n\n if (data._id && typeof data._id === \"string\") {\n try {\n data._id = new ObjectId(data._id);\n } catch (error) {\n throw new Error(`Invalid _id format: ${data._id}`);\n }\n }\n\n return {\n _id: data._id,\n email: data.email,\n password: data.password,\n firstName: data.firstName,\n middleName: data.middleName ?? \"\",\n lastName: data.lastName,\n defaultOrg: data.defaultOrg ?? \"\",\n status: data.status ?? \"active\",\n createdAt: data.createdAt ?? new Date(),\n updatedAt: data.updatedAt ?? \"\",\n deletedAt: data.deletedAt ?? \"\",\n };\n}\n","import { useUserRepo } from \"../user/user.repository\";\nimport {\n AppError,\n BadRequestError,\n comparePassword,\n InternalServerError,\n NotFoundError,\n useCache,\n} from \"@goweekdays/utils\";\nimport { TUser } from \"../user/user.model\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport function useAuthService() {\n const { setCache, delCache } = useCache(\"sessions\");\n\n async function login(\n { email, password } = {} as { email: string; password: string }\n ) {\n if (!email) {\n throw new BadRequestError(\"Email is required\");\n }\n\n if (!password) {\n throw new BadRequestError(\"Password is required\");\n }\n\n // fetch user from database\n let _user: TUser | null;\n\n try {\n _user = await useUserRepo().getUserByEmail(email);\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(`${error}`);\n }\n }\n\n if (!_user) {\n throw new NotFoundError(\n \"Invalid user email. Please check your email and try again.\"\n );\n }\n\n if (_user.status === \"suspended\") {\n throw new BadRequestError(\n \"Your account is currently suspended. Please contact support for assistance.\"\n );\n }\n\n // verify password\n const isPasswordValid = await comparePassword(password, _user.password);\n if (!isPasswordValid) {\n throw new BadRequestError(\"Invalid password\");\n }\n\n const sid = uuidv4(); // Generate a unique session ID\n\n const cacheKey = `sid:${sid}`;\n\n // set TTL to 4 hours\n setCache(cacheKey, _user, 14400)\n .then(() => {\n console.log(\"Session ID cached successfully\");\n })\n .catch((error) => {\n console.error(\"Error caching session ID:\", error);\n });\n\n return { sid, user: _user._id?.toString() ?? \"\" };\n }\n\n async function logout(sid: string) {\n try {\n await delCache(`sid:${sid}`);\n return \"Session deleted successfully\";\n } catch (error) {\n throw new InternalServerError(\"Error deleting token\");\n }\n }\n\n return {\n login,\n logout,\n };\n}\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useAuthService } from \"./auth.service\";\nimport {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n} from \"@goweekdays/utils\";\nimport { useUserService } from \"../user/user.service\";\nimport { useVerificationService } from \"../verification/verification.service\";\nimport { DOMAIN } from \"../../config\";\n\nexport function useAuthController() {\n const { signUp: _signUp } = useVerificationService();\n\n async function login(req: Request, res: Response, next: NextFunction) {\n const email = req.body.email as string;\n const password = req.body.password as string;\n\n const validation = Joi.object({\n email: Joi.string().email().required(),\n password: Joi.string().required(),\n });\n\n const { error } = validation.validate({ email, password });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const session = await useAuthService().login({\n email,\n password,\n });\n\n const cookieOptions = {\n domain: DOMAIN,\n secure: true,\n maxAge: 4 * 60 * 60 * 1000,\n };\n\n res\n .cookie(\"sid\", session.sid, cookieOptions)\n .cookie(\"user\", session.user, cookieOptions)\n .json({ message: \"Login successful\" });\n\n return;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `Error during login: ${error.message}`,\n });\n\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(\"An unexpected error occurred\"));\n }\n return;\n }\n }\n\n async function logout(req: Request, res: Response, next: NextFunction) {\n const sid = (req.headers[\"authorization\"] as string) ?? \"\";\n\n if (!sid) {\n next(new BadRequestError(\"Session ID is required\"));\n return;\n }\n\n try {\n await useAuthService().logout(sid);\n res.json({ message: \"Logged out successfully\" });\n } catch (error) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(\"An unexpected error occurred\"));\n }\n }\n }\n\n return {\n login,\n logout,\n };\n}\n","import {\n useMailer,\n compileHandlebar,\n logger,\n getDirectory,\n BadRequestError,\n NotFoundError,\n InternalServerError,\n useAtlas,\n AppError,\n} from \"@goweekdays/utils\";\nimport {\n schemaInviteMember,\n TVerification,\n TVerificationMetadata,\n} from \"./verification.model\";\nimport { useVerificationRepo } from \"./verification.repository\";\nimport {\n APP_MAIN,\n APP_ORG,\n MAILER_EMAIL,\n MAILER_PASSWORD,\n MAILER_TRANSPORT_HOST,\n MAILER_TRANSPORT_PORT,\n MAILER_TRANSPORT_SECURE,\n VERIFICATION_FORGET_PASSWORD_DURATION,\n VERIFICATION_USER_INVITE_DURATION,\n} from \"../../config\";\n\nimport { useUserRepo } from \"../user\";\nimport { useMemberRepo } from \"../member\";\nimport { TOrg, useOrgRepo } from \"../organization\";\nimport { useRoleRepo } from \"../role\";\nimport Joi from \"joi\";\nimport { usePaypalService } from \"../utils/paypal.service\";\nimport { usePlanRepo } from \"../plan\";\n\nexport function useVerificationService() {\n const MailerConfig = {\n host: MAILER_TRANSPORT_HOST,\n port: MAILER_TRANSPORT_PORT,\n secure: MAILER_TRANSPORT_SECURE,\n email: MAILER_EMAIL,\n password: MAILER_PASSWORD,\n };\n\n const mailer = new useMailer(MailerConfig);\n\n const {\n add,\n getById: _getById,\n updateStatusById: _updateStatusById,\n getVerifications: _getVerifications,\n } = useVerificationRepo();\n const { getUserByEmail } = useUserRepo();\n const { add: addMember } = useMemberRepo();\n\n const { getById: getOrgById } = useOrgRepo();\n const { getById: getRoleById } = useRoleRepo();\n\n async function createUserInvite({\n email,\n metadata,\n }: {\n email: string;\n metadata: TVerificationMetadata;\n }) {\n const value: TVerification = {\n type: \"user-invite\",\n email,\n metadata,\n expireAt: new Date(\n new Date().getTime() + 72 * 60 * 60 * 1000\n ).toISOString(), // 72 hours (3 days) from now\n createdAt: new Date().toISOString(),\n };\n\n if (!metadata.app) {\n throw new BadRequestError(\"App metadata is required.\");\n }\n\n try {\n const user = await getUserByEmail(email);\n const dir = __dirname;\n if (user) {\n value.type = \"member-invite\";\n const res = await add(value);\n const filePath = getDirectory(dir, \"./public/handlebars/member-invite\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_USER_INVITE_DURATION,\n link: `${APP_MAIN}/verify/member-invite/${res}`,\n organization_name:\n metadata.app === \"admin\" ? \"Admin\" : metadata.orgName,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"Member Invite\",\n html: emailContent,\n from: \"GoWeekdays\",\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending user invite email: ${error}`,\n });\n });\n\n return res;\n }\n\n const res = await add(value);\n\n const filePath = getDirectory(dir, \"./public/handlebars/user-invite\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_USER_INVITE_DURATION,\n link: `${APP_MAIN}/verify/invitation/${res}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"User Invite\",\n html: emailContent,\n from: \"GoWeekdays\",\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending user invite email: ${error}`,\n });\n });\n\n return res;\n } catch (error) {\n throw error;\n }\n }\n\n async function createForgetPassword(email: string) {\n const value: TVerification = {\n type: \"forget-password\",\n email,\n expireAt: new Date(new Date().getTime() + 10 * 60 * 1000).toISOString(), // 10 minutes from now\n createdAt: new Date().toISOString(),\n };\n\n try {\n const res = await add(value);\n\n const dir = __dirname;\n\n const filePath = getDirectory(dir, \"./public/handlebars/forget-password\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_FORGET_PASSWORD_DURATION,\n link: `${APP_MAIN}/reset-password/${res}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"Forget Password\",\n from: \"GoWeekdays\",\n html: emailContent,\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending forget password email: ${error}`,\n });\n });\n\n return \"Successfully created a link to reset password. Please check your email.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to create forget password link.\");\n }\n }\n\n async function getById(id: string) {\n try {\n const _id = await _getById(id);\n if (!_id) {\n throw new NotFoundError(\"Verification not found.\");\n }\n return _id;\n } catch (error) {\n throw error;\n }\n }\n\n async function getVerifications({\n search = \"\",\n page = 1,\n status = \"\",\n type = \"\",\n email = \"\",\n limit = 10,\n app = \"\",\n } = {}) {\n try {\n return await _getVerifications({\n search,\n page,\n status,\n type,\n limit,\n email,\n app,\n });\n } catch (error) {\n throw error;\n }\n }\n\n function errorByType(type: string, status?: string) {\n if (type === \"user-invite\" && status === \"expired\") {\n throw new BadRequestError(\n \"Invitation has already expired, please contact admin to resend the invitation.\"\n );\n }\n\n if (type === \"user-sign-up\" && status === \"expired\") {\n throw new BadRequestError(\n \"Sign up verification has expired, please sign up again to get a new verification link.\"\n );\n }\n\n if (type === \"user-invite\" && status === \"complete\") {\n throw new BadRequestError(\n \"User already registered, please login to continue.\"\n );\n }\n\n if (type === \"forget-password\" && status === \"complete\") {\n throw new BadRequestError(\n \"Forget password verification has already been used, please request a new one.\"\n );\n }\n\n if (type === \"forget-password\" && status === \"expired\") {\n throw new BadRequestError(\n \"Forget password verification has expired, please request a new one.\"\n );\n }\n\n throw new BadRequestError(\"Invalid verification.\");\n }\n\n async function verify(id: string) {\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\n try {\n const _id = await _getById(id);\n if (!_id) {\n throw new NotFoundError(\"Verification not found.\");\n }\n\n if (_id.status === \"expired\") {\n errorByType(_id.type, \"expired\");\n }\n\n if (_id.status === \"complete\") {\n throw new BadRequestError(\"Verification already completed.\");\n }\n\n if (!_id.expireAt) {\n throw new BadRequestError(\"Expiration date is required.\");\n }\n\n const expiration = new Date(_id.expireAt).getTime();\n const now = new Date().getTime();\n if (now > expiration) {\n await _updateStatusById(id, \"expired\", session);\n\n errorByType(_id.type, \"expired\");\n\n await session?.commitTransaction();\n }\n\n if (_id.type === \"member-invite\") {\n await _updateStatusById(id, \"complete\", session);\n const user = await getUserByEmail(_id.email);\n if (!user) {\n throw new NotFoundError(\"User not found for member invite.\");\n }\n\n if (!_id.metadata?.app) {\n throw new BadRequestError(\n \"App metadata is required for member invite.\"\n );\n }\n\n if (!_id.metadata?.role || !_id.metadata?.roleName) {\n throw new BadRequestError(\n \"Role metadata is required for member invite.\"\n );\n }\n\n await addMember(\n {\n user: user._id?.toString() ?? \"\",\n app: _id.metadata?.app,\n org: String(_id.metadata?.org ?? \"\"),\n orgName: _id.metadata?.orgName ?? \"\",\n role: String(_id.metadata?.role ?? \"\"),\n roleName: _id.metadata?.roleName,\n name: `${user.firstName} ${user.lastName}`,\n },\n session\n );\n\n await session?.commitTransaction();\n\n return \"Member invitation verified successfully.\";\n }\n\n return _id;\n } catch (error) {\n await session?.abortTransaction();\n logger.log({\n level: \"info\",\n message: `Error verifying user invitation: ${error}`,\n });\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function cancelUserInvitation(id: string) {\n try {\n await updateStatusById(id, \"cancelled\");\n } catch (error) {\n throw new InternalServerError(\n `Error cancelling user invitation: ${error}`\n );\n }\n }\n\n async function updateStatusById(_id: string, status: string) {\n try {\n await _updateStatusById(_id, status);\n return \"Successfully updated verification status.\";\n } catch (error) {\n throw error;\n }\n }\n\n async function signUp({\n email,\n metadata,\n }: {\n email: string;\n metadata?: TVerificationMetadata;\n }) {\n try {\n const user = await getUserByEmail(email);\n\n if (user) {\n throw new BadRequestError(\n `Email ${email} is already registered, please login to continue.`\n );\n }\n\n const value: TVerification = {\n type: \"user-sign-up\",\n email,\n metadata,\n expireAt: new Date(new Date().getTime() + 5 * 60 * 1000), // 5mins from now\n };\n\n const res = await add(value);\n\n const dir = __dirname;\n\n const filePath = getDirectory(dir, \"./public/handlebars/sign-up\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: \"5 minutes\",\n link: `${APP_MAIN}/sign-up/${res}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"Sign Up Verification\",\n html: emailContent,\n from: \"GoWeekdays\",\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending user invite email: ${error}`,\n });\n });\n\n return res;\n } catch (error) {\n throw error;\n }\n }\n\n async function inviteMember(value: {\n email: string;\n role: string;\n app: string;\n org?: string;\n }) {\n const { error } = schemaInviteMember.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n const role = await getRoleById(value.role);\n if (!role) {\n throw new NotFoundError(\"Role not found.\");\n }\n\n let org: TOrg | null = null;\n\n if (value.org) {\n org = await getOrgById(String(value.org));\n if (!org) {\n throw new NotFoundError(\"Organization not found.\");\n }\n }\n\n let verificationData = {\n type: \"user-invite\",\n email: value.email,\n metadata: {\n role: value.role,\n roleName: role.name,\n app: value.app,\n org: value.org,\n orgName: org ? org.name : \"\",\n },\n };\n\n try {\n const user = await getUserByEmail(value.email);\n const dir = __dirname;\n if (user) {\n verificationData.type = \"member-invite\";\n const verificationId = await add(verificationData);\n const filePath = getDirectory(dir, \"./public/handlebars/member-invite\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_USER_INVITE_DURATION,\n link: `${APP_MAIN}/verify/member-invite/${verificationId}`,\n organization_name:\n verificationData.metadata.app === \"admin\"\n ? \"Admin\"\n : org\n ? org.name\n : \"\",\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: value.email,\n subject: \"Member Invite\",\n html: emailContent,\n from: \"GoWeekdays\",\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending user invite email: ${error}`,\n });\n });\n\n return verificationId;\n }\n\n const verificationId = await add(verificationData);\n\n const filePath = getDirectory(dir, \"./public/handlebars/user-invite\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_USER_INVITE_DURATION,\n link: `${APP_MAIN}/verify/invitation/${verificationId}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: value.email,\n subject: \"User Invite\",\n html: emailContent,\n from: \"GoWeekdays\",\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending user invite email: ${error}`,\n });\n });\n\n return verificationId;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to invite member.\");\n }\n }\n }\n\n async function cancelInviteMember(id: string) {\n const { error } = Joi.string().hex().required().validate(id);\n if (error) {\n throw new BadRequestError(\"Invalid verification ID.\");\n }\n\n try {\n const invite = await _getById(id);\n if (!invite) {\n throw new NotFoundError(\"Invitation not found.\");\n }\n\n if (invite.status === \"cancelled\") {\n throw new BadRequestError(\"Invitation already cancelled.\");\n }\n\n if (invite.status === \"complete\") {\n throw new BadRequestError(\"Cannot cancel a completed invitation.\");\n }\n\n await _updateStatusById(id, \"cancelled\");\n return \"Successfully cancelled the invitation.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to cancel the invitation.\");\n }\n }\n }\n\n async function forgetPassword(email: string) {\n const { error } = Joi.string().email().required().validate(email);\n if (error) {\n throw new BadRequestError(\"Invalid email address.\");\n }\n\n try {\n const member = await getUserByEmail(email);\n if (!member) {\n throw new NotFoundError(\"User not found.\");\n }\n\n const value: TVerification = {\n type: \"forget-password\",\n email,\n expireAt: new Date(new Date().getTime() + 10 * 60 * 1000).toISOString(), // 10 minutes from now\n };\n\n const res = await add(value);\n\n const dir = __dirname;\n\n const filePath = getDirectory(dir, \"./public/handlebars/forget-password\");\n\n const emailContent = compileHandlebar({\n context: {\n validity: VERIFICATION_FORGET_PASSWORD_DURATION,\n link: `${APP_MAIN}/reset-password/${res}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"Forget Password\",\n from: \"GoWeekdays\",\n html: emailContent,\n })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending forget password email: ${error}`,\n });\n });\n\n return \"Successfully created a link to reset password. Please check your email.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\n \"Failed to process forget password request.\"\n );\n }\n }\n }\n\n const { addOrder: addPaypalOrder } = usePaypalService();\n const { getByEmail: getOrgByEmail, getByName: getOrgByName } = useOrgRepo();\n\n async function orgSetupFee(\n value: TOrg & {\n seats: number;\n }\n ) {\n const session = useAtlas.getClient()?.startSession();\n if (!session) {\n throw new BadRequestError(\"Unable to start database session.\");\n }\n\n try {\n session.startTransaction();\n\n const orgExistingByName = await getOrgByName(value.name);\n if (orgExistingByName) {\n throw new BadRequestError(`Name ${value.name} is already taken.`);\n }\n\n const orgExistingByEmail = await getOrgByEmail(value.email);\n if (orgExistingByEmail) {\n throw new BadRequestError(`Email ${value.email} is already taken.`);\n }\n\n const amount = 100;\n\n const verificationId = await add(\n {\n type: \"org-setup-fee\",\n email: value.email,\n metadata: {\n seats: value.seats,\n contact: value.contact,\n orgName: value.name,\n createdBy: value.createdBy,\n amount,\n },\n },\n session\n );\n\n const order = await addPaypalOrder({\n amount,\n currency: \"PHP\",\n customId: String(verificationId),\n returnUrl: `${APP_ORG}/organizations/success`,\n cancelUrl: `${APP_ORG}/organizations/cancel`,\n action: \"pay\",\n });\n\n // Commit transaction\n await session?.commitTransaction();\n\n const paypalOrderLink = JSON.parse(order.body.toString()).links.find(\n (link: any) => link.rel === \"approve\"\n );\n\n return {\n paypalOrderLink: paypalOrderLink ? paypalOrderLink.href : \"\",\n };\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\n \"Failed to process organization setup fee.\"\n );\n }\n }\n\n return {\n createForgetPassword,\n createUserInvite,\n verify,\n getById,\n getVerifications,\n cancelUserInvitation,\n updateStatusById,\n signUp,\n inviteMember,\n cancelInviteMember,\n forgetPassword,\n orgSetupFee,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TVerificationMetadata = {\n name?: string;\n app?: string;\n role?: string | ObjectId;\n roleName?: string;\n referralCode?: string;\n org?: string | ObjectId;\n orgName?: string;\n contact?: string;\n seats?: number;\n createdBy?: string | ObjectId;\n amount?: number;\n};\n\nexport type TVerification = {\n _id?: ObjectId;\n type: string;\n email: string;\n metadata?: TVerificationMetadata;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n expireAt?: string | Date;\n};\n\nexport const schemaInviteMember = Joi.object({\n email: Joi.string().email().required(),\n role: Joi.string().hex().required(),\n app: Joi.string().required(),\n org: Joi.string().hex().optional().allow(\"\", null),\n});\n\nexport const schemaVerification = Joi.object({\n type: Joi.string().required(),\n email: Joi.string().email().required(),\n metadata: Joi.object({\n name: Joi.string().optional().allow(\"\", null),\n app: Joi.string().optional().allow(\"\", null),\n role: Joi.string().optional().allow(\"\", null),\n roleName: Joi.string().optional().allow(\"\", null),\n referralCode: Joi.string().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n orgName: Joi.string().optional().allow(\"\", null),\n contact: Joi.string().optional().allow(\"\", null),\n seats: Joi.number().optional().allow(\"\", null),\n createdBy: Joi.string().optional().allow(\"\", null),\n amount: Joi.number().optional().allow(\"\", null),\n }).optional(),\n expireAt: Joi.date().optional().allow(\"\", null),\n});\n\nexport function modelVerification(value: TVerification): TVerification {\n const { error } = schemaVerification.validate(value);\n if (error) {\n throw new BadRequestError(\n `Verification model validation error: ${error.message}`\n );\n }\n\n if (value._id && typeof value._id === \"string\") {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new BadRequestError(`Invalid _id format: ${value._id}`);\n }\n }\n\n if (value.metadata?.org && typeof value.metadata.org === \"string\") {\n try {\n value.metadata.org = new ObjectId(value.metadata.org);\n } catch (error) {\n throw new BadRequestError(`Invalid org ID format: ${value.metadata.org}`);\n }\n }\n\n if (value.metadata?.role && typeof value.metadata.role === \"string\") {\n try {\n value.metadata.role = new ObjectId(value.metadata.role);\n } catch (error) {\n throw new BadRequestError(\n `Invalid role ID format: ${value.metadata.role}`\n );\n }\n }\n\n return {\n _id: value._id,\n type: value.type,\n email: value.email,\n metadata: value.metadata,\n status: value.status ?? \"pending\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt ?? \"\",\n expireAt: value.expireAt ?? new Date(Date.now() + 3600 * 1000),\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { modelVerification, TVerification } from \"./verification.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function useVerificationRepo() {\n const db = useAtlas.getDb();\n\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"verifications\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { email: 1 } },\n { key: { type: 1 } },\n { key: { status: 1 } },\n { key: { \"metadata.org\": 1 } },\n { key: { email: \"text\" } },\n {\n key: { expiredAt: 1 },\n expireAfterSeconds: 0,\n name: \"ttl_expiredAt_index\",\n },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create indexes.\");\n }\n }\n\n async function createIndex() {\n try {\n await collection.createIndex([\n { email: 1 },\n { type: 1 },\n { status: 1 },\n { \"metadata.org\": 1 },\n ]);\n } catch (error) {\n throw new InternalServerError(\"Failed to create index.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({\n email: \"text\",\n });\n } catch (error) {\n throw new Error(\"Failed to create text index on email.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n {\n email: 1,\n type: 1,\n \"metadata.app\": 1,\n \"metadata.org\": 1,\n status: 1,\n },\n { unique: true, partialFilterExpression: { status: \"pending\" } }\n );\n } catch (error) {\n throw new Error(\"Failed to create text index on email.\");\n }\n }\n\n async function add(value: TVerification, session?: ClientSession) {\n value = modelVerification(value);\n try {\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({ level: \"error\", message: `${error}` });\n\n const isDuplicated = error.message.includes(\"duplicate\");\n const isDuplicatedEmail = error.message.includes(\"email\");\n const isDuplicatedUserInvite = error.message.includes(\"user-invite\");\n\n if (isDuplicated && isDuplicatedEmail && isDuplicatedUserInvite) {\n throw new BadRequestError(\"User has a pending invitation.\");\n }\n\n if (isDuplicated) {\n throw new BadRequestError(\"Item name already exists.\");\n }\n\n throw new InternalServerError(\"Server internal error.\");\n }\n }\n\n async function getById(_id: ObjectId | string) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n id: _id.toString(),\n });\n const cached = await getCache<TVerification>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById verification: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TVerification>({ _id });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for verification by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for verification by id: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve verification.\"\n );\n }\n }\n\n async function getVerifications(\n {\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n status = \"active\",\n type = \"\",\n email = \"\",\n app = \"\",\n org = \"\",\n } = {} as {\n search?: string;\n page?: number;\n limit?: number;\n sort?: Record<string, number>;\n status?: string;\n type?: string | Array<string>;\n email?: string;\n app?: string;\n org?: string | ObjectId;\n }\n ) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status };\n const cacheKeyOptions: Record<string, any> = { status, limit, page };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n cacheKeyOptions.sort = JSON.stringify(sort);\n\n if (app) {\n query[\"metadata.app\"] = app;\n cacheKeyOptions.app = app;\n }\n\n if (search) {\n query.$text = { $search: search };\n cacheKeyOptions.search = search;\n }\n\n if (Array.isArray(type)) {\n query.type = { $in: type };\n cacheKeyOptions.type = JSON.stringify(type);\n } else if (type) {\n query.type = type;\n cacheKeyOptions.type = type;\n }\n\n if (email) {\n query.email = email;\n cacheKeyOptions.email = email;\n }\n\n if (org) {\n try {\n query[\"metadata.org\"] = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n cacheKeyOptions.org = org;\n }\n\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<TVerification[]>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getVerifications: ${cacheKey}`,\n });\n return cached;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n {\n $project: {\n _id: 1,\n createdAt: 1,\n email: 1,\n type: 1,\n metadata: 1,\n status: 1,\n },\n },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getVerifications: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getVerifications: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getByIdByType(type: string) {\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n type: type,\n });\n const cached = await getCache<Array<TVerification>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByIdByType verification: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection\n .find<Array<TVerification>>({ type })\n .toArray();\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for verification by type: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for verification by type: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n async function updateStatusById(\n _id: ObjectId | string,\n status: string,\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { status, updatedAt: new Date().toISOString() } },\n { session }\n );\n delCachedData();\n return result;\n } catch (error) {\n throw new InternalServerError(\"Error updating verification status.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getVerifications,\n getById,\n getByIdByType,\n updateStatusById,\n };\n}\n","import * as dotenv from \"dotenv\";\ndotenv.config();\n\nexport const MONGO_URI = (process.env.MONGO_URI ||\n \"mongodb://localhost:27017\") as string;\nexport const MONGO_DB = (process.env.MONGO_DB || \"default\") as string;\n\nexport const PORT = Number(process.env.PORT || 3001);\nexport const SECRET_KEY = process.env.SECRET_KEY as string;\nexport const isDev = process.env.NODE_ENV !== \"production\";\n\nexport const MAILER_TRANSPORT_HOST = process.env\n .MAILER_TRANSPORT_HOST as string;\nexport const MAILER_TRANSPORT_PORT = Number(\n process.env.MAILER_TRANSPORT_PORT || 465\n);\nexport const MAILER_TRANSPORT_SECURE =\n process.env.MAILER_TRANSPORT_SECURE === \"true\";\nexport const MAILER_EMAIL = process.env.MAILER_EMAIL as string;\nexport const MAILER_PASSWORD = process.env.MAILER_PASSWORD as string;\n\nexport const ACCESS_TOKEN_SECRET =\n (process.env.ACCESS_TOKEN_SECRET as string) || \"access_token_secret\";\nexport const REFRESH_TOKEN_SECRET =\n (process.env.REFRESH_TOKEN_SECRET as string) || \"refresh_token_secret\";\nexport const ACCESS_TOKEN_EXPIRY =\n (process.env.ACCESS_TOKEN_EXPIRY as string) || \"15s\";\nexport const REFRESH_TOKEN_EXPIRY =\n (process.env.REFRESH_TOKEN_EXPIRY as string) || \"30d\";\n\nexport const APP_ACCOUNT =\n (process.env.APP_ACCOUNT as string) || \"http://localhost:3001\";\nexport const APP_MAIN =\n (process.env.APP_MAIN as string) || \"http://localhost:3000\";\nexport const VERIFICATION_FORGET_PASSWORD_DURATION =\n (process.env.VERIFICATION_FORGET_PASSWORD_DURATION as string) || \"10 minutes\";\nexport const VERIFICATION_USER_INVITE_DURATION =\n (process.env.VERIFICATION_USER_INVITE_DURATION as string) || \"3 days\";\n\nexport const REDIS_HOST = process.env.REDIS_HOST as string;\nexport const REDIS_PORT = Number(process.env.REDIS_PORT || 6379);\nexport const REDIS_PASSWORD = process.env.REDIS_PASSWORD as string;\n\nexport const DEFAULT_USER_EMAIL = process.env.DEFAULT_USER_EMAIL as string;\nexport const DEFAULT_USER_PASSWORD = process.env\n .DEFAULT_USER_PASSWORD as string;\nexport const DEFAULT_USER_FIRST_NAME = process.env\n .DEFAULT_USER_FIRST_NAME as string;\nexport const DEFAULT_USER_LAST_NAME = process.env\n .DEFAULT_USER_LAST_NAME as string;\n\nexport const SPACES_ACCESS_KEY = process.env.SPACES_ACCESS_KEY as string;\nexport const SPACES_SECRET_KEY = process.env.SPACES_SECRET_KEY as string;\nexport const SPACES_ENDPOINT = process.env.SPACES_ENDPOINT as string;\nexport const SPACES_REGION = process.env.SPACES_REGION as string;\nexport const SPACES_BUCKET = process.env.SPACES_BUCKET as string;\n\nexport const PAYPAL_CLIENT_ID = (process.env.PAYPAL_CLIENT_ID as string) ?? \"\";\nexport const PAYPAL_CLIENT_SECRET =\n (process.env.PAYPAL_CLIENT_SECRET as string) ?? \"\";\nexport const PAYPAL_API_URL =\n (process.env.PAYPAL_API_URL as string) ?? \"https://api-m.sandbox.paypal.com\";\nexport const PAYPAL_WEBHOOK_ID =\n (process.env.PAYPAL_WEBHOOK_ID as string) ?? \"\";\n\nexport const XENDIT_SECRET_KEY =\n (process.env.XENDIT_SECRET_KEY as string) ?? \"\";\nexport const XENDIT_BASE_URL =\n (process.env.XENDIT_BASE_URL as string) ?? \"https://api.xendit.co\";\n\nexport const DOMAIN = (process.env.DOMAIN as string) || \"localhost\";\nexport const APP_ORG =\n (process.env.APP_ORG as string) || \"http://localhost/organizations/create\";\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n NotFoundError,\n hashPassword,\n logger,\n makeCacheKey,\n useAtlas,\n useCache,\n useS3,\n} from \"@goweekdays/utils\";\nimport { useUserRepo } from \"../user/user.repository\";\nimport { TUser } from \"./user.model\";\nimport { TFile } from \"../file/file.model\";\nimport { useFileRepo } from \"../file/file.repository\";\nimport {\n DEFAULT_USER_EMAIL,\n DEFAULT_USER_FIRST_NAME,\n DEFAULT_USER_LAST_NAME,\n DEFAULT_USER_PASSWORD,\n SPACES_ACCESS_KEY,\n SPACES_BUCKET,\n SPACES_ENDPOINT,\n SPACES_REGION,\n SPACES_SECRET_KEY,\n} from \"../../config\";\nimport { useVerificationRepo } from \"../verification/verification.repository\";\nimport { useVerificationService } from \"../verification/verification.service\";\nimport \"multer\";\nimport { useMemberRepo } from \"../member/member.repository\";\nimport { useRoleRepo } from \"../role/role.repository\";\nimport { TPermission, usePermissionRepo } from \"../permission\";\nimport { useOrgRepo } from \"../organization\";\n\nexport function useUserService() {\n const {\n add: addUser,\n getUserByEmail,\n getUserById: _getById,\n updateName: _updateName,\n updateBirthday: _updateBirthday,\n updateUserFieldById: _updateUserFieldById,\n } = useUserRepo();\n\n const { addRole, getById: getRoleById } = useRoleRepo();\n const { add: addMember } = useMemberRepo();\n const { getAll: getAllPermission } = usePermissionRepo();\n const { getById: getOrgById } = useOrgRepo();\n\n async function createDefaultUser() {\n const session = useAtlas.getClient()?.startSession();\n\n try {\n session?.startTransaction();\n const _user = await getUserByEmail(DEFAULT_USER_EMAIL);\n if (_user) {\n throw new BadRequestError(\n `User already exists: ${DEFAULT_USER_EMAIL}.`\n );\n }\n\n const hashedPassword = await hashPassword(DEFAULT_USER_PASSWORD);\n\n const userId = await addUser(\n {\n email: DEFAULT_USER_EMAIL,\n password: hashedPassword,\n firstName: DEFAULT_USER_FIRST_NAME,\n lastName: DEFAULT_USER_LAST_NAME,\n },\n session\n );\n\n const permissions = await getAllPermission({ app: \"admin\", limit: 200 });\n\n const roleData = {\n name: \"Super Admin\",\n app: \"admin\",\n permissions: [],\n createdBy: String(userId),\n };\n\n if (permissions && permissions.items && permissions.items.length > 0) {\n roleData.permissions = permissions.items.map(\n (permission: TPermission) => permission.key\n );\n }\n\n const roleId = await addRole(roleData, session);\n\n await addMember(\n {\n user: userId.toString(),\n name: `${DEFAULT_USER_FIRST_NAME} ${DEFAULT_USER_LAST_NAME}`,\n role: roleId.toString(),\n roleName: \"Super Admin\",\n app: \"admin\",\n },\n session\n );\n\n await session?.commitTransaction();\n return \"Successfully created default user.\";\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function createUser(value: TUser) {\n try {\n const _user = await getUserByEmail(value.email);\n if (_user) {\n throw new BadRequestError(`User already exists: ${value.email}.`);\n }\n\n const hashedPassword = await hashPassword(value.password);\n\n const insertedId = await addUser({\n email: value.email,\n password: hashedPassword,\n firstName: value.firstName,\n middleName: value.middleName,\n lastName: value.lastName,\n });\n\n return insertedId;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(`Error creating user: ${error}`);\n }\n }\n }\n\n const { getById: _getVerificationById, updateStatusById: _updateStatusById } =\n useVerificationRepo();\n\n async function addViaInvite({\n id = \"\",\n firstName = \"\",\n lastName = \"\",\n password = \"\",\n } = {}) {\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\n try {\n const invitation = await _getVerificationById(id);\n if (\n !invitation ||\n !invitation.metadata?.app ||\n !invitation.metadata?.role\n ) {\n throw new BadRequestError(\"Invalid invitation.\");\n }\n\n if (invitation.status === \"complete\") {\n throw new BadRequestError(\"Invitation already used.\");\n }\n\n if (!invitation.expireAt) {\n throw new BadRequestError(\"Expiration date is required.\");\n }\n\n const expired = new Date(invitation.expireAt) < new Date();\n\n if (invitation.status === \"expired\" || expired) {\n throw new BadRequestError(\"Invitation expired.\");\n }\n\n const email = invitation.email;\n\n const user = await getUserByEmail(invitation.email);\n\n let userId = user?._id ?? \"\";\n\n if (!user) {\n const hashedPassword = await hashPassword(password);\n\n userId = await addUser(\n {\n email,\n password: hashedPassword,\n firstName,\n lastName,\n defaultOrg: String(invitation.metadata?.org ?? \"\"),\n },\n session\n );\n }\n\n await _updateStatusById(id, \"complete\", session);\n\n let orgName = \"\";\n\n if (invitation.metadata?.org) {\n const org = await getOrgById(String(invitation.metadata.org));\n if (!org) {\n throw new NotFoundError(\"Organization not found.\");\n }\n\n orgName = org.name;\n }\n\n let roleName = \"\";\n\n if (invitation.metadata.role) {\n const role = await getRoleById(String(invitation.metadata.role));\n if (!role) {\n throw new NotFoundError(\"Role not found.\");\n }\n\n roleName = role.name;\n }\n\n await addMember(\n {\n user: userId.toString(),\n name: `${firstName} ${lastName}`,\n role: invitation.metadata?.role,\n roleName,\n app: invitation.metadata?.app,\n org: invitation.metadata?.org ?? \"\",\n orgName,\n },\n session\n );\n\n await session?.commitTransaction();\n return userId;\n } catch (error) {\n await session?.abortTransaction();\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to create user by invite.\");\n }\n } finally {\n session?.endSession();\n }\n }\n\n async function createUserBySignUp({\n id = \"\",\n firstName = \"\",\n lastName = \"\",\n password = \"\",\n } = {}) {\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\n try {\n const signUp = await _getVerificationById(id);\n if (!signUp) {\n throw new BadRequestError(\"Invalid sign up link.\");\n }\n\n if (signUp.status === \"complete\") {\n throw new BadRequestError(\n \"You have already an account created using this link.\"\n );\n }\n\n if (!signUp.expireAt) {\n throw new BadRequestError(\"Expiration date is required.\");\n }\n\n const expired = new Date(signUp.expireAt) < new Date();\n\n if (signUp.status === \"expired\" || expired) {\n throw new BadRequestError(\"Sign up link expired.\");\n }\n\n const email = signUp.email;\n\n const _user = await getUserByEmail(signUp.email);\n if (_user) {\n throw new BadRequestError(`User already exists: ${email}.`);\n }\n\n const hashedPassword = await hashPassword(password);\n\n const userId = await addUser(\n {\n email,\n password: hashedPassword,\n firstName,\n lastName,\n },\n session\n );\n await _updateStatusById(id, \"complete\", session);\n\n await session?.commitTransaction();\n return userId;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n const { getById } = useVerificationService();\n const { updateStatusById: updateVerificationStatusById } =\n useVerificationRepo();\n\n async function resetPassword(value: {\n id: string;\n newPassword: string;\n confirmPassword: string;\n }) {\n if (value.newPassword !== value.confirmPassword) {\n throw new BadRequestError(\"Passwords do not match.\");\n }\n\n let hashedPassword = \"\";\n\n try {\n hashedPassword = await hashPassword(value.newPassword);\n } catch (error) {\n throw new InternalServerError(`Error hashing password: ${error}`);\n }\n\n const session = useAtlas.getClient()?.startSession();\n\n if (!session) {\n throw new InternalServerError(\"Failed to start database session.\");\n }\n\n try {\n session.startTransaction();\n\n const otpDoc = await getById(value.id);\n if (!otpDoc) {\n throw new NotFoundError(\"You are using an invalid reset link.\");\n }\n\n const user = await getUserByEmail(otpDoc.email);\n if (!user) {\n throw new NotFoundError(\"User not found.\");\n }\n\n if (!user._id) {\n throw new NotFoundError(\"User ID is invalid.\");\n }\n\n if (otpDoc.status === \"used\") {\n throw new BadRequestError(\"This link has already been invalidated.\");\n }\n\n await updateVerificationStatusById(value.id, \"used\", session);\n\n await _updateUserFieldById(\n { _id: String(user._id), field: \"password\", value: hashedPassword },\n session\n );\n\n await session.commitTransaction();\n\n return \"Successfully reset password.\";\n } catch (error) {\n await session.abortTransaction();\n if (error instanceof AppError) {\n throw error;\n }\n throw new InternalServerError(\"Failed to reset password.\");\n }\n }\n\n const { updateName: updateMemberName } = useMemberRepo();\n\n async function updateName(\n _id: string,\n firstName?: string,\n lastName?: string\n ) {\n if (!_id) {\n throw new BadRequestError(\"Invalid user ID\");\n }\n\n if (!firstName) {\n throw new BadRequestError(\"Invalid firstName\");\n }\n\n if (!lastName) {\n throw new BadRequestError(\"Invalid lastName\");\n }\n\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\n const cacheKey = makeCacheKey(\"users\", { user: _id });\n\n try {\n useCache()\n .delCache(cacheKey)\n .then(() => {\n logger.info(`Cache cleared for user: ${_id}`);\n })\n .catch((error) => {\n logger.error(`Failed to clear cache for user: ${_id}`, error);\n });\n\n await _updateName({ _id, firstName, lastName }, session);\n await updateMemberName(\n { user: _id, name: `${firstName} ${lastName}` },\n session\n );\n await session?.commitTransaction();\n return \"Successfully updated name.\";\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function updateBirthday(\n _id: string,\n month: string,\n day: number,\n year: number\n ) {\n if (!_id) {\n throw new BadRequestError(\"Invalid user ID\");\n }\n\n if (!month) {\n throw new BadRequestError(\"Invalid birth month.\");\n }\n\n if (!day) {\n throw new BadRequestError(\"Invalid birthday.\");\n }\n\n if (!year) {\n throw new BadRequestError(\"Invalid birth year.\");\n }\n\n try {\n await _updateBirthday({ _id, month, day, year });\n return \"Successfully updated birthday.\";\n } catch (error) {\n throw error;\n }\n }\n\n async function updateUserFieldById(\n { _id, field, value } = {} as {\n _id: string;\n field: string;\n value: string;\n }\n ) {\n try {\n return await _updateUserFieldById({ _id, field, value });\n } catch (error) {\n throw error;\n }\n }\n\n const { createFile: _createFile, deleteFileById } = useFileRepo();\n\n const s3 = new useS3({\n accessKeyId: SPACES_ACCESS_KEY,\n secretAccessKey: SPACES_SECRET_KEY,\n endpoint: SPACES_ENDPOINT,\n region: SPACES_REGION,\n bucket: SPACES_BUCKET,\n });\n\n async function updateUserProfile(\n { file, user, previousProfile } = {} as {\n file: Express.Multer.File;\n user: string;\n previousProfile?: string;\n }\n ) {\n const session = useAtlas.getClient()?.startSession();\n\n session?.startTransaction();\n\n const _file: TFile = {\n name: file.originalname,\n createdAt: new Date().toISOString(),\n };\n\n try {\n const id = await _createFile(_file, session);\n await s3.uploadObject({\n key: id,\n body: file.buffer,\n contentType: file.mimetype,\n });\n\n if (previousProfile) {\n await deleteFileById(previousProfile, session);\n await s3.deleteObject(previousProfile);\n }\n\n await _updateUserFieldById(\n { _id: user, field: \"profile\", value: id },\n session\n );\n\n await session?.commitTransaction();\n\n return id;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n return {\n createUser,\n resetPassword,\n updateName,\n updateBirthday,\n updateUserFieldById,\n updateUserProfile,\n addViaInvite,\n createUserBySignUp,\n createDefaultUser,\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { MFile, TFile } from \"./file.model\";\nimport { ObjectId, ClientSession } from \"mongodb\";\n\nexport function useFileRepo() {\n const db = useAtlas.getDb();\n\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"files\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { name: 1 } },\n { key: { status: 1 } },\n { key: { name: \"text\" }, name: \"text_index\" },\n ]);\n return \"Successfully created file indexes.\";\n } catch (error) {\n throw new BadRequestError(\"Failed to create file indexes.\");\n }\n }\n\n async function createFile(value: TFile, session?: ClientSession) {\n try {\n value = new MFile(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId.toString();\n } catch (error) {\n throw new InternalServerError(\"Failed to create file.\");\n }\n }\n\n async function deleteFileById(\n _id: string | ObjectId,\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid file id.\");\n }\n\n try {\n await collection.deleteOne({ _id }, { session });\n delCachedData();\n return \"File deleted successfully\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete file.\");\n }\n }\n\n async function getAllDraftedFiles() {\n const cacheKey = makeCacheKey(namespace_collection, { status: \"draft\" });\n\n try {\n // Check cache first\n const cached = await getCache<any[]>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAllDraftedFiles: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection\n .find({ $and: [{ status: \"draft\" }, { status: null }] })\n .toArray();\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAllDraftedFiles: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAllDraftedFiles: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get drafted files.\");\n }\n }\n\n return {\n createIndexes,\n createFile,\n deleteFileById,\n getAllDraftedFiles,\n };\n}\n","import { ObjectId } from \"mongodb\";\n\nexport type TFile = {\n _id?: ObjectId;\n name: string;\n type?: string;\n status?: string;\n createdAt: string;\n};\n\nexport class MFile implements TFile {\n _id?: ObjectId;\n name: string;\n type?: string;\n status?: string;\n createdAt: string;\n\n constructor(value: TFile) {\n this._id = value._id;\n this.name = value.name ?? \"\";\n this.type = value.type ?? \"public\";\n this.status = value.status ?? \"active\";\n this.createdAt = value.createdAt ?? new Date().toISOString();\n }\n}","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelMember,\n schemaMemberRole,\n schemaMemberStatus,\n TMember,\n} from \"./member.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function useMemberRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"members\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { name: 1 } },\n { key: { status: 1 } },\n { key: { name: \"text\", orgName: \"text\" }, name: \"text_index\" },\n {\n key: {\n org: 1,\n user: 1,\n type: 1,\n },\n partialFilterExpression: { deletedAt: \"\" },\n name: \"unique_member\",\n },\n ]);\n return \"Successfully created member indexes.\";\n } catch (error) {\n throw new BadRequestError(\"Failed to create member indexes.\");\n }\n }\n\n async function add(value: TMember, session?: ClientSession) {\n try {\n value = modelMember(value);\n\n await collection.insertOne(value, { session });\n delCachedData();\n return \"Successfully added member.\";\n } catch (error) {\n logger.log({\n level: \"error\",\n message: `Failed to create member: ${error}`,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to create member.\");\n }\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n id: _id.toString(),\n });\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>({ _id });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by id: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve member.\"\n );\n }\n }\n\n async function getByRole(role: string | ObjectId) {\n try {\n role = new ObjectId(role);\n } catch (error) {\n throw new BadRequestError(\"Invalid role ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n role: role.toString(),\n });\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>({ role });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by role: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by role: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve member.\"\n );\n }\n }\n\n async function getByUserId(user: string | ObjectId) {\n try {\n user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n user: String(user),\n });\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByUserId member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>({ user });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by user ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by user ID: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve member.\"\n );\n }\n }\n\n async function getByUserType(\n user: string | ObjectId,\n type: string,\n org?: string | ObjectId\n ) {\n const query: Record<string, any> = {\n type,\n status: \"active\",\n };\n\n const cacheKeyOptions: Record<string, any> = {\n type,\n };\n\n if (org) {\n try {\n org = new ObjectId(org);\n cacheKeyOptions.org = String(org);\n query.org = org;\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n }\n\n try {\n user = new ObjectId(user);\n cacheKeyOptions.user = String(user);\n query.user = user;\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByUserId member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>(query);\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by user ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by user ID: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve member.\"\n );\n }\n }\n\n async function getByApp(options: {\n app: string;\n user?: string | ObjectId;\n org?: string | ObjectId;\n }) {\n const query: Record<string, any> = {\n app: options.app,\n status: { $ne: \"deleted\" },\n };\n\n const cacheKeyOptions: Record<string, any> = {\n app: options.app,\n tag: \"getByApp\",\n };\n\n if (options.org) {\n try {\n query.org = new ObjectId(options.org);\n cacheKeyOptions.org = String(options.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n }\n\n if (options.user) {\n try {\n query.user = new ObjectId(options.user);\n cacheKeyOptions.user = String(options.user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for get by app member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>(query);\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by user ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by user ID: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve member.\"\n );\n }\n }\n\n type TUpdateName = Pick<TMember, \"user\" | \"name\">;\n\n async function updateName(value: TUpdateName, session?: ClientSession) {\n try {\n value.user = new ObjectId(value.user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n try {\n await collection.updateOne(\n { user: value.user },\n { $set: { name: value.name } },\n { session }\n );\n delCachedData();\n return \"Successfully updated member name.\";\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to update member name.\"\n );\n }\n }\n\n async function updateRoleById(\n _id: string | ObjectId,\n value: { role: string | ObjectId; roleName: string },\n session?: ClientSession\n ) {\n const { error } = schemaMemberRole.validate({\n _id,\n role: value.role,\n roleName: value.roleName,\n });\n\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n value.role = new ObjectId(value.role);\n } catch (error) {\n throw new BadRequestError(\"Invalid role.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n {\n $set: {\n role: value.role,\n roleName: value.roleName,\n updatedAt: new Date(),\n },\n },\n { session }\n );\n delCachedData();\n return \"Successfully updated member role.\";\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to update member role.\"\n );\n }\n }\n\n async function updateStatusById(\n _id: string | ObjectId,\n status: string,\n session?: ClientSession\n ) {\n const { error } = schemaMemberStatus.validate({\n _id,\n status,\n });\n\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n {\n $set: {\n status,\n updatedAt: new Date(),\n },\n },\n { session }\n );\n delCachedData();\n return \"Successfully updated member status.\";\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to update member status.\"\n );\n }\n }\n\n async function getAll(\n { search, limit, page, user, org, app, status } = {} as {\n search?: string;\n limit?: number;\n page?: number;\n user?: string | ObjectId;\n org?: string | ObjectId;\n app: string;\n status?: string;\n }\n ) {\n limit = limit && limit > 0 ? limit : 10;\n search = search || \"\";\n page = page && page > 0 ? page - 1 : 0;\n\n status = status ?? \"active\";\n\n const query: Record<string, any> = { app, status };\n\n const cacheKeyOptions: Record<string, any> = { app, status, limit, page };\n\n if (user) {\n cacheKeyOptions.user = String(user);\n try {\n query.user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n }\n\n if (org) {\n cacheKeyOptions.org = String(org);\n try {\n query.org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n }\n\n if (search) {\n cacheKeyOptions.search = search;\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll members: ${cacheKey}`,\n });\n\n // Check cache first\n const cached = await getCache<Record<string, any>>(cacheKey);\n\n if (cached && cached.items.length) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll members: ${cacheKey}`,\n });\n return cached;\n }\n\n try {\n const items = await collection\n .aggregate([\n {\n $match: query,\n },\n {\n $limit: limit,\n },\n {\n $project: {\n _id: 1,\n name: 1,\n user: 1,\n status: 1,\n role: 1,\n roleName: 1,\n org: 1,\n orgName: 1,\n type: 1,\n },\n },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll members: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll members: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve members.\"\n );\n }\n }\n\n async function countByOrg(org: string | ObjectId) {\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, { org: String(org) });\n const cached = await getCache<number>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for countByOrg members: ${cacheKey}`,\n });\n return cached;\n }\n const data = await collection.countDocuments({ org, status: \"active\" });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for countByOrg members: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for countByOrg members: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to count members.\"\n );\n }\n }\n\n async function countByUser(user: string | ObjectId) {\n try {\n user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n user: String(user),\n });\n const cached = await getCache<number>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for countByUser members: ${cacheKey}`,\n });\n return cached;\n }\n const data = await collection.countDocuments({ user, status: \"active\" });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for countByUser members: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for countByUser members: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to count members.\"\n );\n }\n }\n\n async function getOrgsByMembership(\n { search, limit, page, user } = {} as {\n search: string;\n limit: number;\n page: number;\n user?: string | ObjectId;\n }\n ) {\n limit = limit > 0 ? limit : 10;\n search = search || \"\";\n page = page > 0 ? page - 1 : 0;\n\n try {\n user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n const query: Record<string, any> = {\n user,\n status: { $ne: \"deleted\" },\n org: { $nin: [null, \"\"] },\n };\n\n const cacheKeyOptions: Record<string, any> = {\n user: String(user),\n org: JSON.stringify(query.org),\n limit,\n page,\n };\n\n if (search) {\n cacheKeyOptions.search = search;\n query.$text = { $search: search };\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<{ text: string; value: ObjectId }[]>(\n cacheKey\n );\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getOrgsByMembership members: ${cacheKey}`,\n });\n return cached;\n }\n const items = await collection\n .aggregate([\n {\n $match: query,\n },\n {\n $sort: { _id: -1 },\n },\n {\n $limit: limit,\n },\n {\n $project: {\n _id: 0,\n text: \"$orgName\",\n value: \"$org\",\n },\n },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getOrgsByMembership members: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getOrgsByMembership members: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve members.\"\n );\n }\n }\n\n async function getOrgsByUserId(\n {\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n user = \"\",\n status = \"active\",\n } = {} as {\n user: string | ObjectId;\n page: number;\n limit?: number;\n search?: string;\n sort?: Record<string, number>;\n status?: string;\n }\n ) {\n page = page > 0 ? page - 1 : 0;\n try {\n user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n const query: Record<string, any> = { user, status };\n const cacheKeyOptions: Record<string, any> = {\n user: String(user),\n status,\n limit,\n page,\n sort: JSON.stringify(sort),\n };\n\n if (search) {\n cacheKeyOptions.search = search;\n query.$text = { $search: search };\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<{ _id: ObjectId; name: string }[]>(\n cacheKey\n );\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getOrgsByUserId members: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n {\n $lookup: {\n from: \"orgs\",\n localField: \"org\",\n foreignField: \"_id\",\n as: \"organization\",\n },\n },\n { $unwind: \"$organization\" }, // Flatten the array\n {\n $project: { _id: \"$organization._id\", name: \"$organization.name\" },\n }, // Extract required fields\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getOrgsByUserId members: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getOrgsByUserId members: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve organizations.\"\n );\n }\n }\n\n async function updateStatusByUserId(user: string | ObjectId, status: string) {\n try {\n user = new ObjectId(user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n const options: Record<string, any> = {\n status,\n updatedAt: new Date(),\n };\n\n if (status === \"deleted\") {\n options.deletedAt = new Date();\n }\n\n try {\n await collection.updateMany(\n { user },\n {\n $set: options,\n }\n );\n delCachedData();\n return \"Successfully updated member status.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to update member status.\");\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n const { error } = Joi.string().hex().required().validate(_id);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n {\n $set: {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n },\n },\n { session }\n );\n delCachedData();\n return \"Successfully deleted member.\";\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to deleted member.\"\n );\n }\n }\n\n return {\n createIndexes,\n add,\n getById,\n getByRole,\n getAll,\n getOrgsByUserId,\n updateStatusByUserId,\n updateName,\n getByUserId,\n getOrgsByMembership,\n countByOrg,\n countByUser,\n getByUserType,\n getByApp,\n updateRoleById,\n updateStatusById,\n deleteById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TMember = {\n _id?: ObjectId;\n org?: string | ObjectId;\n orgName?: string;\n name: string;\n user: string | ObjectId;\n role: string | ObjectId;\n roleName?: string;\n app: string;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaMember = Joi.object({\n org: Joi.string().hex().optional().allow(\"\", null),\n orgName: Joi.string().optional().allow(\"\", null),\n name: Joi.string().required(),\n user: Joi.string().hex().required(),\n role: Joi.string().hex().required(),\n roleName: Joi.string().optional().allow(\"\", null),\n app: Joi.string().required(),\n});\n\nexport const schemaMemberRole = Joi.object({\n _id: Joi.string().hex().required(),\n role: Joi.string().hex().required(),\n roleName: Joi.string().optional().allow(\"\", null),\n});\n\nexport const schemaMemberStatus = Joi.object({\n _id: Joi.string().hex().required(),\n status: Joi.string().valid(\"active\", \"suspended\").required(),\n});\n\nexport function modelMember(value: TMember): TMember {\n const { error } = schemaMember.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n if (value.org) {\n try {\n value.org = new ObjectId(value.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n }\n\n if (value.user) {\n try {\n value.user = new ObjectId(value.user);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n }\n\n if (value.role) {\n try {\n value.role = new ObjectId(value.role);\n } catch (error) {\n throw new BadRequestError(\"Invalid role ID.\");\n }\n }\n\n return {\n _id: value._id,\n org: value.org ?? \"\",\n orgName: value.orgName ?? \"\",\n name: value.name,\n user: value.user,\n app: value.app,\n role: value.role,\n roleName: value.roleName ?? \"\",\n status: value.status ?? \"active\",\n createdAt: value.createdAt || new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n useAtlas,\n paginate,\n logger,\n makeCacheKey,\n useCache,\n AppError,\n} from \"@goweekdays/utils\";\nimport { modelRole, schemaRoleUpdate, TRole } from \"./role.model\";\nimport { ObjectId, ClientSession } from \"mongodb\";\n\nexport function useRoleRepo() {\n const db = useAtlas.getDb();\n\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"roles\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { name: 1 } },\n { key: { status: 1 } },\n { key: { name: \"text\" } },\n { key: { name: 1, app: 1, org: 1, status: 1 }, unique: true },\n ]);\n } catch (error) {}\n }\n\n async function addRole(\n value: TRole,\n session?: ClientSession,\n clearCache = true\n ) {\n try {\n value = modelRole(value);\n\n const res = await collection.insertOne(value, { session });\n\n if (clearCache) {\n delCachedData();\n }\n\n return res.insertedId;\n } catch (error: any) {\n logger.log({ level: \"error\", message: `${error}` });\n\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Role already exists\");\n }\n\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to create role.\");\n }\n }\n }\n\n async function getRoleByUserId(value: ObjectId | string) {\n try {\n value = new ObjectId(value);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n user: String(value),\n });\n const cached = await getCache<TRole>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getRoleByUserId role: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TRole>({ user: value });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for role by user ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for role by user ID: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to retrieve role by user ID.\");\n }\n }\n\n async function getById(_id: ObjectId | string) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n id: _id.toString(),\n });\n const cached = await getCache<TRole>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById role: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne({ _id });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for role by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for role by id: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to retrieve role by ID.\");\n }\n }\n\n async function getRoleByName(name: string) {\n if (!name) {\n throw new BadRequestError(\"Role name is required.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n name: name,\n });\n const cached = await getCache<TRole>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getRoleByName role: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne({ name });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for role by name: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for role by name: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to retrieve role by name.\");\n }\n }\n\n async function getRoles(\n {\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n app = \"\",\n org = \"\",\n } = {} as {\n search?: string;\n page?: number;\n limit?: number;\n sort?: any;\n app?: string;\n org?: string | ObjectId;\n }\n ) {\n limit = limit > 0 ? limit : 10;\n search = search || \"\";\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status: \"active\" };\n\n const cacheKeyOptions: Record<string, any> = {\n status: \"active\",\n limit,\n page,\n };\n\n if (org && typeof org === \"string\" && org.length === 24) {\n try {\n query.org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n cacheKeyOptions.org = org;\n }\n\n if (app) {\n cacheKeyOptions.app = app;\n query.app = app;\n }\n\n if (search) {\n cacheKeyOptions.search = search;\n query.$text = { $search: search };\n }\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n cacheKeyOptions.sort = JSON.stringify(sort);\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n // Check cache first\n const cached = await getCache<TRole[]>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getRoles: ${cacheKey}`,\n });\n return cached;\n }\n\n try {\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getRoles: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getRoles: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function updateRole(\n _id: string | ObjectId,\n value: Pick<TRole, \"name\" | \"permissions\" | \"description\">,\n session?: ClientSession\n ) {\n const { error } = schemaRoleUpdate.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid role ID.\");\n }\n\n try {\n await collection.updateOne({ _id }, { $set: value }, { session });\n delCachedData();\n return \"Successfully updated role.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to update role.\");\n }\n }\n\n async function updatePermissionsById(\n _id: string | ObjectId,\n permissions: TRole[\"permissions\"],\n session?: ClientSession\n ) {\n if (!_id) {\n throw new BadRequestError(\"Role ID is required.\");\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid role ID.\");\n }\n\n if (!permissions) {\n throw new BadRequestError(\"Permissions are required.\");\n }\n\n if (permissions.length === 0) {\n throw new BadRequestError(\"Permissions cannot be empty.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n { $set: { permissions } },\n { session }\n );\n delCachedData();\n return \"Successfully updated role permissions.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to update role permissions.\");\n }\n }\n\n async function deleteById(_id: ObjectId | string, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.deleteOne(\n { _id },\n {\n session,\n }\n );\n delCachedData();\n return \"Successfully deleted role.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete role.\");\n }\n }\n\n return {\n createIndexes,\n addRole,\n getRoles,\n getRoleByUserId,\n getById,\n getRoleByName,\n updateRole,\n deleteById,\n updatePermissionsById,\n delCachedData,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TRole = {\n _id?: ObjectId;\n id?: string | ObjectId;\n name: string;\n description?: string;\n permissions?: Array<string>;\n org?: string | ObjectId;\n app: string;\n status?: string;\n createdBy?: string | ObjectId;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaRole = Joi.object({\n name: Joi.string().required(),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n permissions: Joi.array().items(Joi.string()).required(),\n org: Joi.string().hex().optional().allow(\"\", null),\n app: Joi.string().required(),\n createdBy: Joi.string().hex().required(),\n});\n\nexport const schemaRoleUpdate = Joi.object({\n name: Joi.string().optional().allow(\"\", null),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n permissions: Joi.array().items(Joi.string()).optional().allow(\"\", null),\n});\n\nexport function modelRole(value: TRole): TRole {\n const { error } = schemaRole.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n if (value._id && typeof value._id === \"string\") {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid _id.\");\n }\n }\n\n if (value.org && typeof value.org === \"string\" && value.org.length === 24) {\n try {\n value.org = new ObjectId(value.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org.\");\n }\n }\n\n if (\n value.createdBy &&\n typeof value.createdBy === \"string\" &&\n value.createdBy.length === 24\n ) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy.\");\n }\n }\n\n return {\n _id: value._id,\n name: value.name,\n description: value.description ?? \"\",\n permissions: value.permissions,\n org: value.org,\n app: value.app,\n status: value.status ?? \"active\",\n createdBy: value.createdBy,\n createdAt: value.createdAt ?? new Date().toISOString(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TPermission = {\n _id?: ObjectId;\n app: string;\n key: string;\n name: string;\n group: string;\n description: string;\n deprecated?: boolean;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaPermission = Joi.object({\n app: Joi.string().required(),\n key: Joi.string().required(),\n name: Joi.string().required(),\n group: Joi.string().required(),\n description: Joi.string().required(),\n deprecated: Joi.boolean().optional().allow(null),\n});\n\nexport const schemaPermissionUpdate = Joi.object({\n key: Joi.string().optional().allow(\"\", null),\n name: Joi.string().optional().allow(\"\", null),\n group: Joi.string().optional().allow(\"\", null),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n});\n\nexport function modelPermission(value: TPermission): TPermission {\n const { error } = schemaPermission.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n return {\n _id: value._id,\n app: value.app,\n key: value.key,\n name: value.name,\n group: value.group,\n description: value.description,\n deprecated: value.deprecated ?? false,\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelPermission,\n schemaPermissionUpdate,\n TPermission,\n} from \"./permission.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function usePermissionRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"permissions\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { app: 1 } },\n { key: { name: 1 } },\n { key: { key: 1 } },\n { key: { group: 1 } },\n {\n key: {\n app: \"text\",\n name: \"text\",\n key: \"text\",\n description: \"text\",\n group: \"text\",\n },\n name: \"text_index\",\n },\n {\n key: { app: 1, name: 1, key: 1, group: 1 },\n unique: true,\n name: \"unique_permission\",\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on permissions.\");\n }\n }\n\n async function add(value: TPermission, session?: ClientSession) {\n try {\n value = modelPermission(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Permission already exists.\");\n }\n\n throw new Error(\"Failed to create permission.\");\n }\n }\n }\n\n async function updateById(\n _id: ObjectId | string,\n value: { key?: string; group?: string; description?: string },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const { error } = schemaPermissionUpdate.validate(value);\n if (error) {\n throw new BadRequestError(`Invalid data: ${error.message}`);\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to update permission.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n app = \"\",\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n // Create cache key only with provided parameters\n const cacheParams: Record<string, any> = {\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n query.status = status;\n cacheParams.status = status;\n\n if (search) {\n query.$text = { $search: search };\n cacheParams.search = search;\n }\n\n if (app) {\n query.app = app;\n cacheParams.app = app;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheParams);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll permissions: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll permissions: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll permissions: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll permissions: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TPermission>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById permission: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPermission>({\n _id,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for permission by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for permission by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get permission.\");\n }\n }\n }\n\n async function getByKey(key: string, group?: string, app?: string) {\n const validation = Joi.object({\n key: Joi.string().required(),\n group: Joi.string().optional().allow(\"\", null),\n app: Joi.string().optional().allow(\"\", null),\n });\n const { error } = validation.validate({ key, group });\n if (error) {\n throw new BadRequestError(`Invalid data: ${error.message}`);\n }\n\n const query: Record<string, any> = {};\n const cacheKeyOptions: Record<string, any> = {};\n\n query.key = key;\n cacheKeyOptions.key = key;\n\n if (group) {\n query.group = group;\n cacheKeyOptions.group = group;\n }\n\n if (app) {\n query.app = app;\n cacheKeyOptions.app = app;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n try {\n const cached = await getCache<TPermission>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById permission: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPermission>(query);\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for permission by key: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for permission by key: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get permission.\");\n }\n }\n }\n\n async function countByGroup(group: string) {\n const cacheKey = makeCacheKey(namespace_collection, {\n group,\n tag: \"countByGroup\",\n });\n\n try {\n const cached = await getCache<number>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById permission: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.countDocuments({\n group,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for permission count by group: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for permission by group: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to count permission by group.\");\n }\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date() } }\n );\n\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete permission.\");\n }\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n getByKey,\n updateById,\n deleteById,\n countByGroup,\n };\n}\n","import { usePermissionRepo } from \"./permission.repository\";\n\nexport function usePermissionService() {\n const {\n updateById: _updateById,\n getById: _getById,\n deleteById: _deleteById,\n } = usePermissionRepo();\n\n async function deleteById(id: string) {\n try {\n await _deleteById(id);\n return \"Permission deleted successfully.\";\n } catch (error) {\n throw error;\n }\n }\n\n return {\n deleteById,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { usePermissionRepo } from \"./permission.repository\";\nimport { usePermissionService } from \"./permission.service\";\nimport { schemaPermission, schemaPermissionUpdate } from \"./permission.model\";\n\nexport function usePermissionController() {\n const {\n getAll: _getAll,\n getById: _getById,\n add: _add,\n updateById: _updateById,\n } = usePermissionRepo();\n\n const { deleteById: _deleteById } = usePermissionService();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaPermission.validate(value);\n\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 _add(value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\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 app: Joi.string().optional().allow(\"\", null),\n status: Joi.string().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 app = (req.query.app as string) ?? \"\";\n const search = (req.query.search as string) ?? \"\";\n const status = (req.query.status as string) ?? \"active\";\n\n try {\n const buildings = await _getAll({\n page,\n limit,\n sort: sortObj,\n app,\n search,\n status,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getById(id);\n res.json({\n message: \"Successfully retrieved permission.\",\n data,\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(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\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 updateById(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const { error: errorId } = Joi.string().hex().required().validate(id);\n\n if (errorId) {\n next(new BadRequestError(errorId.message));\n return;\n }\n\n const payload = req.body;\n\n const { error } = schemaPermissionUpdate.validate(payload);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateById(id, payload);\n res.json(message);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n add,\n getAll,\n getById,\n deleteById,\n updateById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TPermissionGroup = {\n _id?: ObjectId;\n app: string;\n key: string;\n label: string;\n order?: number;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaPermissionGroup = Joi.object({\n app: Joi.string().required(),\n key: Joi.string().required(),\n label: Joi.string().required(),\n order: Joi.number().integer().optional().allow(\"\", null),\n});\n\nexport const schemaPermissionGroupUpdate = Joi.object({\n key: Joi.string().optional().allow(\"\", null),\n label: Joi.string().optional().allow(\"\", null),\n order: Joi.number().integer().optional().allow(\"\", null),\n});\n\nexport function modelPermissionGroup(\n value: TPermissionGroup\n): TPermissionGroup {\n const { error } = schemaPermissionGroup.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n return {\n _id: value._id,\n app: value.app,\n key: value.key,\n label: value.label,\n order: value.order ?? Date.now(),\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelPermissionGroup,\n schemaPermissionGroupUpdate,\n TPermissionGroup,\n} from \"./permission.group.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function usePermissionGroupRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"permission.groups\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { app: 1 } },\n { key: { key: 1 } },\n { key: { label: 1 } },\n {\n key: { app: \"text\", key: \"text\", label: \"text\" },\n name: \"text_index\",\n },\n {\n key: { app: 1, key: 1, label: 1 },\n unique: true,\n name: \"unique_permission_group\",\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on permission groups.\");\n }\n }\n\n async function add(value: TPermissionGroup, session?: ClientSession) {\n try {\n value = modelPermissionGroup(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Permission group already exists.\");\n }\n\n throw new Error(\"Failed to create permission group.\");\n }\n }\n }\n\n async function updateById(\n _id: ObjectId | string,\n value: { name: string; serial: string; levels: number },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const { error } = schemaPermissionGroupUpdate.validate(value);\n if (error) {\n throw new BadRequestError(`Invalid data: ${error.message}`);\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to update permission group.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n app = \"\",\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {};\n\n const cacheParams: Record<string, any> = {\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n query.status = status;\n cacheParams.status = status;\n\n if (search) {\n query.$text = { $search: search };\n cacheParams.search = search;\n }\n\n if (app) {\n query.app = app;\n cacheParams.app = app;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheParams);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll permission groups: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll permission groups: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll permission groups: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll permission groups: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TPermissionGroup>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById permission group: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPermissionGroup>({\n _id,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for permission group by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for permission group by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get permission group.\");\n }\n }\n }\n\n async function getByKey(key: string, app?: string) {\n const validation = Joi.object({\n key: Joi.string().required(),\n app: Joi.string().optional().allow(null, \"\"),\n });\n const { error } = validation.validate({ key, app });\n\n if (error) {\n throw new BadRequestError(\"Invalid key.\");\n }\n\n const query: Record<string, any> = { key };\n const cacheKeyOptions: Record<string, any> = { key, tag: \"byKey\" };\n\n if (app) {\n query.app = app;\n cacheKeyOptions.app = app;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n try {\n const cached = await getCache<TPermissionGroup>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById permission group: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPermissionGroup>(query);\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for permission group by key: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for permission group by key: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get permission group.\");\n }\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date() } }\n );\n\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete permission group.\");\n }\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n getByKey,\n updateById,\n deleteById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n useAtlas,\n} from \"@goweekdays/utils\";\nimport { usePermissionGroupRepo } from \"./permission.group.repository\";\nimport { usePermissionRepo } from \"./permission.repository\";\nimport { useAppRepo } from \"../app\";\n\nlet init = false;\n\nexport function usePermissionGroupService() {\n const {\n updateById: _updateById,\n getById: _getById,\n deleteById: _deleteById,\n getByKey: _getByKey,\n add: _add,\n } = usePermissionGroupRepo();\n\n const { getAll: getAllApps } = useAppRepo();\n\n const {\n countByGroup,\n getByKey: getPermissionByKey,\n add: addPermission,\n } = usePermissionRepo();\n\n async function addDefaultModule() {\n const session = useAtlas.getClient()?.startSession();\n\n if (!session) {\n throw new Error(\"Failed to start database session.\");\n }\n\n try {\n session?.startTransaction();\n\n const apps = await getAllApps({\n limit: 20,\n type: [\"default\", \"standard\"],\n });\n\n if (apps && apps.items && apps.items.length) {\n const modules = [\n {\n key: \"members\",\n label: \"Members\",\n permissions: [\n {\n key: \"members.view\",\n name: \"View Members\",\n description: \"Allow user to view members\",\n },\n {\n key: \"members.view.details\",\n name: \"View Member Details\",\n description: \"Allow user to view member details\",\n },\n {\n key: \"members.add\",\n name: \"Add Members\",\n description: \"Allow user to add new members\",\n },\n {\n key: \"members.edit.details\",\n name: \"Edit Member Details\",\n description: \"Allow user to edit member details\",\n },\n {\n key: \"members.delete\",\n name: \"Delete Members\",\n description: \"Allow user to delete members\",\n },\n ],\n },\n {\n key: \"roles\",\n label: \"Roles\",\n permissions: [\n {\n key: \"roles.view\",\n name: \"View Roles\",\n description: \"Allow user to view roles\",\n },\n {\n key: \"roles.view.details\",\n name: \"View Role Details\",\n description: \"Allow user to view role details\",\n },\n {\n key: \"roles.add\",\n name: \"Add Roles\",\n description: \"Allow user to add new roles\",\n },\n {\n key: \"roles.edit.details\",\n name: \"Edit Role Details\",\n description: \"Allow user to edit role details\",\n },\n {\n key: \"roles.delete\",\n name: \"Delete Roles\",\n description: \"Allow user to delete roles\",\n },\n ],\n },\n {\n key: \"invitations\",\n label: \"Invitations\",\n permissions: [\n {\n key: \"invitations.view\",\n name: \"View Invitations\",\n description: \"Allow user to view invitations\",\n },\n {\n key: \"invitations.view.details\",\n name: \"View Invitation Details\",\n description: \"Allow user to view invitation details\",\n },\n {\n key: \"invitations.send\",\n name: \"Send Invitations\",\n description: \"Allow user to send invitations\",\n },\n {\n key: \"invitations.revoke\",\n name: \"Revoke Invitations\",\n description: \"Allow user to revoke invitations\",\n },\n ],\n },\n ];\n\n for (const app of apps.items) {\n for (const module of modules) {\n const existingGroup = await _getByKey(module.key, app.code);\n\n if (!existingGroup) {\n await _add({\n app: app.code,\n key: module.key,\n label: module.label,\n });\n\n logger.log({\n level: \"info\",\n message: `Default permission group added: ${app.code} - ${module.key}`,\n });\n }\n\n for (const permission of module.permissions) {\n const existingPermission = await getPermissionByKey(\n permission.key,\n module.key,\n app.code\n );\n\n if (!existingPermission) {\n await addPermission({\n app: app.code,\n group: module.key,\n key: permission.key,\n name: permission.name,\n description: permission.description,\n });\n }\n }\n }\n\n if (app.code === \"org\") {\n const modules = [\n {\n key: \"subscriptions\",\n label: \"Subscriptions\",\n permissions: [\n {\n key: \"subscriptions.view.details\",\n name: \"View Subscription Details\",\n description: \"Allow user to view subscription details\",\n },\n {\n key: \"subscriptions.edit.details\",\n name: \"Edit Subscription Details\",\n description: \"Allow user to edit subscription details\",\n },\n {\n key: \"subscriptions.edit.status.cancel\",\n name: \"Edit Subscription Status - Cancel\",\n description:\n \"Allow user to edit subscription status to cancel\",\n },\n ],\n },\n {\n key: \"billing\",\n label: \"Billing\",\n permissions: [\n {\n key: \"billing.view\",\n name: \"View Billing\",\n description: \"Allow user to view billing\",\n },\n ],\n },\n {\n key: \"setting\",\n label: \"Setting\",\n permissions: [\n {\n key: \"setting.view\",\n name: \"View Setting\",\n description: \"Allow user to view setting\",\n },\n {\n key: \"setting.edit.details\",\n name: \"Edit Setting Details\",\n description: \"Allow user to edit setting details\",\n },\n ],\n },\n ];\n\n for (const module of modules) {\n const existingGroup = await _getByKey(module.key, app.code);\n\n if (!existingGroup) {\n await _add({\n app: app.code,\n key: module.key,\n label: module.label,\n });\n\n logger.log({\n level: \"info\",\n message: `Default permission group added: ${app.code} - ${module.key}`,\n });\n }\n\n for (const permission of module.permissions) {\n const existingPermission = await getPermissionByKey(\n permission.key,\n module.key\n );\n\n if (!existingPermission) {\n await addPermission({\n app: app.code,\n group: module.key,\n key: permission.key,\n name: permission.name,\n description: permission.description,\n });\n }\n }\n }\n }\n\n if (app.code === \"admin\") {\n const modules = [\n {\n key: \"applications\",\n label: \"Applications\",\n permissions: [\n {\n key: \"applications.add\",\n name: \"Add Applications\",\n description: \"Allow user to add new applications\",\n },\n {\n key: \"applications.view\",\n name: \"View Applications\",\n description: \"Allow user to view applications\",\n },\n {\n key: \"applications.view.details\",\n name: \"View Application Details\",\n description: \"Allow user to view application details\",\n },\n {\n key: \"applications.edit\",\n name: \"Edit Applications\",\n description: \"Allow user to edit existing applications\",\n },\n {\n key: \"applications.update.details\",\n name: \"Update Application Details\",\n description: \"Allow user to update application details\",\n },\n {\n key: \"applications.delete\",\n name: \"Delete Applications\",\n description: \"Allow user to delete applications\",\n },\n ],\n },\n {\n key: \"organizations\",\n label: \"Organizations\",\n permissions: [\n {\n key: \"organizations.add\",\n name: \"Add Organizations\",\n description: \"Allow user to add new organizations\",\n },\n {\n key: \"organizations.view\",\n name: \"View Organizations\",\n description: \"Allow user to view organizations\",\n },\n {\n key: \"organizations.view.details\",\n name: \"View Organization Details\",\n description: \"Allow user to view organization details\",\n },\n {\n key: \"organizations.edit.status\",\n name: \"Edit Organization Status\",\n description: \"Allow user to edit organization status\",\n },\n {\n key: \"organizations.delete\",\n name: \"Delete Organizations\",\n description: \"Allow user to delete organizations\",\n },\n ],\n },\n {\n key: \"users\",\n label: \"Users\",\n permissions: [\n {\n key: \"users.add\",\n name: \"Add Users\",\n description: \"Allow user to add new users\",\n },\n {\n key: \"users.view\",\n name: \"View Users\",\n description: \"Allow user to view users\",\n },\n {\n key: \"users.view.details\",\n name: \"View User Details\",\n description: \"Allow user to view user details\",\n },\n {\n key: \"users.edit.status\",\n name: \"Edit User Status\",\n description: \"Allow user to edit user status\",\n },\n {\n key: \"users.delete\",\n name: \"Delete Users\",\n description: \"Allow user to delete users\",\n },\n ],\n },\n {\n key: \"subscriptions\",\n label: \"Subscriptions\",\n permissions: [\n {\n key: \"subscriptions.view\",\n name: \"View Subscriptions\",\n description: \"Allow user to view subscriptions\",\n },\n {\n key: \"subscriptions.view.details\",\n name: \"View Subscription Details\",\n description: \"Allow user to view subscription details\",\n },\n {\n key: \"subscriptions.edit.status.suspend\",\n name: \"Edit Subscription Status - Suspend\",\n description:\n \"Allow user to edit subscription status to suspend\",\n },\n {\n key: \"subscriptions.edit.status.activate\",\n name: \"Edit Subscription Status - Activate\",\n description:\n \"Allow user to edit subscription status to activate\",\n },\n ],\n },\n {\n key: \"promo.codes\",\n label: \"Promo Codes\",\n permissions: [\n {\n key: \"promo.codes.view\",\n name: \"View Promo Codes\",\n description: \"Allow user to view promo codes\",\n },\n {\n key: \"promo.codes.view.details\",\n name: \"View Promo Code Details\",\n description: \"Allow user to view promo code details\",\n },\n {\n key: \"promo.codes.add\",\n name: \"Add Promo Codes\",\n description: \"Allow user to add new promo codes\",\n },\n {\n key: \"promo.codes.edit.details\",\n name: \"Edit Promo Code Details\",\n description: \"Allow user to edit promo code details\",\n },\n {\n key: \"promo.codes.update.status\",\n name: \"Update Promo Code Status\",\n description: \"Allow user to update promo code status\",\n },\n {\n key: \"promo.codes.delete\",\n name: \"Delete Promo Codes\",\n description: \"Allow user to delete promo codes\",\n },\n ],\n },\n {\n key: \"affiliates\",\n label: \"Affiliates\",\n permissions: [\n {\n key: \"affiliates.view\",\n name: \"View Affiliates\",\n description: \"Allow user to view affiliates\",\n },\n {\n key: \"affiliates.view.details\",\n name: \"View Affiliate Details\",\n description: \"Allow user to view affiliate details\",\n },\n {\n key: \"affiliates.edit.status\",\n name: \"Edit Affiliate Status\",\n description: \"Allow user to edit affiliate status\",\n },\n ],\n },\n ];\n\n for (const module of modules) {\n const existingGroup = await _getByKey(module.key, app.code);\n\n if (!existingGroup) {\n await _add({\n app: app.code,\n key: module.key,\n label: module.label,\n });\n\n logger.log({\n level: \"info\",\n message: `Default permission group added: ${app.code} - ${module.key}`,\n });\n }\n\n for (const permission of module.permissions) {\n const existingPermission = await getPermissionByKey(\n permission.key,\n module.key\n );\n\n if (!existingPermission) {\n await addPermission({\n app: app.code,\n group: module.key,\n key: permission.key,\n name: permission.name,\n description: permission.description,\n });\n }\n }\n }\n }\n }\n\n await session.commitTransaction();\n }\n\n logger.log({\n level: \"info\",\n message: \"Default permission groups added successfully.\",\n });\n return;\n } catch (error) {\n console.log(error);\n\n await session.abortTransaction();\n throw error;\n } finally {\n await session.endSession();\n }\n }\n\n async function deleteById(id: string) {\n const permission = await _getById(id);\n if (!permission) {\n throw new Error(\"Permission Group not found.\");\n }\n\n const associatedPermissionsCount = await countByGroup(permission.key);\n\n if (associatedPermissionsCount > 0) {\n throw new BadRequestError(\n \"Cannot delete Permission Group with associated Permissions.\"\n );\n }\n\n try {\n await _deleteById(id);\n return \"Permission deleted successfully.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete Permission Group.\");\n }\n }\n }\n\n return {\n addDefaultModule,\n deleteById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TApp = {\n _id?: ObjectId;\n code: string;\n name: string;\n description: string;\n type?: string;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nexport const schemaApp = Joi.object({\n code: Joi.string().alphanum().max(20).required(),\n name: Joi.string().max(255).required(),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n type: Joi.string().allow(\"default\", \"standard\").optional().allow(\"\", null),\n});\n\nexport const schemaAppUpdate = Joi.object({\n code: Joi.string().alphanum().max(20).optional().allow(\"\", null),\n name: Joi.string().max(255).optional().allow(\"\", null),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n});\n\nexport function modelApp(value: TApp): TApp {\n const { error } = schemaApp.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n return {\n _id: value._id,\n code: value.code,\n name: value.name,\n description: value.description,\n type: value.type ?? \"standard\",\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { modelApp, TApp } from \"./app.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function useAppRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"apps\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { code: 1 } },\n { key: { status: 1 } },\n {\n key: { code: \"text\", name: \"text\", description: \"text\" },\n name: \"text_index\",\n },\n {\n key: { code: 1, status: 1 },\n unique: true,\n name: \"unique_code\",\n partialFilterExpression: { status: { $in: [\"active\", \"draft\"] } },\n },\n {\n key: { name: 1, status: 1 },\n unique: true,\n name: \"unique_name\",\n partialFilterExpression: { status: { $in: [\"active\", \"draft\"] } },\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on apps.\");\n }\n }\n\n async function add(value: TApp, session?: ClientSession) {\n try {\n value = modelApp(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"App already exists.\");\n }\n\n throw new Error(\"Failed to create app.\");\n }\n }\n }\n\n async function updateById(\n _id: ObjectId | string,\n value: { name: string; description: string },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to update app.\");\n }\n }\n }\n\n async function getAll(\n {\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n status = \"active\",\n type = \"standard\",\n } = {} as {\n search?: string;\n page?: number;\n limit?: number;\n sort?: Record<string, any>;\n status?: string;\n type?: string | string[];\n }\n ) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status,\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n // Create cache key only with provided parameters\n const cacheParams: Record<string, any> = {\n status,\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n if (search) {\n query.$text = { $search: search };\n cacheParams.search = search;\n }\n\n if (type) {\n if (Array.isArray(type)) {\n query.type = { $in: type };\n } else {\n query.type = type;\n }\n\n cacheParams.type = type;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheParams);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll apps: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll apps: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll apps: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll apps: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TApp>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById app: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TApp>({\n _id,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for app by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for app by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get app.\");\n }\n }\n }\n\n async function getByCode(code: string) {\n const validate = Joi.string().required();\n const { error } = validate.validate(code);\n if (error) {\n throw new BadRequestError(\"Invalid code.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n code,\n tag: \"byCode\",\n });\n\n try {\n const cached = await getCache<TApp>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByCode app: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TApp>({\n code,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for app by code: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for app by code: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get app.\");\n }\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date() } }\n );\n\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete app.\");\n }\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n getByCode,\n updateById,\n deleteById,\n };\n}\n","import { logger, useAtlas } from \"@goweekdays/utils\";\nimport { useAppRepo } from \"./app.repository\";\nimport { usePermissionGroupService } from \"../permission\";\nimport { useUserService } from \"../../services/user.service\";\n\nlet init = false;\n\nexport function useAppService() {\n const {\n updateById: _updateById,\n getById: _getById,\n deleteById: _deleteById,\n getByCode: _getByCode,\n add: _add,\n } = useAppRepo();\n\n async function addDefaultApps() {\n const apps = [\n {\n code: \"admin\",\n name: \"Admin\",\n description: \"Administrative application.\",\n type: \"default\",\n },\n {\n code: \"org\",\n name: \"Organization\",\n description: \"Organization application.\",\n type: \"standard\",\n },\n {\n code: \"marketplace\",\n name: \"Marketplace\",\n description: \"Marketplace for product listings.\",\n },\n {\n code: \"service\",\n name: \"Services\",\n description: \"Service offerings and management.\",\n },\n {\n code: \"stay\",\n name: \"Stay\",\n description: \"Accommodation and lodging services.\",\n },\n { code: \"eat\", name: \"Eat\", description: \"Food and dining services.\" },\n {\n code: \"experience\",\n name: \"Experience\",\n description: \"Experiential touring, travel, activities and events.\",\n },\n {\n code: \"ride\",\n name: \"Ride\",\n description: \"Transportation and ride services.\",\n },\n {\n code: \"job\",\n name: \"jobs\",\n description: \"Job listings and recruitment services.\",\n },\n ];\n\n const session = useAtlas.getClient()?.startSession();\n\n if (!session) {\n throw new Error(\"Failed to start database session.\");\n }\n\n try {\n session?.startTransaction();\n\n for (const app of apps) {\n const existingApp = await _getByCode(app.code);\n\n if (!existingApp) {\n await _add(app, session);\n }\n }\n\n await session.commitTransaction();\n logger.log({\n level: \"info\",\n message: \"Default apps added successfully.\",\n });\n return;\n } catch (error) {\n await session.abortTransaction();\n logger.log({\n level: \"error\",\n message: `Failed to add default apps: ${error}`,\n });\n throw error;\n } finally {\n await session.endSession();\n }\n }\n\n async function deleteById(id: string) {\n try {\n await _deleteById(id);\n return \"App deleted successfully.\";\n } catch (error) {\n throw error;\n }\n }\n\n return {\n addDefaultApps,\n deleteById,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { useAppRepo } from \"./app.repository\";\nimport { useAppService } from \"./app.service\";\nimport { schemaApp, schemaAppUpdate } from \"./app.model\";\n\nexport function useAppController() {\n const {\n getAll: _getAll,\n getById: _getById,\n add: _add,\n updateById: _updateById,\n } = useAppRepo();\n\n const { deleteById: _deleteById } = useAppService();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaApp.validate(value);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const result = await _add(value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateById(req: Request, res: Response, next: NextFunction) {\n const id = (req.params.id as string) ?? \"\";\n const { error: errorId } = Joi.string().hex().required().validate(id);\n if (errorId) {\n next(new BadRequestError(errorId.message));\n return;\n }\n\n const value = req.body;\n\n const { error } = schemaAppUpdate.validate(value);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const result = await _updateById(req.params.id, value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\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 status: Joi.string().optional().allow(\"\", null),\n type: Joi.string().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 status = (req.query.status as string) ?? \"active\";\n const search = (req.query.search as string) ?? \"\";\n let type = (req.query.type as string)\n ? (req.query.type as string).split(\",\")\n : \"standard\";\n\n try {\n const buildings = await _getAll({\n page,\n limit,\n sort: sortObj,\n status,\n search,\n type,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getById(id);\n res.json({\n message: \"Successfully retrieved app.\",\n data,\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(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\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 add,\n updateById,\n getAll,\n getById,\n deleteById,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { usePermissionGroupRepo } from \"./permission.group.repository\";\nimport { usePermissionGroupService } from \"./permission.group.service\";\nimport {\n schemaPermissionGroup,\n schemaPermissionGroupUpdate,\n} from \"./permission.group.model\";\n\nexport function usePermissionGroupController() {\n const {\n getAll: _getAll,\n getById: _getById,\n add: _add,\n updateById: _updateById,\n } = usePermissionGroupRepo();\n\n const { deleteById: _deleteById } = usePermissionGroupService();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaPermissionGroup.validate(value);\n\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 _add(value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\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 app: Joi.string().optional().allow(\"\", null),\n status: Joi.string().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 app = (req.query.app as string) ?? \"\";\n const search = (req.query.search as string) ?? \"\";\n const status = (req.query.status as string) ?? \"active\";\n\n try {\n const buildings = await _getAll({\n page,\n limit,\n sort: sortObj,\n app,\n search,\n status,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getById(id);\n res.json({\n message: \"Successfully retrieved permission group.\",\n data,\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(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\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 updateById(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n const { error: errorId } = Joi.string().hex().required().validate(id);\n\n if (errorId) {\n next(new BadRequestError(errorId.message));\n return;\n }\n\n const payload = req.body;\n\n const { error } = schemaPermissionGroupUpdate.validate(payload);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateById(id, payload);\n res.json(message);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n add,\n getAll,\n getById,\n deleteById,\n updateById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TOrg = {\n _id?: ObjectId;\n name: string;\n description?: string;\n email: string;\n contact?: string;\n createdBy: string | ObjectId;\n status?: string;\n createdAt?: string | Date;\n updatedAt?: string | Date;\n deletedAt?: string | Date;\n};\n\nconst schema = {\n name: Joi.string().max(255).required(),\n description: Joi.string().max(1024).optional().allow(\"\", null),\n email: Joi.string().email().max(255).required(),\n contact: Joi.string().max(50).optional().allow(\"\", null),\n};\n\nexport const schemaOrg = Joi.object({\n ...schema,\n createdBy: Joi.string().hex().required(),\n});\n\nexport const schemaOrgAdd = Joi.object({\n ...schema,\n createdBy: Joi.string().hex().required(),\n seats: Joi.number().required(),\n});\n\nexport const schemaOrgUpdate = Joi.object({\n ...schema,\n _id: Joi.string().hex().required(),\n});\n\nexport function modelOrg(value: TOrg): TOrg {\n const { error } = schemaOrg.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n if (value.createdBy && typeof value.createdBy === \"string\") {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ObjectId\");\n }\n }\n\n return {\n _id: value._id,\n name: value.name,\n description: value.description ?? \"\",\n email: value.email,\n contact: value.contact,\n createdBy: value.createdBy,\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { modelOrg, schemaOrgUpdate, TOrg } from \"./organization.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function useOrgRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"organizations\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { name: 1 } },\n { key: { description: 1 } },\n { key: { status: 1 } },\n { key: { name: \"text\", description: \"text\" }, name: \"text_index\" },\n { key: { name: 1, status: 1 }, unique: true, name: \"unique_name\" },\n { key: { email: 1, status: 1 }, unique: true, name: \"unique_email\" },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index.\");\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function add(value: TOrg, session?: ClientSession) {\n try {\n value = modelOrg(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Organization already exist.\");\n }\n\n throw new Error(\"Failed to create organization.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n search,\n page,\n limit,\n sort: JSON.stringify(sort),\n status,\n });\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll organizations: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll organizations: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n {\n $project: {\n _id: 1,\n name: 1,\n description: 1,\n status: 1,\n createdAt: 1,\n },\n },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll organizations: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll organizations: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TOrg>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById organization: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TOrg>({ _id });\n if (!result) {\n throw new BadRequestError(\"Organization not found.\");\n }\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for organization by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for organization by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get organization.\");\n }\n }\n }\n\n async function getByName(name: string) {\n const cacheKey = makeCacheKey(namespace_collection, { name });\n\n try {\n const cached = await getCache<TOrg>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByName organization: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TOrg>({\n name: { $regex: name, $options: \"i\" },\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for organization by name: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for organization by name: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get organization.\");\n }\n }\n }\n\n async function getByEmail(email: string) {\n const { error } = Joi.string().email().required().validate(email);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { email });\n\n try {\n const cached = await getCache<TOrg>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByEmail organization: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TOrg>({ email });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for organization by email: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for organization by email: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get organization.\");\n }\n }\n }\n\n async function updateFieldById(\n { _id, field, value } = {} as {\n _id: string | ObjectId;\n field: string;\n value: string;\n },\n session?: ClientSession\n ) {\n // Allowed fields to prevent arbitrary updates\n const allowedFields = [\"name\", \"description\"];\n\n if (!allowedFields.includes(field)) {\n throw new BadRequestError(\n `Field \"${field}\" is not allowed to be updated.`\n );\n }\n\n // Validate ID\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n { $set: { [field]: value } }, // Dynamically set the field\n { session }\n );\n\n delCachedData();\n\n return `Successfully updated user ${field}.`;\n } catch (error) {\n throw new InternalServerError(`Failed to update organization ${field}.`);\n }\n }\n\n async function deleteById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date().toISOString() } }\n );\n delCachedData();\n return \"Successfully deleted organization.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete organization.\");\n }\n }\n\n async function updateById(\n _id: string | ObjectId,\n options: Pick<TOrg, \"name\" | \"description\" | \"email\" | \"contact\">\n ) {\n const { error } = schemaOrgUpdate.validate({ ...options, _id });\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n { $set: { ...options, updatedAt: new Date() } }\n );\n delCachedData();\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Organization name already exist.\");\n }\n\n throw new InternalServerError(\"Failed to update org info.\");\n }\n }\n\n async function updateStatusById(\n _id: string | ObjectId,\n status: string,\n session?: ClientSession\n ) {\n const allowedStatuses = [\"active\", \"suspended\", \"inactive\"];\n\n if (!allowedStatuses.includes(status)) {\n throw new BadRequestError(\n `Status \"${status}\" is not a valid organization status.`\n );\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n { $set: { status, updatedAt: new Date() } },\n { session }\n );\n\n delCachedData();\n\n return `Successfully updated organization status to ${status}.`;\n } catch (error) {\n throw new InternalServerError(\"Failed to update organization status.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n updateFieldById,\n deleteById,\n getByName,\n getByEmail,\n updateById,\n updateStatusById,\n };\n}\n","import { BadRequestError, useAtlas } from \"@goweekdays/utils\";\nimport { useOrgRepo } from \"./organization.repository\";\nimport { useRoleRepo } from \"../role/role.repository\";\nimport { schemaOrgAdd, TOrg } from \"./organization.model\";\nimport { TPermission, usePermissionRepo } from \"../permission\";\nimport { useMemberRepo } from \"../member\";\nimport { useUserRepo } from \"../user\";\nimport {\n useSubscriptionRepo,\n useSubscriptionTransactionRepo,\n} from \"../subscription\";\nimport { usePlanRepo } from \"../plan\";\nimport { usePaypalService } from \"../utils/paypal.service\";\nimport { APP_ORG } from \"../../config\";\nimport Joi from \"joi\";\nimport { useVerificationRepo } from \"../verification\";\nimport { useLedgerBillingRepo } from \"../ledger\";\n\nexport function useOrgService() {\n const { add: addOrg } = useOrgRepo();\n const { addRole } = useRoleRepo();\n const { getAll: getAllPermission } = usePermissionRepo();\n const { add: addMember, updateRoleById: _updateRoleById } = useMemberRepo();\n const { getUserById } = useUserRepo();\n const { getDefault } = usePlanRepo();\n const { add: addSubscription } = useSubscriptionRepo();\n const { add: addSubscriptionTransaction } = useSubscriptionTransactionRepo();\n const { addOrder: addPaypalOrder } = usePaypalService();\n\n async function add(\n value: TOrg & {\n seats: number;\n }\n ) {\n const { error } = schemaOrgAdd.validate(value);\n\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n const session = useAtlas.getClient()?.startSession();\n\n if (!session) {\n throw new BadRequestError(\"Unable to start database session.\");\n }\n\n try {\n session?.startTransaction();\n // Create organization\n const org = await addOrg(\n {\n email: value.email,\n name: value.name,\n contact: value.contact,\n createdBy: value.createdBy,\n },\n session\n );\n\n const plan = await getDefault();\n\n if (!plan) {\n throw new BadRequestError(\n \"Failed to create organization, plan not found.\"\n );\n }\n\n const currentDate = new Date();\n const nextBillingDate = new Date(currentDate);\n nextBillingDate.setMonth(currentDate.getMonth() + 1);\n\n const amount = plan.price * value.seats;\n\n const subscriptionId = await addSubscription(\n {\n amount,\n org: String(org),\n seats: value.seats,\n paidSeats: value.seats,\n currency: plan.currency,\n billingCycle: plan.billingCycle,\n nextBillingDate: nextBillingDate,\n },\n session\n );\n\n const createdBy = String(value.createdBy);\n const user = await getUserById(createdBy);\n\n if (!user) {\n throw new BadRequestError(\"User is required to create org member.\");\n }\n\n await addSubscriptionTransaction(\n {\n subscription: subscriptionId,\n type: \"initiate\",\n amount,\n currency: plan.currency,\n description: \"Initial subscription transaction\",\n createdBy: value.createdBy,\n createdByName: `${user.firstName} ${user.lastName}`,\n },\n session\n );\n\n const allPermissions = await getAllPermission({\n app: \"org\",\n limit: 100,\n });\n\n let permissions: string[] = [];\n\n if (\n allPermissions &&\n allPermissions.items &&\n allPermissions.items.length\n ) {\n permissions = allPermissions.items.map((perm: TPermission) => perm.key);\n }\n\n if (permissions.length === 0) {\n throw new Error(\"No permissions found for the organization type.\");\n }\n\n const roleData = {\n org: String(org),\n name: \"Owner\",\n description: \"Owner of the organization\",\n permissions,\n createdBy,\n app: \"org\",\n };\n\n // Create roles\n const role = await addRole(roleData, session);\n\n if (!role) {\n throw new BadRequestError(\"Role is required to create org member.\");\n }\n\n await addMember(\n {\n role: String(role),\n roleName: roleData.name,\n org: String(org),\n orgName: value.name,\n name: `${user.firstName} ${user.lastName}`,\n user: createdBy,\n app: \"org\",\n },\n session\n );\n\n const order = await addPaypalOrder({\n amount,\n currency: plan.currency,\n customId: subscriptionId,\n returnUrl: `${APP_ORG}/organizations/success`,\n cancelUrl: `${APP_ORG}/organizations/cancel`,\n action: \"pay\",\n });\n\n // Commit transaction\n await session?.commitTransaction();\n\n const paypalOrderLink = JSON.parse(order.body.toString()).links.find(\n (link: any) => link.rel === \"approve\"\n );\n\n return {\n org: String(org),\n paypalOrderLink: paypalOrderLink ? paypalOrderLink.href : \"\",\n };\n } catch (error) {\n // Rollback transaction\n await session?.abortTransaction();\n throw error;\n } finally {\n await session?.endSession();\n }\n }\n\n const { getById, updateStatusById: updateVerificationStatus } =\n useVerificationRepo();\n\n const { add: addLedgerBilling } = useLedgerBillingRepo();\n\n async function addWithVerification(id: string) {\n const { error } = Joi.string().hex().required().validate(id);\n\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n const session = useAtlas.getClient()?.startSession();\n\n if (!session) {\n throw new BadRequestError(\"Unable to start database session.\");\n }\n\n try {\n session?.startTransaction();\n\n const verification = await getById(id);\n await updateVerificationStatus(id, \"complete\", session);\n\n if (!verification) {\n throw new BadRequestError(\"Verification not found.\");\n }\n\n if (!verification.metadata?.orgName) {\n throw new BadRequestError(\"Organization name is required.\");\n }\n\n if (!verification.metadata?.seats) {\n throw new BadRequestError(\"Number of seats is required.\");\n }\n\n if (!verification.metadata?.createdBy) {\n throw new BadRequestError(\"CreatedBy is required.\");\n }\n\n if (!verification.metadata?.contact) {\n throw new BadRequestError(\"Contact is required.\");\n }\n\n // Create organization\n const org = await addOrg(\n {\n email: verification.email,\n name: verification.metadata.orgName,\n contact: verification.metadata.contact,\n createdBy: verification.metadata.createdBy,\n },\n session\n );\n\n const plan = await getDefault();\n\n if (!plan) {\n throw new BadRequestError(\n \"Failed to create organization, plan not found.\"\n );\n }\n\n const currentDate = new Date();\n const nextBillingDate = new Date(currentDate);\n nextBillingDate.setMonth(currentDate.getMonth() + 1);\n\n const amount = plan.price * verification.metadata.seats;\n\n await addSubscription(\n {\n amount,\n org: String(org),\n seats: verification.metadata.seats,\n paidSeats: verification.metadata.seats,\n currency: plan.currency,\n billingCycle: plan.billingCycle,\n nextBillingDate: nextBillingDate,\n },\n session\n );\n\n const createdBy = String(verification.metadata.createdBy);\n const user = await getUserById(createdBy);\n\n if (!user) {\n throw new BadRequestError(\"User is required to create org member.\");\n }\n\n const setupFee = verification.metadata?.amount ?? 0;\n\n await addLedgerBilling(\n {\n org: String(org),\n amount: setupFee,\n description: \"Setup payment during organization creation\",\n currency: plan.currency,\n type: \"setup-fee\",\n status: \"paid\",\n },\n session\n );\n\n const allPermissions = await getAllPermission({\n app: \"org\",\n limit: 100,\n });\n\n let permissions: string[] = [];\n\n if (\n allPermissions &&\n allPermissions.items &&\n allPermissions.items.length\n ) {\n permissions = allPermissions.items.map((perm: TPermission) => perm.key);\n }\n\n if (permissions.length === 0) {\n throw new Error(\"No permissions found for the organization type.\");\n }\n\n const roleData = {\n org: String(org),\n name: \"Owner\",\n description: \"Owner of the organization\",\n permissions,\n createdBy,\n app: \"org\",\n };\n\n // Create roles\n const role = await addRole(roleData, session);\n\n if (!role) {\n throw new BadRequestError(\"Role is required to create org member.\");\n }\n\n await addMember(\n {\n role: String(role),\n roleName: roleData.name,\n org: String(org),\n orgName: verification.metadata.orgName,\n name: `${user.firstName} ${user.lastName}`,\n user: createdBy,\n app: \"org\",\n },\n session\n );\n\n // Commit transaction\n await session?.commitTransaction();\n\n return \"Successfully created organization with verification.\";\n } catch (error) {\n // Rollback transaction\n await session?.abortTransaction();\n throw error;\n } finally {\n await session?.endSession();\n }\n }\n\n return {\n add,\n addWithVerification,\n };\n}\n","import Joi from \"joi\";\nimport { useMemberRepo } from \"./member.repository\";\nimport { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport { schemaMemberRole, schemaMemberStatus } from \"./member.model\";\nimport { useMemberService } from \"./member.service\";\n\nexport function useMemberController() {\n const {\n getByUserId: _getByUserId,\n getAll: _getAll,\n getOrgsByMembership: _getOrgsByMembership,\n updateStatusByUserId: _updateStatusByUserId,\n getByUserType: _getByUserType,\n getByApp: _getByApp,\n } = useMemberRepo();\n\n const {\n updateRoleById: _updateRoleById,\n updateStatusById: _updateStatusById,\n deleteById: _deleteById,\n } = useMemberService();\n\n async function getByUserId(req: Request, res: Response, next: NextFunction) {\n const userId = req.params.id as string;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate({ id: userId });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const member = await _getByUserId(userId);\n if (!member) {\n res.status(404).json({ message: \"Member not found.\" });\n return;\n }\n\n res.json(member);\n } catch (error) {\n next(error);\n }\n }\n\n async function getByUserType(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const validation = Joi.object({\n org: Joi.string().hex().optional().allow(\"\", null),\n user: Joi.string().hex().required(),\n app: Joi.string().required(),\n });\n\n const { error } = validation.validate({ ...req.params, ...req.query });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const orgId = req.query.org as string;\n const userId = req.params.user as string;\n const type = req.params.type as string;\n\n try {\n const member = await _getByUserType(userId, type, orgId);\n if (!member) {\n res.status(404).json({ message: \"Member not found.\" });\n return;\n }\n\n res.json(member);\n } catch (error) {\n next(error);\n }\n }\n\n async function getByApp(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.object({\n org: Joi.string().hex().optional().allow(\"\", null),\n user: Joi.string().hex().required(),\n app: Joi.string().required(),\n });\n\n const app = (req.params.app as string) ?? \"\";\n const org = req.query.org as string;\n const user = req.params.user as string;\n\n const { error } = validation.validate({ org, user, app });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const member = await _getByApp({ app, user, org });\n if (!member) {\n res.status(404).json({ message: \"Member not found.\" });\n return;\n }\n\n res.json(member);\n } catch (error) {\n next(error);\n }\n }\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const limit = Number(req.query.limit) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n const user = (req.query.user as string) ?? \"\";\n const org = (req.query.org as string) ?? \"\";\n const app = (req.params.app as string) ?? \"\";\n const status = (req.query.status as string) ?? \"active\";\n\n const validation = Joi.object({\n limit: Joi.number().min(10).max(50).required(),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n user: Joi.string().hex().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n app: Joi.string().required(),\n status: Joi.string().required(),\n });\n\n const { error } = validation.validate({\n search,\n page,\n user,\n org,\n app,\n limit,\n status,\n });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const items = await _getAll({\n search,\n page,\n user,\n org,\n app,\n limit,\n status,\n });\n\n res.json(items);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getAllByAppUser(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const limit = Number(req.query.limit) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n const user = (req.params.user as string) ?? \"\";\n const app = (req.params.app as string) ?? \"\";\n\n const validation = Joi.object({\n limit: Joi.number().min(10).max(200).allow(null, \"\"),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().optional().allow(null, \"\"),\n app: Joi.string().required(),\n user: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate({\n search,\n page,\n limit,\n user,\n app,\n });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const items = await _getAll({\n search,\n page,\n limit,\n user,\n app,\n });\n\n res.json(items);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getOrgsByMembership(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const limit = Number(req.query.limit) ?? 10;\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n const user = (req.query.user as string) ?? \"\";\n\n const validation = Joi.object({\n limit: Joi.number().min(10).max(50).required(),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n user: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({\n search,\n page,\n user,\n limit,\n });\n\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const items = await _getOrgsByMembership({\n search,\n page,\n user,\n limit,\n });\n\n res.json(items);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateStatusByUserId(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n status: Joi.string().valid(\"active\", \"suspended\", \"deleted\").required(),\n });\n\n const { error } = validation.validate(req.params);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const id = req.params.id as string;\n const status = req.params.status as string;\n\n try {\n const message = await _updateStatusByUserId(id, status);\n res.json({ message });\n } catch (error) {\n next(error);\n }\n }\n\n async function updateRoleById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = req.body;\n const _id = (req.params.id as string) ?? \"\";\n\n const { error } = schemaMemberRole.validate({ ...payload, _id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateRoleById({ role: payload.role, _id });\n res.json({ message });\n } catch (error) {\n next(error);\n }\n }\n\n async function updateStatusById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = req.body;\n const _id = (req.params.id as string) ?? \"\";\n\n const { error } = schemaMemberStatus.validate({ ...payload, _id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateStatusById({ status: payload.status, _id });\n res.json({ message });\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(req: Request, res: Response, next: NextFunction) {\n const payload = req.body;\n const _id = (req.params.id as string) ?? \"\";\n\n const { error } = Joi.string().hex().required().validate(_id);\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 } catch (error) {\n next(error);\n }\n }\n\n return {\n getByApp,\n getByUserId,\n getAll,\n getOrgsByMembership,\n updateStatusByUserId,\n getByUserType,\n updateRoleById,\n updateStatusById,\n deleteById,\n getAllByAppUser,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { useRoleRepo } from \"../role\";\nimport { schemaMemberRole, schemaMemberStatus } from \"./member.model\";\nimport { useMemberRepo } from \"./member.repository\";\nimport Joi from \"joi\";\n\nexport function useMemberService() {\n const { getById: getRoleById } = useRoleRepo();\n const {\n updateRoleById: _updateRoleById,\n updateStatusById: _updateStatusById,\n getById: getMemberById,\n deleteById: _deleteById,\n } = useMemberRepo();\n\n async function updateRoleById(value: { _id: string; role: string }) {\n const { error } = schemaMemberRole.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n const role = await getRoleById(value.role);\n if (!role) {\n throw new BadRequestError(\"Role not found.\");\n }\n\n await _updateRoleById(value._id, {\n role: value.role,\n roleName: role.name,\n });\n\n return \"Successfully updated member role.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to update member role.\");\n }\n }\n }\n\n async function updateStatusById(value: { _id: string; status: string }) {\n const { error } = schemaMemberStatus.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n const member = await getMemberById(value._id);\n if (!member) {\n throw new BadRequestError(\"Member not found.\");\n }\n\n await _updateStatusById(value._id, value.status);\n\n return \"Successfully updated member status.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to update member status.\");\n }\n }\n }\n\n async function deleteById(id: string) {\n const { error } = Joi.string().hex().required().validate(id);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n const member = await getMemberById(id);\n if (!member) {\n throw new BadRequestError(\"Member not found.\");\n }\n\n await _deleteById(id);\n\n return \"Successfully deleted member.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to deleted member.\");\n }\n }\n }\n\n return {\n updateRoleById,\n updateStatusById,\n deleteById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { useMemberRepo } from \"../member\";\nimport { useRoleRepo } from \"./role.repository\";\n\nexport function useRoleService() {\n const { getByRole } = useMemberRepo();\n const { deleteById: _deleteById } = useRoleRepo();\n\n async function deleteById(id: string) {\n try {\n const role = await getByRole(id);\n if (role) {\n throw new BadRequestError(\"Cannot delete role assigned to members.\");\n }\n\n await _deleteById(id);\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete role.\");\n }\n }\n }\n\n return {\n deleteById,\n };\n}\n","import { NextFunction, Request, Response } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, InternalServerError } from \"@goweekdays/utils\";\nimport { useRoleRepo } from \"./role.repository\";\nimport { schemaRole } from \"./role.model\";\nimport { useRoleService } from \"./role.service\";\n\nexport function useRoleController() {\n const {\n addRole: _createRole,\n getById: getById,\n getRoleByUserId: _getRoleByUserId,\n getRoles: _getRoles,\n updateRole: _updateRole,\n updatePermissionsById: _updatePermissionsById,\n } = useRoleRepo();\n\n const { deleteById: _deleteById } = useRoleService();\n\n async function createRole(req: Request, res: Response, next: NextFunction) {\n const payload = req.body;\n\n const { error } = schemaRole.validate(payload);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const role = await _createRole(payload);\n res.json({ message: \"Successfully created role.\", data: { role } });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getRoles(req: Request, res: Response, next: NextFunction) {\n const search = (req.query.search as string) ?? \"\";\n const page = parseInt((req.query.page as string) ?? \"1\");\n const limit = parseInt((req.query.limit as string) ?? \"10\");\n const app = (req.query.app as string) ?? \"\";\n const org = (req.query.org as string) ?? \"\";\n\n const validation = Joi.object({\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n limit: Joi.number().required(),\n app: Joi.string().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ search, page, limit, app, org });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getRoles({ search, page, limit, app, org });\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getRoleByUserId(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const userId = req.params.userId;\n\n const validation = Joi.object({\n userId: Joi.string().required(),\n });\n\n const { error } = validation.validate({ userId });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const role = await _getRoleByUserId(userId);\n res.json({ message: \"Successfully retrieved role.\", data: { role } });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getRoleById(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 next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await getById(_id);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateRole(req: Request, res: Response, next: NextFunction) {\n const _id = req.params.id;\n const name = (req.body.name as string) ?? \"\";\n const permissions = (req.body.permissions as Array<string>) ?? [];\n const validation = Joi.object({\n _id: Joi.string().required(),\n name: Joi.string().required(),\n permissions: Joi.array().items(Joi.string()).required(),\n });\n\n const { error } = validation.validate({ _id, name, permissions });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const role = await _updateRole(_id, { name, permissions });\n res.json({ message: \"Successfully updated role.\", data: { role } });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updatePermissionsById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const _id = req.params.id;\n const permissions = (req.body.permissions as Array<string>) ?? [];\n const validation = Joi.object({\n _id: Joi.string().required(),\n permissions: Joi.array().items(Joi.string()).required(),\n });\n\n const { error } = validation.validate({ _id, permissions });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _updatePermissionsById(_id, permissions);\n res.json({ message: \"Successfully updated role permissions.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteRole(req: Request, res: Response, next: NextFunction) {\n const _id = req.params.id;\n\n const validation = Joi.object({\n _id: Joi.string().required(),\n });\n\n const { error } = validation.validate({ _id });\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 createRole,\n getRoles,\n getRoleByUserId,\n getRoleById,\n updateRole,\n deleteRole,\n updatePermissionsById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TSubscription = {\n _id?: ObjectId;\n org: string | ObjectId;\n seats: number;\n paidSeats: number;\n amount: number;\n currency: string;\n billingCycle: \"monthly\" | \"yearly\"; // e.g., 'monthly', 'yearly'\n promoCode?: string;\n retry?: number;\n status?: string;\n nextBillingDate: Date | string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nconst schema = {\n seats: Joi.number().integer().min(1).required(),\n paidSeats: Joi.number().integer().min(0).required(),\n amount: Joi.number().positive().required(),\n promoCode: Joi.string().optional().allow(\"\", null),\n nextBillingDate: Joi.date().optional().allow(\"\", null),\n};\n\nexport const schemaSubscription = Joi.object({\n ...schema,\n org: Joi.string().hex().length(24).required(),\n currency: Joi.string().length(3).required(),\n billingCycle: Joi.string().valid(\"monthly\", \"yearly\").required(),\n});\n\nexport const schemaSubscriptionUpdate = Joi.object({\n ...schema,\n status: Joi.string().optional().allow(\"\", null),\n});\n\nexport const schemaSubscriptionSeats = Joi.object({\n id: Joi.string().hex().length(24).required(),\n seats: Joi.number().integer().min(1).required(),\n amount: Joi.number().positive().optional().allow(null, 0),\n user: Joi.string().hex().length(24).required(),\n});\n\nexport function modelSubscription(data: any): TSubscription {\n const { error } = schemaSubscription.validate(data);\n\n if (error) {\n throw new BadRequestError(`Invalid subscription data: ${error.message}`);\n }\n\n if (data._id && typeof data._id === \"string\") {\n try {\n data._id = new ObjectId(data._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n }\n\n try {\n data.org = new ObjectId(data.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n\n return {\n _id: data._id,\n org: data.org,\n seats: data.seats,\n paidSeats: data.paidSeats,\n amount: data.amount,\n currency: data.currency,\n billingCycle: data.billingCycle,\n promoCode: data.promoCode,\n status: data.status ?? \"active\",\n retry: data.retry ?? 0,\n nextBillingDate: data.nextBillingDate,\n createdAt: data.createdAt ?? new Date(),\n updatedAt: data.updatedAt ?? \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelSubscription,\n schemaSubscriptionUpdate,\n TSubscription,\n} from \"./subscription.model\";\nimport Joi from \"joi\";\nimport { ObjectId, ClientSession } from \"mongodb\";\n\nexport function useSubscriptionRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"subscriptions\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: {\n org: 1,\n },\n name: \"org_index\",\n },\n {\n key: { org: 1, status: 1 },\n name: \"org_status_index\",\n },\n ]);\n } catch (error) {}\n }\n\n async function add(value: TSubscription, session?: ClientSession) {\n try {\n value = modelSubscription(value);\n const result = await collection.insertOne(value, { session });\n delCachedData();\n return result.insertedId.toString();\n } catch (error) {\n logger.log({\n level: \"error\",\n message: `${error}`,\n });\n\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to add subscription.\");\n }\n }\n\n async function getAll({\n page = 1,\n limit = 10,\n search = \"\",\n status = \"active\",\n } = {}) {\n page = page < 1 ? page - 1 : page;\n\n const query: Record<string, any> = { status };\n const cacheKeyOptions: Record<string, any> = {\n page,\n limit,\n search,\n status,\n tag: \"getAll\",\n };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n try {\n const cachedData = await getCache<TPaginate<TSubscription>>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data: TPaginate<TSubscription> = paginate(\n items,\n page,\n limit,\n length\n );\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll subscription: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll subscription: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get subscriptions.\");\n }\n }\n\n async function getByOrg(org: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(org);\n if (error) {\n throw new Error(`Invalid org ID: ${error.message}`);\n }\n\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n org: String(org),\n tag: \"getByOrg\",\n });\n const cachedData = await getCache<TSubscription>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TSubscription>({\n org,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getByOrg subscription: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getByOrg subscription: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get subscription.\");\n }\n }\n\n async function getById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid subscription ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: String(_id),\n tag: \"getById\",\n });\n const cachedData = await getCache<TSubscription>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TSubscription>({\n _id,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getById subscription: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getById subscription: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get subscription.\");\n }\n }\n\n async function getByStatus(status = \"active\", limit = 100, retry = 3) {\n const validation = Joi.object({\n status: Joi.string()\n .valid(\"active\", \"due\", \"overdue\")\n .required()\n .default(\"active\"),\n limit: Joi.number().integer().min(1).max(250).default(100),\n });\n\n const { error, value } = validation.validate({ status, limit });\n if (error) {\n throw new BadRequestError(`Invalid parameters: ${error.message}`);\n }\n\n const currentDate = new Date();\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n nextBillingDate: currentDate.toString(),\n tag: \"getByStatus\",\n });\n const cachedData = await getCache<TSubscription[]>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = (await collection\n .aggregate([\n {\n $match: {\n nextBillingDate: { $lte: currentDate },\n status: value.status,\n retry: { $lt: retry },\n },\n },\n {\n $limit: value.limit,\n },\n ])\n .toArray()) as TSubscription[];\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for due subscription: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for due subscription: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get due subscription.\");\n }\n }\n\n async function updateRetryById(\n _id: string | ObjectId,\n retry: number,\n session?: ClientSession\n ) {\n const validate = Joi.object({\n _id: Joi.string().hex().length(24).required(),\n retry: Joi.number().integer().min(0).required(),\n });\n\n const { error } = validate.validate({ _id, retry });\n if (error) {\n throw new BadRequestError(`Invalid parameters: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { retry, updatedAt: new Date() } },\n { session }\n );\n\n if (result.modifiedCount === 0) {\n throw new InternalServerError(\"Failed to update subscription retry.\");\n }\n\n delCachedData();\n return \"Successfully updated subscription retry.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to update subscription retry.\");\n }\n }\n\n async function deleteById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid subscription ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\" } }\n );\n\n if (result.modifiedCount === 0) {\n throw new InternalServerError(\"Failed to delete subscription.\");\n }\n\n delCachedData();\n return \"Successfully deleted subscription.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to delete subscription.\");\n }\n }\n\n async function updateById(\n _id: string | ObjectId,\n options: {\n seats?: number;\n paidSeats?: number;\n amount?: number;\n promoCode?: string;\n status?: string;\n nextBillingDate?: Date;\n },\n session?: ClientSession\n ) {\n const { error: errorId } = Joi.string()\n .hex()\n .length(24)\n .required()\n .validate(_id);\n if (errorId) {\n throw new Error(`Invalid subscription ID: ${errorId.message}`);\n }\n\n const validation = Joi.object({\n seats: Joi.number().integer().min(1).optional().allow(\"\", null),\n paidSeats: Joi.number().integer().min(0).optional(),\n amount: Joi.number().positive().optional(),\n promoCode: Joi.string().max(50).optional().allow(\"\", null),\n status: Joi.string()\n .valid(\"active\", \"due\", \"overdue\", \"suspended\")\n .optional()\n .allow(\"\", null),\n nextBillingDate: Joi.date().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(options);\n if (error) {\n throw new BadRequestError(\n `Invalid subscription update data: ${error.message}`\n );\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { ...options, updatedAt: new Date() } },\n { session }\n );\n\n if (result.modifiedCount === 0) {\n throw new InternalServerError(\"Failed to update subscription.\");\n }\n\n delCachedData();\n return \"Successfully updated subscription.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to update subscription.\");\n }\n }\n\n async function updateStatusById(\n _id: string | ObjectId,\n status: string,\n session?: ClientSession\n ) {\n const validate = Joi.object({\n _id: Joi.string().hex().length(24).required(),\n status: Joi.string()\n .valid(\"active\", \"due\", \"overdue\", \"suspended\")\n .required(),\n });\n\n const { error } = validate.validate({ _id, status });\n if (error) {\n throw new BadRequestError(`Invalid parameters: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { status, updatedAt: new Date() } },\n { session }\n );\n\n if (result.modifiedCount === 0) {\n throw new InternalServerError(\"Failed to update subscription status.\");\n }\n\n delCachedData();\n return \"Successfully updated subscription status.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to update subscription status.\");\n }\n }\n\n async function getOverdueForSuspension(limit = 100, daysOverdue = 7) {\n const validation = Joi.object({\n limit: Joi.number().integer().min(1).max(250).default(100),\n daysOverdue: Joi.number().integer().min(1).default(7),\n });\n\n const { error, value } = validation.validate({ limit, daysOverdue });\n if (error) {\n throw new BadRequestError(`Invalid parameters: ${error.message}`);\n }\n\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - value.daysOverdue);\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n cutoffDate: cutoffDate.toISOString(),\n tag: \"getOverdueForSuspension\",\n });\n const cachedData = await getCache<TSubscription[]>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = (await collection\n .aggregate([\n {\n $match: {\n status: \"due\",\n nextBillingDate: { $lte: cutoffDate },\n },\n },\n {\n $limit: value.limit,\n },\n ])\n .toArray()) as TSubscription[];\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for overdue suspension: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for overdue suspension: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Failed to get overdue subscriptions for suspension.\"\n );\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getByOrg,\n getById,\n deleteById,\n updateById,\n getByStatus,\n updateStatusById,\n updateRetryById,\n getOverdueForSuspension,\n };\n}\n","import Joi from \"joi\";\nimport { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport { useSubscriptionRepo } from \"./subscription.repository\";\nimport { schemaSubscriptionSeats } from \"./subscription.model\";\nimport { useSubscriptionService } from \"./subscription.service\";\n\nexport function useSubscriptionController() {\n const {\n getAll: _getAll,\n getById: _getById,\n getByOrg: _getByOrg,\n } = useSubscriptionRepo();\n\n const { updateSeats: _updateSeats } = useSubscriptionService();\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.object({\n page: Joi.number().min(1).max(100).optional().allow(null, \"\").default(1),\n limit: Joi.number()\n .min(1)\n .max(100)\n .optional()\n .allow(null, \"\")\n .default(10),\n status: Joi.string()\n .valid(\"active\", \"suspended\")\n .optional()\n .default(\"active\"),\n });\n\n const query = req.query;\n\n const { error, value } = validation.validate(query);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAll(value);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(req: Request, res: Response, next: NextFunction) {\n const id = (req.params.id as string) ?? \"\";\n const validation = Joi.object({\n id: Joi.string().hex().length(24).required(),\n });\n\n const { error, value } = validation.validate({ id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getById(value.id);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getByOrg(req: Request, res: Response, next: NextFunction) {\n const org = (req.params.org as string) ?? \"\";\n\n const validation = Joi.object({\n org: Joi.string().hex().length(24).required(),\n });\n\n const { error, value } = validation.validate({ org });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getByOrg(value.org);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateSeats(req: Request, res: Response, next: NextFunction) {\n const id = (req.params.id as string) ?? \"\";\n const payload = req.body;\n const { error } = schemaSubscriptionSeats.validate({ ...payload, id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const user = (payload.user as string) ?? \"\";\n const seats = (payload.seats as number) ?? 0;\n const amount = (payload.amount as number) ?? 0;\n\n try {\n const message = await _updateSeats({ id, seats, amount, user });\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n getAll,\n getById,\n getByOrg,\n updateSeats,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n useAtlas,\n} from \"@goweekdays/utils\";\nimport { useSubscriptionRepo } from \"./subscription.repository\";\nimport { useSubscriptionTransactionRepo } from \"./subscription.transaction.repository\";\nimport cron from \"node-cron\";\nimport { useUserRepo } from \"../user\";\nimport {\n schemaSubscription,\n schemaSubscriptionSeats,\n TSubscription,\n} from \"./subscription.model\";\nimport { useLedgerBillingRepo } from \"./../ledger\";\nimport { usePaypalService } from \"../utils\";\nimport { useOrgRepo } from \"../organization\";\nimport Joi from \"joi\";\nimport { usePlanRepo } from \"../plan\";\n\nexport function useSubscriptionService() {\n const {\n getById,\n updateById,\n getByStatus,\n updateStatusById,\n updateRetryById,\n getByOrg,\n } = useSubscriptionRepo();\n const { add: addTransaction } = useSubscriptionTransactionRepo();\n const { getUserById: getUserById } = useUserRepo();\n\n async function updateSeats({\n id = \"\",\n user = \"\",\n amount = 0,\n seats = 0,\n } = {}) {\n const { error } = schemaSubscriptionSeats.validate({\n id,\n seats,\n amount,\n user,\n });\n\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n const subscription = await getById(id);\n if (!subscription) {\n throw new Error(\"Subscription not found\");\n }\n\n if (subscription.seats === seats) {\n throw new Error(\"Failed to update subscription, no changes detected.\");\n }\n\n const userData = await getUserById(user);\n if (!userData) {\n throw new Error(\"User not found.\");\n }\n\n const session = useAtlas.getClient()?.startSession();\n if (!session) {\n throw new Error(\"Unable to start database session.\");\n }\n\n let subscriptionAmount = subscription.amount;\n\n const seatIncreased = seats > subscription.paidSeats;\n\n let paidSeats = subscription.paidSeats;\n\n if (seatIncreased) {\n subscriptionAmount += amount ?? 0;\n paidSeats = seats;\n }\n\n try {\n session.startTransaction();\n await updateById(\n id,\n { seats, amount: subscriptionAmount, paidSeats },\n session\n );\n if (seatIncreased) {\n await addTransaction(\n {\n type: \"add-seat\",\n description: `Added ${seats - subscription.paidSeats} seats.`,\n amount: amount ?? 0,\n currency: subscription.currency,\n subscription: id,\n createdBy: user,\n createdByName: `${userData.firstName} ${userData.lastName}`,\n },\n session\n );\n }\n await session.commitTransaction();\n return \"Successfully updated subscription seats.\";\n } catch (error) {\n await session.abortTransaction();\n throw error;\n } finally {\n session.endSession();\n }\n }\n\n const {\n add: addLedgerBilling,\n getByInvoice,\n updateStatusById: updateLedgerStatusById,\n } = useLedgerBillingRepo();\n const { getById: getOrgById, updateStatusById: updateOrgStatusById } =\n useOrgRepo();\n\n const { createInvoice: createPaypalInvoice, sendInvoice: sendPaypalInvoice } =\n usePaypalService();\n\n async function sendInvoice(subscription: TSubscription) {\n const session = useAtlas.getClient()?.startSession();\n if (!session) {\n throw new Error(\"Unable to start database session.\");\n }\n\n if (!subscription.org) {\n throw new Error(\"Subscription organization not found.\");\n }\n\n const orgId = String(subscription.org);\n\n try {\n session.startTransaction();\n\n const org = await getOrgById(orgId);\n\n if (!org) {\n throw new Error(\"Organization not found.\");\n }\n\n const dueDate = new Date();\n dueDate.setDate(dueDate.getDate() + 7); // Set due date 7 days from now\n\n const paypalInvoice = await createPaypalInvoice({\n email: org.email,\n amount: subscription.amount,\n currency: subscription.currency,\n title: \"Subscription Invoice\",\n dueDate: dueDate.toISOString().split(\"T\")[0],\n });\n\n const sentInvoice = await sendPaypalInvoice(paypalInvoice.id);\n\n const payerViewUrl = sentInvoice.href ?? \"\";\n\n await addLedgerBilling(\n {\n org: orgId,\n type: \"subscription\",\n description: `Subscription invoice for ${subscription.seats} seats.`,\n amount: subscription.amount,\n currency: subscription.currency,\n status: \"pending\",\n payerViewUrl,\n dueDate: dueDate,\n invoice: paypalInvoice.id,\n },\n session\n );\n\n await updateStatusById(\n subscription._id?.toString() ?? \"\",\n \"due\",\n session\n );\n\n await session.commitTransaction();\n return \"Successfully sent subscription invoice.\";\n } catch (error) {\n await session.abortTransaction();\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new Error(\"Failed to send subscription invoice.\");\n } finally {\n session.endSession();\n }\n }\n\n async function processInvoices() {\n const retry = 3;\n while (true) {\n const subscriptions = await getByStatus(\"active\", 100, retry);\n\n if (!subscriptions || subscriptions.length === 0) {\n break;\n }\n\n for (let index = 0; index < subscriptions.length; index++) {\n const subscription = subscriptions[index];\n\n // if updated today, skip\n const today = new Date();\n const nextBillingDate = new Date(subscription.updatedAt ?? \"\");\n if (\n (nextBillingDate.getFullYear() === today.getFullYear() &&\n nextBillingDate.getMonth() === today.getMonth() &&\n nextBillingDate.getDate() === today.getDate()) ||\n (subscription.retry && subscription.retry >= retry)\n ) {\n continue;\n }\n\n try {\n await sendInvoice(subscription);\n } catch (error) {\n await updateRetryById(\n subscription._id?.toString() ?? \"\",\n (subscription.retry ?? 0) + 1\n );\n\n if (subscription.status === \"active\") {\n await updateStatusById(subscription._id?.toString() ?? \"\", \"due\");\n }\n\n logger.log({\n level: \"error\",\n message: `Failed to process invoice for subscription ID ${\n subscription._id\n }: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n }\n }\n\n const { getOverdueForSuspension } = useSubscriptionRepo();\n\n async function processSuspensions() {\n const DAYS_OVERDUE = 7;\n\n while (true) {\n const subscriptions = await getOverdueForSuspension(100, DAYS_OVERDUE);\n\n if (!subscriptions || subscriptions.length === 0) {\n break;\n }\n\n for (const subscription of subscriptions) {\n const subId = subscription._id?.toString() ?? \"\";\n\n const session = useAtlas.getClient()?.startSession();\n if (!session) {\n logger.log({\n level: \"error\",\n message: `Failed to start session for subscription ${subId}`,\n });\n continue;\n }\n\n try {\n session.startTransaction();\n\n await updateStatusById(subId, \"suspended\", session);\n\n await updateRetryById(subId, 0, session);\n\n if (subscription.org) {\n await updateOrgStatusById(subscription.org, \"suspended\", session);\n }\n\n await session.commitTransaction();\n\n logger.log({\n level: \"info\",\n message: `Subscription ${subId} suspended due to non-payment after ${DAYS_OVERDUE} days.`,\n });\n } catch (error) {\n await session.abortTransaction();\n\n logger.log({\n level: \"error\",\n message: `Failed to suspend subscription ${subId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n });\n } finally {\n session.endSession();\n }\n }\n }\n }\n\n const { getDefault: getDefaultPlan } = usePlanRepo();\n\n async function processPaidInvoice(invoiceId: string) {\n const { error } = Joi.string().required().validate(invoiceId);\n if (error) {\n throw new BadRequestError(`Invalid invoice ID: ${error.message}`);\n }\n\n const ledgerBill = await getByInvoice(invoiceId);\n if (!ledgerBill) {\n throw new BadRequestError(\n \"Ledger bill not found for the given invoice ID.\"\n );\n }\n\n const orgId = String(ledgerBill.org);\n\n const org = await getOrgById(orgId);\n if (!org) {\n throw new BadRequestError(\"Organization not found for the ledger bill.\");\n }\n\n const subscription = await getByOrg(orgId);\n if (!subscription) {\n throw new BadRequestError(\"Subscription not found for the organization.\");\n }\n\n const plan = await getDefaultPlan();\n if (!plan) {\n throw new BadRequestError(\"Default plan not found.\");\n }\n\n const session = useAtlas.getClient()?.startSession();\n if (!session) {\n throw new Error(\"Unable to start database session.\");\n }\n\n try {\n session.startTransaction();\n\n const subscriptionId = String(subscription._id);\n\n const nextBillingDate = new Date();\n nextBillingDate.setMonth(nextBillingDate.getMonth() + 1);\n\n await updateById(\n subscriptionId,\n {\n status: \"active\",\n nextBillingDate,\n paidSeats: subscription.seats,\n amount: plan.price * subscription.seats,\n },\n session\n );\n\n await updateOrgStatusById(orgId, \"active\", session);\n\n await updateLedgerStatusById(String(ledgerBill._id), \"paid\", session);\n\n await session.commitTransaction();\n return \"Successfully processed paid invoice.\";\n } catch (error) {\n await session.abortTransaction();\n logger.log({\n level: \"error\",\n message: `Failed to process paid invoice ${invoiceId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n });\n\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to process paid invoice.\");\n } finally {\n session.endSession();\n }\n }\n\n /**\n * Schedule daily invoice processing at midnight\n * Cron: \"0 0 * * *\" = Every day at 00:00\n */\n function scheduleInvoiceProcessing() {\n cron.schedule(\"0 0 * * *\", async () => {\n logger.log({\n level: \"info\",\n message: \"Starting scheduled invoice processing...\",\n });\n\n try {\n await processInvoices();\n logger.log({\n level: \"info\",\n message: \"Scheduled invoice processing completed.\",\n });\n } catch (error) {\n logger.log({\n level: \"error\",\n message: `Scheduled invoice processing failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n });\n }\n });\n }\n\n /**\n * Schedule daily suspension processing at 1 AM\n * Cron: \"0 1 * * *\" = Every day at 01:00\n */\n function scheduleSuspensionProcessing() {\n cron.schedule(\"0 1 * * *\", async () => {\n logger.log({\n level: \"info\",\n message: \"Starting scheduled suspension processing...\",\n });\n\n try {\n await processSuspensions();\n logger.log({\n level: \"info\",\n message: \"Scheduled suspension processing completed.\",\n });\n } catch (error) {\n logger.log({\n level: \"error\",\n message: `Scheduled suspension processing failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n });\n }\n });\n }\n\n return {\n updateSeats,\n processInvoices,\n processSuspensions,\n scheduleInvoiceProcessing,\n scheduleSuspensionProcessing,\n processPaidInvoice,\n };\n}\n","import {\n AppError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelSubscriptionTransaction,\n TSubscriptionTransaction,\n} from \"./subscription.transaction.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function useSubscriptionTransactionRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"subscription.transactions\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: {\n subscription: 1,\n },\n name: \"subscription_index\",\n },\n {\n key: { subscription: 1, type: 1 },\n name: \"subscription_type_index\",\n },\n {\n key: { createdAt: -1 },\n name: \"createdAt_index\",\n },\n ]);\n } catch (error) {}\n }\n\n async function add(value: TSubscriptionTransaction, session?: ClientSession) {\n try {\n value = modelSubscriptionTransaction(value);\n await collection.insertOne(value, { session });\n delCachedData();\n return \"Successfully added subscription transaction.\";\n } catch (error) {\n logger.log({\n level: \"error\",\n message: `${error}`,\n });\n\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to add subscription transaction.\");\n }\n }\n\n async function getAll({ page = 1, limit = 10, search = \"\", id = \"\" } = {}) {\n page = page > 0 ? page - 1 : page;\n\n const query: Record<string, any> = {};\n const cacheKeyOptions: Record<string, any> = {\n page,\n limit,\n search,\n tag: \"getAll\",\n };\n\n try {\n query.subscription = new ObjectId(id);\n cacheKeyOptions.subscription = id;\n } catch (error) {\n throw new InternalServerError(\"Invalid organization ID.\");\n }\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n try {\n const cachedData = await getCache<TPaginate<TSubscriptionTransaction>>(\n cacheKey\n );\n if (cachedData) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll subscription transaction: ${cacheKey}`,\n });\n return cachedData;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data: TPaginate<TSubscriptionTransaction> = paginate(\n items,\n page,\n limit,\n length\n );\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll subscription transaction: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll subscription transaction: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get subscription transactions.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TSubscriptionTransaction = {\n _id?: ObjectId;\n subscription: string | ObjectId;\n amount: number;\n currency: string;\n type: \"initiate\" | \"add-seat\" | \"remove-seat\" | \"renewal\";\n description?: string;\n createdBy: string | ObjectId;\n createdByName?: string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport const schemaSubscriptionTransaction = Joi.object({\n subscription: Joi.string().hex().length(24).required(),\n amount: Joi.number().positive().required(),\n currency: Joi.string().length(3).required(),\n type: Joi.string()\n .valid(\"initiate\", \"add-seat\", \"remove-seat\", \"renewal\")\n .required(),\n description: Joi.string().max(255).optional().allow(\"\", null),\n createdBy: Joi.string().hex().length(24).required(),\n createdByName: Joi.string().optional().allow(\"\", null),\n});\n\nexport function modelSubscriptionTransaction(\n data: TSubscriptionTransaction\n): TSubscriptionTransaction {\n const { error } = schemaSubscriptionTransaction.validate(data);\n\n if (error) {\n throw new BadRequestError(\n `Invalid subscription transaction data: ${error.message}`\n );\n }\n\n if (data._id && typeof data._id === \"string\") {\n try {\n data._id = new ObjectId(data._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription transaction ID.\");\n }\n }\n\n if (data.subscription && typeof data.subscription === \"string\") {\n try {\n data.subscription = new ObjectId(data.subscription);\n } catch (error) {\n throw new BadRequestError(\"Invalid subscription ID.\");\n }\n }\n\n if (data.createdBy && typeof data.createdBy === \"string\") {\n try {\n data.createdBy = new ObjectId(data.createdBy);\n } catch (error) {\n throw new BadRequestError(\"Invalid createdBy ID.\");\n }\n }\n\n return {\n _id: data._id,\n subscription: data.subscription,\n amount: data.amount,\n currency: data.currency,\n type: data.type,\n description: data.description ?? \"\",\n createdBy: data.createdBy,\n createdByName: data.createdByName,\n createdAt: data.createdAt ?? new Date(),\n updatedAt: data.updatedAt ?? \"\",\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TLedgerBill = {\n _id?: ObjectId;\n org: string | ObjectId;\n type: \"setup-fee\" | \"subscription\";\n description: string;\n amount: number;\n currency: string;\n status: \"pending\" | \"paid\" | \"overdue\";\n billingFrom?: string | Date;\n billingTo?: string | Date;\n payerViewUrl?: string;\n invoice?: string;\n paidAt?: string | Date; // only if completed\n dueDate?: string | Date; // required for pending/overdue\n createdAt?: string | Date;\n};\n\nexport const ledgerBillTypes = [\"setup-fee\", \"subscription\"];\nexport const ledgerBillStatuses = [\"pending\", \"paid\", \"overdue\"];\n\nexport const schemaLedgerBill = Joi.object({\n org: Joi.string().hex().length(24).required(),\n type: Joi.string()\n .valid(...ledgerBillTypes)\n .required(),\n description: Joi.string().max(255).required(),\n amount: Joi.number().positive().required(),\n currency: Joi.string().length(3).required(),\n status: Joi.string()\n .valid(...ledgerBillStatuses)\n .required(),\n billingFrom: Joi.date().optional().allow(\"\", null),\n billingTo: Joi.date().optional().allow(\"\", null),\n payerViewUrl: Joi.string().uri().optional().allow(\"\", null),\n paidAt: Joi.date().optional().allow(\"\", null),\n dueDate: Joi.date().optional().allow(\"\", null),\n invoice: Joi.string().optional().allow(\"\", null),\n});\n\nexport const schemaLedgerBillingSummary = Joi.object({\n status: Joi.string()\n .valid(...ledgerBillStatuses)\n .required(),\n org: Joi.string().hex().length(24).required(),\n});\n\nexport function modelLedgerBill(value: TLedgerBill): TLedgerBill {\n const { error } = schemaLedgerBill.validate(value);\n if (error) {\n throw new Error(`Ledger bill model validation error: ${error.message}`);\n }\n\n try {\n value.org = new ObjectId(value.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n\n return {\n _id: value._id,\n org: value.org,\n type: value.type,\n description: value.description,\n amount: value.amount,\n currency: value.currency,\n status: value.status,\n billingFrom: value.billingFrom ?? \"\",\n billingTo: value.billingTo ?? \"\",\n payerViewUrl: value.payerViewUrl ?? \"\",\n paidAt: value.paidAt ?? \"\",\n dueDate: value.dueDate ?? \"\",\n invoice: value.invoice ?? \"\",\n createdAt: value.createdAt ?? new Date(),\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n modelLedgerBill,\n schemaLedgerBillingSummary,\n TLedgerBill,\n} from \"./ledger.billing.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport Joi from \"joi\";\n\nexport function useLedgerBillingRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"ledger.billings\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { org: 1 } },\n { key: { status: 1 } },\n { key: { description: \"text\" }, name: \"text_index\" },\n ]);\n return \"Successfully created ledger billing indexes.\";\n } catch (error) {\n throw new BadRequestError(\"Failed to create ledger billing indexes.\");\n }\n }\n\n async function add(value: TLedgerBill, session?: ClientSession) {\n try {\n value = modelLedgerBill(value);\n const result = await collection.insertOne(value, { session });\n delCachedData();\n return result.insertedId;\n } catch (error: any) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new BadRequestError(\n `Failed to add ledger billing: ${error.message}`\n );\n }\n }\n\n async function getAll({\n org = \"\",\n search = \"\",\n page = 1,\n limit = 10,\n status = \"\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status: { $ne: \"deleted\" } };\n const cacheKeyOptions: Record<string, any> = {\n search,\n page,\n limit,\n tag: \"getAll\",\n };\n\n try {\n query.org = new ObjectId(org);\n cacheKeyOptions.org = org;\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n\n if (status) {\n query.status = status;\n cacheKeyOptions.status = status;\n }\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll ledger billings: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll ledger billings: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll ledger billings: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll ledger billings: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid ledger billing ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ledger billing ID.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: String(_id),\n tag: \"getById\",\n });\n const cachedData = await getCache<TLedgerBill>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TLedgerBill>({\n _id,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getById ledger billing: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getById ledger billing: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get ledger billing.\");\n }\n }\n\n async function getByInvoice(invoice: string) {\n const { error } = Joi.string().required().validate(invoice);\n if (error) {\n throw new Error(`Invalid ledger billing invoice: ${error.message}`);\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n invoice,\n tag: \"getByInvoice\",\n });\n const cachedData = await getCache<TLedgerBill>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TLedgerBill>({\n invoice,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getByInvoice ledger billing: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getByInvoice ledger billing: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get ledger billing by invoice.\");\n }\n }\n\n async function updateStatusById(\n _id: string | ObjectId,\n status: string,\n session?: ClientSession\n ) {\n const { error } = Joi.object({\n _id: Joi.string().hex().length(24).required(),\n status: Joi.string()\n .valid(\"pending\", \"paid\", \"overdue\", \"deleted\")\n .required(),\n }).validate({ _id, status });\n\n if (error) {\n throw new Error(`Invalid ledger billing ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ledger billing ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { status } },\n { session }\n );\n delCachedData();\n return result.modifiedCount > 0;\n } catch (error: any) {\n throw new BadRequestError(\n `Failed to update ledger billing status: ${error.message}`\n );\n }\n }\n\n async function getSummary(status: string, org: string | ObjectId) {\n const { error } = schemaLedgerBillingSummary.validate({ status, org });\n if (error) {\n throw new Error(`Invalid ledger billing ID: ${error.message}`);\n }\n\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid ledger billing org.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n org: String(org),\n status,\n tag: \"getSummaryByOrgStatus\",\n });\n const cachedData = await getCache<TLedgerBill>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection\n .aggregate([\n { $match: { org, status } },\n {\n $group: {\n _id: \"$status\",\n totalAmount: { $sum: \"$amount\" },\n count: { $sum: 1 },\n },\n },\n ])\n .toArray();\n\n setCache(cacheKey, data[0])\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for ledger billing summary: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for ledger billing summary: ${err.message}`,\n });\n });\n\n return data[0];\n } catch (error) {\n throw new InternalServerError(\"Failed to get ledger billing summary.\");\n }\n }\n\n return {\n delCachedData,\n createIndexes,\n add,\n getAll,\n getById,\n getByInvoice,\n getSummary,\n updateStatusById,\n };\n}\n","import { useLedgerBillingRepo } from \"./ledger.billing.repository\";\nimport { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport { schemaLedgerBillingSummary } from \"./ledger.billing.model\";\n\nexport function useLedgerBillingController() {\n const {\n getAll: _getAll,\n getById: _getById,\n getSummary: _getSummary,\n } = useLedgerBillingRepo();\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const query = req.query;\n\n const validation = Joi.object({\n org: Joi.string().hex().optional().allow(\"\", null),\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 status: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(query);\n\n const page =\n typeof req.query.page === \"string\" ? Number(req.query.page) : 1;\n const limit =\n typeof req.query.limit === \"string\" ? Number(req.query.limit) : 10;\n const search = (req.query.search as string) ?? \"\";\n const org = (req.query.org as string) ?? \"\";\n const status = (req.query.status as string) ?? \"\";\n\n const isPageNumber = isFinite(page);\n if (!isPageNumber) {\n next(new BadRequestError(\"Invalid page number.\"));\n return;\n }\n\n const isLimitNumber = isFinite(limit);\n\n if (!isLimitNumber) {\n next(new BadRequestError(\"Invalid limit number.\"));\n return;\n }\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const orgs = await _getAll({ org, page, limit, search, status });\n res.json(orgs);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const org = await _getById(id);\n res.json(org);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getSummary(req: Request, res: Response, next: NextFunction) {\n const params = req.params;\n\n const { error } = schemaLedgerBillingSummary.validate(params);\n const org = (req.params.org as string) ?? \"\";\n const status = (req.params.status as string) ?? \"\";\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const summary = await _getSummary(status, org);\n res.json(summary);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n getAll,\n getById,\n getSummary,\n };\n}\n","import { AppError, BadRequestError } from \"@goweekdays/utils\";\nimport { Octokit } from \"@octokit/rest\";\nimport _sodium from \"libsodium-wrappers\";\n\nexport function useGitHubService() {\n // Helper: parse repo URL\n function parseRepoUrl(url: string) {\n const match = url.match(/github\\.com[:\\/]([^\\/]+)\\/(.+)\\.git$/);\n if (!match) throw new Error(\"Invalid GitHub repo URL\");\n return { owner: match[1], repo: match[2] };\n }\n\n // Helper: check admin permissions\n async function checkAdminPermission(\n owner: string,\n repo: string,\n octokit: Octokit\n ) {\n try {\n const { data: repoData } = await octokit.repos.get({ owner, repo });\n if (!repoData.permissions?.admin) {\n throw new BadRequestError(\n \"You do not have admin access to this repository.\"\n );\n }\n } catch (error: any) {\n if (error.status === 404) {\n throw new BadRequestError(\n \"Repository not found or you don't have access to it.\"\n );\n } else if (error.status === 401) {\n throw new BadRequestError(\n \"Invalid GitHub token or insufficient permissions.\"\n );\n } else if (error.message.includes(\"admin access\")) {\n throw error; // Re-throw our custom admin access error\n } else {\n throw new BadRequestError(\n `Failed to check repository permissions: ${error.message}`\n );\n }\n }\n }\n\n // Set environment variables or secrets\n async function setVariables(params: {\n githubToken: string;\n repoUrl: string;\n environment: string;\n type: \"env\" | \"secret\";\n keyValues: string; // multiple lines: KEY=value\n }) {\n try {\n const { githubToken, repoUrl, environment, type, keyValues } = params;\n\n // Create Octokit instance with the provided token\n const octokit = new Octokit({ auth: githubToken });\n const { owner, repo } = parseRepoUrl(repoUrl);\n\n // Check admin permission first\n await checkAdminPermission(owner, repo, octokit);\n\n // Split by various whitespace characters (newlines, spaces, tabs) and filter out empty entries\n const lines = keyValues\n .split(/[\\n\\r\\s\\t]+/)\n .map((l) => l.trim())\n .filter(Boolean);\n\n for (const line of lines) {\n const equalIndex = line.indexOf(\"=\");\n if (equalIndex === -1) continue; // Skip lines without =\n\n const key = line.substring(0, equalIndex).trim();\n const value = line.substring(equalIndex + 1).trim();\n if (!key || !value) continue;\n\n if (type === \"secret\") {\n // Get environment public key\n const { data: publicKeyRes } =\n await octokit.actions.getEnvironmentPublicKey({\n owner,\n repo,\n environment_name: environment,\n });\n\n try {\n // Ensure libsodium is ready\n await _sodium.ready;\n const sodium = _sodium;\n\n // Convert GitHub's base64 public key to Uint8Array\n const publicKeyBase64 = publicKeyRes.key;\n if (!publicKeyBase64) {\n throw new Error(\"No public key received from GitHub\");\n }\n\n // Use Buffer for more reliable base64 decoding\n const keyBytes = new Uint8Array(\n Buffer.from(publicKeyBase64, \"base64\")\n );\n const valueBytes = new Uint8Array(Buffer.from(value, \"utf8\"));\n\n // Encrypt using libsodium sealed box\n const encryptedBytes = sodium.crypto_box_seal(valueBytes, keyBytes);\n const encryptedValue =\n Buffer.from(encryptedBytes).toString(\"base64\");\n\n await octokit.actions.createOrUpdateEnvironmentSecret({\n owner,\n repo,\n environment_name: environment,\n secret_name: key,\n encrypted_value: encryptedValue,\n key_id: publicKeyRes.key_id,\n });\n } catch (encryptionError: any) {\n throw new BadRequestError(\n `Failed to encrypt secret '${key}': ${encryptionError.message}`\n );\n }\n } else if (type === \"env\") {\n // Create or update environment variable (plain)\n try {\n // Try to update first (if variable exists)\n await octokit.actions.updateEnvironmentVariable({\n owner,\n repo,\n environment_name: environment,\n name: key,\n value,\n });\n } catch (updateError: any) {\n if (updateError.status === 404) {\n // Variable doesn't exist, create it\n await octokit.actions.createEnvironmentVariable({\n owner,\n repo,\n environment_name: environment,\n name: key,\n value,\n });\n } else {\n // Re-throw other errors\n throw updateError;\n }\n }\n }\n }\n\n return `Successfully set ${lines.length} ${type} variables/secrets in environment '${environment}'`;\n } catch (error: any) {\n if (error instanceof AppError) throw error;\n\n // Handle specific GitHub API errors\n if (error.status === 422) {\n throw new BadRequestError(\n `GitHub API validation error: ${error.message}`\n );\n } else if (error.status === 404) {\n throw new BadRequestError(\"Environment or repository not found.\");\n } else if (error.status === 403) {\n throw new BadRequestError(\n \"Forbidden: Insufficient permissions or rate limit exceeded.\"\n );\n } else if (\n error.message.includes(\"admin access\") ||\n error.message.includes(\"permissions\")\n ) {\n throw error; // Re-throw permission-related errors as-is\n } else {\n throw new BadRequestError(\n `Failed to set GitHub variables: ${error.message}`\n );\n }\n }\n }\n\n return {\n setVariables,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useGitHubService } from \"./github.service\";\nimport {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n} from \"@goweekdays/utils\";\nimport { usePaypalService } from \"./paypal.service\";\nimport { PAYPAL_WEBHOOK_ID } from \"../../config\";\nimport { useOrgService } from \"../organization\";\nimport { useSubscriptionService } from \"../subscription\";\n\nexport function useUtilController() {\n async function healthCheck(req: Request, res: Response, next: NextFunction) {\n try {\n res.status(200).json({\n success: true,\n message: \"Util service is healthy\",\n timestamp: new Date().toISOString(),\n data: {\n availableEndpoints: [\n \"POST /github/variables - Set GitHub environment variables or secrets\",\n ],\n keyValueFormat: \"KEY=value pairs separated by semicolons\",\n },\n });\n } catch (error: any) {\n logger.error(\"Health check failed\", { error: error.message });\n next(new InternalServerError(\"Health check failed\"));\n }\n }\n\n async function setGitHubVariables(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n const { githubToken, repoUrl, environment, type, keyValues } = req.body;\n\n // Validation schema\n const validation = Joi.object({\n githubToken: Joi.string().required().messages({\n \"string.empty\": \"GitHub token is required\",\n \"any.required\": \"GitHub token is required\",\n }),\n repoUrl: Joi.string().uri().required().messages({\n \"string.empty\": \"Repository URL is required\",\n \"string.uri\": \"Repository URL must be a valid URL\",\n \"any.required\": \"Repository URL is required\",\n }),\n environment: Joi.string().required().messages({\n \"string.empty\": \"Environment name is required\",\n \"any.required\": \"Environment name is required\",\n }),\n type: Joi.string().valid(\"env\", \"secret\").required().messages({\n \"any.only\": 'Type must be either \"env\" or \"secret\"',\n \"any.required\": \"Type is required\",\n }),\n keyValues: Joi.string().required().messages({\n \"string.empty\": \"Key-value pairs are required\",\n \"any.required\": \"Key-value pairs are required\",\n }),\n });\n\n const { error } = validation.validate({\n githubToken,\n repoUrl,\n environment,\n type,\n keyValues,\n });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n // Validate GitHub repo URL format\n const repoUrlPattern = /github\\.com[:\\/]([^\\/]+)\\/(.+)\\.git$/;\n if (!repoUrlPattern.test(repoUrl)) {\n next(\n new BadRequestError(\n \"Invalid GitHub repository URL format. Expected format: https://github.com/owner/repo.git\"\n )\n );\n return;\n }\n\n // Validate key-value pairs format (support semicolons as separators)\n const lines = keyValues\n .split(\";\")\n .map((l: string) => l.trim())\n .filter(Boolean);\n const invalidLines = lines.filter(\n (line: string) => !line.includes(\"=\") || line.indexOf(\"=\") === -1\n );\n if (invalidLines.length > 0) {\n next(\n new BadRequestError(\n \"Invalid key-value format. Each pair should be in format: KEY=value. Pairs should be separated by semicolons.\"\n )\n );\n return;\n }\n\n const githubService = useGitHubService();\n const result = await githubService.setVariables({\n githubToken,\n repoUrl,\n environment,\n type: type as \"env\" | \"secret\",\n keyValues,\n });\n\n logger.info(`GitHub variables set successfully`, {\n repoUrl,\n environment,\n type,\n count: lines.length,\n });\n\n res.status(200).json({\n success: true,\n message: result,\n data: {\n repoUrl,\n environment,\n type,\n variablesSet: lines.length,\n },\n });\n } catch (error: any) {\n logger.error(\"Failed to set GitHub variables\", {\n error: error.message,\n stack: error.stack,\n });\n\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(\n `Failed to set GitHub variables: ${error.message}`\n )\n );\n }\n }\n }\n\n const { verifySignature, captureOrder } = usePaypalService();\n\n const { addWithVerification } = useOrgService();\n\n const { processPaidInvoice } = useSubscriptionService();\n\n async function paypalWebhook(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n const isSignatureValid = await verifySignature(\n req.body,\n req.headers as any,\n PAYPAL_WEBHOOK_ID\n );\n\n if (isSignatureValid) {\n const payload = JSON.parse(req.body);\n const eventType = payload.event_type;\n const resource = payload.resource;\n\n console.log(\"EVENT:\", eventType);\n\n switch (eventType) {\n case \"CHECKOUT.ORDER.APPROVED\": {\n const orderId = resource.id;\n await captureOrder(orderId);\n\n break;\n }\n case \"PAYMENT.CAPTURE.COMPLETED\": {\n const customId =\n resource?.custom_id || resource?.purchase_units?.[0]?.custom_id;\n\n if (!customId) {\n throw new Error(\"Missing PayPal customId\");\n }\n\n await addWithVerification(customId);\n\n break;\n }\n case \"INVOICING.INVOICE.PAID\": {\n const invoiceId = resource.invoice.id ?? \"\";\n if (!invoiceId) {\n throw new Error(\"Missing PayPal invoice ID\");\n }\n\n logger.log({\n level: \"info\",\n message: `Processing paid invoice from PayPal webhook: ${invoiceId}`,\n });\n\n await processPaidInvoice(invoiceId);\n break;\n }\n default:\n break;\n }\n } else {\n next(new BadRequestError(\"Invalid PayPal webhook signature.\"));\n return;\n }\n\n // Return a 200 response to mark successful webhook delivery\n res.sendStatus(200);\n return;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: `${error}`,\n });\n next(new InternalServerError(`PayPal webhook error: ${error.message}`));\n }\n }\n\n return {\n healthCheck,\n setGitHubVariables,\n paypalWebhook,\n };\n}\n","import {\n Client,\n Environment,\n OrdersController,\n CheckoutPaymentIntent,\n OrderApplicationContextUserAction,\n} from \"@paypal/paypal-server-sdk\";\nimport crypto from \"crypto\";\nimport crc32 from \"buffer-crc32\";\nimport {\n isDev,\n PAYPAL_API_URL,\n PAYPAL_CLIENT_ID,\n PAYPAL_CLIENT_SECRET,\n PAYPAL_WEBHOOK_ID,\n} from \"../../config\";\nimport { logger } from \"@goweekdays/utils\";\nimport { useSubscriptionRepo } from \"../subscription\";\nimport Joi from \"joi\";\n\nexport interface PaypalWebhookHeaders {\n \"paypal-auth-algo\"?: string;\n \"paypal-cert-url\": string;\n \"paypal-transmission-id\": string;\n \"paypal-transmission-sig\": string;\n \"paypal-transmission-time\": string;\n}\n\n// Cache for downloaded certificates\nconst certCache: Map<string, string> = new Map();\n\nexport function usePaypalService() {\n async function getToken() {\n const auth = Buffer.from(\n `${process.env.PAYPAL_CLIENT_ID}:${process.env.PAYPAL_CLIENT_SECRET}`\n ).toString(\"base64\");\n\n const res = await fetch(`${PAYPAL_API_URL}/v1/oauth2/token`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${auth}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: \"grant_type=client_credentials\",\n });\n\n const data = await res.json();\n return data.access_token as string;\n }\n\n const paypalClient = new Client({\n clientCredentialsAuthCredentials: {\n oAuthClientId: PAYPAL_CLIENT_ID,\n oAuthClientSecret: PAYPAL_CLIENT_SECRET,\n },\n timeout: 0,\n environment: isDev ? Environment.Sandbox : Environment.Production,\n });\n\n function addOrder({\n amount = 0,\n currency = \"PHP\",\n customId = \"\",\n returnUrl = \"\",\n cancelUrl = \"\",\n action = \"pay\",\n } = {}) {\n return new OrdersController(paypalClient).createOrder({\n body: {\n intent: CheckoutPaymentIntent.Capture,\n purchaseUnits: [\n {\n amount: {\n currencyCode: currency,\n value: amount.toFixed(2),\n },\n customId,\n },\n ],\n applicationContext: {\n returnUrl,\n cancelUrl,\n userAction:\n action === \"pay\"\n ? OrderApplicationContextUserAction.PayNow\n : action === \"continue\"\n ? OrderApplicationContextUserAction.Continue\n : undefined,\n },\n },\n prefer: \"return=minimal\",\n });\n }\n\n function captureOrder(id: string) {\n return new OrdersController(paypalClient).captureOrder({ id });\n }\n\n async function createInvoice(value: {\n email: string;\n amount: number;\n currency: string;\n note?: string;\n title: string;\n dueDate?: string;\n }) {\n const validation = Joi.object({\n email: Joi.string().email().required(),\n amount: Joi.number().positive().required(),\n currency: Joi.string().length(3).required(),\n note: Joi.string().max(255).optional().allow(\"\", null),\n title: Joi.string().max(255).required(),\n dueDate: Joi.string().isoDate().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(value);\n if (error) {\n throw new Error(`Invalid invoice data: ${error.message}`);\n }\n\n try {\n const token = await getToken();\n const res = await fetch(`${PAYPAL_API_URL}/v2/invoicing/invoices`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n Prefer: \"return=representation\",\n },\n body: JSON.stringify({\n detail: {\n currency_code: value.currency,\n note: \"Subscription invoice\",\n ...(value.dueDate && {\n payment_term: {\n due_date: value.dueDate.slice(0, 10),\n term_type: \"DUE_ON_DATE_SPECIFIED\",\n },\n }),\n },\n invoicer: {\n name: { given_name: \"GoWeekdays\" },\n },\n primary_recipients: [\n {\n billing_info: {\n email_address: value.email,\n },\n },\n ],\n items: [\n {\n name: value.title,\n quantity: \"1\",\n unit_amount: {\n currency_code: value.currency,\n value: value.amount.toFixed(2),\n },\n },\n ],\n }),\n });\n\n return res.json();\n } catch (error) {\n throw error;\n }\n }\n\n async function sendInvoice(invoiceId: string) {\n try {\n const token = await getToken();\n const res = await fetch(\n `${PAYPAL_API_URL}/v2/invoicing/invoices/${invoiceId}/send`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n Prefer: \"return=representation\",\n },\n }\n );\n\n return res.json();\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Downloads and caches a PayPal certificate from the given URL.\n * @param url - The URL of the certificate to download\n * @returns The certificate PEM content\n */\n async function downloadAndCacheCert(url: string): Promise<string> {\n // Check if certificate is already cached\n const cachedCert = certCache.get(url);\n if (cachedCert) {\n return cachedCert;\n }\n\n // Download the certificate\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `Failed to download PayPal certificate: ${response.statusText}`\n );\n }\n\n const certPem = await response.text();\n certCache.set(url, certPem);\n\n return certPem;\n }\n\n /**\n * Verifies a PayPal webhook signature locally using cryptographic verification.\n * This validates that the webhook notification is authentic and was sent by PayPal.\n *\n * @param rawBody - The raw webhook event body as a Buffer or string\n * @param headers - The PayPal webhook headers from the incoming request\n * @param webhookId - Optional webhook ID, defaults to PAYPAL_WEBHOOK_ID from config\n * @returns Promise resolving to true if signature is valid, false otherwise\n */\n async function verifySignature(\n rawBody: Buffer | string,\n headers: PaypalWebhookHeaders,\n webhookId: string = PAYPAL_WEBHOOK_ID\n ): Promise<boolean> {\n const transmissionId = headers[\"paypal-transmission-id\"];\n const timeStamp = headers[\"paypal-transmission-time\"];\n const certUrl = headers[\"paypal-cert-url\"];\n const transmissionSig = headers[\"paypal-transmission-sig\"];\n\n if (!transmissionId || !timeStamp || !certUrl || !transmissionSig) {\n logger.log({\n level: \"error\",\n message: \"Missing required PayPal webhook headers\",\n });\n return false;\n }\n\n // Calculate CRC32 of raw event data, hex to decimal (matching PayPal reference implementation)\n const crc = parseInt(\"0x\" + crc32(rawBody).toString(\"hex\"));\n\n // Construct the expected signed message\n const message = `${transmissionId}|${timeStamp}|${webhookId}|${crc}`;\n\n try {\n // Download the PayPal certificate\n const certPem = await downloadAndCacheCert(certUrl);\n\n // Create buffer from base64-encoded signature\n const signatureBuffer = Buffer.from(transmissionSig, \"base64\");\n\n // Create a verification object and verify the signature\n const verifier = crypto.createVerify(\"SHA256\");\n verifier.update(message);\n\n return verifier.verify(certPem, signatureBuffer);\n } catch (error) {\n logger.log({\n level: \"error\",\n message: `PayPal webhook verification error: ${error}`,\n });\n throw new Error(\"Failed to verify PayPal webhook signature.\");\n }\n }\n\n return {\n addOrder,\n captureOrder,\n verifySignature,\n createInvoice,\n sendInvoice,\n };\n}\n","import Joi from \"joi\";\n\nexport const transactionSchema = Joi.object({\n _id: Joi.string().hex().optional().allow(\"\", null),\n payment: Joi.string().required(),\n user: Joi.string().hex().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n type: Joi.string().required(),\n amount: Joi.number().positive().min(0).required(),\n currency: Joi.string().required(),\n description: Joi.string().optional().allow(\"\", null),\n metadata: Joi.object({\n subscriptionId: Joi.string().hex().optional().allow(\"\", null),\n cycle: Joi.number().optional().allow(\"\", null),\n seats: Joi.number().optional().allow(\"\", null),\n promoCode: Joi.string().optional().allow(\"\", null),\n })\n .optional()\n .allow(\"\", null),\n status: Joi.string().optional().allow(\"\", null),\n createdAt: Joi.string().optional().allow(\"\", null),\n updatedAt: Joi.string().optional().allow(\"\", null),\n deletedAt: Joi.string().optional().allow(\"\", null),\n});\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TPlan = {\n _id?: ObjectId;\n name: string;\n description?: string;\n features?: string[];\n price: number;\n currency: string;\n billingCycle: \"monthly\" | \"yearly\";\n default?: boolean;\n status?: \"active\" | \"inactive\";\n createdAt?: Date | string;\n updatedAt?: Date | string;\n};\n\nexport const currencies = [\"USD\", \"PHP\"];\n\nexport const schemaPlan = Joi.object({\n name: Joi.string().min(3).max(100).required(),\n description: Joi.string().max(255).optional().allow(\"\", null),\n features: Joi.array().items(Joi.string().max(100)).optional(),\n price: Joi.number().positive().required(),\n currency: Joi.string()\n .length(3)\n .allow(...currencies)\n .required(),\n default: Joi.boolean().optional().allow(null, \"\"),\n billingCycle: Joi.string().valid(\"monthly\", \"yearly\").required(),\n});\n\nexport function modelPlan(data: any): TPlan {\n const { error } = schemaPlan.validate(data);\n\n if (error) {\n throw new Error(`Invalid plan data: ${error.message}`);\n }\n\n return {\n _id: data._id,\n name: data.name,\n description: data.description,\n features: data.features,\n price: data.price,\n currency: data.currency,\n billingCycle: data.billingCycle,\n status: data.status ?? \"active\",\n default: data.default ?? false,\n createdAt: data.createdAt ?? new Date(),\n updatedAt: data.updatedAt ?? \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { modelPlan, TPlan } from \"./plan.model\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport function usePlanRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"plans\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: {\n status: 1,\n },\n },\n {\n key: {\n name: 1,\n },\n },\n {\n key: { billingCycle: 1 },\n },\n {\n key: { name: \"text\", description: \"text\" },\n name: \"name_description_text_index\",\n },\n {\n key: { name: 1, status: 1 },\n partialFilterExpression: { status: \"active\" },\n unique: true,\n name: \"unique_name_index\",\n },\n {\n key: { default: 1 },\n unique: true,\n partialFilterExpression: { status: \"active\" },\n },\n ]);\n } catch (error) {}\n }\n\n async function add(value: TPlan) {\n try {\n value = modelPlan(value);\n await collection.insertOne(value);\n delCachedData();\n return \"Successfully added plan.\";\n } catch (error: any) {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Plan name already exist.\");\n }\n\n throw new InternalServerError(\"Failed to add plan.\");\n }\n }\n\n async function getAll({\n page = 1,\n limit = 10,\n search = \"\",\n status = \"active\",\n } = {}) {\n page = page < 1 ? page - 1 : page;\n\n const query: Record<string, any> = { status };\n const cacheKeyOptions: Record<string, any> = {\n page,\n limit,\n search,\n status,\n tag: \"getAll\",\n };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n try {\n const cachedData = await getCache<TPaginate<TPlan>>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data: TPaginate<TPlan> = paginate(items, page, limit, length);\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll plan: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll plan: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get plans.\");\n }\n }\n\n async function getById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid plan ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid plan ID.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: String(_id),\n tag: \"getById\",\n });\n const cachedData = await getCache<TPlan>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TPlan>({\n _id,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getById plan: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getById plan: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get plan.\");\n }\n }\n\n async function getDefault() {\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n default: true,\n tag: \"getDefault\",\n });\n const cachedData = await getCache<TPlan>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TPlan>({\n default: true,\n status: \"active\",\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for default plan: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for default plan: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get default plan.\");\n }\n }\n\n async function deleteById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid plan ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid plan ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\" } }\n );\n\n if (result.modifiedCount === 0) {\n throw new InternalServerError(\"Failed to delete plan.\");\n }\n\n delCachedData();\n return \"Successfully deleted plan.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to delete plan.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n getDefault,\n deleteById,\n };\n}\n","import { usePlanRepo } from \"./plan.repository\";\n\nexport function usePlanService() {\n const { add } = usePlanRepo();\n\n async function addDefaultPlan() {\n try {\n await add({\n name: \"Standard\",\n description: \"Default standard plan\",\n price: 1000,\n currency: \"PHP\",\n billingCycle: \"monthly\",\n default: true,\n });\n } catch (error) {\n throw error;\n }\n }\n\n return {\n addDefaultPlan,\n };\n}\n","import Joi from \"joi\";\nimport { usePlanRepo } from \"./plan.repository\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\n\nexport function usePlanController() {\n const {\n add: _add,\n getAll: _getAll,\n getById: _getById,\n deleteById: _deleteById,\n getDefault: _getDefault,\n } = usePlanRepo();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const validation = Joi.object({\n name: Joi.string().min(3).max(100).required(),\n description: Joi.string().max(255).optional().allow(\"\", null),\n features: Joi.array().items(Joi.string().max(100)).optional(),\n price: Joi.number().positive().required(),\n currency: Joi.string().length(3).required(),\n billingCycle: Joi.string().valid(\"monthly\", \"yearly\").required(),\n });\n\n const { error } = validation.validate(value);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _add(value);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const status = (req.query.status as string) ?? \"active\";\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n const limit = Number(req.query.limit) ?? 10;\n\n const validation = Joi.object({\n status: Joi.string().required(),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n limit: Joi.number().required(),\n });\n\n const { error } = validation.validate({ status, search, page, limit });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const plans = await _getAll({ status, search, page, limit });\n res.json(plans);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id as string;\n\n const validation = Joi.string().hex().length(24).required();\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const plan = await _getById(id);\n res.json(plan);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id as string;\n\n const validation = Joi.string().hex().length(24).required();\n const { error } = validation.validate(id);\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 getDefault(req: Request, res: Response, next: NextFunction) {\n try {\n const plan = await _getDefault();\n res.json(plan);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n add,\n getAll,\n getById,\n deleteById,\n getDefault,\n };\n}\n","import Joi from \"joi\";\nimport { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport { useSubscriptionTransactionRepo } from \"./subscription.transaction.repository\";\n\nexport function useSubscriptionTransactionController() {\n const { getAll: _getAll } = useSubscriptionTransactionRepo();\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.object({\n id: Joi.string().hex().length(24).required(),\n page: Joi.number().min(1).max(100).optional().allow(null, \"\").default(1),\n limit: Joi.number()\n .min(1)\n .max(100)\n .optional()\n .allow(null, \"\")\n .default(10),\n });\n\n const query = req.query;\n const id = (req.params.id as string) ?? \"\";\n\n const { error, value } = validation.validate({ ...query, id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getAll(value);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n getAll,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useVerificationService } from \"./verification.service\";\nimport { useVerificationRepo } from \"./verification.repository\";\nimport { schemaInviteMember } from \"./verification.model\";\nimport { schemaOrgAdd } from \"../organization\";\n\nexport function useVerificationController() {\n const {\n createUserInvite: _createUserInvite,\n createForgetPassword: _createForgetPassword,\n cancelUserInvitation: _cancelUserInvitation,\n verify: _verify,\n inviteMember: _inviteMember,\n signUp: _signUp,\n cancelInviteMember: _cancelInviteMember,\n forgetPassword: _forgetPassword,\n orgSetupFee: _orgSetupFee,\n } = useVerificationService();\n\n const { getVerifications: _getVerifications } = useVerificationRepo();\n\n async function createUserInvite(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const validation = Joi.object({\n email: Joi.string().email().required(),\n app: Joi.string().required(),\n role: Joi.string().hex().required(),\n roleName: Joi.string().required(),\n org: Joi.string().hex().optional().optional().allow(\"\", null),\n orgName: Joi.string().optional().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const email = (req.body.email as string) ?? \"\";\n const app = (req.body.app as string) ?? \"\";\n const role = (req.body.role as string) ?? \"\";\n const roleName = (req.body.roleName as string) ?? \"\";\n const org = (req.body.org as string) ?? \"\";\n const orgName = (req.body.orgName as string) ?? \"\";\n\n try {\n await _createUserInvite({\n email,\n metadata: {\n app,\n role,\n roleName,\n org,\n orgName,\n },\n });\n\n res.json({ message: \"Successfully invited user.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function createForgetPassword(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const email = (req.body.email as string) || \"\";\n\n const validation = Joi.string().email().required();\n\n const { error } = validation.validate(email);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createForgetPassword(email);\n res.json({\n message:\n \"Check your email to verify it before resetting your password.\",\n });\n return;\n } catch (error) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(\"An unexpected error occurred\"));\n }\n }\n }\n\n async function getVerifications(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const validation = Joi.object({\n status: Joi.string().required(),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n type: Joi.string().optional().allow(\"\", null),\n email: Joi.string().optional().allow(\"\", null),\n app: Joi.string().optional().allow(\"\", null),\n org: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(req.query);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const status = (req.query.status as string) ?? \"\";\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n let type = (req.query.type as string) ?? \"\";\n const email = (req.query.email as string) ?? \"\";\n const app = (req.query.app as string) ?? \"\";\n const org = (req.query.org as string) ?? \"\";\n\n const hasMultipleTypes = type.includes(\",\");\n\n let splitType: Array<string> = [];\n\n if (hasMultipleTypes) {\n splitType = type.split(\",\");\n }\n\n try {\n const items = await _getVerifications({\n status,\n search,\n page,\n type: hasMultipleTypes ? splitType : type,\n email,\n app,\n org,\n });\n res.json(items);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function verify(req: Request, res: Response, next: NextFunction) {\n const id = (req.params.id as string) || \"\";\n\n const validation = Joi.string().hex().required();\n\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _verify(id);\n res.json(message);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function cancelUserInvitation(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const otpId = (req.params.id as string) || \"\";\n\n const validation = Joi.string().hex().required();\n\n const { error } = validation.validate(otpId);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _cancelUserInvitation(otpId);\n return res.json({\n message: \"User invite has been cancelled.\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n async function signUp(req: Request, res: Response, next: NextFunction) {\n const validation = Joi.string().email().required();\n\n const { error } = validation.validate(req.body.email);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const email = (req.body.email as string) ?? \"\";\n\n try {\n await _signUp({ email });\n res.json({ message: \"Successfully signed up user.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function inviteMember(req: Request, res: Response, next: NextFunction) {\n const { error } = schemaInviteMember.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _inviteMember(req.body);\n res.json({ message: \"Successfully invited member.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function cancelInviteMember(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const id = (req.params.id as string) || \"\";\n\n const validation = Joi.string().hex().required();\n\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _cancelInviteMember(id);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function forgetPassword(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const email = (req.body.email as string) ?? \"\";\n\n const validation = Joi.string().email().required();\n\n const { error } = validation.validate(email);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _forgetPassword(email);\n res.json({\n message,\n });\n return;\n } catch (error) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(\"An unexpected error occurred\"));\n }\n }\n }\n\n async function orgSetupFee(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaOrgAdd.validate(value);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _orgSetupFee(value);\n\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n getVerifications,\n createUserInvite,\n createForgetPassword,\n verify,\n cancelUserInvitation,\n inviteMember,\n signUp,\n cancelInviteMember,\n forgetPassword,\n orgSetupFee,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { useOrgService } from \"./organization.service\";\nimport { useMemberRepo } from \"../member/member.repository\";\nimport { useOrgRepo } from \"./organization.repository\";\nimport { schemaOrgAdd, schemaOrgUpdate } from \"./organization.model\";\n\nexport function useOrgController() {\n const { add: _add } = useOrgService();\n const { getOrgsByMembership } = useMemberRepo();\n const {\n getByName: _getByName,\n getAll: getAllOrg,\n getById: _getById,\n updateById: _updateById,\n } = useOrgRepo();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaOrgAdd.validate(value);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _add(value);\n\n res.json({\n message: \"Organization created successfully.\",\n data,\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getOrgsByUserId(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const page =\n typeof req.query.page === \"string\" ? Number(req.query.page) : 1;\n const limit =\n typeof req.query.limit === \"string\" ? Number(req.query.limit) : 10;\n const search = (req.query.search as string) ?? \"\";\n\n const user = (req.params.user as string) ?? \"\";\n\n const isPageNumber = isFinite(page);\n if (!isPageNumber) {\n next(new BadRequestError(\"Invalid page number.\"));\n return;\n }\n\n const isLimitNumber = isFinite(limit);\n\n if (!isLimitNumber) {\n next(new BadRequestError(\"Invalid limit number.\"));\n return;\n }\n\n const validation = Joi.object({\n user: Joi.string().hex().required(),\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 });\n\n const { error } = validation.validate({ user, page, limit, search });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const orgs = await getOrgsByMembership({ user, page, limit, search });\n res.json(orgs);\n return;\n } catch (error) {\n next(error);\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 status: Joi.string()\n .valid(\"active\", \"suspended\", \"inactive\", \"deleted\")\n .optional(),\n });\n\n const { error } = validation.validate(query);\n\n const page =\n typeof req.query.page === \"string\" ? Number(req.query.page) : 1;\n const limit =\n typeof req.query.limit === \"string\" ? Number(req.query.limit) : 10;\n const search = (req.query.search as string) ?? \"\";\n const status = (req.query.status as string) ?? \"active\";\n\n const isPageNumber = isFinite(page);\n if (!isPageNumber) {\n next(new BadRequestError(\"Invalid page number.\"));\n return;\n }\n\n const isLimitNumber = isFinite(limit);\n\n if (!isLimitNumber) {\n next(new BadRequestError(\"Invalid limit number.\"));\n return;\n }\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const orgs = await getAllOrg({ page, limit, search, status });\n res.json(orgs);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getByName(req: Request, res: Response, next: NextFunction) {\n const name = req.params.name;\n\n const validation = Joi.object({\n name: Joi.string().required(),\n });\n\n const { error } = validation.validate({ name });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const org = await _getByName(name);\n res.json(org);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const org = await _getById(id);\n res.json(org);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateById(req: Request, res: Response, next: NextFunction) {\n const _id = (req.params.id as string) ?? \"\";\n const payload = req.body;\n const { error } = schemaOrgUpdate.validate({ _id, ...payload });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateById(_id, payload);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n add,\n getOrgsByUserId,\n getByName,\n getAll,\n getById,\n updateById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useUserService } from \"./user.service\";\nimport { useUserRepo } from \"../user/user.repository\";\n\nexport function useUserController() {\n const {\n updateName: _updateName,\n updateBirthday: _updateBirthday,\n updateUserFieldById: _updateUserFieldById,\n updateUserProfile: _updateUserProfile,\n addViaInvite: _addViaInvite,\n createUserBySignUp: _createUserBySignUp,\n resetPassword: _resetPassword,\n } = useUserService();\n\n const { getUserById: _getUserById, getAll: _getAll } = useUserRepo();\n\n async function getAll(req: Request, res: Response, next: NextFunction) {\n const status = (req.query.status as string) ?? \"\";\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n\n const validation = Joi.object({\n status: Joi.string().required(),\n search: Joi.string().optional().allow(\"\", null),\n page: Joi.number().required(),\n });\n\n const { error } = validation.validate({ status, search, page });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const items = await _getAll({ status, search, page });\n\n res.json(items);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getUserById(req: Request, res: Response, next: NextFunction) {\n const id = (req.params.id as string) || \"\";\n\n const validation = Joi.string().hex().validate(id);\n if (validation.error) {\n throw new BadRequestError(\"Invalid id.\");\n }\n\n try {\n const user = await _getUserById(id);\n if (!user) {\n throw new BadRequestError(\"User not found.\");\n }\n\n res.json(user);\n } catch (error) {\n next(error);\n }\n }\n\n async function updateName(req: Request, res: Response, next: NextFunction) {\n const id = (req.headers.user as any) ?? \"\";\n const firstName = (req.body.firstName as string) ?? \"\";\n const lastName = (req.body.lastName as string) ?? \"\";\n\n const validation = Joi.object({\n firstName: Joi.string().required(),\n lastName: Joi.string().required(),\n });\n\n const { error } = validation.validate({ firstName, lastName });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateName(id, firstName, lastName);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateBirthday(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const id = (req.headers.user as any) ?? \"\";\n const month = (req.body.month as string) ?? \"\";\n const day = (req.body.day as number) ?? 0;\n const year = (req.body.year as number) ?? 0;\n\n const validation = Joi.object({\n month: Joi.string().required(),\n day: Joi.number().integer().min(1).max(31).required(),\n year: Joi.number()\n .integer()\n .min(1900)\n .max(new Date().getFullYear())\n .required(),\n });\n\n const { error } = validation.validate({ month, day, year });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateBirthday(id, month, day, year);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateUserFieldById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const _id = req.params.id as string;\n const { field, value } = req.body;\n\n // Runtime validation using Joi\n const validation = Joi.object({\n _id: Joi.string().hex().required(),\n field: Joi.string()\n .valid(\"gender\", \"email\", \"contact\", \"profile\")\n .required(),\n value: Joi.alternatives().conditional(\"field\", {\n is: \"email\",\n then: Joi.string().email().required(),\n otherwise: Joi.string().required(),\n }),\n });\n\n const { error } = validation.validate({ _id, field, value });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateUserFieldById({ _id, field, value });\n res.json({ message });\n } catch (error) {\n next(error);\n }\n }\n\n async function updateUserProfile(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n res.status(400).send(\"File is required!\");\n return;\n }\n\n const previousProfile = (req.body.previousProfile as string) ?? \"\";\n\n const validation = Joi.object({\n previousProfile: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ previousProfile });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const user = (req.headers[\"user\"] as string) ?? \"\";\n\n try {\n await _updateUserProfile({\n file: req.file,\n user,\n previousProfile,\n });\n res.json({ message: \"Successfully updated profile picture.\" });\n return;\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(error));\n }\n }\n }\n\n async function addViaInvite(req: Request, res: Response, next: NextFunction) {\n const firstName = (req.body.firstName as string) ?? \"\";\n const lastName = (req.body.lastName as string) ?? \"\";\n const password = (req.body.password as string) ?? \"\";\n const id = (req.params.id as string) ?? \"\";\n const type = (req.body.type as string) ?? \"\";\n\n const validation = Joi.object({\n firstName: Joi.string().required(),\n lastName: Joi.string().required(),\n password: Joi.string().required(),\n id: Joi.string().hex().required(),\n type: Joi.string().required(),\n });\n\n const { error } = validation.validate({\n firstName,\n lastName,\n password,\n id,\n type,\n });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n if (type === \"user-invite\") {\n await _addViaInvite({ firstName, lastName, password, id });\n }\n\n if (type === \"user-sign-up\") {\n await _createUserBySignUp({\n firstName,\n lastName,\n password,\n id,\n });\n }\n\n res.json({ message: \"Successfully created account.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function resetPassword(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const payload = req.body;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n newPassword: Joi.string().min(8).required(),\n confirmPassword: Joi.string().min(8).required(),\n });\n\n const { error } = validation.validate(payload);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _resetPassword(payload);\n res.json({ message: \"Password reset successfully.\" });\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n return {\n getAll,\n getUserById,\n updateName,\n updateBirthday,\n updateUserFieldById,\n updateUserProfile,\n addViaInvite,\n resetPassword,\n };\n}\n","import { BadRequestError, logger } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TBuilding = {\n _id?: ObjectId;\n school: ObjectId;\n serial?: string;\n name: string;\n levels: number;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n status?: string;\n};\n\nexport const schemaBuilding = Joi.object({\n _id: Joi.string().hex().optional(),\n school: Joi.string().hex().required(),\n serial: Joi.string().optional().allow(\"\", null),\n name: Joi.string().required(),\n levels: Joi.number().integer().min(1).required(),\n createdAt: Joi.date().optional().allow(\"\", null),\n updatedAt: Joi.date().optional().allow(\"\", null),\n deletedAt: Joi.date().optional().allow(\"\", null),\n status: Joi.string().optional().allow(\"\", null),\n});\n\nexport type TBuildingUnit = {\n _id?: ObjectId;\n school: ObjectId | string;\n name?: string;\n building: ObjectId | string;\n buildingName?: string;\n level: number;\n category: string;\n type: string;\n seating_capacity: number;\n standing_capacity: number;\n description?: string;\n unit_of_measurement: string;\n area: number;\n status: string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n};\n\nexport const schemaBuildingUnit = Joi.object({\n _id: Joi.string().hex().optional(),\n school: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n building: Joi.string().hex().required(),\n buildingName: Joi.string().optional().allow(\"\", null),\n level: Joi.number().integer().min(1).required(),\n category: Joi.string().required(),\n type: Joi.string().required(),\n seating_capacity: Joi.number().integer().min(0).required(),\n standing_capacity: Joi.number().integer().min(0).required(),\n description: Joi.string().optional().allow(\"\", null),\n unit_of_measurement: Joi.string().valid(\"sqm\").required(),\n area: Joi.number().positive().required(),\n status: Joi.string().optional().allow(\"\", null),\n});\n\nexport const schemaUpdateOptions = Joi.object({\n name: Joi.string().optional().allow(\"\", null),\n building: Joi.string().hex().optional().allow(\"\", null),\n buildingName: Joi.string().optional().allow(\"\", null),\n level: Joi.number().integer().min(1).optional().allow(\"\", null),\n category: Joi.string().optional().allow(\"\", null),\n type: Joi.string().optional().allow(\"\", null),\n seating_capacity: Joi.number().integer().min(0).optional().allow(\"\", null),\n standing_capacity: Joi.number().integer().min(0).optional().allow(\"\", null),\n area: Joi.number().positive().optional().allow(\"\", null),\n});\n\nexport function MBuilding(value: TBuilding) {\n const { error } = schemaBuilding.validate(value);\n if (error) {\n logger.info(`Building Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value._id && typeof value._id === \"string\") {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid _id format\");\n }\n }\n\n try {\n value.school = new ObjectId(value.school);\n } catch (error) {\n throw new BadRequestError(\"Invalid school format\");\n }\n\n return {\n _id: value._id ?? undefined,\n school: value.school,\n serial: value.serial ?? \"\",\n name: value.name ?? \"\",\n levels: value.levels ?? 0,\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt ?? \"\",\n deletedAt: value.deletedAt ?? \"\",\n };\n}\n\nexport function MBuildingUnit(value: TBuildingUnit) {\n const { error } = schemaBuildingUnit.validate(value);\n if (error) {\n logger.info(`Building Unit Model: ${error.message}`);\n throw new BadRequestError(error.message);\n }\n\n if (value._id && typeof value._id === \"string\") {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID\");\n }\n }\n\n try {\n value.school = new ObjectId(value.school);\n } catch (error) {\n throw new BadRequestError(\"Invalid school ID\");\n }\n\n try {\n value.building = new ObjectId(value.building);\n } catch (error) {\n throw new BadRequestError(\"Invalid building ID\");\n }\n\n return {\n _id: value._id ?? undefined,\n school: value.school,\n name: value.name ?? \"\",\n building: value.building,\n buildingName: value.buildingName ?? \"\",\n level: value.level ?? 0,\n category: value.category ?? \"\",\n type: value.type ?? \"\",\n seating_capacity: value.seating_capacity ?? 0,\n standing_capacity: value.standing_capacity ?? 0,\n description: value.description ?? \"\",\n unit_of_measurement: value.unit_of_measurement ?? \"sqm\",\n area: value.area ?? 0,\n status: value.status ?? \"active\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt ?? \"\",\n deletedAt: value.deletedAt ?? \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { MBuilding, TBuilding } from \"./building.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function useBuildingRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"school.buildings\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { name: 1 }, unique: true, name: \"unique_name_index\" },\n { key: { school: 1 } },\n { key: { status: 1 } },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on buildings.\");\n }\n }\n\n async function add(value: TBuilding, session?: ClientSession) {\n try {\n value = MBuilding(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n const isDuplicated = error.message.includes(\"duplicate\");\n\n if (isDuplicated) {\n throw new BadRequestError(\"Building already exists.\");\n }\n\n throw new Error(\"Failed to create building.\");\n }\n }\n }\n\n async function updateById(\n _id: ObjectId | string,\n value: { name: string; serial: string; levels: number },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to update building.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n school = \"\",\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n status,\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n if (school) {\n try {\n query.school = new ObjectId(school);\n } catch (error) {\n throw new BadRequestError(\"Invalid school ID.\");\n }\n }\n\n // Create cache key only with provided parameters\n const cacheParams: Record<string, any> = {\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n if (search) cacheParams.search = search;\n if (school) cacheParams.school = school;\n if (status !== \"active\") cacheParams.status = status;\n\n const cacheKey = makeCacheKey(namespace_collection, cacheParams);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll buildings: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll buildings: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll buildings: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll buildings: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TBuilding>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById building: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TBuilding>({\n _id,\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for building by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for building by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get building.\");\n }\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date() } }\n );\n\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete building.\");\n }\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n updateById,\n deleteById,\n };\n}\n","import { BadRequestError, NotFoundError, useAtlas } from \"@goweekdays/utils\";\nimport { useBuildingRepo } from \"./building.repository\";\nimport { useBuildingUnitRepo } from \"./building-unit.repository\";\n\nexport function useBuildingService() {\n const {\n updateById: _updateById,\n getById: _getById,\n deleteById: _deleteById,\n } = useBuildingRepo();\n const { getByBuildingLevel, getByBuilding, updateByBuildingId } =\n useBuildingUnitRepo();\n\n async function updateById(\n id: string,\n data: { name: string; levels: number; serial: string }\n ) {\n data.levels = Number(data.levels);\n\n const session = useAtlas.getClient()?.startSession();\n\n try {\n const building = await _getById(id);\n\n if (!building) {\n throw new NotFoundError(\"Building not found.\");\n }\n\n if (data.levels < building.levels) {\n const unit = await getByBuildingLevel(id, building.levels);\n if (unit) {\n throw new BadRequestError(\n \"Cannot reduce floors, there are existing building units at higher floors.\"\n );\n }\n }\n\n session?.startTransaction();\n\n if (building.name !== data.name) {\n await updateByBuildingId(id, { buildingName: data.name }, session);\n }\n\n const result = await _updateById(id, data, session);\n\n await session?.commitTransaction();\n\n return result;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function deleteById(id: string) {\n const building = await getByBuilding(id);\n if (building) {\n throw new BadRequestError(\n \"Cannot delete building with existing room/facility. Please delete room/facility first.\"\n );\n }\n\n try {\n await _deleteById(id);\n return \"Building deleted successfully.\";\n } catch (error) {\n throw error;\n }\n }\n\n return {\n updateById,\n deleteById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport {\n MBuildingUnit,\n schemaUpdateOptions,\n TBuildingUnit,\n} from \"./building.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function useBuildingUnitRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"school.building-units\";\n\n const collection = db.collection(namespace_collection);\n\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: { name: 1, building: 1, level: 1 },\n unique: true,\n name: \"unique_name_index\",\n },\n { key: { school: 1 } },\n { key: { building: 1 } },\n { key: { status: 1 } },\n { key: { createdAt: 1 } },\n {\n key: {\n name: \"text\",\n buildingName: \"text\",\n category: \"text\",\n type: \"text\",\n },\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on building units.\");\n }\n }\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function add(value: TBuildingUnit, session?: ClientSession) {\n try {\n value = MBuildingUnit(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to create building unit.\");\n }\n }\n }\n\n type TUpdateOptions = {\n name?: string;\n building?: string;\n level?: number;\n category?: string;\n type?: string;\n seating_capacity?: number;\n standing_capacity?: number;\n area?: number;\n };\n\n async function updateById(\n _id: string | ObjectId,\n value: TUpdateOptions,\n session?: ClientSession\n ) {\n const { error } = schemaUpdateOptions.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to create building unit.\");\n }\n }\n }\n\n async function updateByBuildingId(\n building: string | ObjectId,\n value: Partial<Pick<TBuildingUnit, \"buildingName\">>,\n session?: ClientSession\n ) {\n const { error } = schemaUpdateOptions.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n building = new ObjectId(building);\n } catch (error) {\n throw new BadRequestError(\"Invalid building ID.\");\n }\n\n try {\n const res = await collection.updateMany(\n { building },\n { $set: value },\n { session }\n );\n delCachedData();\n return res;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to update building unit.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n school = \"\",\n building = \"\",\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n deletedAt: { $in: [\"\", null] },\n status: { $in: [status, \"\", null] },\n };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n if (school) {\n try {\n query.school = new ObjectId(school);\n } catch (error) {\n throw new BadRequestError(\"Invalid school ID.\");\n }\n }\n\n if (building) {\n try {\n query.building = new ObjectId(building);\n } catch (error) {\n throw new BadRequestError(\"Invalid building ID.\");\n }\n }\n\n // Create cache key only with provided parameters\n const cacheParams: Record<string, any> = {\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n if (search) cacheParams.search = search;\n if (school) cacheParams.school = school;\n if (building) cacheParams.building = building;\n if (status !== \"active\") cacheParams.status = status;\n\n const cacheKey = makeCacheKey(namespace_collection, cacheParams);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll building units: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll building units: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $sort: sort },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll building units: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll building units: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TBuildingUnit>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById building unit: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TBuildingUnit>({\n _id,\n deletedAt: { $in: [\"\", null] },\n });\n if (!result) {\n throw new BadRequestError(\"Building unit not found.\");\n }\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for building unit by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for building unit by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get building unit.\");\n }\n }\n }\n\n async function getByBuildingLevel(\n building: string | ObjectId,\n level: number\n ) {\n try {\n building = new ObjectId(building);\n } catch (error) {\n throw new BadRequestError(\"Invalid building ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n building: String(building),\n level,\n });\n\n try {\n const cached = await getCache<TBuildingUnit>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById building unit: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TBuildingUnit>({\n building,\n level,\n status: \"active\",\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for building unit by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for building unit by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get building unit.\");\n }\n }\n }\n\n async function getByBuilding(building: string | ObjectId) {\n try {\n building = new ObjectId(building);\n } catch (error) {\n throw new BadRequestError(\"Invalid building ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n building: String(building),\n });\n\n try {\n const cached = await getCache<TBuildingUnit>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById building unit: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TBuildingUnit>({\n building,\n status: \"active\",\n });\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for building unit by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for building unit by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get building unit.\");\n }\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n const res = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date() } },\n { session }\n );\n delCachedData();\n return \"Room/Facility deleted successfully.\";\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new Error(\"Failed to deleted room/facility.\");\n }\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n getByBuildingLevel,\n updateById,\n getByBuilding,\n deleteById,\n updateByBuildingId,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, logger } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { useBuildingRepo } from \"./building.repository\";\nimport { useBuildingService } from \"./building.service\";\n\nexport function useBuildingController() {\n const { getAll: _getAll, getById: _getById, add: _add } = useBuildingRepo();\n\n const { updateById: _updateById, deleteById: _deleteById } =\n useBuildingService();\n\n async function createBuilding(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const value = req.body;\n\n const validation = Joi.object({\n name: Joi.string().required(),\n school: Joi.string().hex().required(),\n levels: Joi.number().integer().min(1).required(),\n serial: Joi.string().optional().allow(\"\", null),\n status: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(value);\n\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 _add(value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateById(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n const id = req.params.id ?? \"\";\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n value: Joi.object({\n name: Joi.string().required(),\n serial: Joi.string().optional().allow(\"\", null),\n levels: Joi.number().integer().min(1).required(),\n }),\n });\n\n const { error } = validation.validate({ id, value });\n\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 _updateById(id, value);\n res.json(result);\n return;\n } catch (error) {\n next(error);\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 school: Joi.string().hex().optional().allow(\"\", null),\n status: Joi.string().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 status = (req.query.status as string) ?? \"active\";\n const school = (req.query.school 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 status,\n school,\n search,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const building = await _getById(id);\n res.json({\n message: \"Successfully retrieved building.\",\n data: { building },\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(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\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 createBuilding,\n getAll,\n getById,\n updateById,\n deleteById,\n };\n}\n","import { useAtlas } from \"@goweekdays/utils\";\nimport { TBuildingUnit } from \"./building.model\";\nimport { useBuildingUnitRepo } from \"./building-unit.repository\";\n\nexport function useBuildingUnitService() {\n const { add: _add } = useBuildingUnitRepo();\n\n async function add(value: { building: TBuildingUnit; qty: number }) {\n const session = useAtlas.getClient()?.startSession();\n if (!session) {\n throw new Error(\"Unable to start session for building unit service.\");\n }\n\n try {\n await session.startTransaction();\n for (let index = 0; index < value.qty; index++) {\n await _add(\n { ...value.building, name: `${value.building.name} ${index + 1}` },\n session\n );\n }\n\n await session.commitTransaction();\n return \"Building unit added successfully.\";\n } catch (error) {\n await session.abortTransaction();\n throw error;\n } finally {\n session.endSession();\n }\n }\n\n return {\n add,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { useBuildingUnitRepo } from \"./building-unit.repository\";\nimport { useBuildingUnitService } from \"./building-unit.service\";\nimport { schemaUpdateOptions } from \"./building.model\";\n\nexport function useBuildingUnitController() {\n const {\n getAll: _getAll,\n getById: _getById,\n updateById: _updateById,\n deleteById: _deleteById,\n } = useBuildingUnitRepo();\n\n const { add: _add } = useBuildingUnitService();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const data = req.body;\n\n const validation = Joi.object({\n building: Joi.object({\n school: Joi.string().hex().required(),\n name: Joi.string().optional().allow(\"\", null),\n building: Joi.string().hex().required(),\n buildingName: Joi.string().optional().allow(\"\", null),\n level: Joi.number().integer().min(1).required(),\n category: Joi.string().required(),\n type: Joi.string().required(),\n seating_capacity: Joi.number().integer().min(0).required(),\n standing_capacity: Joi.number().integer().min(0).required(),\n description: Joi.string().optional().allow(\"\", null),\n unit_of_measurement: Joi.string().valid(\"sqm\").required(),\n area: Joi.number().positive().required(),\n status: Joi.string().optional().allow(\"\", null),\n }),\n qty: Joi.number().integer().min(1).max(20).optional().default(1),\n });\n\n const { error } = validation.validate(data);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const buildingUnit = await _add(data);\n res.json({\n message: \"Building unit added successfully.\",\n data: { buildingUnit },\n });\n } catch (error) {\n next(error);\n }\n }\n\n async function updateById(req: Request, res: Response, next: NextFunction) {\n const data = req.body;\n const id = req.params.id ?? \"\";\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n value: schemaUpdateOptions,\n });\n\n const { error } = validation.validate({ id, value: data });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const buildingUnit = await _updateById(id, data);\n res.json({\n message: \"Building unit updated successfully.\",\n data: { buildingUnit },\n });\n } catch (error) {\n next(error);\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 school: Joi.string().hex().optional().allow(\"\", null),\n building: Joi.string().hex().optional().allow(\"\", null),\n status: Joi.string().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 status = (req.query.status as string) ?? \"active\";\n const school = (req.query.school as string) ?? \"\";\n const building = (req.query.building 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 status,\n school,\n search,\n building,\n });\n res.json(buildings);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const buildingUnit = await _getById(id);\n res.json({\n message: \"Successfully retrieved building unit.\",\n data: { buildingUnit },\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(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\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 add,\n getAll,\n getById,\n updateById,\n deleteById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport { ObjectId, Db, Collection } from \"mongodb\";\nimport { z } from \"zod\";\n\n// Counter Schema\nconst TCounter = z.object({\n _id: z\n .union([\n z.string().length(24, \"Invalid ObjectId hex string\"),\n z.instanceof(ObjectId),\n ])\n .transform((val) => (typeof val === \"string\" ? new ObjectId(val) : val))\n .optional(),\n count: z.number().int().min(0).default(0),\n type: z.string(),\n createdAt: z\n .date()\n .optional()\n .default(() => new Date()),\n updatedAt: z.date().optional(),\n deletedAt: z.date().optional(),\n});\nexport type TCounter = z.infer<typeof TCounter>;\n\n// Counter Model Composable\nexport function useCounterModel(db: Db) {\n const collection: Collection<TCounter> = db.collection<TCounter>(\"counters\");\n\n function createCounter(value: Pick<TCounter, \"type\">) {\n try {\n return TCounter.parse(value);\n } catch (error: any) {\n throw new BadRequestError(error.issues[0].message);\n }\n }\n\n function validateCounter(data: unknown) {\n return TCounter.safeParse(data);\n }\n\n return {\n createCounter,\n validateCounter,\n collection,\n };\n}\n","import { useAtlas, useCache, makeCacheKey, logger } from \"@goweekdays/utils\";\nimport { useCounterModel } from \"./counter.model\";\nimport { ClientSession } from \"mongodb\";\n\nexport function useCounterRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"counters\";\n const { collection, createCounter } = useCounterModel(db);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: { type: 1 },\n },\n {\n key: { type: 1 },\n unique: true,\n name: \"unique_type\",\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index.\");\n }\n }\n\n async function add(type: string) {\n try {\n const value = createCounter({ type });\n await collection.insertOne(value);\n delCachedData();\n } catch (error) {\n throw new Error(\"Failed to add counter.\");\n }\n }\n\n async function incrementByType(type: string, session?: ClientSession) {\n try {\n const res = await collection.updateOne(\n { type },\n { $inc: { count: 1 } },\n { session }\n );\n delCachedData();\n } catch (error) {\n throw new Error(`Failed to increment ${type} counter.`);\n }\n }\n\n async function getByType(type: string) {\n const cacheKey = makeCacheKey(namespace_collection, { type });\n\n try {\n // Check cache first\n const cached = await getCache<any>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByType counter: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne({ type });\n\n if (data) {\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for counter by type: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for counter by type: ${err.message}`,\n });\n });\n }\n\n return data;\n } catch (error) {\n throw new Error(\"Failed to get counter.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getByType,\n incrementByType,\n };\n}\n","import { TFile } from \"./file.model\";\nimport { useFileRepo } from \"./file.repository\";\nimport { logger, useS3, useAtlas } from \"@goweekdays/utils\";\nimport {\n SPACES_ACCESS_KEY,\n SPACES_BUCKET,\n SPACES_ENDPOINT,\n SPACES_REGION,\n SPACES_SECRET_KEY,\n} from \"../../config\";\nimport cron from \"node-cron\";\nimport * as fs from \"fs\";\nexport function useFileService() {\n const {\n createFile: _createFile,\n deleteFileById,\n getAllDraftedFiles,\n } = useFileRepo();\n\n const s3 = new useS3({\n accessKeyId: SPACES_ACCESS_KEY,\n secretAccessKey: SPACES_SECRET_KEY,\n endpoint: SPACES_ENDPOINT,\n region: SPACES_REGION,\n bucket: SPACES_BUCKET,\n forcePathStyle: true,\n });\n\n async function createFile(value: Express.Multer.File) {\n const session = useAtlas.getClient()?.startSession();\n\n session?.startTransaction();\n\n const file: TFile = {\n name: value.originalname,\n createdAt: new Date().toISOString(),\n };\n\n try {\n const id = await _createFile(file, session);\n\n // Read file from disk instead of buffer\n const fileBuffer =\n value.buffer || (await fs.promises.readFile(value.path));\n\n await s3.uploadObject({\n key: id,\n body: fileBuffer,\n contentType: value.mimetype,\n });\n\n await session?.commitTransaction();\n\n // Clean up temporary file\n if (value.path) {\n try {\n await fs.promises.unlink(value.path);\n } catch (cleanupError) {\n console.error(\n `Failed to cleanup temporary file ${value.path}:`,\n cleanupError\n );\n }\n }\n\n return id;\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n async function deleteFile(id: string) {\n const session = useAtlas.getClient()?.startSession();\n\n session?.startTransaction();\n\n try {\n await deleteFileById(id, session);\n await s3.deleteObject(id);\n await session?.commitTransaction();\n\n return \"File deleted successfully\";\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n function deleteDraft() {\n cron.schedule(\"0 0 * * *\", async () => {\n const files = await getAllDraftedFiles();\n for (let index = 0; index < files.length; index++) {\n const file = files[index];\n try {\n await deleteFile(file._id.toString());\n await logger.log({\n level: \"info\",\n message: \"Successfully deleted draft files.\",\n });\n } catch (error) {\n logger.log({\n level: \"info\",\n message: \"Successfully deleted draft files.\",\n });\n return;\n }\n }\n });\n }\n\n return {\n createFile,\n deleteFile,\n deleteDraft,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { useFileService } from \"./file.service\";\nimport {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport Joi from \"joi\";\n\nexport function useFileController() {\n const { createFile, deleteFile: _deleteFile } = useFileService();\n async function upload(req: Request, res: Response, next: NextFunction) {\n if (!req.file) {\n res.status(400).send(\"File is required!\");\n return;\n }\n\n try {\n const id = await createFile(req.file);\n res.json({ message: \"Successfully uploaded file\", id });\n return;\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(error));\n }\n }\n }\n\n async function deleteFile(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id as string;\n\n const validation = Joi.string().required();\n\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const message = await _deleteFile(id);\n res.json({ message });\n return;\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(error));\n }\n }\n }\n\n return {\n upload,\n deleteFile,\n };\n}\n","import Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TPromo = {\n _id?: ObjectId;\n code: string;\n description?: string;\n type: \"flat\" | \"fixed\" | \"tiered\";\n flatRate?: number; // regardless of seats\n fixedRate?: number; // per seat\n tiers?: Array<{\n minSeats: number;\n maxSeats: number;\n rate: number;\n }>;\n currency: string;\n startDate: Date | string;\n endDate?: Date | string;\n assignedTo?: string | ObjectId; // org id\n status: \"active\" | \"inactive\" | \"expired\";\n assignedAt?: Date | string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n deletedAt?: Date | string;\n};\n\nexport const schemaPromo = Joi.object({\n code: Joi.string().min(3).max(50).required(),\n description: Joi.string().max(255).optional().allow(\"\", null),\n type: Joi.string().valid(\"flat\", \"fixed\", \"tiered\").required(),\n flatRate: Joi.number()\n .positive()\n .when(\"type\", {\n is: \"flat\",\n then: Joi.required(),\n otherwise: Joi.forbidden(),\n })\n .optional()\n .allow(null, 0),\n fixedRate: Joi.number()\n .positive()\n .when(\"type\", {\n is: \"fixed\",\n then: Joi.required(),\n otherwise: Joi.forbidden(),\n })\n .optional()\n .allow(null, 0),\n tiers: Joi.array()\n .items(\n Joi.object({\n minSeats: Joi.number().integer().min(1).required(),\n maxSeats: Joi.number().integer().min(Joi.ref(\"minSeats\")).required(),\n rate: Joi.number().positive().required(),\n })\n )\n .when(\"type\", {\n is: \"tiered\",\n then: Joi.required(),\n otherwise: Joi.forbidden(),\n }),\n currency: Joi.string().length(3).required(),\n startDate: Joi.date().required(),\n endDate: Joi.date().greater(Joi.ref(\"startDate\")).optional().allow(null, \"\"),\n});\n\nexport function modelPromo(data: TPromo): TPromo {\n const { error } = schemaPromo.validate(data);\n\n if (error) {\n throw new Error(`Invalid promo data: ${error.message}`);\n }\n\n return {\n _id: data._id,\n code: data.code,\n description: data.description ?? \"\",\n type: data.type,\n flatRate: data.flatRate ?? 0,\n fixedRate: data.fixedRate ?? 0,\n tiers: data.tiers ?? [],\n currency: data.currency,\n startDate: data.startDate ?? new Date(),\n endDate: data.endDate ?? \"\",\n assignedTo: data.assignedTo ?? \"\",\n status: data.status ?? \"active\",\n assignedAt: data.assignedAt ?? \"\",\n createdAt: data.createdAt ?? new Date(),\n updatedAt: data.updatedAt ?? \"\",\n deletedAt: data.deletedAt ?? \"\",\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@goweekdays/utils\";\nimport { modelPromo, TPromo } from \"./promo.model\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport function usePromoRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"users\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n {\n key: {\n code: \"text\",\n },\n name: \"code_text_index\",\n },\n {\n key: { code: 1, status: 1 },\n unique: true,\n partialFilterExpression: { status: \"active\" },\n name: \"unique_active_code_index\",\n },\n ]);\n } catch (error) {}\n }\n\n async function add(value: TPromo) {\n try {\n value = modelPromo(value);\n await collection.insertOne(value);\n delCachedData();\n return \"Successfully added promo.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to add promo.\");\n }\n }\n\n async function getAll({\n page = 1,\n limit = 10,\n search = \"\",\n status = \"active\",\n } = {}) {\n page = page < 1 ? page - 1 : page;\n\n const query: Record<string, any> = { status };\n const cacheKeyOptions: Record<string, any> = {\n page,\n limit,\n search,\n status,\n tag: \"getAll\",\n };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n try {\n const cachedData = await getCache<TPaginate<TPromo>>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n\n const data: TPaginate<TPromo> = paginate(items, page, limit, length);\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll promo: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll promo: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get promos.\");\n }\n }\n\n async function getByCode(code: string) {\n const { error } = Joi.string().min(3).max(50).required().validate(code);\n if (error) {\n throw new Error(`Invalid promo code: ${error.message}`);\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n code,\n tag: \"getByCode\",\n });\n const cachedData = await getCache<TPromo>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TPromo>({\n code,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getByCode promo: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getByCode promo: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get promo.\");\n }\n }\n\n async function getById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid promo ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid promo ID.\");\n }\n\n try {\n const cacheKey = makeCacheKey(namespace_collection, {\n _id: String(_id),\n tag: \"getById\",\n });\n const cachedData = await getCache<TPromo>(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n const data = await collection.findOne<TPromo>({\n _id,\n status: { $ne: \"deleted\" },\n });\n\n setCache(cacheKey, data)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getById promo: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getById promo: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\"Failed to get promo.\");\n }\n }\n\n async function deleteById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).required().validate(_id);\n if (error) {\n throw new Error(`Invalid promo ID: ${error.message}`);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid promo ID.\");\n }\n\n try {\n const result = await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\" } }\n );\n\n if (result.modifiedCount === 0) {\n throw new InternalServerError(\"Failed to delete promo.\");\n }\n\n delCachedData();\n return \"Successfully deleted promo.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to delete promo.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getByCode,\n getById,\n deleteById,\n };\n}\n","import { BadRequestError } from \"@goweekdays/utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TJobPost = {\n _id?: ObjectId;\n org: ObjectId | string;\n title: string;\n setup: string;\n location: string;\n type: string;\n description: string;\n status?: string;\n createdAt?: Date;\n updatedAt?: Date;\n deletedAt?: Date;\n};\n\nexport const schemaJobPost = Joi.object({\n _id: Joi.string().hex().optional(),\n org: Joi.string().hex().required(),\n title: Joi.string().trim().required(),\n setup: Joi.string().trim().required(),\n location: Joi.string().trim().required(),\n type: Joi.string().trim().required(),\n description: Joi.string().trim().required(),\n status: Joi.string().trim().optional().allow(\"\", null),\n createdAt: Joi.date().optional(),\n updatedAt: Joi.date().optional(),\n deletedAt: Joi.date().optional(),\n});\n\nexport const schemaJobPostUpdate = Joi.object({\n _id: Joi.string().hex().required(),\n title: Joi.string().trim().required(),\n setup: Joi.string().trim().required(),\n location: Joi.string().trim().required(),\n type: Joi.string().trim().required(),\n description: Joi.string().trim().required(),\n});\n\nexport function modelJobPost(value: TJobPost): TJobPost {\n const { error } = schemaJobPost.validate(value);\n\n if (error) {\n throw new BadRequestError(`Invalid job post: ${error.message}`);\n }\n if (!value._id) {\n try {\n value._id = new ObjectId();\n } catch (error) {\n throw new BadRequestError(\"Invalid job post ID.\");\n }\n }\n\n try {\n value.org = new ObjectId(value.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid Org ID\");\n }\n\n return {\n _id: value._id,\n org: value.org,\n title: value.title,\n setup: value.setup,\n location: value.location,\n type: value.type,\n description: value.description,\n status: value.status ?? \"draft\",\n createdAt: value.createdAt ?? new Date(),\n updatedAt: value.updatedAt,\n deletedAt: value.deletedAt,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, logger } from \"@goweekdays/utils\";\nimport { schemaJobPost, schemaJobPostUpdate } from \"./job.post.model\";\nimport { useJobPostRepo } from \"./job.post.repository\";\nimport { useJobPostService } from \"./job.post.service\";\n\nexport function useJobPostController() {\n const {\n add: _add,\n getAll: _getAll,\n getJobPostsByOrg: _getJobPostsByOrg,\n getById: _getById,\n updateById: _updateById\n } = useJobPostRepo();\n const { deleteById: _deleteById } = useJobPostService();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaJobPost.validate(value);\n\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 _add(value);\n res.json({ message: \"Successfully created job post.\", data: { result } });\n return;\n } catch (error) {\n next(error);\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 status: Joi.string().optional(),\n });\n\n const { error } = validation.validate(query);\n\n const page =\n typeof req.query.page === \"string\" ? Number(req.query.page) : 1;\n const limit =\n typeof req.query.limit === \"string\" ? Number(req.query.limit) : 10;\n const search = (req.query.search as string) ?? \"\";\n const status = (req.query.status as string) ?? \"active\";\n\n const isPageNumber = isFinite(page);\n if (!isPageNumber) {\n next(new BadRequestError(\"Invalid page number.\"));\n return;\n }\n\n const isLimitNumber = isFinite(limit);\n\n if (!isLimitNumber) {\n next(new BadRequestError(\"Invalid limit number.\"));\n return;\n }\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const jobPosts = await _getAll({ page, limit, search, status });\n res.json(jobPosts);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getJobPostsByOrg(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const page =\n typeof req.query.page === \"string\" ? Number(req.query.page) : 1;\n const limit =\n typeof req.query.limit === \"string\" ? Number(req.query.limit) : 10;\n const search = (req.query.search as string) ?? \"\";\n const status = (req.query.status as string) ?? \"active\";\n\n const org = (req.params.org as string) ?? \"\";\n\n const isPageNumber = isFinite(page);\n if (!isPageNumber) {\n next(new BadRequestError(\"Invalid page number.\"));\n return;\n }\n\n const isLimitNumber = isFinite(limit);\n\n if (!isLimitNumber) {\n next(new BadRequestError(\"Invalid limit number.\"));\n return;\n }\n\n const validation = Joi.object({\n org: Joi.string().hex().required(),\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 status: Joi.string().optional()\n });\n\n const { error } = validation.validate({ org, page, limit, search, status });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const jobPosts = await _getJobPostsByOrg({ org, page, limit, search, status });\n res.json(jobPosts);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getById(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\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const jobPost = await _getById(id);\n res.json(jobPost);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateById(req: Request, res: Response, next: NextFunction) {\n const _id = req.params.id;\n const payload = req.body;\n const { error } = schemaJobPostUpdate.validate({ _id, ...payload });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateById(_id, payload);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteById(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id;\n\n if (!id) {\n next(new BadRequestError(\"Job Post ID is required.\"));\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 add,\n getAll,\n getJobPostsByOrg,\n getById,\n updateById,\n deleteById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n useAtlas,\n useCache,\n makeCacheKey,\n paginate,\n logger,\n InternalServerError\n} from \"@goweekdays/utils\";\nimport { TJobPost, modelJobPost, schemaJobPostUpdate } from \"./job.post.model\";\nimport { ClientSession, ObjectId, } from \"mongodb\";\n\nexport function useJobPostRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new BadRequestError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"job.posts\";\n const collection = db.collection(namespace_collection);\n const { getCache, setCache, delNamespace } = useCache(namespace_collection);\n\n\n function delCachedData() {\n delNamespace()\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache namespace cleared for ${namespace_collection}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to clear cache namespace for ${namespace_collection}: ${err.message}`,\n });\n });\n }\n\n async function createIndexes() {\n try {\n await collection.createIndexes([\n { key: { title: 1 } },\n { key: { setup: 1 } },\n { key: { location: 1 } },\n { key: { type: 1 } },\n {\n key: {\n title: \"text\",\n setup: \"text\",\n location: \"text\",\n type: \"text\",\n },\n name: \"jobpost_text_search\",\n },\n ]);\n return \"Successfully created job post indexes.\";\n } catch (error: any) {\n throw new BadRequestError(\"Failed to create job post indexes.\");\n }\n }\n\n async function add(value: TJobPost, session?: ClientSession) {\n try {\n value = modelJobPost(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n logger.log({\n level: \"error\",\n message: error.message,\n });\n throw new BadRequestError(`Failed to create job post: ${error.message}`);\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n status = \"active\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = { status };\n\n if (search) {\n query.$text = { $search: search };\n }\n\n const cacheKey = makeCacheKey(namespace_collection, {\n search,\n page,\n limit,\n status,\n });\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll job posts: ${cacheKey}`,\n });\n\n try {\n const cached = await getCache<Record<string, any>>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getAll job posts: ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n {\n $project: {\n _id: 1,\n title: 1,\n setup: 1,\n location: 1,\n type: 1,\n createdAt: 1,\n },\n },\n ])\n .toArray();\n const length = await collection.countDocuments(query);\n\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 600)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getAll job posts: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll job posts: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getJobPostsByOrg(\n {\n search = \"\",\n page = 1,\n limit = 10,\n org = \"\",\n status = \"active\",\n } = {} as {\n org: string | ObjectId;\n page: number;\n limit?: number;\n search?: string;\n status?: string;\n }\n ) {\n page = page > 0 ? page - 1 : 0;\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid organization ID.\");\n }\n\n const query: Record<string, any> = { org, status };\n const cacheKeyOptions: Record<string, any> = {\n org: String(org),\n status,\n limit,\n page,\n };\n\n if (search) {\n cacheKeyOptions.search = search;\n query.$text = { $search: search };\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n const cached = await getCache<{ _id: ObjectId; name: string }[]>(\n cacheKey\n );\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getJobPostsByOrg : ${cacheKey}`,\n });\n return cached;\n }\n\n const items = await collection\n .aggregate([\n { $match: query },\n { $skip: page * limit },\n { $limit: limit },\n {\n $project: {\n _id: 1,\n title: 1,\n setup: 1,\n location: 1,\n type: 1,\n createdAt: 1,\n },\n },\n ])\n .toArray();\n\n const length = await collection.countDocuments(query);\n const data = paginate(items, page, limit, length);\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for getJobPostsByOrg: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getJobPostsByOrg: ${err.message}`,\n });\n });\n\n return data;\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve job posts.\"\n );\n }\n }\n\n async function getById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { _id: String(_id) });\n\n try {\n const cached = await getCache<TJobPost>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById job post: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TJobPost>({ _id });\n if (!result) {\n throw new BadRequestError(\"Job post not found.\");\n }\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for job post by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for job post by id: ${err.message}`,\n });\n });\n\n return result;\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to get job post.\");\n }\n }\n }\n\n async function updateById(\n _id: string | ObjectId,\n options: Pick<TJobPost, \"title\" | \"setup\" | \"location\" | \"type\" | \"description\">\n ) {\n const { error } = schemaJobPostUpdate.validate({ ...options, _id });\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid JobPost ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n { $set: { ...options, updatedAt: new Date() } }\n );\n delCachedData();\n return \"Successfully updated job post.\";\n } catch (error: any) {\n throw new InternalServerError(\"Failed to update job post.\");\n }\n }\n\n async function deleteById(_id: string | ObjectId, session?: ClientSession) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n await collection.updateOne(\n { _id },\n {\n $set: {\n status: \"deleted\",\n updatedAt: new Date(),\n deletedAt: new Date(),\n },\n },\n { session }\n );\n delCachedData();\n return \"Successfully deleted job post.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete job post.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getJobPostsByOrg,\n getById,\n updateById,\n deleteById,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { useJobPostRepo } from \"./job.post.repository\";\nimport Joi from \"joi\";\n\nexport function useJobPostService() {\n const { deleteById: _deleteById } = useJobPostRepo();\n\n async function deleteById(id: string) {\n const { error } = Joi.string().hex().required().validate(id);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n try {\n await _deleteById(id);\n return \"Successfully deleted job post.\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(\"Failed to delete job post.\");\n }\n }\n }\n\n return {\n deleteById,\n };\n}"],"mappings":"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","names":["ObjectId","error","ObjectId","BadRequestError","InternalServerError","useCache","crypto","useCache","BadRequestError","InternalServerError","Joi","AppError","BadRequestError","InternalServerError","logger","logger","BadRequestError","NotFoundError","InternalServerError","useAtlas","AppError","BadRequestError","Joi","ObjectId","error","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","paginate","AppError","BadRequestError","InternalServerError","NotFoundError","logger","makeCacheKey","useAtlas","useCache","BadRequestError","InternalServerError","logger","makeCacheKey","useAtlas","useCache","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","BadRequestError","Joi","ObjectId","error","ObjectId","Joi","useAtlas","useCache","logger","BadRequestError","AppError","InternalServerError","makeCacheKey","error","paginate","BadRequestError","InternalServerError","useAtlas","paginate","logger","makeCacheKey","useCache","AppError","BadRequestError","Joi","ObjectId","error","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","AppError","makeCacheKey","paginate","error","BadRequestError","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","Joi","useAtlas","useCache","logger","AppError","BadRequestError","error","makeCacheKey","paginate","InternalServerError","BadRequestError","logger","Joi","BadRequestError","logger","error","Joi","BadRequestError","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","Joi","useAtlas","useCache","logger","AppError","BadRequestError","error","makeCacheKey","paginate","InternalServerError","AppError","BadRequestError","InternalServerError","logger","useAtlas","BadRequestError","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","Joi","useAtlas","useCache","logger","AppError","BadRequestError","makeCacheKey","paginate","InternalServerError","error","logger","useAtlas","useAtlas","logger","BadRequestError","Joi","BadRequestError","error","Joi","useAtlas","logger","modules","BadRequestError","AppError","InternalServerError","BadRequestError","logger","Joi","BadRequestError","logger","error","Joi","BadRequestError","Joi","ObjectId","error","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","Joi","useAtlas","useCache","logger","AppError","BadRequestError","makeCacheKey","paginate","InternalServerError","error","BadRequestError","useAtlas","Joi","BadRequestError","AppError","BadRequestError","InternalServerError","AppError","BadRequestError","InternalServerError","BadRequestError","AppError","InternalServerError","Joi","BadRequestError","BadRequestError","error","Joi","Joi","BadRequestError","error","AppError","InternalServerError","Joi","BadRequestError","error","BadRequestError","Joi","ObjectId","schema","error","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","Joi","ObjectId","useAtlas","InternalServerError","useCache","logger","AppError","makeCacheKey","paginate","error","BadRequestError","Joi","BadRequestError","AppError","BadRequestError","InternalServerError","logger","useAtlas","AppError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","BadRequestError","Joi","ObjectId","error","ObjectId","useAtlas","InternalServerError","useCache","logger","AppError","makeCacheKey","paginate","BadRequestError","Joi","ObjectId","error","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","Joi","useAtlas","useCache","logger","BadRequestError","AppError","makeCacheKey","paginate","error","InternalServerError","Joi","BadRequestError","Joi","BadRequestError","error","AppError","BadRequestError","Joi","AppError","BadRequestError","InternalServerError","logger","crypto","logger","Joi","error","crypto","logger","InternalServerError","Joi","BadRequestError","AppError","Joi","Joi","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","Joi","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","paginate","error","AppError","Joi","BadRequestError","Joi","error","BadRequestError","useAtlas","error","AppError","logger","Joi","InternalServerError","Joi","BadRequestError","error","Joi","BadRequestError","Joi","BadRequestError","error","Joi","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","error","AppError","InternalServerError","BadRequestError","useAtlas","error","Joi","BadRequestError","Joi","BadRequestError","error","Joi","useAtlas","BadRequestError","AppError","InternalServerError","NotFoundError","makeCacheKey","useCache","logger","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","error","AppError","InternalServerError","Joi","BadRequestError","res","filePath","emailContent","logger","InternalServerError","NotFoundError","useAtlas","verificationId","error","AppError","Joi","Joi","BadRequestError","error","logger","AppError","InternalServerError","BadRequestError","logger","Joi","ObjectId","error","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","useCache","logger","AppError","BadRequestError","makeCacheKey","paginate","InternalServerError","BadRequestError","NotFoundError","useAtlas","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","useCache","logger","AppError","BadRequestError","error","makeCacheKey","paginate","InternalServerError","useAtlas","NotFoundError","BadRequestError","BadRequestError","logger","Joi","Joi","BadRequestError","logger","error","useAtlas","useAtlas","BadRequestError","Joi","Joi","BadRequestError","error","BadRequestError","ObjectId","useAtlas","useCache","makeCacheKey","logger","useAtlas","useCache","logger","makeCacheKey","logger","useS3","useAtlas","cron","useS3","useAtlas","logger","AppError","BadRequestError","InternalServerError","Joi","error","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","Joi","ObjectId","useAtlas","InternalServerError","useCache","logger","makeCacheKey","paginate","error","BadRequestError","AppError","BadRequestError","Joi","ObjectId","error","Joi","BadRequestError","logger","AppError","BadRequestError","useAtlas","useCache","makeCacheKey","paginate","logger","InternalServerError","ObjectId","useAtlas","BadRequestError","useCache","logger","makeCacheKey","paginate","InternalServerError","AppError","error","AppError","BadRequestError","InternalServerError","Joi","BadRequestError","error","AppError","InternalServerError","BadRequestError","logger","error","Joi"]}
|