@eeplatform/core 1.8.6 → 1.8.7
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 +1 -0
- package/dist/index.js +36 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +36 -1
- 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","../src/config.ts","../src/resources/token/token.repository.ts","../src/resources/auth/auth.controller.ts","../src/resources/user/user.service.ts","../src/resources/file/file.repository.ts","../src/resources/file/file.model.ts","../src/resources/verification/verification.repository.ts","../src/resources/verification/verification.model.ts","../src/resources/verification/verification.service.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/user/user.controller.ts","../src/resources/organization/organization.model.ts","../src/resources/organization/organization.repository.ts","../src/resources/organization/organization.service.ts","../src/resources/organization/organization.controller.ts","../src/resources/role/role.controller.ts","../src/resources/role/role.service.ts","../src/resources/member/member.controller.ts","../src/resources/file/file.service.ts","../src/resources/file/file.controller.ts","../src/resources/verification/verification.controller.ts","../src/resources/address/address.model.ts","../src/resources/address/address.repository.ts","../src/resources/address/address.controller.ts","../src/resources/token/token.model.ts","../src/resources/counter/counter.model.ts","../src/resources/counter/counter.repository.ts","../src/resources/utils/gemini.service.ts","../src/resources/utils/github.service.ts","../src/resources/utils/transcribe.service.ts","../src/resources/utils/audio-transcription.controller.ts","../src/resources/utils/util.controller.ts","../src/resources/utils/transaction.schema.ts","../src/resources/psgc/psgc.model.ts","../src/resources/psgc/psgc.repository.ts","../src/resources/psgc/psgc.controller.ts"],"sourcesContent":["import { ClientSession, ObjectId } from \"mongodb\";\nimport { MUser, MUserRole, TUser, TUserRole } from \"./user.model\";\nimport {\n useAtlas,\n InternalServerError,\n logger,\n BadRequestError,\n paginate,\n useCache,\n makeCacheKey,\n} from \"@eeplatform/nodejs-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 createTextIndex() {\n try {\n await collection.createIndex({\n firstName: \"text\",\n middleName: \"text\",\n lastName: \"text\",\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 { email: 1, deletedAt: 1 },\n { unique: true }\n );\n } catch (error) {\n throw new Error(\"Failed to create unique index on email.\");\n }\n }\n\n async function createUser(value: TUser, session?: ClientSession) {\n try {\n value = new MUser(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 getUsers({\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 getUsers: ${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 getUsers: ${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 getUsers: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getUsers: ${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 ];\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 async function addUserRole(\n { _id, role } = {} as { _id: string | ObjectId; role: TUserRole },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n role = new MUserRole(role);\n\n try {\n await collection.updateOne(\n { _id, \"roles.app\": { $ne: role.app } },\n // @ts-ignore\n { $push: { roles: role } },\n { session }\n );\n } catch (error) {\n throw new InternalServerError(\"Failed to add user role.\");\n }\n }\n\n return {\n createTextIndex,\n createUniqueIndex,\n createUser,\n getUserByEmail,\n getUserById,\n getUsers,\n updatePassword,\n updateName,\n updateBirthday,\n updateUserFieldById,\n addUserRole,\n getUserByReferralCode,\n };\n}\n","import { ObjectId } from \"mongodb\";\n\nexport type TUserRole = {\n name: string;\n app: string;\n role: ObjectId | string;\n status?: string;\n};\n\nexport class MUserRole implements TUserRole {\n name: string;\n app: string;\n role: ObjectId | string;\n status?: string;\n\n constructor(value: TUserRole) {\n this.name = value.name ?? \"\";\n this.app = value.app ?? \"\";\n this.role = value.role ?? \"\";\n this.status = value.status ?? \"active\";\n }\n}\n\nexport type TUser = {\n _id?: ObjectId;\n email: string;\n password: string;\n prefix?: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n suffix?: string;\n birthMonth?: string;\n birthDay?: number;\n birthYear?: number;\n gender?: string;\n defaultOrg?: ObjectId | string;\n xenditCustomerId?: string;\n type?: string;\n status?: string;\n referralCode?: string;\n referredBy?: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport class MUser implements TUser {\n _id?: ObjectId;\n email: string;\n password: string;\n prefix?: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n suffix?: string;\n birthMonth?: string;\n birthDay?: number;\n birthYear?: number;\n gender?: string;\n roles?: TUserRole[];\n status?: string;\n type?: string;\n xenditCustomerId?: string | undefined;\n referralCode?: string;\n referredBy?: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n defaultOrg?: ObjectId | string;\n\n constructor(value: TUser) {\n this._id = value._id ?? new ObjectId();\n this.email = value.email ?? \"\";\n this.password = value.password ?? \"\";\n this.prefix = value.prefix ?? \"\";\n this.firstName = value.firstName ?? \"\";\n this.middleName = value.middleName ?? \"\";\n this.lastName = value.lastName ?? \"\";\n this.suffix = value.suffix ?? \"\";\n this.birthMonth = value.birthMonth ?? \"\";\n this.birthDay = value.birthDay ?? 0;\n this.birthYear = value.birthYear ?? 0;\n this.gender = value.gender ?? \"\";\n this.type = value.type ?? \"client\";\n this.status = value.status ?? \"\";\n this.xenditCustomerId = value.xenditCustomerId ?? \"\";\n this.referralCode = value.referralCode ?? \"\";\n this.referredBy = value.referredBy ?? \"\";\n this.createdAt = value.createdAt ?? new Date().toISOString();\n this.updatedAt = value.updatedAt ?? \"\";\n this.deletedAt = value.deletedAt ?? \"\";\n\n if (value.defaultOrg) {\n try {\n value.defaultOrg = new ObjectId(value.defaultOrg);\n } catch (error) {\n throw new Error(\"Invalid defaultOrg ID.\");\n }\n }\n\n this.defaultOrg = value.defaultOrg;\n }\n}\n","import { useUserRepo } from \"../user/user.repository\";\nimport {\n AppError,\n BadRequestError,\n comparePassword,\n generateToken,\n InternalServerError,\n NotFoundError,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { ACCESS_TOKEN_SECRET, REFRESH_TOKEN_SECRET } from \"../../config\";\nimport { useTokenRepo } from \"../token/token.repository\";\nimport jwt from \"jsonwebtoken\";\nimport { TUser } from \"../user/user.model\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport function useAuthService() {\n const expiresIn = \"1m\";\n\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 refreshToken(token: string) {\n type TMetadata = { user: string };\n\n let decoded: TMetadata;\n\n try {\n decoded = (await jwt.verify(token, REFRESH_TOKEN_SECRET)) as TMetadata;\n } catch (error) {\n throw new BadRequestError(\"Invalid refresh token\");\n }\n\n let _token;\n\n try {\n _token = await useTokenRepo().getToken(token);\n if (!_token) {\n throw new NotFoundError(\"Invalid token\");\n }\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(`${error}`);\n }\n }\n\n let accessToken;\n\n try {\n accessToken = generateToken({\n secret: ACCESS_TOKEN_SECRET,\n metadata: { user: decoded.user },\n options: { expiresIn },\n });\n } catch (error) {\n throw new BadRequestError(\"Error generating access token\");\n }\n\n return accessToken;\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 refreshToken,\n logout,\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\";\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 GEMINI_API_KEY = (process.env.GEMINI_API_KEY as string) ?? \"\";\nexport const ASSEMBLY_AI_API_KEY =\n (process.env.ASSEMBLY_AI_API_KEY as string) ?? \"\";\n\nexport const DOMAIN = (process.env.DOMAIN as string) ?? \"localhost\";\n","import {\n InternalServerError,\n logger,\n makeCacheKey,\n useAtlas,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { ObjectId } from \"mongodb\";\n\nexport function useTokenRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"tokens\";\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 createToken(\n { token, user } = {} as { token: string; user: string | ObjectId }\n ) {\n try {\n user = new ObjectId(user);\n } catch (error) {\n return Promise.reject(\"Invalid user ID\");\n }\n\n try {\n await collection.insertOne({ token, user });\n delCachedData();\n return \"Token created\";\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n async function getToken(token: string) {\n const cacheKey = makeCacheKey(namespace_collection, { token });\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 getToken: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne({ token });\n\n if (data) {\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for token: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for token: ${err.message}`,\n });\n });\n }\n\n return data;\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n async function deleteToken(token: string) {\n try {\n const result = await collection.deleteOne({ token });\n delCachedData();\n return result;\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n return {\n createToken,\n getToken,\n deleteToken,\n };\n}\n","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 \"@eeplatform/nodejs-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 refreshToken(req: Request, res: Response, next: NextFunction) {\n const refreshToken = req.body.token as string;\n\n if (!refreshToken) {\n next(new BadRequestError(\"Refresh token is required\"));\n return;\n }\n\n try {\n const newRefreshToken = await useAuthService().refreshToken(refreshToken);\n res.json({ token: newRefreshToken });\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 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 async function resetPassword(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const otp = (req.body.otp as string) || \"\";\n const newPassword = (req.body.newPassword as string) || \"\";\n const passwordConfirmation =\n (req.body.passwordConfirmation as string) || \"\";\n\n const validation = Joi.object({\n otp: Joi.string().hex().required(),\n newPassword: Joi.string().required().min(8),\n passwordConfirmation: Joi.string().required().min(8),\n });\n\n const { error } = validation.validate({\n otp,\n newPassword,\n passwordConfirmation,\n });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await useUserService().resetPassword(\n otp,\n newPassword,\n passwordConfirmation\n );\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function signUp(req: Request, res: Response, next: NextFunction) {\n const email = req.body.email as string;\n const referralCode = (req.body.referral as string) ?? \"\";\n\n const validation = Joi.object({\n email: Joi.string().email().required(),\n referralCode: Joi.string().min(4).optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ email, referralCode });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _signUp({\n email,\n metadata: {\n referralCode,\n },\n });\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n login,\n refreshToken,\n logout,\n resetPassword,\n signUp,\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n NotFoundError,\n hashPassword,\n logger,\n makeCacheKey,\n useAtlas,\n useCache,\n useS3,\n} from \"@eeplatform/nodejs-utils\";\nimport { useUserRepo } from \"../user/user.repository\";\nimport { MUser, 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 { ObjectId } from \"mongodb\";\nimport { useRoleRepo } from \"../role/role.repository\";\n\nexport function useUserService() {\n const {\n createUser: _createUser,\n getUserByEmail,\n getUserById: _getById,\n updateName: _updateName,\n updateBirthday: _updateBirthday,\n updateUserFieldById: _updateUserFieldById,\n getUsers: _getUsers,\n } = useUserRepo();\n\n const { addRole } = useRoleRepo();\n const { add: addMember } = useMemberRepo();\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 = new ObjectId();\n\n const user: TUser = {\n _id: userId,\n email: DEFAULT_USER_EMAIL,\n password: hashedPassword,\n firstName: DEFAULT_USER_FIRST_NAME,\n lastName: DEFAULT_USER_LAST_NAME,\n status: \"active\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Xendit customer creation removed\n // const customer = await createCustomer({\n // reference_id: userId.toString(),\n // type: \"INDIVIDUAL\",\n // individual_detail: {\n // given_names: user.firstName,\n // surname: user.lastName,\n // },\n // email: user.email,\n // });\n\n // if (!customer.id) {\n // throw new InternalServerError(\"Failed to create xendit customer.\");\n // }\n\n // user.xenditCustomerId = customer.id;\n\n await _createUser(user, session);\n\n const roleId = await addRole(\n {\n id: \"\",\n name: \"Super Admin\",\n type: \"admin\",\n permissions: [\"*\"],\n status: \"active\",\n default: true,\n },\n session\n );\n\n await addMember(\n {\n user: userId.toString(),\n name: `${user.firstName} ${user.lastName}`,\n role: roleId.toString(),\n roleName: \"Super Admin\",\n type: \"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 getUsers({\n search = \"\",\n page = 1,\n status = \"\",\n type = \"\",\n limit = 10,\n } = {}) {\n try {\n return await _getUsers({ search, page, status, type, limit });\n } catch (error) {\n throw error;\n }\n }\n\n type TCreateUser = Pick<\n TUser,\n | \"email\"\n | \"password\"\n | \"prefix\"\n | \"firstName\"\n | \"middleName\"\n | \"lastName\"\n | \"suffix\"\n >;\n\n async function createUser(value: TCreateUser) {\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\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 userId = new ObjectId();\n\n const user: TUser = {\n _id: userId,\n email: value.email,\n password: hashedPassword,\n prefix: value.prefix,\n firstName: value.firstName,\n middleName: value.middleName,\n lastName: value.lastName,\n suffix: value.suffix,\n status: \"active\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Xendit customer creation removed\n // const customer = await createCustomer({\n // reference_id: userId.toString(),\n // type: \"INDIVIDUAL\",\n // individual_detail: {\n // given_names: user.firstName,\n // surname: user.lastName,\n // },\n // email: user.email,\n // });\n\n // if (!customer.id) {\n // throw new InternalServerError(\"Failed to create xendit customer.\");\n // }\n\n // user.xenditCustomerId = customer.id;\n\n await _createUser(user, 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: _getVerificationById, updateStatusById: _updateStatusById } =\n useVerificationRepo();\n\n async function createUserByInvite({\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 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 const user: TUser = new MUser({\n email,\n password: hashedPassword,\n firstName,\n lastName,\n status: \"active\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n defaultOrg: invitation.metadata?.org,\n });\n\n userId = await _createUser(user, session);\n }\n\n await _updateStatusById(id, \"complete\", session);\n\n await addMember(\n {\n user: userId.toString(),\n name: `${firstName} ${lastName}`,\n role: invitation.metadata?.role,\n roleName: invitation.metadata?.roleName,\n type: invitation.metadata?.app,\n org: invitation.metadata?.org ?? \"\",\n orgName: invitation.metadata?.orgName ?? \"\",\n },\n session\n );\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 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 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 = new ObjectId();\n\n const user: TUser = {\n _id: userId,\n email,\n password: hashedPassword,\n firstName,\n lastName,\n status: \"active\",\n referredBy: signUp.metadata?.referralCode,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n await _createUser(user, session);\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 { verify, getById, updateStatusById } = useVerificationService();\n\n async function resetPassword(\n id: string,\n newPassword: string,\n passwordConfirmation: string\n ) {\n try {\n await verify(id);\n } catch (error) {\n throw error;\n }\n\n if (newPassword !== passwordConfirmation) {\n throw new BadRequestError(\"Passwords do not match.\");\n }\n\n let hashedPassword = \"\";\n\n try {\n hashedPassword = await hashPassword(newPassword);\n } catch (error) {\n throw new InternalServerError(`Error hashing password: ${error}`);\n }\n\n try {\n const otpDoc = await getById(id);\n if (!otpDoc) {\n throw new NotFoundError(\"You are using an invalid reset link.\");\n }\n\n if (otpDoc.status === \"used\") {\n throw new BadRequestError(\"This link has already been invalidated.\");\n }\n\n await updateStatusById(id, \"used\");\n\n return \"Successfully reset password.\";\n } catch (error) {\n throw error;\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 getUsers,\n createUser,\n resetPassword,\n updateName,\n updateBirthday,\n updateUserFieldById,\n updateUserProfile,\n createUserByInvite,\n createUserBySignUp,\n createDefaultUser,\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n useAtlas,\n useCache,\n} from \"@eeplatform/nodejs-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 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 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 BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { MVerification, 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 = new MVerification(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 } = {} 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 }\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 // 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 { BadRequestError } from \"@eeplatform/nodejs-utils\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TVerificationMetadata = {\n name?: string;\n app?: string;\n role?: string;\n roleName?: string;\n referralCode?: string;\n org?: string | ObjectId;\n orgName?: string;\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 | null;\n expireAt: string | Date;\n};\n\nexport class MVerification implements TVerification {\n _id?: ObjectId;\n type: string;\n email: string;\n metadata?: TVerificationMetadata;\n status?: string;\n createdAt: string | Date;\n updatedAt?: string | Date | null;\n expireAt: string | Date;\n\n constructor(value: TVerification) {\n this._id = value._id ?? new ObjectId();\n this.type = value.type ?? \"\";\n this.email = value.email ?? \"\";\n\n if (this.metadata?.org) {\n try {\n this.metadata.org = new ObjectId(this.metadata?.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n }\n\n this.metadata = value.metadata ?? {};\n this.status = value.status ?? \"pending\";\n this.createdAt = value.createdAt ?? new Date();\n this.updatedAt = value.updatedAt ?? null;\n this.expireAt = value.expireAt ?? new Date(Date.now() + 3600 * 1000);\n }\n}\n","import {\n useMailer,\n compileHandlebar,\n logger,\n getDirectory,\n BadRequestError,\n NotFoundError,\n InternalServerError,\n useAtlas,\n} from \"@eeplatform/nodejs-utils\";\nimport {\n TVerification,\n TVerificationMetadata,\n} from \"./verification.model\";\nimport { useVerificationRepo } from \"./verification.repository\";\nimport {\n APP_MAIN,\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/user.repository\";\nimport { TKeyValuePair } from \"../../types/local.types\";\nimport { useMemberRepo } from \"../member/member.repository\";\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, getUserByReferralCode } = useUserRepo();\n const { add: addMember } = useMemberRepo();\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: \"EEPlatform\",\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: \"EEPlatform\",\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: \"EEPlatform\",\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 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 type: _id.metadata?.app,\n org: _id.metadata?.org ?? \"\",\n orgName: _id.metadata?.orgName ?? \"\",\n role: _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: TKeyValuePair;\n }) {\n try {\n if (\n metadata &&\n metadata.referralCode &&\n typeof metadata.referralCode === \"string\"\n ) {\n const code = await getUserByReferralCode(metadata.referralCode);\n\n if (!code) {\n throw new BadRequestError(\"Invalid referral code.\");\n }\n }\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 createdAt: new Date().toISOString(),\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: \"EEPlatform\",\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 return {\n createForgetPassword,\n createUserInvite,\n verify,\n getById,\n getVerifications,\n cancelUserInvitation,\n updateStatusById,\n signUp,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { MMember, TMember } from \"./member.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\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 createIndex() {\n try {\n await collection.createIndex([\n {\n name: 1,\n },\n {\n status: 1,\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n {\n org: 1,\n user: 1,\n type: 1,\n },\n { partialFilterExpression: { deletedAt: \"\" }, unique: true },\n );\n } catch (error) {\n throw new Error(\"Failed to create unique index.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex([\n {\n name: \"text\",\n },\n {\n orgName: \"text\",\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create text index.\");\n }\n }\n\n async function add(value: TMember, session?: ClientSession) {\n try {\n value = MMember(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 getByOrg(org: string | ObjectId) {\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n org: String(org),\n tag: \"byOrg\",\n });\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByOrg member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>({ org });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by org: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by org: ${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 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 getAll(\n { search, limit, page, user, org, type, status } = {} as {\n search: string;\n limit: number;\n page: number;\n user?: string | ObjectId;\n org?: string | ObjectId;\n type: string;\n status: string;\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> = { type, status };\n\n const cacheKeyOptions: Record<string, any> = { type, 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 return {\n createIndex,\n createUniqueIndex,\n createTextIndex,\n add,\n getById,\n getByOrg,\n getAll,\n getOrgsByUserId,\n updateStatusByUserId,\n updateName,\n getByUserId,\n getOrgsByMembership,\n countByOrg,\n countByUser,\n getByUserType,\n };\n}\n","import { BadRequestError } from \"@eeplatform/nodejs-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 type: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport function MMember(value: TMember): TMember {\n const schema = Joi.object({\n _id: Joi.string().hex().optional().allow(\"\", null),\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 type: Joi.string().required(),\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\n const { error } = schema.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 type: value.type,\n role: value.role,\n roleName: value.roleName ?? \"\",\n status: value.status || \"active\",\n createdAt: value.createdAt || new Date().toISOString(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n useAtlas,\n paginate,\n logger,\n makeCacheKey,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { MRole, TMiniRole, TRole } from \"./role.model\";\nimport { ObjectId, ClientSession } from \"mongodb\";\nimport { TKeyValuePair } from \"../../types/local.types\";\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 createIndex() {\n try {\n await collection.createIndex({ name: 1 });\n await collection.createIndex({ type: 1 });\n await collection.createIndex({ status: 1 });\n await collection.createIndex({ id: 1 });\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on role.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\"Failed to create text index on role.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { name: 1, type: 1, id: 1 },\n { unique: true },\n );\n } catch (error) {\n throw new InternalServerError(\"Failed to create unique index on role.\");\n }\n }\n\n async function addRole(\n value: TRole,\n session?: ClientSession,\n clearCache = true,\n ) {\n value = new MRole(value);\n\n try {\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 throw new InternalServerError(\"Failed to create role.\");\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 getRoleById(_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 getRoleById 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 type = \"\",\n id = \"\",\n } = {} as {\n search?: string;\n page?: number;\n limit?: number;\n sort?: any;\n type?: string;\n id?: string | ObjectId;\n },\n ) {\n limit = limit > 0 ? limit : 10;\n search = search || \"\";\n page = page > 0 ? page - 1 : 0;\n\n if (id && typeof id === \"string\" && id.length === 24) {\n try {\n id = new ObjectId(id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n }\n\n const query: TKeyValuePair = { status: \"active\" };\n\n // Only add id to query if it's provided and valid\n if (id) {\n query.id = id;\n }\n\n const cacheKeyOptions: Record<string, any> = {\n status: \"active\",\n limit,\n page,\n };\n\n if (id) {\n cacheKeyOptions.id = String(id);\n }\n\n if (type) {\n cacheKeyOptions.type = type;\n query.type = type;\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: TMiniRole,\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 (!value.name) {\n delete value.name;\n }\n\n if (!value.permissions) {\n delete value.permissions;\n }\n\n if (value.name || value.permissions) {\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 } else {\n throw new BadRequestError(\"No fields to update.\");\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 deleteRole(_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.updateOne(\n { _id },\n { $set: { status: \"deleted\", updateAt: new Date() } },\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 createIndex,\n createTextIndex,\n createUniqueIndex,\n addRole,\n getRoles,\n getRoleByUserId,\n getRoleById,\n getRoleByName,\n updateRole,\n deleteRole,\n updatePermissionsById,\n delCachedData,\n };\n}\n","import { 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 type?: string;\n status?: string;\n default?: boolean;\n createdBy?: string | ObjectId;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport type TMiniRole = Pick<TRole, \"name\" | \"permissions\">;\n\nexport class MRole implements TRole {\n _id: ObjectId;\n id: string | ObjectId;\n name?: string;\n description?: string;\n permissions?: Array<string>;\n type?: string;\n status?: string;\n default?: boolean;\n createdBy?: string | ObjectId;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n constructor(value: TRole) {\n if (typeof value._id === \"string\") {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new Error(\"Invalid _id.\");\n }\n }\n\n if (typeof value.id === \"string\" && value.id.length === 24) {\n try {\n value.id = new ObjectId(value.id);\n } catch (error) {\n throw new Error(\"Invalid id.\");\n }\n }\n\n this.id = value.id ?? \"\";\n\n this._id = value._id ?? new ObjectId();\n this.name = value.name ?? \"\";\n this.description = value.description ?? \"\";\n this.permissions = value.permissions ?? [];\n this.type = value.type ? value.type : \"account\";\n this.status = value.status ?? \"active\";\n\n this.default = value.default ?? false;\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new Error(\"Invalid createdBy.\");\n }\n }\n this.createdBy = value.createdBy ?? \"\";\n\n this.createdAt = value.createdAt ?? new Date().toISOString();\n this.updatedAt = value.updatedAt ?? \"\";\n this.deletedAt = value.deletedAt ?? \"\";\n }\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@eeplatform/nodejs-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 getUsers: _getUsers,\n createUserByInvite: _createUserByInvite,\n createUserBySignUp: _createUserBySignUp,\n } = useUserService();\n\n const { getUserById: _getUserById } = useUserRepo();\n\n async function getUsers(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 _getUsers({ 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 createUserByVerification(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\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 _createUserByInvite({ 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 return {\n getUsers,\n getUserById,\n updateName,\n updateBirthday,\n updateUserFieldById,\n updateUserProfile,\n createUserByVerification,\n };\n}\n","import { BadRequestError } from \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TOrg = {\n _id?: ObjectId;\n name: string;\n description: string;\n type?: string;\n sector: string;\n sectorName?: string;\n sectorType: string;\n category: string;\n email?: string;\n contact?: string;\n region?: string;\n regionName?: string;\n province?: string;\n provinceName?: string;\n cityMunicipality?: string;\n cityMunicipalityName?: string;\n barangay?: string;\n barangayName?: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport const schemaOrg = Joi.object({\n _id: Joi.string().hex().optional().allow(\"\", null),\n name: Joi.string().required(),\n email: Joi.string().email().required(),\n contact: Joi.string().required(),\n type: Joi.string().required(),\n sector: Joi.string().required(),\n sectorName: Joi.string().optional().allow(\"\", null),\n sectorType: Joi.string().allow(\"public\", \"private\").required(),\n category: Joi.string().required(),\n region: Joi.string().optional().allow(\"\", null),\n regionName: Joi.string().optional().allow(\"\", null),\n province: Joi.string().optional().allow(\"\", null),\n provinceName: Joi.string().optional().allow(\"\", null),\n cityMunicipality: Joi.string().optional().allow(\"\", null),\n cityMunicipalityName: Joi.string().optional().allow(\"\", null),\n barangay: Joi.string().optional().allow(\"\", null),\n barangayName: Joi.string().optional().allow(\"\", null),\n description: Joi.string().optional().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\nexport function MOrg(value: TOrg): TOrg {\n const { error } = schemaOrg.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n if (value._id) {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n }\n\n return {\n _id: value._id,\n name: value.name,\n description: value.description,\n type: value.type,\n sector: value.sector,\n sectorName: value.sectorName || \"\",\n sectorType: value.sectorType,\n category: value.category,\n email: value.email,\n contact: value.contact,\n region: value.region,\n regionName: value.regionName || \"\",\n province: value.province,\n provinceName: value.provinceName || \"\",\n cityMunicipality: value.cityMunicipality,\n cityMunicipalityName: value.cityMunicipalityName || \"\",\n barangay: value.barangay,\n barangayName: value.barangayName || \"\",\n status: value.status || \"active\",\n createdAt: value.createdAt || new Date().toISOString(),\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 \"@eeplatform/nodejs-utils\";\nimport { MOrg, TOrg } from \"./organization.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\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 }, unique: true, name: \"unique_name\" },\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 = MOrg(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>({ name });\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 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 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 return {\n createIndexes,\n add,\n getAll,\n getById,\n updateFieldById,\n deleteById,\n getByName,\n };\n}\n","import { useAtlas } from \"@eeplatform/nodejs-utils\";\nimport { useOrgRepo } from \"./organization.repository\";\nimport { useRoleRepo } from \"../role/role.repository\";\nimport { TOrg } from \"./organization.model\";\n\nexport function useOrgService() {\n const { add: addOrg } = useOrgRepo();\n const { addRole } = useRoleRepo();\n\n async function add(value: TOrg) {\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\n try {\n // Create organization\n const org = await addOrg(value, session);\n\n // Create roles\n const role = await addRole(\n {\n id: org,\n name: \"Owner\",\n description: \"Owner of the organization\",\n permissions: [\"all\"],\n },\n session\n );\n\n // Commit transaction\n session?.commitTransaction();\n\n return \"Organization created successfully.\";\n } catch (error) {\n // Rollback transaction\n 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 \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\nimport { useOrgService } from \"./organization.service\";\nimport { useMemberRepo } from \"../member/member.repository\";\nimport { useOrgRepo } from \"./organization.repository\";\nimport { schemaOrg } 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 } = useOrgRepo();\n\n async function createOrg(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaOrg.validate(value);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _add(value);\n\n res.json({ message });\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 return {\n createOrg,\n getOrgsByUserId,\n getByName,\n getAll,\n getById,\n };\n}\n","import { NextFunction, Request, Response } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, InternalServerError } from \"@eeplatform/nodejs-utils\";\nimport { useRoleRepo } from \"./role.repository\";\nimport { useRoleService } from \"./role.service\";\n\nexport function useRoleController() {\n const {\n addRole: _createRole,\n getRoleById: _getRoleById,\n getRoleByUserId: _getRoleByUserId,\n getRoles: _getRoles,\n updateRole: _updateRole,\n updatePermissionsById: _updatePermissionsById,\n } = useRoleRepo();\n\n async function createRole(req: Request, res: Response, next: NextFunction) {\n const payload = req.body;\n const validation = Joi.object({\n name: Joi.string().required(),\n permissions: Joi.array().items(Joi.string()).required(),\n type: Joi.string()\n .valid(\"school\", \"division\", \"region\", \"account\")\n .required(),\n id: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.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 type = (req.query.type as string) ?? \"\";\n const id = (req.query.id 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 type: Joi.string().optional().allow(\"\", null),\n id: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ search, page, limit, type, id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getRoles({ search, page, limit, type, id });\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 _getRoleById(_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 const { deleteById } = useRoleService();\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 {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@eeplatform/nodejs-utils\";\nimport { ObjectId } from \"bson\";\nimport Joi from \"joi\";\nimport { useRoleRepo } from \"./role.repository\";\nimport { useMemberRepo } from \"../member\";\n\nexport function useRoleService() {\n const { getByOrg } = useMemberRepo();\n\n const { deleteRole, getRoleById } = useRoleRepo();\n\n async function deleteById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).validate(_id);\n if (error) {\n throw new BadRequestError(\"Invalid Role ID\");\n }\n\n try {\n const role = await getRoleById(_id);\n if (!role) {\n throw new BadRequestError(\"Role not found\");\n }\n\n const org = await getByOrg(String(role.id));\n\n if (org) {\n throw new BadRequestError(\"Cannot delete role assigned to members\");\n }\n\n await deleteRole(_id);\n\n return \"Role deleted successfully\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to delete role\");\n }\n }\n\n return {\n deleteById,\n };\n}\n","import Joi from \"joi\";\nimport { useMemberRepo } from \"./member.repository\";\nimport { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@eeplatform/nodejs-utils\";\n\nexport function useMemberController() {\n const {\n getByUserId: _getByUserId,\n getAll: _getAll,\n getOrgsByMembership: _getOrgsByMembership,\n updateStatusByUserId: _updateStatusByUserId,\n getByUserType: _getByUserType,\n } = useMemberRepo();\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 type: 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 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 type = (req.query.type as string) ?? \"main\";\n const status = (req.query.status as string) ?? \"active\";\n\n const validation = Joi.object({\n limit: Joi.number().min(10).max(300).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 type: Joi.string().required(),\n status: Joi.string().required(),\n });\n\n const { error } = validation.validate({\n search,\n page,\n user,\n org,\n type,\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 type,\n limit,\n status,\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 return {\n getByUserId,\n getAll,\n getOrgsByMembership,\n updateStatusByUserId,\n getByUserType,\n };\n}\n","import { TFile } from \"./file.model\";\nimport { useFileRepo } from \"./file.repository\";\nimport { logger, useS3, useAtlas } from \"@eeplatform/nodejs-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 \"@eeplatform/nodejs-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 {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@eeplatform/nodejs-utils\";\nimport { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useVerificationService } from \"./verification.service\";\nimport { useVerificationRepo } from \"./verification.repository\";\n\nexport function useVerificationController() {\n const {\n createUserInvite: _createUserInvite,\n createForgetPassword: _createForgetPassword,\n cancelUserInvitation: _cancelUserInvitation,\n verify: _verify,\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 });\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\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 });\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 return {\n getVerifications,\n createUserInvite,\n createForgetPassword,\n verify,\n cancelUserInvitation,\n };\n}\n","import { BadRequestError } from \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TAddress = {\n _id?: ObjectId;\n type: string;\n user: ObjectId | string;\n org?: ObjectId | string;\n country: string;\n address: string;\n continuedAddress?: string;\n city: string;\n province: string;\n postalCode: string;\n taxId: string;\n};\n\nexport const addressSchema = Joi.object({\n type: Joi.string().required(),\n user: Joi.string().hex().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n country: Joi.string().required(),\n address: Joi.string().required(),\n continuedAddress: Joi.string().optional().allow(\"\", null),\n city: Joi.string().required(),\n province: Joi.string().required(),\n postalCode: Joi.string().required(),\n taxId: Joi.string().optional().allow(\"\", null),\n});\n\nexport function MAddress(value: any): TAddress {\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.org) {\n try {\n value.org = new ObjectId(value.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n }\n\n return {\n type: value.type ?? \"billing\",\n user: value.user ?? \"\",\n org: value.org ?? \"\",\n country: value.country ?? \"\",\n address: value.address ?? \"\",\n continuedAddress: value.continuedAddress ?? \"\",\n city: value.city ?? \"\",\n province: value.province ?? \"\",\n postalCode: value.postalCode ?? \"\",\n taxId: value.taxId ?? \"\",\n };\n}\n","import {\n BadRequestError,\n useAtlas,\n useCache,\n makeCacheKey,\n logger,\n} from \"@eeplatform/nodejs-utils\";\nimport { MAddress, TAddress } from \"./address.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function useAddressRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new BadRequestError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"addresses\";\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 createIndex() {\n try {\n await collection.createIndexes([\n { key: { user: 1 } },\n { key: { type: 1 } },\n { key: { orgId: 1 } },\n ]);\n } catch (error) {\n throw new BadRequestError(\"Failed to create index on address.\");\n }\n }\n\n async function add(value: TAddress, session?: ClientSession) {\n try {\n value = MAddress(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n throw new BadRequestError(\"Failed to create address.\");\n }\n }\n\n type TUpdateAddress = Pick<\n TAddress,\n | \"country\"\n | \"address\"\n | \"continuedAddress\"\n | \"city\"\n | \"province\"\n | \"postalCode\"\n | \"taxId\"\n | \"org\"\n >;\n\n async function updateById(\n _id: string | ObjectId,\n value: TUpdateAddress,\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid address ID.\");\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 try {\n await collection.updateOne(\n { _id },\n { $set: value },\n { session, upsert: true }\n );\n delCachedData();\n return \"Successfully updated address.\";\n } catch (error: any) {\n throw new BadRequestError(\"Failed to update address.\");\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 user ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { user: String(user) });\n\n try {\n // Check cache first\n const cached = await getCache<TAddress>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByUserId address: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TAddress>({ user });\n\n if (data) {\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for address by user ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for address by user ID: ${err.message}`,\n });\n });\n }\n\n return data;\n } catch (error) {\n throw new BadRequestError(\"Failed to get address by ID.\");\n }\n }\n\n async function getByOrgId(org: string | ObjectId) {\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid orgId.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { org: String(org) });\n\n try {\n // Check cache first\n const cached = await getCache<TAddress>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByOrgId address: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TAddress>({ org });\n\n if (data) {\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for address by org ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for address by org ID: ${err.message}`,\n });\n });\n }\n\n return data;\n } catch (error) {\n throw new BadRequestError(\"Failed to get address by orgId.\");\n }\n }\n\n return {\n createIndex,\n add,\n getByUserId,\n getByOrgId,\n updateById,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, NotFoundError } from \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\nimport { useAddressRepo } from \"./address.repository\";\n\nexport function useAddressController() {\n const {\n add: _add,\n getByUserId: _getByUserId,\n getByOrgId: _getByOrgId,\n updateById: _updateById,\n } = useAddressRepo();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const validation = Joi.object({\n type: Joi.string().required(),\n user: Joi.string().hex().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n country: Joi.string().required(),\n address: Joi.string().required(),\n continuedAddress: Joi.string().optional().allow(\"\", null),\n city: Joi.string().required(),\n province: Joi.string().required(),\n postalCode: Joi.string().required(),\n taxId: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(value);\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const value = req.body;\n const id = await _add(value);\n res.json({ message: \"Successfully added subscription.\", id });\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 value = req.body;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n country: Joi.string().required(),\n address: Joi.string().required(),\n continuedAddress: Joi.string().optional().allow(\"\", null),\n city: Joi.string().required(),\n province: Joi.string().required(),\n postalCode: Joi.string().required(),\n taxId: Joi.string().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ id, ...value });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateById(id, value);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getByUserId(req: Request, res: Response, next: NextFunction) {\n const user = req.params.user as string;\n\n const validation = Joi.string().hex().required();\n const { error } = validation.validate(user);\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const address = await _getByUserId(user);\n if (!address) {\n next(new NotFoundError(\"Address not found.\"));\n return;\n }\n\n res.json(address);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getByOrgId(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id as string;\n\n const validation = Joi.string().hex().required();\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const address = await _getByOrgId(id);\n if (!address) {\n next(new NotFoundError(\"Address not found.\"));\n return;\n }\n\n res.json(address);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n add,\n getByUserId,\n getByOrgId,\n updateById,\n };\n}\n","import { ObjectId } from \"mongodb\";\n\nexport type TToken = {\n token: string;\n user: ObjectId;\n createdAt?: string;\n};\n\nexport class MToken implements TToken {\n token: string;\n user: ObjectId;\n createdAt?: string;\n\n constructor(value: TToken) {\n this.token = value.token ?? \"\";\n this.user = value.user ?? new ObjectId();\n this.createdAt = value.createdAt ?? new Date().toISOString();\n }\n}","import { BadRequestError } from \"@eeplatform/nodejs-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 {\n useAtlas,\n useCache,\n makeCacheKey,\n logger,\n} from \"@eeplatform/nodejs-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 createIndex() {\n try {\n await collection.createIndexes([\n {\n key: { type: 1 },\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndexes([\n {\n key: { type: 1 },\n unique: true,\n name: \"unique_type\",\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create counter unique 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 createIndex,\n createUniqueIndex,\n add,\n getByType,\n incrementByType,\n };\n}\n","import { GoogleGenerativeAI } from \"@google/generative-ai\";\nimport { GEMINI_API_KEY } from \"../../config\";\nimport fs from \"fs\";\nimport path from \"path\";\n\n// Initialize Gemini AI\nconst genAI = new GoogleGenerativeAI(GEMINI_API_KEY);\n\n// Supported audio formats for Gemini AI\nconst SUPPORTED_AUDIO_FORMATS = [\n \"audio/wav\",\n \"audio/mp3\",\n \"audio/aiff\",\n \"audio/aac\",\n \"audio/ogg\",\n \"audio/flac\",\n];\n\nexport interface AudioTranscriptionOptions {\n prompt?: string;\n language?: string;\n enableTimestamps?: boolean;\n maxTokens?: number;\n}\n\nexport interface AudioTranscriptionResult {\n transcription: string;\n confidence?: number;\n language?: string;\n duration?: number;\n timestamps?: Array<{\n start: number;\n end: number;\n text: string;\n }>;\n}\n\nexport interface AudioFileData {\n data: Buffer;\n mimeType: string;\n}\n\nexport interface PhonemeMatchOptions {\n language?: string;\n caseSensitive?: boolean;\n partialMatch?: boolean;\n}\n\nexport interface PhonemeMatchResult {\n transcription: string;\n targetPhoneme: string;\n isMatch: boolean;\n confidence?: number;\n detectedPhonemes?: string[];\n matchDetails?: {\n exactMatch: boolean;\n partialMatch: boolean;\n position?: number;\n context?: string;\n };\n}\n\nexport function useGeminiAiService() {\n /**\n * Convert audio file to base64 format required by Gemini\n */\n const prepareAudioData = (audioBuffer: Buffer, mimeType: string): string => {\n return audioBuffer.toString(\"base64\");\n };\n\n /**\n * Validate audio file format\n */\n const validateAudioFormat = (mimeType: string): boolean => {\n return SUPPORTED_AUDIO_FORMATS.includes(mimeType);\n };\n\n /**\n * Read audio file from filesystem\n */\n const readAudioFile = async (filePath: string): Promise<AudioFileData> => {\n try {\n const audioBuffer = await fs.promises.readFile(filePath);\n const extension = path.extname(filePath).toLowerCase();\n\n // Map file extensions to MIME types\n const mimeTypeMap: Record<string, string> = {\n \".wav\": \"audio/wav\",\n \".mp3\": \"audio/mp3\",\n \".aiff\": \"audio/aiff\",\n \".aac\": \"audio/aac\",\n \".ogg\": \"audio/ogg\",\n \".flac\": \"audio/flac\",\n };\n\n const mimeType = mimeTypeMap[extension];\n if (!mimeType) {\n throw new Error(`Unsupported audio format: ${extension}`);\n }\n\n return {\n data: audioBuffer,\n mimeType,\n };\n } catch (error) {\n throw new Error(\n `Failed to read audio file: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Transcribe audio using Gemini AI\n */\n const transcribeAudio = async (\n audioData: AudioFileData,\n options: AudioTranscriptionOptions = {}\n ): Promise<AudioTranscriptionResult> => {\n try {\n // Validate audio format\n if (!validateAudioFormat(audioData.mimeType)) {\n throw new Error(`Unsupported audio format: ${audioData.mimeType}`);\n }\n\n // Use Gemini Pro model (more widely available)\n const model = genAI.getGenerativeModel({ model: \"gemini-2.5-flash\" });\n\n // Prepare the prompt\n let prompt =\n \"Please transcribe the following audio file accurately. Provide the transcription as plain text.\";\n\n if (options.prompt) {\n prompt += ` Additional instructions: ${options.prompt}`;\n }\n\n if (options.language) {\n prompt += ` The audio is in ${options.language}.`;\n }\n\n if (options.enableTimestamps) {\n prompt += \" Please include timestamps if possible.\";\n }\n\n // Prepare audio data for Gemini\n const audioBase64 = prepareAudioData(audioData.data, audioData.mimeType);\n\n // Create the request\n const result = await model.generateContent([\n prompt,\n {\n inlineData: {\n data: audioBase64,\n mimeType: audioData.mimeType,\n },\n },\n ]);\n\n const response = await result.response;\n const transcription = response.text();\n\n return {\n transcription: transcription.trim(),\n language: options.language,\n };\n } catch (error) {\n throw new Error(\n `Audio transcription failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Transcribe audio from file path\n */\n const transcribeAudioFromFile = async (\n filePath: string,\n options: AudioTranscriptionOptions = {}\n ): Promise<AudioTranscriptionResult> => {\n try {\n const audioData = await readAudioFile(filePath);\n return await transcribeAudio(audioData, options);\n } catch (error) {\n throw new Error(\n `Failed to transcribe audio from file: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Transcribe audio from buffer\n */\n const transcribeAudioFromBuffer = async (\n audioBuffer: Buffer,\n mimeType: string,\n options: AudioTranscriptionOptions = {}\n ): Promise<AudioTranscriptionResult> => {\n try {\n const audioData: AudioFileData = {\n data: audioBuffer,\n mimeType,\n };\n return await transcribeAudio(audioData, options);\n } catch (error) {\n throw new Error(\n `Failed to transcribe audio from buffer: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Get supported audio formats\n */\n const getSupportedAudioFormats = (): string[] => {\n return [...SUPPORTED_AUDIO_FORMATS];\n };\n\n /**\n * Generate text content using Gemini AI (existing functionality)\n */\n const generateContent = async (\n prompt: string,\n options: { maxTokens?: number } = {}\n ): Promise<string> => {\n try {\n const model = genAI.getGenerativeModel({ model: \"gemini-pro\" });\n\n const result = await model.generateContent(prompt);\n const response = await result.response;\n\n return response.text();\n } catch (error) {\n throw new Error(\n `Content generation failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Transcribe audio and check for specific phoneme matches\n * This function uses a specialized prompt to focus on phoneme detection\n */\n const checkPhonemeMatch = async (\n audioData: AudioFileData,\n targetPhoneme: string,\n options: PhonemeMatchOptions = {}\n ): Promise<PhonemeMatchResult> => {\n try {\n // Validate audio format\n if (!validateAudioFormat(audioData.mimeType)) {\n throw new Error(`Unsupported audio format: ${audioData.mimeType}`);\n }\n\n // Use Gemini Pro model (more widely available)\n const model = genAI.getGenerativeModel({ model: \"gemini-2.5-flash\" });\n\n // Create a specialized prompt for phoneme detection focused on the first sound\n const phonemePrompt = `\nYou are a phonetic analysis expert. Please transcribe the following audio and analyze it for phonemes, with special focus on the FIRST SOUND produced.\n\nINSTRUCTIONS:\n1. Transcribe the audio as accurately as possible, even if it contains incomplete words, sounds, or non-words\n2. Identify the FIRST phoneme (speech sound) produced at the very beginning of the audio\n3. Check if this FIRST phoneme matches the target phoneme: \"${targetPhoneme}\"\n4. Only consider the target phoneme as a match if it appears as the FIRST sound in the sequence\n5. List all phonemes detected, but prioritize the first one for matching purposes\n\nTARGET PHONEME: ${targetPhoneme}\n${options.language ? `EXPECTED LANGUAGE: ${options.language}` : \"\"}\n\nPlease provide your response in the following format:\nTRANSCRIPTION: [The transcribed text/sounds]\nFIRST_PHONEME: [The very first phoneme/sound produced in the audio]\nPHONEMES_DETECTED: [Ordered list of all phonemes you can identify, starting with the first]\nTARGET_PHONEME_PRESENT: [YES/NO - whether the target phoneme \"${targetPhoneme}\" is the FIRST sound produced]\nMATCH_TYPE: [EXACT/PARTIAL/NONE - type of match found for the first phoneme only]\nPOSITION: [Position of the target phoneme: should be 0 if it's the first sound, -1 if not found as first sound]\nCONFIDENCE: [Your confidence level from 0.0 to 1.0]\nCONTEXT: [Description of the first sound and any surrounding context]\n\nIMPORTANT: Only consider it a match if the target phoneme is the FIRST sound produced. Even if the target phoneme appears later in the sequence, it should NOT be considered a match.\n `.trim();\n\n // Prepare audio data for Gemini\n const audioBase64 = prepareAudioData(audioData.data, audioData.mimeType);\n\n // Create the request\n const result = await model.generateContent([\n phonemePrompt,\n {\n inlineData: {\n data: audioBase64,\n mimeType: audioData.mimeType,\n },\n },\n ]);\n\n const response = await result.response;\n const analysisText = response.text();\n\n // Parse the response to extract structured data\n const transcription = extractValue(analysisText, \"TRANSCRIPTION\");\n const firstPhoneme = extractValue(analysisText, \"FIRST_PHONEME\");\n const detectedPhonemes = extractListValue(\n analysisText,\n \"PHONEMES_DETECTED\"\n );\n const isTargetPresent =\n extractValue(analysisText, \"TARGET_PHONEME_PRESENT\")?.toUpperCase() ===\n \"YES\";\n const matchType = extractValue(analysisText, \"MATCH_TYPE\")?.toUpperCase();\n const position = extractNumericValue(analysisText, \"POSITION\");\n const confidence = extractNumericValue(analysisText, \"CONFIDENCE\");\n const context = extractValue(analysisText, \"CONTEXT\");\n\n // Additional programmatic check for first phoneme matching\n const programmaticMatch = checkFirstPhonemeInText(\n transcription || analysisText,\n firstPhoneme ||\n (detectedPhonemes.length > 0 ? detectedPhonemes[0] : \"\"),\n targetPhoneme,\n options\n );\n\n // Determine final match result - only consider it a match if target is the first phoneme\n const isMatch =\n (isTargetPresent && position === 0) || programmaticMatch.found;\n const exactMatch =\n (matchType === \"EXACT\" && position === 0) || programmaticMatch.exact;\n const partialMatch =\n (matchType === \"PARTIAL\" && position === 0) ||\n programmaticMatch.partial;\n\n return {\n transcription: transcription || analysisText,\n targetPhoneme,\n isMatch,\n confidence: confidence !== null ? confidence : undefined,\n detectedPhonemes:\n detectedPhonemes.length > 0 ? detectedPhonemes : undefined,\n matchDetails: {\n exactMatch,\n partialMatch,\n position: isMatch\n ? position !== null\n ? position\n : programmaticMatch.position\n : -1,\n context:\n context ||\n programmaticMatch.context ||\n (firstPhoneme\n ? `First phoneme detected: ${firstPhoneme}. Target: ${targetPhoneme}`\n : \"Analysis focused on first sound produced\"),\n },\n };\n } catch (error) {\n throw new Error(\n `Phoneme analysis failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Check for phoneme match from file path\n */\n const checkPhonemeMatchFromFile = async (\n filePath: string,\n targetPhoneme: string,\n options: PhonemeMatchOptions = {}\n ): Promise<PhonemeMatchResult> => {\n try {\n const audioData = await readAudioFile(filePath);\n return await checkPhonemeMatch(audioData, targetPhoneme, options);\n } catch (error) {\n throw new Error(\n `Failed to analyze phonemes from file: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Check for phoneme match from buffer\n */\n const checkPhonemeMatchFromBuffer = async (\n audioBuffer: Buffer,\n mimeType: string,\n targetPhoneme: string,\n options: PhonemeMatchOptions = {}\n ): Promise<PhonemeMatchResult> => {\n try {\n const audioData: AudioFileData = {\n data: audioBuffer,\n mimeType,\n };\n return await checkPhonemeMatch(audioData, targetPhoneme, options);\n } catch (error) {\n throw new Error(\n `Failed to analyze phonemes from buffer: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Helper function to extract values from Gemini's structured response\n */\n const extractValue = (text: string, key: string): string | null => {\n const regex = new RegExp(`${key}:\\\\s*(.+?)(?=\\\\n|$)`, \"i\");\n const match = text.match(regex);\n return match ? match[1].trim() : null;\n };\n\n /**\n * Helper function to extract list values from Gemini's structured response\n */\n const extractListValue = (text: string, key: string): string[] => {\n const value = extractValue(text, key);\n if (!value) return [];\n\n // Parse comma-separated or bracket-enclosed lists\n return value\n .replace(/[\\[\\]]/g, \"\")\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n };\n\n /**\n * Helper function to extract numeric values from Gemini's structured response\n */\n const extractNumericValue = (text: string, key: string): number | null => {\n const value = extractValue(text, key);\n if (!value) return null;\n\n const num = parseFloat(value);\n return isNaN(num) ? null : num;\n };\n\n /**\n * Programmatic phoneme matching as backup/validation\n */\n const checkPhonemeInText = (\n text: string,\n targetPhoneme: string,\n options: PhonemeMatchOptions\n ) => {\n const searchText = options.caseSensitive ? text : text.toLowerCase();\n const searchPhoneme = options.caseSensitive\n ? targetPhoneme\n : targetPhoneme.toLowerCase();\n\n const exactIndex = searchText.indexOf(searchPhoneme);\n const found = exactIndex !== -1;\n\n let partialFound = false;\n let partialIndex = -1;\n\n if (!found && options.partialMatch !== false) {\n // Check for partial matches (phoneme as part of larger sounds)\n const phonemePattern = new RegExp(\n searchPhoneme.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"),\n \"gi\"\n );\n const match = searchText.match(phonemePattern);\n if (match) {\n partialFound = true;\n partialIndex = searchText.search(phonemePattern);\n }\n }\n\n return {\n found: found || partialFound,\n exact: found,\n partial: partialFound,\n position: found ? exactIndex : partialIndex,\n context:\n found || partialFound\n ? text.substring(\n Math.max(0, (exactIndex !== -1 ? exactIndex : partialIndex) - 10),\n Math.min(\n text.length,\n (exactIndex !== -1 ? exactIndex : partialIndex) +\n searchPhoneme.length +\n 10\n )\n )\n : undefined,\n };\n };\n\n /**\n * Check if the target phoneme matches the first phoneme produced\n */\n const checkFirstPhonemeInText = (\n text: string,\n firstPhoneme: string,\n targetPhoneme: string,\n options: PhonemeMatchOptions\n ) => {\n if (!firstPhoneme) {\n return {\n found: false,\n exact: false,\n partial: false,\n position: -1,\n context: undefined,\n };\n }\n\n const searchFirstPhoneme = options.caseSensitive\n ? firstPhoneme\n : firstPhoneme.toLowerCase();\n const searchTargetPhoneme = options.caseSensitive\n ? targetPhoneme\n : targetPhoneme.toLowerCase();\n\n // Check for exact match with the first phoneme\n const exactMatch = searchFirstPhoneme === searchTargetPhoneme;\n\n // Check for partial match (target phoneme is contained in first phoneme or vice versa)\n let partialMatch = false;\n if (!exactMatch && options.partialMatch !== false) {\n partialMatch =\n searchFirstPhoneme.includes(searchTargetPhoneme) ||\n searchTargetPhoneme.includes(searchFirstPhoneme);\n }\n\n const found = exactMatch || partialMatch;\n\n return {\n found,\n exact: exactMatch,\n partial: partialMatch,\n position: found ? 0 : -1, // First phoneme is always at position 0 if matched\n context: found ? `First sound: ${firstPhoneme}` : undefined,\n };\n };\n\n return {\n transcribeAudio,\n transcribeAudioFromFile,\n transcribeAudioFromBuffer,\n getSupportedAudioFormats,\n validateAudioFormat,\n generateContent,\n checkPhonemeMatch,\n checkPhonemeMatchFromFile,\n checkPhonemeMatchFromBuffer,\n };\n}\n","import { AppError, BadRequestError } from \"@eeplatform/nodejs-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; // semicolon separated: KEY=value;KEY2=value2\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 semicolons and filter out empty entries\n const lines = keyValues\n .split(\";\")\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 await octokit.actions.createEnvironmentVariable({\n owner,\n repo,\n environment_name: environment,\n name: key,\n value,\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 { AppError, BadRequestError, useRedis } from \"@eeplatform/nodejs-utils\";\nimport { useFileService } from \"../file/file.service\";\n\nexport function useTranscribeService() {\n const { createFile } = useFileService();\n const { getClient } = useRedis();\n\n const redisClient = getClient();\n\n async function transcribeAudio(file: Express.Multer.File) {\n try {\n const fileId = await createFile(file);\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new BadRequestError(\"Failed to transcribe audio file\");\n }\n }\n }\n\n return {\n transcribeAudio,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { useGeminiAiService } from \"./gemini.service\";\nimport {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\n\nexport function useAudioTranscriptionController() {\n const geminiService = useGeminiAiService();\n\n /**\n * Validation schema for transcription options\n */\n const transcriptionOptionsSchema = Joi.object({\n language: Joi.string().optional().max(50),\n enableTimestamps: Joi.boolean().optional(),\n prompt: Joi.string().optional().max(1000),\n maxTokens: Joi.number().integer().min(1).max(8192).optional(),\n });\n\n /**\n * Validation schema for phoneme matching options\n */\n const phonemeOptionsSchema = Joi.object({\n language: Joi.string().optional().max(50),\n caseSensitive: Joi.boolean().optional(),\n partialMatch: Joi.boolean().optional(),\n });\n\n /**\n * Validation schema for phoneme matching request\n */\n const phonemeMatchSchema = Joi.object({\n targetPhoneme: Joi.string().required().min(1).max(10),\n options: phonemeOptionsSchema.optional(),\n });\n\n /**\n * Transcribe audio from uploaded file\n */\n async function transcribeFromFile(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"Audio file is required\"));\n return;\n }\n\n try {\n // Validate request body options\n const { error, value: options } = transcriptionOptionsSchema.validate(\n req.body\n );\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n // Validate audio format\n const { buffer, mimetype, originalname, size } = req.file;\n\n if (!geminiService.validateAudioFormat(mimetype)) {\n const supportedFormats = geminiService.getSupportedAudioFormats();\n next(\n new BadRequestError(\n `Unsupported audio format: ${mimetype}. Supported formats: ${supportedFormats.join(\n \", \"\n )}`\n )\n );\n return;\n }\n\n // Check file size (limit to 25MB)\n const maxSizeBytes = 25 * 1024 * 1024; // 25MB\n if (size > maxSizeBytes) {\n next(\n new BadRequestError(\n `File size too large. Maximum allowed size is ${\n maxSizeBytes / (1024 * 1024)\n }MB`\n )\n );\n return;\n }\n\n // Perform transcription\n const startTime = Date.now();\n const result = await geminiService.transcribeAudioFromBuffer(\n buffer,\n mimetype,\n options\n );\n const processingTime = Date.now() - startTime;\n\n res.json({\n success: true,\n data: {\n transcription: result.transcription,\n language: result.language,\n confidence: result.confidence,\n timestamps: result.timestamps,\n },\n metadata: {\n originalFilename: originalname,\n fileSize: size,\n mimeType: mimetype,\n processingTimeMs: processingTime,\n options: options,\n },\n });\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(\n `Audio transcription failed: ${error.message}`\n )\n );\n }\n }\n }\n\n /**\n * Transcribe audio from base64 encoded data\n */\n async function transcribeFromBase64(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n // Validate request body\n const bodySchema = Joi.object({\n audioData: Joi.string().required(),\n mimeType: Joi.string().required(),\n options: transcriptionOptionsSchema.optional(),\n });\n\n const { error, value } = bodySchema.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const { audioData, mimeType, options = {} } = value;\n\n // Validate audio format\n if (!geminiService.validateAudioFormat(mimeType)) {\n const supportedFormats = geminiService.getSupportedAudioFormats();\n next(\n new BadRequestError(\n `Unsupported audio format: ${mimeType}. Supported formats: ${supportedFormats.join(\n \", \"\n )}`\n )\n );\n return;\n }\n\n // Convert base64 to buffer\n let audioBuffer: Buffer;\n try {\n audioBuffer = Buffer.from(audioData, \"base64\");\n } catch (conversionError) {\n next(new BadRequestError(\"Invalid base64 audio data\"));\n return;\n }\n\n // Check buffer size\n const maxSizeBytes = 25 * 1024 * 1024; // 25MB\n if (audioBuffer.length > maxSizeBytes) {\n next(\n new BadRequestError(\n `Audio data too large. Maximum allowed size is ${\n maxSizeBytes / (1024 * 1024)\n }MB`\n )\n );\n return;\n }\n\n // Perform transcription\n const startTime = Date.now();\n const result = await geminiService.transcribeAudioFromBuffer(\n audioBuffer,\n mimeType,\n options\n );\n const processingTime = Date.now() - startTime;\n\n res.json({\n success: true,\n data: {\n transcription: result.transcription,\n language: result.language,\n confidence: result.confidence,\n timestamps: result.timestamps,\n },\n metadata: {\n fileSize: audioBuffer.length,\n mimeType: mimeType,\n processingTimeMs: processingTime,\n options: options,\n },\n });\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(\n `Audio transcription failed: ${error.message}`\n )\n );\n }\n }\n }\n\n /**\n * Get supported audio formats\n */\n async function getSupportedFormats(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n const formats = geminiService.getSupportedAudioFormats();\n\n res.json({\n success: true,\n data: {\n supportedFormats: formats,\n maxFileSizeMB: 25,\n description: \"Supported audio formats for transcription\",\n },\n });\n } catch (error: any) {\n next(\n new InternalServerError(\n `Failed to get supported formats: ${error.message}`\n )\n );\n }\n }\n\n /**\n * Validate audio format without transcription\n */\n async function validateFormat(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n const schema = Joi.object({\n mimeType: Joi.string().required(),\n });\n\n const { error, value } = schema.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const { mimeType } = value;\n const isSupported = geminiService.validateAudioFormat(mimeType);\n const supportedFormats = geminiService.getSupportedAudioFormats();\n\n res.json({\n success: true,\n data: {\n mimeType: mimeType,\n isSupported: isSupported,\n supportedFormats: supportedFormats,\n },\n });\n } catch (error: any) {\n next(\n new InternalServerError(`Format validation failed: ${error.message}`)\n );\n }\n }\n\n /**\n * Check for specific phoneme in uploaded audio file\n */\n async function checkPhonemeFromFile(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"Audio file is required\"));\n return;\n }\n\n try {\n // Validate request body\n const { error, value } = phonemeMatchSchema.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const { targetPhoneme, options = {} } = value;\n\n // Validate audio format\n const { buffer, mimetype, originalname, size } = req.file;\n\n if (!geminiService.validateAudioFormat(mimetype)) {\n const supportedFormats = geminiService.getSupportedAudioFormats();\n next(\n new BadRequestError(\n `Unsupported audio format: ${mimetype}. Supported formats: ${supportedFormats.join(\n \", \"\n )}`\n )\n );\n return;\n }\n\n // Check file size (limit to 25MB)\n const maxSizeBytes = 25 * 1024 * 1024; // 25MB\n if (size > maxSizeBytes) {\n next(\n new BadRequestError(\n `File size too large. Maximum allowed size is ${\n maxSizeBytes / (1024 * 1024)\n }MB`\n )\n );\n return;\n }\n\n // Perform phoneme analysis\n const startTime = Date.now();\n const result = await geminiService.checkPhonemeMatchFromBuffer(\n buffer,\n mimetype,\n targetPhoneme,\n options\n );\n const processingTime = Date.now() - startTime;\n\n // If no match found, throw BadRequestError (404-like behavior)\n if (!result.isMatch) {\n throw new BadRequestError(\n `Phoneme \"${targetPhoneme}\" not found in the provided audio. Transcription: \"${result.transcription}\"`\n );\n }\n\n res.json({\n success: true,\n data: {\n targetPhoneme: result.targetPhoneme,\n isMatch: result.isMatch,\n transcription: result.transcription,\n confidence: result.confidence,\n detectedPhonemes: result.detectedPhonemes,\n matchDetails: {\n exactMatch: result.matchDetails?.exactMatch,\n partialMatch: result.matchDetails?.partialMatch,\n position: result.matchDetails?.position,\n context: result.matchDetails?.context,\n },\n },\n metadata: {\n originalFilename: originalname,\n fileSize: size,\n mimeType: mimetype,\n processingTimeMs: processingTime,\n options: options,\n },\n });\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(`Phoneme analysis failed: ${error.message}`)\n );\n }\n }\n }\n\n /**\n * Check for specific phoneme in base64 encoded audio data\n */\n async function checkPhonemeFromBase64(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n // Validate request body\n const bodySchema = Joi.object({\n audioData: Joi.string().required(),\n mimeType: Joi.string().required(),\n targetPhoneme: Joi.string().required().min(1).max(10),\n options: phonemeOptionsSchema.optional(),\n });\n\n const { error, value } = bodySchema.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const { audioData, mimeType, targetPhoneme, options = {} } = value;\n\n // Validate audio format\n if (!geminiService.validateAudioFormat(mimeType)) {\n const supportedFormats = geminiService.getSupportedAudioFormats();\n next(\n new BadRequestError(\n `Unsupported audio format: ${mimeType}. Supported formats: ${supportedFormats.join(\n \", \"\n )}`\n )\n );\n return;\n }\n\n // Convert base64 to buffer\n let audioBuffer: Buffer;\n try {\n audioBuffer = Buffer.from(audioData, \"base64\");\n } catch (conversionError) {\n next(new BadRequestError(\"Invalid base64 audio data\"));\n return;\n }\n\n // Check buffer size\n const maxSizeBytes = 25 * 1024 * 1024; // 25MB\n if (audioBuffer.length > maxSizeBytes) {\n next(\n new BadRequestError(\n `Audio data too large. Maximum allowed size is ${\n maxSizeBytes / (1024 * 1024)\n }MB`\n )\n );\n return;\n }\n\n // Perform phoneme analysis\n const startTime = Date.now();\n const result = await geminiService.checkPhonemeMatchFromBuffer(\n audioBuffer,\n mimeType,\n targetPhoneme,\n options\n );\n const processingTime = Date.now() - startTime;\n\n // If no match found, throw BadRequestError (404-like behavior)\n if (!result.isMatch) {\n throw new BadRequestError(\n `Phoneme \"${targetPhoneme}\" not found in the provided audio. Transcription: \"${result.transcription}\"`\n );\n }\n\n res.json({\n success: true,\n data: {\n targetPhoneme: result.targetPhoneme,\n isMatch: result.isMatch,\n transcription: result.transcription,\n confidence: result.confidence,\n detectedPhonemes: result.detectedPhonemes,\n matchDetails: {\n exactMatch: result.matchDetails?.exactMatch,\n partialMatch: result.matchDetails?.partialMatch,\n position: result.matchDetails?.position,\n context: result.matchDetails?.context,\n },\n },\n metadata: {\n fileSize: audioBuffer.length,\n mimeType: mimeType,\n processingTimeMs: processingTime,\n options: options,\n },\n });\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(`Phoneme analysis failed: ${error.message}`)\n );\n }\n }\n }\n\n /**\n * Batch phoneme analysis - check multiple phonemes in one audio file\n */\n async function batchPhonemeCheck(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"Audio file is required\"));\n return;\n }\n\n try {\n // Validate request body\n const batchSchema = Joi.object({\n targetPhonemes: Joi.array()\n .items(Joi.string().min(1).max(10))\n .min(1)\n .max(20)\n .required(),\n options: phonemeOptionsSchema.optional(),\n });\n\n const { error, value } = batchSchema.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const { targetPhonemes, options = {} } = value;\n\n // Validate audio format\n const { buffer, mimetype, originalname, size } = req.file;\n\n if (!geminiService.validateAudioFormat(mimetype)) {\n const supportedFormats = geminiService.getSupportedAudioFormats();\n next(\n new BadRequestError(\n `Unsupported audio format: ${mimetype}. Supported formats: ${supportedFormats.join(\n \", \"\n )}`\n )\n );\n return;\n }\n\n // Check file size\n const maxSizeBytes = 25 * 1024 * 1024; // 25MB\n if (size > maxSizeBytes) {\n next(\n new BadRequestError(\n `File size too large. Maximum allowed size is ${\n maxSizeBytes / (1024 * 1024)\n }MB`\n )\n );\n return;\n }\n\n // Perform batch phoneme analysis\n const startTime = Date.now();\n const results = [];\n\n for (const phoneme of targetPhonemes) {\n try {\n const result = await geminiService.checkPhonemeMatchFromBuffer(\n buffer,\n mimetype,\n phoneme,\n options\n );\n\n results.push({\n phoneme,\n isMatch: result.isMatch,\n confidence: result.confidence,\n matchDetails: {\n exactMatch: result.matchDetails?.exactMatch,\n partialMatch: result.matchDetails?.partialMatch,\n position: result.matchDetails?.position,\n context: result.matchDetails?.context,\n },\n });\n } catch (phonemeError) {\n results.push({\n phoneme,\n isMatch: false,\n error:\n phonemeError instanceof Error\n ? phonemeError.message\n : \"Unknown error\",\n });\n }\n }\n\n const processingTime = Date.now() - startTime;\n const successfulAnalysis = results.filter((r) => !r.error);\n const detectedPhonemes = results.filter((r) => r.isMatch);\n\n res.json({\n success: true,\n data: {\n totalPhonemes: targetPhonemes.length,\n analyzedPhonemes: successfulAnalysis.length,\n detectedCount: detectedPhonemes.length,\n detectionRate: (\n (detectedPhonemes.length / targetPhonemes.length) *\n 100\n ).toFixed(1),\n results: results,\n },\n metadata: {\n originalFilename: originalname,\n fileSize: size,\n mimeType: mimetype,\n processingTimeMs: processingTime,\n options: options,\n },\n });\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(\n `Batch phoneme analysis failed: ${error.message}`\n )\n );\n }\n }\n }\n\n /**\n * Health check for the transcription service\n */\n async function healthCheck(req: Request, res: Response, next: NextFunction) {\n try {\n // Simple test to verify Gemini service is accessible\n const testResult = await geminiService.generateContent(\"Test connection\");\n\n res.json({\n success: true,\n data: {\n status: \"healthy\",\n service: \"audio-transcription\",\n geminiApiStatus: testResult ? \"connected\" : \"disconnected\",\n supportedFormats: geminiService.getSupportedAudioFormats(),\n timestamp: new Date().toISOString(),\n },\n });\n } catch (error: any) {\n next(new InternalServerError(`Health check failed: ${error.message}`));\n }\n }\n\n return {\n transcribeFromFile,\n transcribeFromBase64,\n getSupportedFormats,\n validateFormat,\n healthCheck,\n checkPhonemeFromFile,\n checkPhonemeFromBase64,\n batchPhonemeCheck,\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 \"@eeplatform/nodejs-utils\";\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 return {\n healthCheck,\n setGitHubVariables,\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 TPSGC = {\n _id?: ObjectId;\n code: string;\n name: string;\n type: string;\n};\n\nexport const schemaPSGC = Joi.object({\n code: Joi.string().length(10).required(),\n name: Joi.string().required(),\n type: Joi.string().valid(\"Reg\", \"Prov\", \"City\", \"Mun\", \"Bgy\").required(),\n});\n\nexport function modelPSGC(data: any) {\n const { error } = schemaPSGC.validate(data);\n if (error) {\n throw new Error(`Invalid PSGC data: ${error.message}`);\n }\n\n return {\n code: data.code,\n name: data.name,\n type: data.type,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { modelPSGC, TPSGC } from \"./psgc.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function usePSGCRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"psgc\";\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: { name: \"text\" } },\n { key: { code: 1 }, unique: true, name: \"unique_code\" },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on PSGC.\");\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: TPSGC, session?: ClientSession) {\n try {\n value = modelPSGC(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(\"Region already exists.\");\n }\n\n throw new Error(\"Failed to create PSGC.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n type = \"\",\n prefix = \"\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n type,\n };\n\n const cacheKeyOptions: Record<string, any> = {\n type,\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n if (prefix) {\n query.code = { $regex: `^${prefix}` };\n cacheKeyOptions.prefix = prefix;\n }\n\n if (type === \"City\" || type === \"Mun\") {\n query.type = { $in: [\"City\", \"Mun\"] };\n }\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: 1 };\n\n if (search) {\n query.$text = { $search: search };\n cacheKeyOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll PSGC: ${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 PSGC: ${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 PSGC: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll PSGC: ${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<TPSGC>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById PSGC: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPSGC>({\n _id,\n deletedAt: { $in: [\"\", null] },\n });\n if (!result) {\n throw new BadRequestError(\"Region not found.\");\n }\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for PSGC by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for PSGC 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 PSGC.\");\n }\n }\n }\n\n async function getByName(\n { name, prefix = \"\", type = \"\" } = {} as {\n name: string;\n prefix?: string;\n type?: string;\n }\n ) {\n // / stop words to ignore\n const stopWords = new Set([\"of\", \"the\"]);\n\n const words = name\n .trim()\n .split(/\\s+/)\n .filter((w) => w.length > 2 && !stopWords.has(w.toLowerCase()))\n .map((w) => w.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n\n const regex = words.map((w) => `(?=.*${w})`).join(\"\");\n\n const query: Record<string, any> = {\n name: { $regex: regex, $options: \"i\" },\n };\n\n const cacheKeyOptions: Record<string, any> = { type };\n\n if (type) {\n query.type = type;\n cacheKeyOptions.type = type;\n }\n\n const _types = [\"City\", \"Mun\"];\n\n if (_types.includes(type)) {\n query.type = { $in: _types };\n }\n\n if (prefix) {\n query.code = { $regex: `^${prefix}` };\n cacheKeyOptions.prefix = prefix;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { name });\n\n logger.log({\n level: \"info\",\n message: `Query for getByName PSGC: ${JSON.stringify(query)}`,\n });\n\n try {\n const cached = await getCache<TPSGC>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByName PSGC: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPSGC>(query);\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for PSGC by name: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for PSGC 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 PSGC.\");\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\"];\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, deletedAt: { $in: [\"\", null] } },\n { $set: { [field]: value, updatedAt: new Date().toISOString() } },\n { session }\n );\n\n delCachedData();\n\n return `Successfully updated PSGC ${field}.`;\n } catch (error) {\n throw new InternalServerError(`Failed to update PSGC ${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 PSGC.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete PSGC.\");\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n updateFieldById,\n deleteById,\n getByName,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\nimport { usePSGCRepo } from \"./psgc.repository\";\nimport { schemaPSGC } from \"./psgc.model\";\n\nexport function usePSGCController() {\n const {\n add: _add,\n getAll: _getAll,\n getById: _getById,\n getByName: _getByName,\n updateFieldById: _updateFieldById,\n deleteById: _deleteById,\n } = usePSGCRepo();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaPSGC.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 res.json({\n message: \"Successfully created region.\",\n data,\n });\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 type: Joi.string().valid(\"Reg\", \"Prov\", \"City\", \"Mun\", \"Bgy\").required(),\n prefix: 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 type = (req.query.type as string) ?? \"\";\n const prefix = (req.query.prefix as string) ? String(req.query.prefix) : \"\";\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 data = await _getAll({\n page,\n limit,\n search,\n type,\n prefix,\n });\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;\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 region.\",\n data,\n });\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 data = await _getByName({ name });\n res.json({\n message: \"Successfully retrieved region.\",\n data,\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateField(req: Request, res: Response, next: NextFunction) {\n const _id = req.params.id;\n const { field, value } = req.body;\n\n const validation = Joi.object({\n _id: Joi.string().hex().required(),\n field: Joi.string().valid(\"name\", \"director\", \"directorName\").required(),\n value: Joi.string().required(),\n });\n\n const { error } = validation.validate({ _id, field, value });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateFieldById({ _id, field, value });\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 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 getByName,\n updateField,\n deleteById,\n };\n}\n"],"mappings":"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","names":["ObjectId","ObjectId","BadRequestError","InternalServerError","useCache","InternalServerError","logger","makeCacheKey","useAtlas","useCache","ObjectId","useCache","BadRequestError","InternalServerError","Joi","AppError","BadRequestError","InternalServerError","logger","BadRequestError","InternalServerError","NotFoundError","logger","makeCacheKey","useAtlas","useCache","BadRequestError","InternalServerError","logger","makeCacheKey","useAtlas","useCache","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","BadRequestError","ObjectId","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","paginate","logger","BadRequestError","NotFoundError","InternalServerError","useAtlas","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","BadRequestError","ObjectId","error","ObjectId","useAtlas","useCache","logger","AppError","InternalServerError","BadRequestError","makeCacheKey","paginate","BadRequestError","res","filePath","emailContent","logger","InternalServerError","NotFoundError","useAtlas","ObjectId","BadRequestError","InternalServerError","useAtlas","paginate","logger","makeCacheKey","useCache","ObjectId","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","paginate","useAtlas","BadRequestError","ObjectId","InternalServerError","NotFoundError","makeCacheKey","useCache","logger","Joi","BadRequestError","error","logger","AppError","InternalServerError","refreshToken","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","error","AppError","InternalServerError","BadRequestError","Joi","ObjectId","error","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","useCache","logger","AppError","BadRequestError","makeCacheKey","paginate","InternalServerError","useAtlas","useAtlas","BadRequestError","Joi","BadRequestError","error","Joi","Joi","BadRequestError","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","Joi","error","Joi","BadRequestError","error","AppError","InternalServerError","Joi","BadRequestError","error","logger","useS3","useAtlas","useS3","useAtlas","logger","AppError","BadRequestError","InternalServerError","Joi","error","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","error","AppError","InternalServerError","BadRequestError","Joi","ObjectId","BadRequestError","useAtlas","useCache","makeCacheKey","logger","ObjectId","useAtlas","BadRequestError","useCache","logger","makeCacheKey","BadRequestError","NotFoundError","Joi","Joi","BadRequestError","value","error","NotFoundError","ObjectId","BadRequestError","ObjectId","useAtlas","useCache","makeCacheKey","logger","useAtlas","useCache","logger","makeCacheKey","fs","AppError","BadRequestError","AppError","BadRequestError","AppError","BadRequestError","AppError","BadRequestError","InternalServerError","Joi","Joi","AppError","BadRequestError","InternalServerError","logger","Joi","Joi","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","useCache","logger","AppError","BadRequestError","makeCacheKey","paginate","InternalServerError","BadRequestError","Joi","BadRequestError","error","Joi"]}
|
|
1
|
+
{"version":3,"sources":["../src/resources/user/user.repository.ts","../src/resources/user/user.model.ts","../src/resources/auth/auth.service.ts","../src/config.ts","../src/resources/token/token.repository.ts","../src/resources/auth/auth.controller.ts","../src/resources/user/user.service.ts","../src/resources/file/file.repository.ts","../src/resources/file/file.model.ts","../src/resources/verification/verification.repository.ts","../src/resources/verification/verification.model.ts","../src/resources/verification/verification.service.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/user/user.controller.ts","../src/resources/organization/organization.model.ts","../src/resources/organization/organization.repository.ts","../src/resources/organization/organization.service.ts","../src/resources/organization/organization.controller.ts","../src/resources/role/role.controller.ts","../src/resources/role/role.service.ts","../src/resources/member/member.controller.ts","../src/resources/file/file.service.ts","../src/resources/file/file.controller.ts","../src/resources/verification/verification.controller.ts","../src/resources/address/address.model.ts","../src/resources/address/address.repository.ts","../src/resources/address/address.controller.ts","../src/resources/token/token.model.ts","../src/resources/counter/counter.model.ts","../src/resources/counter/counter.repository.ts","../src/resources/utils/gemini.service.ts","../src/resources/utils/github.service.ts","../src/resources/utils/transcribe.service.ts","../src/resources/utils/audio-transcription.controller.ts","../src/resources/utils/util.controller.ts","../src/resources/utils/transaction.schema.ts","../src/resources/psgc/psgc.model.ts","../src/resources/psgc/psgc.repository.ts","../src/resources/psgc/psgc.controller.ts"],"sourcesContent":["import { ClientSession, ObjectId } from \"mongodb\";\nimport { MUser, MUserRole, TUser, TUserRole } from \"./user.model\";\nimport {\n useAtlas,\n InternalServerError,\n logger,\n BadRequestError,\n paginate,\n useCache,\n makeCacheKey,\n} from \"@eeplatform/nodejs-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 createTextIndex() {\n try {\n await collection.createIndex({\n firstName: \"text\",\n middleName: \"text\",\n lastName: \"text\",\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 { email: 1, deletedAt: 1 },\n { unique: true }\n );\n } catch (error) {\n throw new Error(\"Failed to create unique index on email.\");\n }\n }\n\n async function createUser(value: TUser, session?: ClientSession) {\n try {\n value = new MUser(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 getUsers({\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 getUsers: ${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 getUsers: ${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 getUsers: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getUsers: ${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 ];\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 async function addUserRole(\n { _id, role } = {} as { _id: string | ObjectId; role: TUserRole },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid user ID.\");\n }\n\n role = new MUserRole(role);\n\n try {\n await collection.updateOne(\n { _id, \"roles.app\": { $ne: role.app } },\n // @ts-ignore\n { $push: { roles: role } },\n { session }\n );\n } catch (error) {\n throw new InternalServerError(\"Failed to add user role.\");\n }\n }\n\n return {\n createTextIndex,\n createUniqueIndex,\n createUser,\n getUserByEmail,\n getUserById,\n getUsers,\n updatePassword,\n updateName,\n updateBirthday,\n updateUserFieldById,\n addUserRole,\n getUserByReferralCode,\n };\n}\n","import { ObjectId } from \"mongodb\";\n\nexport type TUserRole = {\n name: string;\n app: string;\n role: ObjectId | string;\n status?: string;\n};\n\nexport class MUserRole implements TUserRole {\n name: string;\n app: string;\n role: ObjectId | string;\n status?: string;\n\n constructor(value: TUserRole) {\n this.name = value.name ?? \"\";\n this.app = value.app ?? \"\";\n this.role = value.role ?? \"\";\n this.status = value.status ?? \"active\";\n }\n}\n\nexport type TUser = {\n _id?: ObjectId;\n email: string;\n password: string;\n prefix?: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n suffix?: string;\n birthMonth?: string;\n birthDay?: number;\n birthYear?: number;\n gender?: string;\n defaultOrg?: ObjectId | string;\n xenditCustomerId?: string;\n type?: string;\n status?: string;\n referralCode?: string;\n referredBy?: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport class MUser implements TUser {\n _id?: ObjectId;\n email: string;\n password: string;\n prefix?: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n suffix?: string;\n birthMonth?: string;\n birthDay?: number;\n birthYear?: number;\n gender?: string;\n roles?: TUserRole[];\n status?: string;\n type?: string;\n xenditCustomerId?: string | undefined;\n referralCode?: string;\n referredBy?: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n defaultOrg?: ObjectId | string;\n\n constructor(value: TUser) {\n this._id = value._id ?? new ObjectId();\n this.email = value.email ?? \"\";\n this.password = value.password ?? \"\";\n this.prefix = value.prefix ?? \"\";\n this.firstName = value.firstName ?? \"\";\n this.middleName = value.middleName ?? \"\";\n this.lastName = value.lastName ?? \"\";\n this.suffix = value.suffix ?? \"\";\n this.birthMonth = value.birthMonth ?? \"\";\n this.birthDay = value.birthDay ?? 0;\n this.birthYear = value.birthYear ?? 0;\n this.gender = value.gender ?? \"\";\n this.type = value.type ?? \"client\";\n this.status = value.status ?? \"\";\n this.xenditCustomerId = value.xenditCustomerId ?? \"\";\n this.referralCode = value.referralCode ?? \"\";\n this.referredBy = value.referredBy ?? \"\";\n this.createdAt = value.createdAt ?? new Date().toISOString();\n this.updatedAt = value.updatedAt ?? \"\";\n this.deletedAt = value.deletedAt ?? \"\";\n\n if (value.defaultOrg) {\n try {\n value.defaultOrg = new ObjectId(value.defaultOrg);\n } catch (error) {\n throw new Error(\"Invalid defaultOrg ID.\");\n }\n }\n\n this.defaultOrg = value.defaultOrg;\n }\n}\n","import { useUserRepo } from \"../user/user.repository\";\nimport {\n AppError,\n BadRequestError,\n comparePassword,\n generateToken,\n InternalServerError,\n NotFoundError,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { ACCESS_TOKEN_SECRET, REFRESH_TOKEN_SECRET } from \"../../config\";\nimport { useTokenRepo } from \"../token/token.repository\";\nimport jwt from \"jsonwebtoken\";\nimport { TUser } from \"../user/user.model\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport function useAuthService() {\n const expiresIn = \"1m\";\n\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 refreshToken(token: string) {\n type TMetadata = { user: string };\n\n let decoded: TMetadata;\n\n try {\n decoded = (await jwt.verify(token, REFRESH_TOKEN_SECRET)) as TMetadata;\n } catch (error) {\n throw new BadRequestError(\"Invalid refresh token\");\n }\n\n let _token;\n\n try {\n _token = await useTokenRepo().getToken(token);\n if (!_token) {\n throw new NotFoundError(\"Invalid token\");\n }\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new InternalServerError(`${error}`);\n }\n }\n\n let accessToken;\n\n try {\n accessToken = generateToken({\n secret: ACCESS_TOKEN_SECRET,\n metadata: { user: decoded.user },\n options: { expiresIn },\n });\n } catch (error) {\n throw new BadRequestError(\"Error generating access token\");\n }\n\n return accessToken;\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 refreshToken,\n logout,\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\";\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 GEMINI_API_KEY = (process.env.GEMINI_API_KEY as string) ?? \"\";\nexport const ASSEMBLY_AI_API_KEY =\n (process.env.ASSEMBLY_AI_API_KEY as string) ?? \"\";\n\nexport const DOMAIN = (process.env.DOMAIN as string) ?? \"localhost\";\n","import {\n InternalServerError,\n logger,\n makeCacheKey,\n useAtlas,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { ObjectId } from \"mongodb\";\n\nexport function useTokenRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"tokens\";\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 createToken(\n { token, user } = {} as { token: string; user: string | ObjectId }\n ) {\n try {\n user = new ObjectId(user);\n } catch (error) {\n return Promise.reject(\"Invalid user ID\");\n }\n\n try {\n await collection.insertOne({ token, user });\n delCachedData();\n return \"Token created\";\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n async function getToken(token: string) {\n const cacheKey = makeCacheKey(namespace_collection, { token });\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 getToken: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne({ token });\n\n if (data) {\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for token: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for token: ${err.message}`,\n });\n });\n }\n\n return data;\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n async function deleteToken(token: string) {\n try {\n const result = await collection.deleteOne({ token });\n delCachedData();\n return result;\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n return {\n createToken,\n getToken,\n deleteToken,\n };\n}\n","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 \"@eeplatform/nodejs-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 refreshToken(req: Request, res: Response, next: NextFunction) {\n const refreshToken = req.body.token as string;\n\n if (!refreshToken) {\n next(new BadRequestError(\"Refresh token is required\"));\n return;\n }\n\n try {\n const newRefreshToken = await useAuthService().refreshToken(refreshToken);\n res.json({ token: newRefreshToken });\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 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 async function resetPassword(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const otp = (req.body.otp as string) || \"\";\n const newPassword = (req.body.newPassword as string) || \"\";\n const passwordConfirmation =\n (req.body.passwordConfirmation as string) || \"\";\n\n const validation = Joi.object({\n otp: Joi.string().hex().required(),\n newPassword: Joi.string().required().min(8),\n passwordConfirmation: Joi.string().required().min(8),\n });\n\n const { error } = validation.validate({\n otp,\n newPassword,\n passwordConfirmation,\n });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await useUserService().resetPassword(\n otp,\n newPassword,\n passwordConfirmation\n );\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function signUp(req: Request, res: Response, next: NextFunction) {\n const email = req.body.email as string;\n const referralCode = (req.body.referral as string) ?? \"\";\n\n const validation = Joi.object({\n email: Joi.string().email().required(),\n referralCode: Joi.string().min(4).optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ email, referralCode });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _signUp({\n email,\n metadata: {\n referralCode,\n },\n });\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n login,\n refreshToken,\n logout,\n resetPassword,\n signUp,\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n NotFoundError,\n hashPassword,\n logger,\n makeCacheKey,\n useAtlas,\n useCache,\n useS3,\n} from \"@eeplatform/nodejs-utils\";\nimport { useUserRepo } from \"../user/user.repository\";\nimport { MUser, 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 { ObjectId } from \"mongodb\";\nimport { useRoleRepo } from \"../role/role.repository\";\n\nexport function useUserService() {\n const {\n createUser: _createUser,\n getUserByEmail,\n getUserById: _getById,\n updateName: _updateName,\n updateBirthday: _updateBirthday,\n updateUserFieldById: _updateUserFieldById,\n getUsers: _getUsers,\n } = useUserRepo();\n\n const { addRole } = useRoleRepo();\n const { add: addMember } = useMemberRepo();\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 = new ObjectId();\n\n const user: TUser = {\n _id: userId,\n email: DEFAULT_USER_EMAIL,\n password: hashedPassword,\n firstName: DEFAULT_USER_FIRST_NAME,\n lastName: DEFAULT_USER_LAST_NAME,\n status: \"active\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Xendit customer creation removed\n // const customer = await createCustomer({\n // reference_id: userId.toString(),\n // type: \"INDIVIDUAL\",\n // individual_detail: {\n // given_names: user.firstName,\n // surname: user.lastName,\n // },\n // email: user.email,\n // });\n\n // if (!customer.id) {\n // throw new InternalServerError(\"Failed to create xendit customer.\");\n // }\n\n // user.xenditCustomerId = customer.id;\n\n await _createUser(user, session);\n\n const roleId = await addRole(\n {\n id: \"\",\n name: \"Super Admin\",\n type: \"admin\",\n permissions: [\"*\"],\n status: \"active\",\n default: true,\n },\n session\n );\n\n await addMember(\n {\n user: userId.toString(),\n name: `${user.firstName} ${user.lastName}`,\n role: roleId.toString(),\n roleName: \"Super Admin\",\n type: \"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 getUsers({\n search = \"\",\n page = 1,\n status = \"\",\n type = \"\",\n limit = 10,\n } = {}) {\n try {\n return await _getUsers({ search, page, status, type, limit });\n } catch (error) {\n throw error;\n }\n }\n\n type TCreateUser = Pick<\n TUser,\n | \"email\"\n | \"password\"\n | \"prefix\"\n | \"firstName\"\n | \"middleName\"\n | \"lastName\"\n | \"suffix\"\n >;\n\n async function createUser(value: TCreateUser) {\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\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 userId = new ObjectId();\n\n const user: TUser = {\n _id: userId,\n email: value.email,\n password: hashedPassword,\n prefix: value.prefix,\n firstName: value.firstName,\n middleName: value.middleName,\n lastName: value.lastName,\n suffix: value.suffix,\n status: \"active\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Xendit customer creation removed\n // const customer = await createCustomer({\n // reference_id: userId.toString(),\n // type: \"INDIVIDUAL\",\n // individual_detail: {\n // given_names: user.firstName,\n // surname: user.lastName,\n // },\n // email: user.email,\n // });\n\n // if (!customer.id) {\n // throw new InternalServerError(\"Failed to create xendit customer.\");\n // }\n\n // user.xenditCustomerId = customer.id;\n\n await _createUser(user, 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: _getVerificationById, updateStatusById: _updateStatusById } =\n useVerificationRepo();\n\n async function createUserByInvite({\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 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 const user: TUser = new MUser({\n email,\n password: hashedPassword,\n firstName,\n lastName,\n status: \"active\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n defaultOrg: invitation.metadata?.org,\n });\n\n userId = await _createUser(user, session);\n }\n\n await _updateStatusById(id, \"complete\", session);\n\n await addMember(\n {\n user: userId.toString(),\n name: `${firstName} ${lastName}`,\n role: invitation.metadata?.role,\n roleName: invitation.metadata?.roleName,\n type: invitation.metadata?.app,\n org: invitation.metadata?.org ?? \"\",\n orgName: invitation.metadata?.orgName ?? \"\",\n },\n session\n );\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 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 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 = new ObjectId();\n\n const user: TUser = {\n _id: userId,\n email,\n password: hashedPassword,\n firstName,\n lastName,\n status: \"active\",\n referredBy: signUp.metadata?.referralCode,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n await _createUser(user, session);\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 { verify, getById, updateStatusById } = useVerificationService();\n\n async function resetPassword(\n id: string,\n newPassword: string,\n passwordConfirmation: string\n ) {\n try {\n await verify(id);\n } catch (error) {\n throw error;\n }\n\n if (newPassword !== passwordConfirmation) {\n throw new BadRequestError(\"Passwords do not match.\");\n }\n\n let hashedPassword = \"\";\n\n try {\n hashedPassword = await hashPassword(newPassword);\n } catch (error) {\n throw new InternalServerError(`Error hashing password: ${error}`);\n }\n\n try {\n const otpDoc = await getById(id);\n if (!otpDoc) {\n throw new NotFoundError(\"You are using an invalid reset link.\");\n }\n\n if (otpDoc.status === \"used\") {\n throw new BadRequestError(\"This link has already been invalidated.\");\n }\n\n await updateStatusById(id, \"used\");\n\n return \"Successfully reset password.\";\n } catch (error) {\n throw error;\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 getUsers,\n createUser,\n resetPassword,\n updateName,\n updateBirthday,\n updateUserFieldById,\n updateUserProfile,\n createUserByInvite,\n createUserBySignUp,\n createDefaultUser,\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n useAtlas,\n useCache,\n} from \"@eeplatform/nodejs-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 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 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 BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { MVerification, 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 = new MVerification(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 } = {} 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 }\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 // 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 { BadRequestError } from \"@eeplatform/nodejs-utils\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TVerificationMetadata = {\n name?: string;\n app?: string;\n role?: string;\n roleName?: string;\n referralCode?: string;\n org?: string | ObjectId;\n orgName?: string;\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 | null;\n expireAt: string | Date;\n};\n\nexport class MVerification implements TVerification {\n _id?: ObjectId;\n type: string;\n email: string;\n metadata?: TVerificationMetadata;\n status?: string;\n createdAt: string | Date;\n updatedAt?: string | Date | null;\n expireAt: string | Date;\n\n constructor(value: TVerification) {\n this._id = value._id ?? new ObjectId();\n this.type = value.type ?? \"\";\n this.email = value.email ?? \"\";\n\n if (this.metadata?.org) {\n try {\n this.metadata.org = new ObjectId(this.metadata?.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n }\n\n this.metadata = value.metadata ?? {};\n this.status = value.status ?? \"pending\";\n this.createdAt = value.createdAt ?? new Date();\n this.updatedAt = value.updatedAt ?? null;\n this.expireAt = value.expireAt ?? new Date(Date.now() + 3600 * 1000);\n }\n}\n","import {\n useMailer,\n compileHandlebar,\n logger,\n getDirectory,\n BadRequestError,\n NotFoundError,\n InternalServerError,\n useAtlas,\n} from \"@eeplatform/nodejs-utils\";\nimport {\n TVerification,\n TVerificationMetadata,\n} from \"./verification.model\";\nimport { useVerificationRepo } from \"./verification.repository\";\nimport {\n APP_MAIN,\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/user.repository\";\nimport { TKeyValuePair } from \"../../types/local.types\";\nimport { useMemberRepo } from \"../member/member.repository\";\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, getUserByReferralCode } = useUserRepo();\n const { add: addMember } = useMemberRepo();\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: \"EEPlatform\",\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: \"EEPlatform\",\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: \"EEPlatform\",\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 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 type: _id.metadata?.app,\n org: _id.metadata?.org ?? \"\",\n orgName: _id.metadata?.orgName ?? \"\",\n role: _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: TKeyValuePair;\n }) {\n try {\n if (\n metadata &&\n metadata.referralCode &&\n typeof metadata.referralCode === \"string\"\n ) {\n const code = await getUserByReferralCode(metadata.referralCode);\n\n if (!code) {\n throw new BadRequestError(\"Invalid referral code.\");\n }\n }\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 createdAt: new Date().toISOString(),\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: \"EEPlatform\",\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 return {\n createForgetPassword,\n createUserInvite,\n verify,\n getById,\n getVerifications,\n cancelUserInvitation,\n updateStatusById,\n signUp,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { MMember, TMember } from \"./member.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\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 createIndex() {\n try {\n await collection.createIndex([\n {\n name: 1,\n },\n {\n status: 1,\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n {\n org: 1,\n user: 1,\n type: 1,\n },\n { partialFilterExpression: { deletedAt: \"\" }, unique: true },\n );\n } catch (error) {\n throw new Error(\"Failed to create unique index.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex([\n {\n name: \"text\",\n },\n {\n orgName: \"text\",\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create text index.\");\n }\n }\n\n async function add(value: TMember, session?: ClientSession) {\n try {\n value = MMember(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 getByOrg(org: string | ObjectId) {\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n\n try {\n // Check cache first\n const cacheKey = makeCacheKey(namespace_collection, {\n org: String(org),\n tag: \"byOrg\",\n });\n const cached = await getCache<TMember>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByOrg member: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TMember>({ org });\n\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for member by org: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for member by org: ${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 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 getAll(\n { search, limit, page, user, org, type, status } = {} as {\n search: string;\n limit: number;\n page: number;\n user?: string | ObjectId;\n org?: string | ObjectId;\n type: string;\n status: string;\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> = { type, status };\n\n const cacheKeyOptions: Record<string, any> = { type, 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 return {\n createIndex,\n createUniqueIndex,\n createTextIndex,\n add,\n getById,\n getByOrg,\n getAll,\n getOrgsByUserId,\n updateStatusByUserId,\n updateName,\n getByUserId,\n getOrgsByMembership,\n countByOrg,\n countByUser,\n getByUserType,\n };\n}\n","import { BadRequestError } from \"@eeplatform/nodejs-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 type: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport function MMember(value: TMember): TMember {\n const schema = Joi.object({\n _id: Joi.string().hex().optional().allow(\"\", null),\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 type: Joi.string().required(),\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\n const { error } = schema.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 type: value.type,\n role: value.role,\n roleName: value.roleName ?? \"\",\n status: value.status || \"active\",\n createdAt: value.createdAt || new Date().toISOString(),\n updatedAt: \"\",\n deletedAt: \"\",\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n useAtlas,\n paginate,\n logger,\n makeCacheKey,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { MRole, TMiniRole, TRole } from \"./role.model\";\nimport { ObjectId, ClientSession } from \"mongodb\";\nimport { TKeyValuePair } from \"../../types/local.types\";\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 createIndex() {\n try {\n await collection.createIndex({ name: 1 });\n await collection.createIndex({ type: 1 });\n await collection.createIndex({ status: 1 });\n await collection.createIndex({ id: 1 });\n } catch (error) {\n throw new InternalServerError(\"Failed to create index on role.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({ name: \"text\" });\n } catch (error) {\n throw new InternalServerError(\"Failed to create text index on role.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex(\n { name: 1, type: 1, id: 1 },\n { unique: true },\n );\n } catch (error) {\n throw new InternalServerError(\"Failed to create unique index on role.\");\n }\n }\n\n async function addRole(\n value: TRole,\n session?: ClientSession,\n clearCache = true,\n ) {\n value = new MRole(value);\n\n try {\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 throw new InternalServerError(\"Failed to create role.\");\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 getRoleById(_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 getRoleById 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 type = \"\",\n id = \"\",\n } = {} as {\n search?: string;\n page?: number;\n limit?: number;\n sort?: any;\n type?: string;\n id?: string | ObjectId;\n },\n ) {\n limit = limit > 0 ? limit : 10;\n search = search || \"\";\n page = page > 0 ? page - 1 : 0;\n\n if (id && typeof id === \"string\" && id.length === 24) {\n try {\n id = new ObjectId(id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n }\n\n const query: TKeyValuePair = { status: \"active\" };\n\n // Only add id to query if it's provided and valid\n if (id) {\n query.id = id;\n }\n\n const cacheKeyOptions: Record<string, any> = {\n status: \"active\",\n limit,\n page,\n };\n\n if (id) {\n cacheKeyOptions.id = String(id);\n }\n\n if (type) {\n cacheKeyOptions.type = type;\n query.type = type;\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: TMiniRole,\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 (!value.name) {\n delete value.name;\n }\n\n if (!value.permissions) {\n delete value.permissions;\n }\n\n if (value.name || value.permissions) {\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 } else {\n throw new BadRequestError(\"No fields to update.\");\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 deleteRole(_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.updateOne(\n { _id },\n { $set: { status: \"deleted\", updateAt: new Date() } },\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 createIndex,\n createTextIndex,\n createUniqueIndex,\n addRole,\n getRoles,\n getRoleByUserId,\n getRoleById,\n getRoleByName,\n updateRole,\n deleteRole,\n updatePermissionsById,\n delCachedData,\n };\n}\n","import { 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 type?: string;\n status?: string;\n default?: boolean;\n createdBy?: string | ObjectId;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport type TMiniRole = Pick<TRole, \"name\" | \"permissions\">;\n\nexport class MRole implements TRole {\n _id: ObjectId;\n id: string | ObjectId;\n name?: string;\n description?: string;\n permissions?: Array<string>;\n type?: string;\n status?: string;\n default?: boolean;\n createdBy?: string | ObjectId;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n constructor(value: TRole) {\n if (typeof value._id === \"string\") {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new Error(\"Invalid _id.\");\n }\n }\n\n if (typeof value.id === \"string\" && value.id.length === 24) {\n try {\n value.id = new ObjectId(value.id);\n } catch (error) {\n throw new Error(\"Invalid id.\");\n }\n }\n\n this.id = value.id ?? \"\";\n\n this._id = value._id ?? new ObjectId();\n this.name = value.name ?? \"\";\n this.description = value.description ?? \"\";\n this.permissions = value.permissions ?? [];\n this.type = value.type ? value.type : \"account\";\n this.status = value.status ?? \"active\";\n\n this.default = value.default ?? false;\n\n if (value.createdBy) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new Error(\"Invalid createdBy.\");\n }\n }\n this.createdBy = value.createdBy ?? \"\";\n\n this.createdAt = value.createdAt ?? new Date().toISOString();\n this.updatedAt = value.updatedAt ?? \"\";\n this.deletedAt = value.deletedAt ?? \"\";\n }\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@eeplatform/nodejs-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 getUsers: _getUsers,\n createUserByInvite: _createUserByInvite,\n createUserBySignUp: _createUserBySignUp,\n } = useUserService();\n\n const { getUserById: _getUserById } = useUserRepo();\n\n async function getUsers(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 _getUsers({ 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 createUserByVerification(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\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 _createUserByInvite({ 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 return {\n getUsers,\n getUserById,\n updateName,\n updateBirthday,\n updateUserFieldById,\n updateUserProfile,\n createUserByVerification,\n };\n}\n","import { BadRequestError } from \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TOrg = {\n _id?: ObjectId;\n name: string;\n description: string;\n type?: string;\n sector: string;\n sectorName?: string;\n sectorType: string;\n category: string;\n email?: string;\n contact?: string;\n region?: string;\n regionName?: string;\n province?: string;\n provinceName?: string;\n cityMunicipality?: string;\n cityMunicipalityName?: string;\n barangay?: string;\n barangayName?: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport const schemaOrg = Joi.object({\n _id: Joi.string().hex().optional().allow(\"\", null),\n name: Joi.string().required(),\n email: Joi.string().email().required(),\n contact: Joi.string().required(),\n type: Joi.string().required(),\n sector: Joi.string().required(),\n sectorName: Joi.string().optional().allow(\"\", null),\n sectorType: Joi.string().allow(\"public\", \"private\").required(),\n category: Joi.string().required(),\n region: Joi.string().optional().allow(\"\", null),\n regionName: Joi.string().optional().allow(\"\", null),\n province: Joi.string().optional().allow(\"\", null),\n provinceName: Joi.string().optional().allow(\"\", null),\n cityMunicipality: Joi.string().optional().allow(\"\", null),\n cityMunicipalityName: Joi.string().optional().allow(\"\", null),\n barangay: Joi.string().optional().allow(\"\", null),\n barangayName: Joi.string().optional().allow(\"\", null),\n description: Joi.string().optional().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\nexport function MOrg(value: TOrg): TOrg {\n const { error } = schemaOrg.validate(value);\n if (error) {\n throw new BadRequestError(error.message);\n }\n\n if (value._id) {\n try {\n value._id = new ObjectId(value._id);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n }\n\n return {\n _id: value._id,\n name: value.name,\n description: value.description,\n type: value.type,\n sector: value.sector,\n sectorName: value.sectorName || \"\",\n sectorType: value.sectorType,\n category: value.category,\n email: value.email,\n contact: value.contact,\n region: value.region,\n regionName: value.regionName || \"\",\n province: value.province,\n provinceName: value.provinceName || \"\",\n cityMunicipality: value.cityMunicipality,\n cityMunicipalityName: value.cityMunicipalityName || \"\",\n barangay: value.barangay,\n barangayName: value.barangayName || \"\",\n status: value.status || \"active\",\n createdAt: value.createdAt || new Date().toISOString(),\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 \"@eeplatform/nodejs-utils\";\nimport { MOrg, TOrg } from \"./organization.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\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 }, unique: true, name: \"unique_name\" },\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 = MOrg(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>({ name });\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 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 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 return {\n createIndexes,\n add,\n getAll,\n getById,\n updateFieldById,\n deleteById,\n getByName,\n };\n}\n","import { useAtlas } from \"@eeplatform/nodejs-utils\";\nimport { useOrgRepo } from \"./organization.repository\";\nimport { useRoleRepo } from \"../role/role.repository\";\nimport { TOrg } from \"./organization.model\";\n\nexport function useOrgService() {\n const { add: addOrg } = useOrgRepo();\n const { addRole } = useRoleRepo();\n\n async function add(value: TOrg) {\n const session = useAtlas.getClient()?.startSession();\n session?.startTransaction();\n\n try {\n // Create organization\n const org = await addOrg(value, session);\n\n // Create roles\n const role = await addRole(\n {\n id: org,\n name: \"Owner\",\n description: \"Owner of the organization\",\n permissions: [\"all\"],\n },\n session\n );\n\n // Commit transaction\n session?.commitTransaction();\n\n return \"Organization created successfully.\";\n } catch (error) {\n // Rollback transaction\n 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 \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\nimport { useOrgService } from \"./organization.service\";\nimport { useMemberRepo } from \"../member/member.repository\";\nimport { useOrgRepo } from \"./organization.repository\";\nimport { schemaOrg } 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 } = useOrgRepo();\n\n async function createOrg(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaOrg.validate(value);\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _add(value);\n\n res.json({ message });\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 return {\n createOrg,\n getOrgsByUserId,\n getByName,\n getAll,\n getById,\n };\n}\n","import { NextFunction, Request, Response } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError, InternalServerError } from \"@eeplatform/nodejs-utils\";\nimport { useRoleRepo } from \"./role.repository\";\nimport { useRoleService } from \"./role.service\";\n\nexport function useRoleController() {\n const {\n addRole: _createRole,\n getRoleById: _getRoleById,\n getRoleByUserId: _getRoleByUserId,\n getRoles: _getRoles,\n updateRole: _updateRole,\n updatePermissionsById: _updatePermissionsById,\n } = useRoleRepo();\n\n async function createRole(req: Request, res: Response, next: NextFunction) {\n const payload = req.body;\n const validation = Joi.object({\n name: Joi.string().required(),\n permissions: Joi.array().items(Joi.string()).required(),\n type: Joi.string()\n .valid(\"school\", \"division\", \"region\", \"account\")\n .required(),\n id: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.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 type = (req.query.type as string) ?? \"\";\n const id = (req.query.id 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 type: Joi.string().optional().allow(\"\", null),\n id: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ search, page, limit, type, id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getRoles({ search, page, limit, type, id });\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 _getRoleById(_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 const { deleteById } = useRoleService();\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 {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@eeplatform/nodejs-utils\";\nimport { ObjectId } from \"bson\";\nimport Joi from \"joi\";\nimport { useRoleRepo } from \"./role.repository\";\nimport { useMemberRepo } from \"../member\";\n\nexport function useRoleService() {\n const { getByOrg } = useMemberRepo();\n\n const { deleteRole, getRoleById } = useRoleRepo();\n\n async function deleteById(_id: string | ObjectId) {\n const { error } = Joi.string().hex().length(24).validate(_id);\n if (error) {\n throw new BadRequestError(\"Invalid Role ID\");\n }\n\n try {\n const role = await getRoleById(_id);\n if (!role) {\n throw new BadRequestError(\"Role not found\");\n }\n\n const org = await getByOrg(String(role.id));\n\n if (org) {\n throw new BadRequestError(\"Cannot delete role assigned to members\");\n }\n\n await deleteRole(_id);\n\n return \"Role deleted successfully\";\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n }\n\n throw new InternalServerError(\"Failed to delete role\");\n }\n }\n\n return {\n deleteById,\n };\n}\n","import Joi from \"joi\";\nimport { useMemberRepo } from \"./member.repository\";\nimport { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@eeplatform/nodejs-utils\";\n\nexport function useMemberController() {\n const {\n getByUserId: _getByUserId,\n getAll: _getAll,\n getOrgsByMembership: _getOrgsByMembership,\n updateStatusByUserId: _updateStatusByUserId,\n getByUserType: _getByUserType,\n } = useMemberRepo();\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 type: 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 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 type = (req.query.type as string) ?? \"main\";\n const status = (req.query.status as string) ?? \"active\";\n\n const validation = Joi.object({\n limit: Joi.number().min(10).max(300).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 type: Joi.string().required(),\n status: Joi.string().required(),\n });\n\n const { error } = validation.validate({\n search,\n page,\n user,\n org,\n type,\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 type,\n limit,\n status,\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 return {\n getByUserId,\n getAll,\n getOrgsByMembership,\n updateStatusByUserId,\n getByUserType,\n };\n}\n","import { TFile } from \"./file.model\";\nimport { useFileRepo } from \"./file.repository\";\nimport { logger, useS3, useAtlas } from \"@eeplatform/nodejs-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 \"@eeplatform/nodejs-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 {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@eeplatform/nodejs-utils\";\nimport { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useVerificationService } from \"./verification.service\";\nimport { useVerificationRepo } from \"./verification.repository\";\n\nexport function useVerificationController() {\n const {\n createUserInvite: _createUserInvite,\n createForgetPassword: _createForgetPassword,\n cancelUserInvitation: _cancelUserInvitation,\n verify: _verify,\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 });\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\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 });\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 return {\n getVerifications,\n createUserInvite,\n createForgetPassword,\n verify,\n cancelUserInvitation,\n };\n}\n","import { BadRequestError } from \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\nimport { ObjectId } from \"mongodb\";\n\nexport type TAddress = {\n _id?: ObjectId;\n type: string;\n user: ObjectId | string;\n org?: ObjectId | string;\n country: string;\n address: string;\n continuedAddress?: string;\n city: string;\n province: string;\n postalCode: string;\n taxId: string;\n};\n\nexport const addressSchema = Joi.object({\n type: Joi.string().required(),\n user: Joi.string().hex().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n country: Joi.string().required(),\n address: Joi.string().required(),\n continuedAddress: Joi.string().optional().allow(\"\", null),\n city: Joi.string().required(),\n province: Joi.string().required(),\n postalCode: Joi.string().required(),\n taxId: Joi.string().optional().allow(\"\", null),\n});\n\nexport function MAddress(value: any): TAddress {\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.org) {\n try {\n value.org = new ObjectId(value.org);\n } catch (error) {\n throw new BadRequestError(\"Invalid org ID.\");\n }\n }\n\n return {\n type: value.type ?? \"billing\",\n user: value.user ?? \"\",\n org: value.org ?? \"\",\n country: value.country ?? \"\",\n address: value.address ?? \"\",\n continuedAddress: value.continuedAddress ?? \"\",\n city: value.city ?? \"\",\n province: value.province ?? \"\",\n postalCode: value.postalCode ?? \"\",\n taxId: value.taxId ?? \"\",\n };\n}\n","import {\n BadRequestError,\n useAtlas,\n useCache,\n makeCacheKey,\n logger,\n} from \"@eeplatform/nodejs-utils\";\nimport { MAddress, TAddress } from \"./address.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function useAddressRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new BadRequestError(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"addresses\";\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 createIndex() {\n try {\n await collection.createIndexes([\n { key: { user: 1 } },\n { key: { type: 1 } },\n { key: { orgId: 1 } },\n ]);\n } catch (error) {\n throw new BadRequestError(\"Failed to create index on address.\");\n }\n }\n\n async function add(value: TAddress, session?: ClientSession) {\n try {\n value = MAddress(value);\n const res = await collection.insertOne(value, { session });\n delCachedData();\n return res.insertedId;\n } catch (error: any) {\n throw new BadRequestError(\"Failed to create address.\");\n }\n }\n\n type TUpdateAddress = Pick<\n TAddress,\n | \"country\"\n | \"address\"\n | \"continuedAddress\"\n | \"city\"\n | \"province\"\n | \"postalCode\"\n | \"taxId\"\n | \"org\"\n >;\n\n async function updateById(\n _id: string | ObjectId,\n value: TUpdateAddress,\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid address ID.\");\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 try {\n await collection.updateOne(\n { _id },\n { $set: value },\n { session, upsert: true }\n );\n delCachedData();\n return \"Successfully updated address.\";\n } catch (error: any) {\n throw new BadRequestError(\"Failed to update address.\");\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 user ID.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { user: String(user) });\n\n try {\n // Check cache first\n const cached = await getCache<TAddress>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByUserId address: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TAddress>({ user });\n\n if (data) {\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for address by user ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for address by user ID: ${err.message}`,\n });\n });\n }\n\n return data;\n } catch (error) {\n throw new BadRequestError(\"Failed to get address by ID.\");\n }\n }\n\n async function getByOrgId(org: string | ObjectId) {\n try {\n org = new ObjectId(org);\n } catch (error) {\n throw new BadRequestError(\"Invalid orgId.\");\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { org: String(org) });\n\n try {\n // Check cache first\n const cached = await getCache<TAddress>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByOrgId address: ${cacheKey}`,\n });\n return cached;\n }\n\n const data = await collection.findOne<TAddress>({ org });\n\n if (data) {\n setCache(cacheKey, data, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for address by org ID: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for address by org ID: ${err.message}`,\n });\n });\n }\n\n return data;\n } catch (error) {\n throw new BadRequestError(\"Failed to get address by orgId.\");\n }\n }\n\n return {\n createIndex,\n add,\n getByUserId,\n getByOrgId,\n updateById,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError, NotFoundError } from \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\nimport { useAddressRepo } from \"./address.repository\";\n\nexport function useAddressController() {\n const {\n add: _add,\n getByUserId: _getByUserId,\n getByOrgId: _getByOrgId,\n updateById: _updateById,\n } = useAddressRepo();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const validation = Joi.object({\n type: Joi.string().required(),\n user: Joi.string().hex().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n country: Joi.string().required(),\n address: Joi.string().required(),\n continuedAddress: Joi.string().optional().allow(\"\", null),\n city: Joi.string().required(),\n province: Joi.string().required(),\n postalCode: Joi.string().required(),\n taxId: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate(value);\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const value = req.body;\n const id = await _add(value);\n res.json({ message: \"Successfully added subscription.\", id });\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 value = req.body;\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n country: Joi.string().required(),\n address: Joi.string().required(),\n continuedAddress: Joi.string().optional().allow(\"\", null),\n city: Joi.string().required(),\n province: Joi.string().required(),\n postalCode: Joi.string().required(),\n taxId: Joi.string().optional().allow(\"\", null),\n org: Joi.string().hex().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ id, ...value });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateById(id, value);\n res.json({ message });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getByUserId(req: Request, res: Response, next: NextFunction) {\n const user = req.params.user as string;\n\n const validation = Joi.string().hex().required();\n const { error } = validation.validate(user);\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const address = await _getByUserId(user);\n if (!address) {\n next(new NotFoundError(\"Address not found.\"));\n return;\n }\n\n res.json(address);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getByOrgId(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id as string;\n\n const validation = Joi.string().hex().required();\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const address = await _getByOrgId(id);\n if (!address) {\n next(new NotFoundError(\"Address not found.\"));\n return;\n }\n\n res.json(address);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n return {\n add,\n getByUserId,\n getByOrgId,\n updateById,\n };\n}\n","import { ObjectId } from \"mongodb\";\n\nexport type TToken = {\n token: string;\n user: ObjectId;\n createdAt?: string;\n};\n\nexport class MToken implements TToken {\n token: string;\n user: ObjectId;\n createdAt?: string;\n\n constructor(value: TToken) {\n this.token = value.token ?? \"\";\n this.user = value.user ?? new ObjectId();\n this.createdAt = value.createdAt ?? new Date().toISOString();\n }\n}","import { BadRequestError } from \"@eeplatform/nodejs-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 {\n useAtlas,\n useCache,\n makeCacheKey,\n logger,\n} from \"@eeplatform/nodejs-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 createIndex() {\n try {\n await collection.createIndexes([\n {\n key: { type: 1 },\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndexes([\n {\n key: { type: 1 },\n unique: true,\n name: \"unique_type\",\n },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create counter unique 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 createIndex,\n createUniqueIndex,\n add,\n getByType,\n incrementByType,\n };\n}\n","import { GoogleGenerativeAI } from \"@google/generative-ai\";\nimport { GEMINI_API_KEY } from \"../../config\";\nimport fs from \"fs\";\nimport path from \"path\";\n\n// Initialize Gemini AI\nconst genAI = new GoogleGenerativeAI(GEMINI_API_KEY);\n\n// Supported audio formats for Gemini AI\nconst SUPPORTED_AUDIO_FORMATS = [\n \"audio/wav\",\n \"audio/mp3\",\n \"audio/aiff\",\n \"audio/aac\",\n \"audio/ogg\",\n \"audio/flac\",\n];\n\nexport interface AudioTranscriptionOptions {\n prompt?: string;\n language?: string;\n enableTimestamps?: boolean;\n maxTokens?: number;\n}\n\nexport interface AudioTranscriptionResult {\n transcription: string;\n confidence?: number;\n language?: string;\n duration?: number;\n timestamps?: Array<{\n start: number;\n end: number;\n text: string;\n }>;\n}\n\nexport interface AudioFileData {\n data: Buffer;\n mimeType: string;\n}\n\nexport interface PhonemeMatchOptions {\n language?: string;\n caseSensitive?: boolean;\n partialMatch?: boolean;\n}\n\nexport interface PhonemeMatchResult {\n transcription: string;\n targetPhoneme: string;\n isMatch: boolean;\n confidence?: number;\n detectedPhonemes?: string[];\n matchDetails?: {\n exactMatch: boolean;\n partialMatch: boolean;\n position?: number;\n context?: string;\n };\n}\n\nexport function useGeminiAiService() {\n /**\n * Convert audio file to base64 format required by Gemini\n */\n const prepareAudioData = (audioBuffer: Buffer, mimeType: string): string => {\n return audioBuffer.toString(\"base64\");\n };\n\n /**\n * Validate audio file format\n */\n const validateAudioFormat = (mimeType: string): boolean => {\n return SUPPORTED_AUDIO_FORMATS.includes(mimeType);\n };\n\n /**\n * Read audio file from filesystem\n */\n const readAudioFile = async (filePath: string): Promise<AudioFileData> => {\n try {\n const audioBuffer = await fs.promises.readFile(filePath);\n const extension = path.extname(filePath).toLowerCase();\n\n // Map file extensions to MIME types\n const mimeTypeMap: Record<string, string> = {\n \".wav\": \"audio/wav\",\n \".mp3\": \"audio/mp3\",\n \".aiff\": \"audio/aiff\",\n \".aac\": \"audio/aac\",\n \".ogg\": \"audio/ogg\",\n \".flac\": \"audio/flac\",\n };\n\n const mimeType = mimeTypeMap[extension];\n if (!mimeType) {\n throw new Error(`Unsupported audio format: ${extension}`);\n }\n\n return {\n data: audioBuffer,\n mimeType,\n };\n } catch (error) {\n throw new Error(\n `Failed to read audio file: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Transcribe audio using Gemini AI\n */\n const transcribeAudio = async (\n audioData: AudioFileData,\n options: AudioTranscriptionOptions = {}\n ): Promise<AudioTranscriptionResult> => {\n try {\n // Validate audio format\n if (!validateAudioFormat(audioData.mimeType)) {\n throw new Error(`Unsupported audio format: ${audioData.mimeType}`);\n }\n\n // Use Gemini Pro model (more widely available)\n const model = genAI.getGenerativeModel({ model: \"gemini-2.5-flash\" });\n\n // Prepare the prompt\n let prompt =\n \"Please transcribe the following audio file accurately. Provide the transcription as plain text.\";\n\n if (options.prompt) {\n prompt += ` Additional instructions: ${options.prompt}`;\n }\n\n if (options.language) {\n prompt += ` The audio is in ${options.language}.`;\n }\n\n if (options.enableTimestamps) {\n prompt += \" Please include timestamps if possible.\";\n }\n\n // Prepare audio data for Gemini\n const audioBase64 = prepareAudioData(audioData.data, audioData.mimeType);\n\n // Create the request\n const result = await model.generateContent([\n prompt,\n {\n inlineData: {\n data: audioBase64,\n mimeType: audioData.mimeType,\n },\n },\n ]);\n\n const response = await result.response;\n const transcription = response.text();\n\n return {\n transcription: transcription.trim(),\n language: options.language,\n };\n } catch (error) {\n throw new Error(\n `Audio transcription failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Transcribe audio from file path\n */\n const transcribeAudioFromFile = async (\n filePath: string,\n options: AudioTranscriptionOptions = {}\n ): Promise<AudioTranscriptionResult> => {\n try {\n const audioData = await readAudioFile(filePath);\n return await transcribeAudio(audioData, options);\n } catch (error) {\n throw new Error(\n `Failed to transcribe audio from file: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Transcribe audio from buffer\n */\n const transcribeAudioFromBuffer = async (\n audioBuffer: Buffer,\n mimeType: string,\n options: AudioTranscriptionOptions = {}\n ): Promise<AudioTranscriptionResult> => {\n try {\n const audioData: AudioFileData = {\n data: audioBuffer,\n mimeType,\n };\n return await transcribeAudio(audioData, options);\n } catch (error) {\n throw new Error(\n `Failed to transcribe audio from buffer: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Get supported audio formats\n */\n const getSupportedAudioFormats = (): string[] => {\n return [...SUPPORTED_AUDIO_FORMATS];\n };\n\n /**\n * Generate text content using Gemini AI (existing functionality)\n */\n const generateContent = async (\n prompt: string,\n options: { maxTokens?: number } = {}\n ): Promise<string> => {\n try {\n const model = genAI.getGenerativeModel({ model: \"gemini-pro\" });\n\n const result = await model.generateContent(prompt);\n const response = await result.response;\n\n return response.text();\n } catch (error) {\n throw new Error(\n `Content generation failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Transcribe audio and check for specific phoneme matches\n * This function uses a specialized prompt to focus on phoneme detection\n */\n const checkPhonemeMatch = async (\n audioData: AudioFileData,\n targetPhoneme: string,\n options: PhonemeMatchOptions = {}\n ): Promise<PhonemeMatchResult> => {\n try {\n // Validate audio format\n if (!validateAudioFormat(audioData.mimeType)) {\n throw new Error(`Unsupported audio format: ${audioData.mimeType}`);\n }\n\n // Use Gemini Pro model (more widely available)\n const model = genAI.getGenerativeModel({ model: \"gemini-2.5-flash\" });\n\n // Create a specialized prompt for phoneme detection focused on the first sound\n const phonemePrompt = `\nYou are a phonetic analysis expert. Please transcribe the following audio and analyze it for phonemes, with special focus on the FIRST SOUND produced.\n\nINSTRUCTIONS:\n1. Transcribe the audio as accurately as possible, even if it contains incomplete words, sounds, or non-words\n2. Identify the FIRST phoneme (speech sound) produced at the very beginning of the audio\n3. Check if this FIRST phoneme matches the target phoneme: \"${targetPhoneme}\"\n4. Only consider the target phoneme as a match if it appears as the FIRST sound in the sequence\n5. List all phonemes detected, but prioritize the first one for matching purposes\n\nTARGET PHONEME: ${targetPhoneme}\n${options.language ? `EXPECTED LANGUAGE: ${options.language}` : \"\"}\n\nPlease provide your response in the following format:\nTRANSCRIPTION: [The transcribed text/sounds]\nFIRST_PHONEME: [The very first phoneme/sound produced in the audio]\nPHONEMES_DETECTED: [Ordered list of all phonemes you can identify, starting with the first]\nTARGET_PHONEME_PRESENT: [YES/NO - whether the target phoneme \"${targetPhoneme}\" is the FIRST sound produced]\nMATCH_TYPE: [EXACT/PARTIAL/NONE - type of match found for the first phoneme only]\nPOSITION: [Position of the target phoneme: should be 0 if it's the first sound, -1 if not found as first sound]\nCONFIDENCE: [Your confidence level from 0.0 to 1.0]\nCONTEXT: [Description of the first sound and any surrounding context]\n\nIMPORTANT: Only consider it a match if the target phoneme is the FIRST sound produced. Even if the target phoneme appears later in the sequence, it should NOT be considered a match.\n `.trim();\n\n // Prepare audio data for Gemini\n const audioBase64 = prepareAudioData(audioData.data, audioData.mimeType);\n\n // Create the request\n const result = await model.generateContent([\n phonemePrompt,\n {\n inlineData: {\n data: audioBase64,\n mimeType: audioData.mimeType,\n },\n },\n ]);\n\n const response = await result.response;\n const analysisText = response.text();\n\n // Parse the response to extract structured data\n const transcription = extractValue(analysisText, \"TRANSCRIPTION\");\n const firstPhoneme = extractValue(analysisText, \"FIRST_PHONEME\");\n const detectedPhonemes = extractListValue(\n analysisText,\n \"PHONEMES_DETECTED\"\n );\n const isTargetPresent =\n extractValue(analysisText, \"TARGET_PHONEME_PRESENT\")?.toUpperCase() ===\n \"YES\";\n const matchType = extractValue(analysisText, \"MATCH_TYPE\")?.toUpperCase();\n const position = extractNumericValue(analysisText, \"POSITION\");\n const confidence = extractNumericValue(analysisText, \"CONFIDENCE\");\n const context = extractValue(analysisText, \"CONTEXT\");\n\n // Additional programmatic check for first phoneme matching\n const programmaticMatch = checkFirstPhonemeInText(\n transcription || analysisText,\n firstPhoneme ||\n (detectedPhonemes.length > 0 ? detectedPhonemes[0] : \"\"),\n targetPhoneme,\n options\n );\n\n // Determine final match result - only consider it a match if target is the first phoneme\n const isMatch =\n (isTargetPresent && position === 0) || programmaticMatch.found;\n const exactMatch =\n (matchType === \"EXACT\" && position === 0) || programmaticMatch.exact;\n const partialMatch =\n (matchType === \"PARTIAL\" && position === 0) ||\n programmaticMatch.partial;\n\n return {\n transcription: transcription || analysisText,\n targetPhoneme,\n isMatch,\n confidence: confidence !== null ? confidence : undefined,\n detectedPhonemes:\n detectedPhonemes.length > 0 ? detectedPhonemes : undefined,\n matchDetails: {\n exactMatch,\n partialMatch,\n position: isMatch\n ? position !== null\n ? position\n : programmaticMatch.position\n : -1,\n context:\n context ||\n programmaticMatch.context ||\n (firstPhoneme\n ? `First phoneme detected: ${firstPhoneme}. Target: ${targetPhoneme}`\n : \"Analysis focused on first sound produced\"),\n },\n };\n } catch (error) {\n throw new Error(\n `Phoneme analysis failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Check for phoneme match from file path\n */\n const checkPhonemeMatchFromFile = async (\n filePath: string,\n targetPhoneme: string,\n options: PhonemeMatchOptions = {}\n ): Promise<PhonemeMatchResult> => {\n try {\n const audioData = await readAudioFile(filePath);\n return await checkPhonemeMatch(audioData, targetPhoneme, options);\n } catch (error) {\n throw new Error(\n `Failed to analyze phonemes from file: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Check for phoneme match from buffer\n */\n const checkPhonemeMatchFromBuffer = async (\n audioBuffer: Buffer,\n mimeType: string,\n targetPhoneme: string,\n options: PhonemeMatchOptions = {}\n ): Promise<PhonemeMatchResult> => {\n try {\n const audioData: AudioFileData = {\n data: audioBuffer,\n mimeType,\n };\n return await checkPhonemeMatch(audioData, targetPhoneme, options);\n } catch (error) {\n throw new Error(\n `Failed to analyze phonemes from buffer: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n };\n\n /**\n * Helper function to extract values from Gemini's structured response\n */\n const extractValue = (text: string, key: string): string | null => {\n const regex = new RegExp(`${key}:\\\\s*(.+?)(?=\\\\n|$)`, \"i\");\n const match = text.match(regex);\n return match ? match[1].trim() : null;\n };\n\n /**\n * Helper function to extract list values from Gemini's structured response\n */\n const extractListValue = (text: string, key: string): string[] => {\n const value = extractValue(text, key);\n if (!value) return [];\n\n // Parse comma-separated or bracket-enclosed lists\n return value\n .replace(/[\\[\\]]/g, \"\")\n .split(\",\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n };\n\n /**\n * Helper function to extract numeric values from Gemini's structured response\n */\n const extractNumericValue = (text: string, key: string): number | null => {\n const value = extractValue(text, key);\n if (!value) return null;\n\n const num = parseFloat(value);\n return isNaN(num) ? null : num;\n };\n\n /**\n * Programmatic phoneme matching as backup/validation\n */\n const checkPhonemeInText = (\n text: string,\n targetPhoneme: string,\n options: PhonemeMatchOptions\n ) => {\n const searchText = options.caseSensitive ? text : text.toLowerCase();\n const searchPhoneme = options.caseSensitive\n ? targetPhoneme\n : targetPhoneme.toLowerCase();\n\n const exactIndex = searchText.indexOf(searchPhoneme);\n const found = exactIndex !== -1;\n\n let partialFound = false;\n let partialIndex = -1;\n\n if (!found && options.partialMatch !== false) {\n // Check for partial matches (phoneme as part of larger sounds)\n const phonemePattern = new RegExp(\n searchPhoneme.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"),\n \"gi\"\n );\n const match = searchText.match(phonemePattern);\n if (match) {\n partialFound = true;\n partialIndex = searchText.search(phonemePattern);\n }\n }\n\n return {\n found: found || partialFound,\n exact: found,\n partial: partialFound,\n position: found ? exactIndex : partialIndex,\n context:\n found || partialFound\n ? text.substring(\n Math.max(0, (exactIndex !== -1 ? exactIndex : partialIndex) - 10),\n Math.min(\n text.length,\n (exactIndex !== -1 ? exactIndex : partialIndex) +\n searchPhoneme.length +\n 10\n )\n )\n : undefined,\n };\n };\n\n /**\n * Check if the target phoneme matches the first phoneme produced\n */\n const checkFirstPhonemeInText = (\n text: string,\n firstPhoneme: string,\n targetPhoneme: string,\n options: PhonemeMatchOptions\n ) => {\n if (!firstPhoneme) {\n return {\n found: false,\n exact: false,\n partial: false,\n position: -1,\n context: undefined,\n };\n }\n\n const searchFirstPhoneme = options.caseSensitive\n ? firstPhoneme\n : firstPhoneme.toLowerCase();\n const searchTargetPhoneme = options.caseSensitive\n ? targetPhoneme\n : targetPhoneme.toLowerCase();\n\n // Check for exact match with the first phoneme\n const exactMatch = searchFirstPhoneme === searchTargetPhoneme;\n\n // Check for partial match (target phoneme is contained in first phoneme or vice versa)\n let partialMatch = false;\n if (!exactMatch && options.partialMatch !== false) {\n partialMatch =\n searchFirstPhoneme.includes(searchTargetPhoneme) ||\n searchTargetPhoneme.includes(searchFirstPhoneme);\n }\n\n const found = exactMatch || partialMatch;\n\n return {\n found,\n exact: exactMatch,\n partial: partialMatch,\n position: found ? 0 : -1, // First phoneme is always at position 0 if matched\n context: found ? `First sound: ${firstPhoneme}` : undefined,\n };\n };\n\n return {\n transcribeAudio,\n transcribeAudioFromFile,\n transcribeAudioFromBuffer,\n getSupportedAudioFormats,\n validateAudioFormat,\n generateContent,\n checkPhonemeMatch,\n checkPhonemeMatchFromFile,\n checkPhonemeMatchFromBuffer,\n };\n}\n","import { AppError, BadRequestError } from \"@eeplatform/nodejs-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; // semicolon separated: KEY=value;KEY2=value2\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 semicolons and filter out empty entries\n const lines = keyValues\n .split(\";\")\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 await octokit.actions.createEnvironmentVariable({\n owner,\n repo,\n environment_name: environment,\n name: key,\n value,\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 { AppError, BadRequestError, useRedis } from \"@eeplatform/nodejs-utils\";\nimport { useFileService } from \"../file/file.service\";\n\nexport function useTranscribeService() {\n const { createFile } = useFileService();\n const { getClient } = useRedis();\n\n const redisClient = getClient();\n\n async function transcribeAudio(file: Express.Multer.File) {\n try {\n const fileId = await createFile(file);\n } catch (error) {\n if (error instanceof AppError) {\n throw error;\n } else {\n throw new BadRequestError(\"Failed to transcribe audio file\");\n }\n }\n }\n\n return {\n transcribeAudio,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { useGeminiAiService } from \"./gemini.service\";\nimport {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\n\nexport function useAudioTranscriptionController() {\n const geminiService = useGeminiAiService();\n\n /**\n * Validation schema for transcription options\n */\n const transcriptionOptionsSchema = Joi.object({\n language: Joi.string().optional().max(50),\n enableTimestamps: Joi.boolean().optional(),\n prompt: Joi.string().optional().max(1000),\n maxTokens: Joi.number().integer().min(1).max(8192).optional(),\n });\n\n /**\n * Validation schema for phoneme matching options\n */\n const phonemeOptionsSchema = Joi.object({\n language: Joi.string().optional().max(50),\n caseSensitive: Joi.boolean().optional(),\n partialMatch: Joi.boolean().optional(),\n });\n\n /**\n * Validation schema for phoneme matching request\n */\n const phonemeMatchSchema = Joi.object({\n targetPhoneme: Joi.string().required().min(1).max(10),\n options: phonemeOptionsSchema.optional(),\n });\n\n /**\n * Transcribe audio from uploaded file\n */\n async function transcribeFromFile(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"Audio file is required\"));\n return;\n }\n\n try {\n // Validate request body options\n const { error, value: options } = transcriptionOptionsSchema.validate(\n req.body\n );\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n // Validate audio format\n const { buffer, mimetype, originalname, size } = req.file;\n\n if (!geminiService.validateAudioFormat(mimetype)) {\n const supportedFormats = geminiService.getSupportedAudioFormats();\n next(\n new BadRequestError(\n `Unsupported audio format: ${mimetype}. Supported formats: ${supportedFormats.join(\n \", \"\n )}`\n )\n );\n return;\n }\n\n // Check file size (limit to 25MB)\n const maxSizeBytes = 25 * 1024 * 1024; // 25MB\n if (size > maxSizeBytes) {\n next(\n new BadRequestError(\n `File size too large. Maximum allowed size is ${\n maxSizeBytes / (1024 * 1024)\n }MB`\n )\n );\n return;\n }\n\n // Perform transcription\n const startTime = Date.now();\n const result = await geminiService.transcribeAudioFromBuffer(\n buffer,\n mimetype,\n options\n );\n const processingTime = Date.now() - startTime;\n\n res.json({\n success: true,\n data: {\n transcription: result.transcription,\n language: result.language,\n confidence: result.confidence,\n timestamps: result.timestamps,\n },\n metadata: {\n originalFilename: originalname,\n fileSize: size,\n mimeType: mimetype,\n processingTimeMs: processingTime,\n options: options,\n },\n });\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(\n `Audio transcription failed: ${error.message}`\n )\n );\n }\n }\n }\n\n /**\n * Transcribe audio from base64 encoded data\n */\n async function transcribeFromBase64(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n // Validate request body\n const bodySchema = Joi.object({\n audioData: Joi.string().required(),\n mimeType: Joi.string().required(),\n options: transcriptionOptionsSchema.optional(),\n });\n\n const { error, value } = bodySchema.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const { audioData, mimeType, options = {} } = value;\n\n // Validate audio format\n if (!geminiService.validateAudioFormat(mimeType)) {\n const supportedFormats = geminiService.getSupportedAudioFormats();\n next(\n new BadRequestError(\n `Unsupported audio format: ${mimeType}. Supported formats: ${supportedFormats.join(\n \", \"\n )}`\n )\n );\n return;\n }\n\n // Convert base64 to buffer\n let audioBuffer: Buffer;\n try {\n audioBuffer = Buffer.from(audioData, \"base64\");\n } catch (conversionError) {\n next(new BadRequestError(\"Invalid base64 audio data\"));\n return;\n }\n\n // Check buffer size\n const maxSizeBytes = 25 * 1024 * 1024; // 25MB\n if (audioBuffer.length > maxSizeBytes) {\n next(\n new BadRequestError(\n `Audio data too large. Maximum allowed size is ${\n maxSizeBytes / (1024 * 1024)\n }MB`\n )\n );\n return;\n }\n\n // Perform transcription\n const startTime = Date.now();\n const result = await geminiService.transcribeAudioFromBuffer(\n audioBuffer,\n mimeType,\n options\n );\n const processingTime = Date.now() - startTime;\n\n res.json({\n success: true,\n data: {\n transcription: result.transcription,\n language: result.language,\n confidence: result.confidence,\n timestamps: result.timestamps,\n },\n metadata: {\n fileSize: audioBuffer.length,\n mimeType: mimeType,\n processingTimeMs: processingTime,\n options: options,\n },\n });\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(\n `Audio transcription failed: ${error.message}`\n )\n );\n }\n }\n }\n\n /**\n * Get supported audio formats\n */\n async function getSupportedFormats(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n const formats = geminiService.getSupportedAudioFormats();\n\n res.json({\n success: true,\n data: {\n supportedFormats: formats,\n maxFileSizeMB: 25,\n description: \"Supported audio formats for transcription\",\n },\n });\n } catch (error: any) {\n next(\n new InternalServerError(\n `Failed to get supported formats: ${error.message}`\n )\n );\n }\n }\n\n /**\n * Validate audio format without transcription\n */\n async function validateFormat(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n const schema = Joi.object({\n mimeType: Joi.string().required(),\n });\n\n const { error, value } = schema.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const { mimeType } = value;\n const isSupported = geminiService.validateAudioFormat(mimeType);\n const supportedFormats = geminiService.getSupportedAudioFormats();\n\n res.json({\n success: true,\n data: {\n mimeType: mimeType,\n isSupported: isSupported,\n supportedFormats: supportedFormats,\n },\n });\n } catch (error: any) {\n next(\n new InternalServerError(`Format validation failed: ${error.message}`)\n );\n }\n }\n\n /**\n * Check for specific phoneme in uploaded audio file\n */\n async function checkPhonemeFromFile(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"Audio file is required\"));\n return;\n }\n\n try {\n // Validate request body\n const { error, value } = phonemeMatchSchema.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const { targetPhoneme, options = {} } = value;\n\n // Validate audio format\n const { buffer, mimetype, originalname, size } = req.file;\n\n if (!geminiService.validateAudioFormat(mimetype)) {\n const supportedFormats = geminiService.getSupportedAudioFormats();\n next(\n new BadRequestError(\n `Unsupported audio format: ${mimetype}. Supported formats: ${supportedFormats.join(\n \", \"\n )}`\n )\n );\n return;\n }\n\n // Check file size (limit to 25MB)\n const maxSizeBytes = 25 * 1024 * 1024; // 25MB\n if (size > maxSizeBytes) {\n next(\n new BadRequestError(\n `File size too large. Maximum allowed size is ${\n maxSizeBytes / (1024 * 1024)\n }MB`\n )\n );\n return;\n }\n\n // Perform phoneme analysis\n const startTime = Date.now();\n const result = await geminiService.checkPhonemeMatchFromBuffer(\n buffer,\n mimetype,\n targetPhoneme,\n options\n );\n const processingTime = Date.now() - startTime;\n\n // If no match found, throw BadRequestError (404-like behavior)\n if (!result.isMatch) {\n throw new BadRequestError(\n `Phoneme \"${targetPhoneme}\" not found in the provided audio. Transcription: \"${result.transcription}\"`\n );\n }\n\n res.json({\n success: true,\n data: {\n targetPhoneme: result.targetPhoneme,\n isMatch: result.isMatch,\n transcription: result.transcription,\n confidence: result.confidence,\n detectedPhonemes: result.detectedPhonemes,\n matchDetails: {\n exactMatch: result.matchDetails?.exactMatch,\n partialMatch: result.matchDetails?.partialMatch,\n position: result.matchDetails?.position,\n context: result.matchDetails?.context,\n },\n },\n metadata: {\n originalFilename: originalname,\n fileSize: size,\n mimeType: mimetype,\n processingTimeMs: processingTime,\n options: options,\n },\n });\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(`Phoneme analysis failed: ${error.message}`)\n );\n }\n }\n }\n\n /**\n * Check for specific phoneme in base64 encoded audio data\n */\n async function checkPhonemeFromBase64(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n try {\n // Validate request body\n const bodySchema = Joi.object({\n audioData: Joi.string().required(),\n mimeType: Joi.string().required(),\n targetPhoneme: Joi.string().required().min(1).max(10),\n options: phonemeOptionsSchema.optional(),\n });\n\n const { error, value } = bodySchema.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const { audioData, mimeType, targetPhoneme, options = {} } = value;\n\n // Validate audio format\n if (!geminiService.validateAudioFormat(mimeType)) {\n const supportedFormats = geminiService.getSupportedAudioFormats();\n next(\n new BadRequestError(\n `Unsupported audio format: ${mimeType}. Supported formats: ${supportedFormats.join(\n \", \"\n )}`\n )\n );\n return;\n }\n\n // Convert base64 to buffer\n let audioBuffer: Buffer;\n try {\n audioBuffer = Buffer.from(audioData, \"base64\");\n } catch (conversionError) {\n next(new BadRequestError(\"Invalid base64 audio data\"));\n return;\n }\n\n // Check buffer size\n const maxSizeBytes = 25 * 1024 * 1024; // 25MB\n if (audioBuffer.length > maxSizeBytes) {\n next(\n new BadRequestError(\n `Audio data too large. Maximum allowed size is ${\n maxSizeBytes / (1024 * 1024)\n }MB`\n )\n );\n return;\n }\n\n // Perform phoneme analysis\n const startTime = Date.now();\n const result = await geminiService.checkPhonemeMatchFromBuffer(\n audioBuffer,\n mimeType,\n targetPhoneme,\n options\n );\n const processingTime = Date.now() - startTime;\n\n // If no match found, throw BadRequestError (404-like behavior)\n if (!result.isMatch) {\n throw new BadRequestError(\n `Phoneme \"${targetPhoneme}\" not found in the provided audio. Transcription: \"${result.transcription}\"`\n );\n }\n\n res.json({\n success: true,\n data: {\n targetPhoneme: result.targetPhoneme,\n isMatch: result.isMatch,\n transcription: result.transcription,\n confidence: result.confidence,\n detectedPhonemes: result.detectedPhonemes,\n matchDetails: {\n exactMatch: result.matchDetails?.exactMatch,\n partialMatch: result.matchDetails?.partialMatch,\n position: result.matchDetails?.position,\n context: result.matchDetails?.context,\n },\n },\n metadata: {\n fileSize: audioBuffer.length,\n mimeType: mimeType,\n processingTimeMs: processingTime,\n options: options,\n },\n });\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(`Phoneme analysis failed: ${error.message}`)\n );\n }\n }\n }\n\n /**\n * Batch phoneme analysis - check multiple phonemes in one audio file\n */\n async function batchPhonemeCheck(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n if (!req.file) {\n next(new BadRequestError(\"Audio file is required\"));\n return;\n }\n\n try {\n // Validate request body\n const batchSchema = Joi.object({\n targetPhonemes: Joi.array()\n .items(Joi.string().min(1).max(10))\n .min(1)\n .max(20)\n .required(),\n options: phonemeOptionsSchema.optional(),\n });\n\n const { error, value } = batchSchema.validate(req.body);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n const { targetPhonemes, options = {} } = value;\n\n // Validate audio format\n const { buffer, mimetype, originalname, size } = req.file;\n\n if (!geminiService.validateAudioFormat(mimetype)) {\n const supportedFormats = geminiService.getSupportedAudioFormats();\n next(\n new BadRequestError(\n `Unsupported audio format: ${mimetype}. Supported formats: ${supportedFormats.join(\n \", \"\n )}`\n )\n );\n return;\n }\n\n // Check file size\n const maxSizeBytes = 25 * 1024 * 1024; // 25MB\n if (size > maxSizeBytes) {\n next(\n new BadRequestError(\n `File size too large. Maximum allowed size is ${\n maxSizeBytes / (1024 * 1024)\n }MB`\n )\n );\n return;\n }\n\n // Perform batch phoneme analysis\n const startTime = Date.now();\n const results = [];\n\n for (const phoneme of targetPhonemes) {\n try {\n const result = await geminiService.checkPhonemeMatchFromBuffer(\n buffer,\n mimetype,\n phoneme,\n options\n );\n\n results.push({\n phoneme,\n isMatch: result.isMatch,\n confidence: result.confidence,\n matchDetails: {\n exactMatch: result.matchDetails?.exactMatch,\n partialMatch: result.matchDetails?.partialMatch,\n position: result.matchDetails?.position,\n context: result.matchDetails?.context,\n },\n });\n } catch (phonemeError) {\n results.push({\n phoneme,\n isMatch: false,\n error:\n phonemeError instanceof Error\n ? phonemeError.message\n : \"Unknown error\",\n });\n }\n }\n\n const processingTime = Date.now() - startTime;\n const successfulAnalysis = results.filter((r) => !r.error);\n const detectedPhonemes = results.filter((r) => r.isMatch);\n\n res.json({\n success: true,\n data: {\n totalPhonemes: targetPhonemes.length,\n analyzedPhonemes: successfulAnalysis.length,\n detectedCount: detectedPhonemes.length,\n detectionRate: (\n (detectedPhonemes.length / targetPhonemes.length) *\n 100\n ).toFixed(1),\n results: results,\n },\n metadata: {\n originalFilename: originalname,\n fileSize: size,\n mimeType: mimetype,\n processingTimeMs: processingTime,\n options: options,\n },\n });\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(\n new InternalServerError(\n `Batch phoneme analysis failed: ${error.message}`\n )\n );\n }\n }\n }\n\n /**\n * Health check for the transcription service\n */\n async function healthCheck(req: Request, res: Response, next: NextFunction) {\n try {\n // Simple test to verify Gemini service is accessible\n const testResult = await geminiService.generateContent(\"Test connection\");\n\n res.json({\n success: true,\n data: {\n status: \"healthy\",\n service: \"audio-transcription\",\n geminiApiStatus: testResult ? \"connected\" : \"disconnected\",\n supportedFormats: geminiService.getSupportedAudioFormats(),\n timestamp: new Date().toISOString(),\n },\n });\n } catch (error: any) {\n next(new InternalServerError(`Health check failed: ${error.message}`));\n }\n }\n\n return {\n transcribeFromFile,\n transcribeFromBase64,\n getSupportedFormats,\n validateFormat,\n healthCheck,\n checkPhonemeFromFile,\n checkPhonemeFromBase64,\n batchPhonemeCheck,\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 \"@eeplatform/nodejs-utils\";\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 return {\n healthCheck,\n setGitHubVariables,\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 TPSGC = {\n _id?: ObjectId;\n code: string;\n name: string;\n type: string;\n};\n\nexport const schemaPSGC = Joi.object({\n code: Joi.string().length(10).required(),\n name: Joi.string().required(),\n type: Joi.string().valid(\"Reg\", \"Prov\", \"City\", \"Mun\", \"Bgy\").required(),\n});\n\nexport function modelPSGC(data: any) {\n const { error } = schemaPSGC.validate(data);\n if (error) {\n throw new Error(`Invalid PSGC data: ${error.message}`);\n }\n\n return {\n code: data.code,\n name: data.name,\n type: data.type,\n };\n}\n","import {\n AppError,\n BadRequestError,\n InternalServerError,\n logger,\n makeCacheKey,\n paginate,\n useAtlas,\n useCache,\n} from \"@eeplatform/nodejs-utils\";\nimport { modelPSGC, TPSGC } from \"./psgc.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\n\nexport function usePSGCRepo() {\n const db = useAtlas.getDb();\n if (!db) {\n throw new Error(\"Unable to connect to server.\");\n }\n\n const namespace_collection = \"psgc\";\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: { name: \"text\" } },\n { key: { code: 1 }, unique: true, name: \"unique_code\" },\n ]);\n } catch (error) {\n throw new Error(\"Failed to create index on PSGC.\");\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: TPSGC, session?: ClientSession) {\n try {\n value = modelPSGC(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(\"Region already exists.\");\n }\n\n throw new Error(\"Failed to create PSGC.\");\n }\n }\n }\n\n async function getAll({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n type = \"\",\n prefix = \"\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: Record<string, any> = {\n type,\n };\n\n const cacheKeyOptions: Record<string, any> = {\n type,\n page,\n limit,\n sort: JSON.stringify(sort),\n };\n\n if (prefix) {\n query.code = { $regex: `^${prefix}` };\n cacheKeyOptions.prefix = prefix;\n }\n\n if (type === \"City\" || type === \"Mun\") {\n query.type = { $in: [\"City\", \"Mun\"] };\n }\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: 1 };\n\n if (search) {\n query.$text = { $search: search };\n cacheKeyOptions.search = search;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, cacheKeyOptions);\n\n logger.log({\n level: \"info\",\n message: `Cache key for getAll PSGC: ${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 PSGC: ${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 PSGC: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for getAll PSGC: ${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<TPSGC>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getById PSGC: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPSGC>({\n _id,\n deletedAt: { $in: [\"\", null] },\n });\n if (!result) {\n throw new BadRequestError(\"Region not found.\");\n }\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for PSGC by id: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for PSGC 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 PSGC.\");\n }\n }\n }\n\n async function getByName(\n { name, prefix = \"\", type = \"\" } = {} as {\n name: string;\n prefix?: string;\n type?: string;\n },\n ) {\n // / stop words to ignore\n const stopWords = new Set([\"of\", \"the\"]);\n\n const words = name\n .trim()\n .split(/\\s+/)\n .filter((w) => w.length > 2 && !stopWords.has(w.toLowerCase()))\n .map((w) => w.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n\n const regex = words.map((w) => `(?=.*${w})`).join(\"\");\n\n const query: Record<string, any> = {\n name: { $regex: regex, $options: \"i\" },\n };\n\n const cacheKeyOptions: Record<string, any> = { type };\n\n if (type) {\n query.type = type;\n cacheKeyOptions.type = type;\n }\n\n const _types = [\"City\", \"Mun\"];\n\n if (_types.includes(type)) {\n query.type = { $in: _types };\n }\n\n if (prefix) {\n query.code = { $regex: `^${prefix}` };\n cacheKeyOptions.prefix = prefix;\n }\n\n const cacheKey = makeCacheKey(namespace_collection, { name });\n\n logger.log({\n level: \"info\",\n message: `Query for getByName PSGC: ${JSON.stringify(query)}`,\n });\n\n try {\n const cached = await getCache<TPSGC>(cacheKey);\n if (cached) {\n logger.log({\n level: \"info\",\n message: `Cache hit for getByName PSGC: ${cacheKey}`,\n });\n return cached;\n }\n\n const result = await collection.findOne<TPSGC>(query);\n\n setCache(cacheKey, result, 300)\n .then(() => {\n logger.log({\n level: \"info\",\n message: `Cache set for PSGC by name: ${cacheKey}`,\n });\n })\n .catch((err) => {\n logger.log({\n level: \"error\",\n message: `Failed to set cache for PSGC 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 PSGC.\");\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\"];\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, deletedAt: { $in: [\"\", null] } },\n { $set: { [field]: value, updatedAt: new Date().toISOString() } },\n { session },\n );\n\n delCachedData();\n\n return `Successfully updated PSGC ${field}.`;\n } catch (error) {\n throw new InternalServerError(`Failed to update PSGC ${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 PSGC.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete PSGC.\");\n }\n }\n\n async function setRegionProvinceName() {\n try {\n const cities = await collection\n .find({ type: { $in: [\"City\", \"Mun\"] } })\n .toArray();\n\n for (let index = 0; index < cities.length; index++) {\n const city = cities[index];\n\n if (city.region) {\n continue;\n }\n\n const province = await collection.findOne({\n type: \"Prov\",\n code: { $regex: `^${city.code.substring(0, 5)}` },\n });\n\n if (province) {\n await collection.updateOne(\n { _id: city._id },\n { $set: { province: province.name } },\n );\n }\n\n const region = await collection.findOne({\n type: \"Reg\",\n code: { $regex: `^${city.code.substring(0, 2)}` },\n });\n\n if (region) {\n await collection.updateOne(\n { _id: city._id },\n { $set: { region: region.name } },\n );\n }\n }\n\n return \"Successfully set region name as province name for cities.\";\n } catch (error) {\n console.log(error);\n }\n }\n\n return {\n createIndexes,\n add,\n getAll,\n getById,\n updateFieldById,\n deleteById,\n getByName,\n setRegionProvinceName,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { BadRequestError } from \"@eeplatform/nodejs-utils\";\nimport Joi from \"joi\";\nimport { usePSGCRepo } from \"./psgc.repository\";\nimport { schemaPSGC } from \"./psgc.model\";\n\nexport function usePSGCController() {\n const {\n add: _add,\n getAll: _getAll,\n getById: _getById,\n getByName: _getByName,\n updateFieldById: _updateFieldById,\n deleteById: _deleteById,\n } = usePSGCRepo();\n\n async function add(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const { error } = schemaPSGC.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 res.json({\n message: \"Successfully created region.\",\n data,\n });\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 type: Joi.string().valid(\"Reg\", \"Prov\", \"City\", \"Mun\", \"Bgy\").required(),\n prefix: 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 type = (req.query.type as string) ?? \"\";\n const prefix = (req.query.prefix as string) ? String(req.query.prefix) : \"\";\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 data = await _getAll({\n page,\n limit,\n search,\n type,\n prefix,\n });\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;\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 region.\",\n data,\n });\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 data = await _getByName({ name });\n res.json({\n message: \"Successfully retrieved region.\",\n data,\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateField(req: Request, res: Response, next: NextFunction) {\n const _id = req.params.id;\n const { field, value } = req.body;\n\n const validation = Joi.object({\n _id: Joi.string().hex().required(),\n field: Joi.string().valid(\"name\", \"director\", \"directorName\").required(),\n value: Joi.string().required(),\n });\n\n const { error } = validation.validate({ _id, field, value });\n\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const message = await _updateFieldById({ _id, field, value });\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 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 getByName,\n updateField,\n deleteById,\n };\n}\n"],"mappings":"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","names":["ObjectId","ObjectId","BadRequestError","InternalServerError","useCache","InternalServerError","logger","makeCacheKey","useAtlas","useCache","ObjectId","useCache","BadRequestError","InternalServerError","Joi","AppError","BadRequestError","InternalServerError","logger","BadRequestError","InternalServerError","NotFoundError","logger","makeCacheKey","useAtlas","useCache","BadRequestError","InternalServerError","logger","makeCacheKey","useAtlas","useCache","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","BadRequestError","ObjectId","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","paginate","logger","BadRequestError","NotFoundError","InternalServerError","useAtlas","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","BadRequestError","ObjectId","error","ObjectId","useAtlas","useCache","logger","AppError","InternalServerError","BadRequestError","makeCacheKey","paginate","BadRequestError","res","filePath","emailContent","logger","InternalServerError","NotFoundError","useAtlas","ObjectId","BadRequestError","InternalServerError","useAtlas","paginate","logger","makeCacheKey","useCache","ObjectId","ObjectId","useAtlas","InternalServerError","useCache","logger","BadRequestError","makeCacheKey","paginate","useAtlas","BadRequestError","ObjectId","InternalServerError","NotFoundError","makeCacheKey","useCache","logger","Joi","BadRequestError","error","logger","AppError","InternalServerError","refreshToken","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","error","AppError","InternalServerError","BadRequestError","Joi","ObjectId","error","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","useCache","logger","AppError","BadRequestError","makeCacheKey","paginate","InternalServerError","useAtlas","useAtlas","BadRequestError","Joi","BadRequestError","error","Joi","Joi","BadRequestError","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","Joi","error","Joi","BadRequestError","error","AppError","InternalServerError","Joi","BadRequestError","error","logger","useS3","useAtlas","useS3","useAtlas","logger","AppError","BadRequestError","InternalServerError","Joi","error","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","error","AppError","InternalServerError","BadRequestError","Joi","ObjectId","BadRequestError","useAtlas","useCache","makeCacheKey","logger","ObjectId","useAtlas","BadRequestError","useCache","logger","makeCacheKey","BadRequestError","NotFoundError","Joi","Joi","BadRequestError","value","error","NotFoundError","ObjectId","BadRequestError","ObjectId","useAtlas","useCache","makeCacheKey","logger","useAtlas","useCache","logger","makeCacheKey","fs","AppError","BadRequestError","AppError","BadRequestError","AppError","BadRequestError","AppError","BadRequestError","InternalServerError","Joi","Joi","AppError","BadRequestError","InternalServerError","logger","Joi","Joi","Joi","AppError","BadRequestError","InternalServerError","logger","makeCacheKey","paginate","useAtlas","useCache","ObjectId","useAtlas","useCache","logger","AppError","BadRequestError","makeCacheKey","paginate","InternalServerError","BadRequestError","Joi","BadRequestError","error","Joi"]}
|