@goweekdays/core 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/error.ts","../src/utils/logger.ts","../src/utils/errorHandler.middleware.ts","../src/utils/authorization.middleware.ts","../src/utils/hash-password.ts","../src/utils/compare-password.ts","../src/utils/mailer.ts","../src/utils/generate-token.ts","../src/utils/paginate.ts","../src/utils/redis.ts","../src/config.ts","../src/utils/compile-handlebar.ts","../src/utils/get-directory.ts","../src/utils/s3.ts","../src/utils/atlas.ts","../src/utils/prepend-zero.ts","../src/utils/to-object-id.ts","../src/models/verification.model.ts","../src/repositories/verification.repository.ts","../src/services/verification.service.ts","../src/repositories/user.repository.ts","../src/models/user.model.ts","../src/controllers/verification.controller.ts","../src/models/token.model.ts","../src/repositories/token.repository.ts","../src/services/user.service.ts","../src/repositories/file.repository.ts","../src/models/file.model.ts","../src/controllers/user.controller.ts","../src/services/auth.service.ts","../src/controllers/auth.controller.ts","../src/models/role.model.ts","../src/repositories/role.repository.ts","../src/services/file.service.ts","../src/controllers/file.controller.ts","../src/services/role.service.ts","../src/controllers/role.controller.ts","../src/models/entity.model.ts","../src/repositories/entity.repository.ts","../src/services/entity.service.ts","../src/controllers/entity.controller.ts","../src/models/workflow.model.ts","../src/repositories/workflow.repository.ts","../src/services/workflow.service.ts","../src/controllers/workflow.controller.ts","../src/models/cap-bldg-act.model.ts","../src/repositories/cap-bldg-act.repository.ts","../src/services/cap-bldg-act.service.ts","../src/controllers/cap-bldg-act.controller.ts","../src/models/comment.model.ts","../src/repositories/comment.repository.ts","../src/services/comment.service.ts","../src/controllers/comment.controller.ts"],"sourcesContent":["\nexport class AppError extends Error {\n public readonly statusCode: number;\n public readonly isOperational: boolean;\n\n constructor(message: string, statusCode: number, isOperational: boolean = true) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.statusCode = statusCode;\n this.isOperational = isOperational;\n Error.captureStackTrace(this);\n }\n}\n\nexport class BadRequestError extends AppError {\n constructor(message: string = 'Bad Request') {\n super(message, 400);\n }\n}\n\nexport class UnauthorizedError extends AppError {\n constructor(message: string = 'Unauthorized') {\n super(message, 401);\n }\n}\n\nexport class NotFoundError extends AppError {\n constructor(message: string = 'Not Found') {\n super(message, 404);\n }\n}\n\nexport class InternalServerError extends AppError {\n constructor(message: string = 'Internal Server Error') {\n super(message, 500);\n }\n}\n","import * as winston from \"winston\";\n\nexport const logger = winston.createLogger({\n level: \"info\",\n format: winston.format.combine(winston.format.timestamp(), winston.format.json()),\n transports: [\n // File transport (optional)\n new winston.transports.File({ filename: \"error.log\", level: \"error\" }),\n new winston.transports.File({ filename: \"combined.log\" }),\n ],\n});","import { Request, Response, NextFunction } from 'express';\nimport { AppError } from './error';\nimport { logger } from './logger';\n\nexport const errorHandler = (err: AppError, req: Request, res: Response, next: NextFunction) => {\n if (err.isOperational) {\n res.status(err.statusCode).json({\n status: 'error',\n message: err.message,\n });\n return;\n } else {\n logger.log({ level: 'error', message: err.message });\n res.status(500).json({\n status: 'error',\n message: 'Internal Server Error',\n });\n return;\n }\n};\n","import { Request, Response, NextFunction } from \"express\";\nimport jwt from \"jsonwebtoken\";\n\nexport function authMiddleware(access_token_secret = \"\") {\n return (req: Request, res: Response, next: NextFunction) => {\n if (!access_token_secret) {\n res.status(401).json({ message: \"Access token secret is required\" });\n return;\n }\n\n const authorization = req.headers[\"authorization\"];\n const token = authorization && authorization.split(\" \")[1];\n if (!token) {\n res.status(401).json({ message: \"Unauthorized\" });\n return;\n }\n\n jwt.verify(token, access_token_secret as string, (err: any, user: any) => {\n if (err) {\n res.status(401).json({ message: \"Authorization token expired\" });\n return;\n }\n\n req.headers[\"user\"] = user.user;\n next();\n });\n };\n}","import bcrypt from \"bcrypt\";\n\nconst saltRounds = 10;\n\nexport async function hashPassword(password: string): Promise<string> {\n try {\n return await bcrypt.hash(password, saltRounds);\n } catch (error) {\n throw new Error(\"Failed to hash password.\");\n }\n}","import bcrypt from \"bcrypt\";\n\nexport async function comparePassword(password: string, hashedPassword: string): Promise<boolean> {\n return new Promise((resolve) => {\n bcrypt.compare(password, hashedPassword, (err, result) => {\n if (err) {\n resolve(false);\n }\n resolve(result);\n });\n });\n}","import { SendMailOptions, createTransport, Transporter } from \"nodemailer\";\n\ninterface MailerConfig {\n email: string;\n password: string;\n host: string;\n port: number;\n secure: boolean;\n}\n\nexport class useMailer {\n private transporter: Transporter;\n\n constructor(private config: MailerConfig) {\n this.transporter = createTransport({\n host: config.host,\n port: config.port,\n secure: config.secure,\n auth: {\n user: config.email,\n pass: config.password,\n },\n });\n }\n\n async sendMail({\n to,\n subject,\n text,\n html,\n sender,\n }: {\n sender?: string;\n to: string;\n subject: string;\n text?: string;\n html?: string;\n }): Promise<string> {\n const mailOptions: SendMailOptions = {\n from: sender ? `${sender} <${this.config.email}>` : this.config.email,\n to,\n subject,\n };\n\n if (text) {\n mailOptions.text = text;\n }\n\n if (html) {\n mailOptions.html = html;\n }\n\n try {\n await this.transporter.sendMail(mailOptions);\n return \"Email sent successfully\";\n } catch (error) {\n return Promise.reject(error);\n }\n }\n}\n","import jwt from \"jsonwebtoken\";\n\nexport function generateToken({ metadata = {}, secret = \"\", options = {} } = {} as { metadata?: Record<string, unknown>, secret: string, options?: jwt.SignOptions }) {\n if (!secret) throw new Error(\"Missing secret.\");\n return jwt.sign(metadata, secret, options);\n}","export function paginate(items: any[], page = 0, limit = 10, length: number) {\n if (length === 0) {\n return {\n items: [],\n pages: 0,\n pageRange: `0-0 of 0`,\n };\n }\n\n const startIndex = page * limit + 1;\n const endIndex = Math.min(startIndex + limit - 1, length);\n\n return {\n items,\n pages: Math.ceil(length / limit),\n pageRange: `${startIndex}-${endIndex} of ${length}`,\n };\n}","import { createClient, RedisClientType } from \"redis\";\n\nlet redisClient: RedisClientType;\n\nimport {\n REDIS_HOST,\n REDIS_PASSWORD,\n REDIS_PORT,\n} from \"./../config\";\n\nexport async function initRedisClient() {\n redisClient = await createClient({\n password: REDIS_PASSWORD,\n socket: {\n host: REDIS_HOST,\n port: REDIS_PORT,\n },\n });\n}\n\nexport function useRedisClient() {\n return redisClient;\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: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","import Handlebars from \"handlebars\";\nimport fs from \"fs\";\n\nexport function compileHandlebar({ context = {}, filePath = \"\" } = {}) {\n const templateSource = fs.readFileSync(filePath, \"utf8\");\n const template = Handlebars.compile(templateSource);\n return template(context);\n}","import path from \"path\";\nexport function getDirectory(directory: string, filePath: string) {\n return path.resolve(directory, `${filePath}.hbs`);\n}","import { PutObjectCommand, DeleteObjectCommand, S3Client } from '@aws-sdk/client-s3';\nimport { Readable } from 'stream';\n\ninterface S3Config {\n accessKeyId: string;\n secretAccessKey: string;\n endpoint: string;\n region: string;\n bucket: string;\n}\n\nexport class useS3 {\n private client: S3Client;\n\n constructor(private config: S3Config) {\n this.client = new S3Client({\n endpoint: config.endpoint,\n region: config.region,\n credentials: {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n },\n forcePathStyle: false, // Optional, based on usage\n });\n }\n\n async uploadObject({\n key,\n body,\n metadata = {},\n contentType\n }: {\n key: string;\n body: string | Buffer;\n metadata?: { [key: string]: string };\n contentType?: string;\n }): Promise<string> {\n const buffer = Readable.from(body);\n try {\n await this.client.send(new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n Body: buffer,\n ACL: \"public-read\",\n Metadata: metadata,\n ContentType: contentType,\n ContentLength: Buffer.byteLength(body),\n }));\n\n return 'Successfully uploaded file.';\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n async deleteObject(key = \"\") {\n try {\n await this.client.send(new DeleteObjectCommand({ Key: key, Bucket: this.config.bucket }));\n return 'Successfully deleted file.';\n } catch (error) {\n return Promise.reject(error);\n }\n }\n}","import { MongoClient, Db } from \"mongodb\";\n\ninterface AtlasConfig {\n name?: string; // Connection name, though only one connection is allowed\n uri: string;\n db: string;\n}\n\nexport class useAtlas {\n private static client: MongoClient | null = null;\n private static database: Db | null = null;\n\n // Initialize the MongoDB connection with the provided config\n public static async initialize(config: AtlasConfig): Promise<void> {\n if (this.client) {\n console.warn(`Client is already initialized. Skipping initialization.`);\n return;\n }\n\n const { uri, db } = config;\n this.client = new MongoClient(uri, { maxPoolSize: 10, maxIdleTimeMS: 60000, connectTimeoutMS: 60000 });\n\n try {\n await this.client.connect();\n this.database = this.client.db(db);\n console.log(`Connected to database \"${db}\".`);\n } catch (error) {\n this.client = null; // Reset if connection fails\n throw error;\n }\n }\n\n // Get the MongoDB client\n public static getClient(): MongoClient | null {\n return this.client;\n }\n\n // Get the database\n public static getDb(): Db | null {\n return this.database;\n }\n\n // Close the connection\n public static async close(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.client = null;\n this.database = null;\n console.log(`Closed connection to the database.`);\n } else {\n console.warn(`No client is currently initialized.`);\n }\n }\n}","export function prependZeros(value: number, length: number = 6): string {\n let numberStr = value.toString();\n let numZeros = Math.max(0, length - numberStr.length); // Calculate the number of zeros needed\n return numberStr.padStart(numZeros + numberStr.length, '0'); // Prepend zeros\n}","import { ObjectId } from \"mongodb\";\nimport { BadRequestError } from \"./error\";\n\nexport function toObjectId(value: string | ObjectId) {\n if (!value) {\n throw new BadRequestError(\"Valid is required.\");\n }\n\n // check if value is hex\n const instanceOfObjectId = value instanceof ObjectId;\n if (!instanceOfObjectId) {\n const isValidHex = /^[0-9a-fA-F]{24}$/.test(value);\n if (!isValidHex) {\n throw new BadRequestError(\"Invalid value, expecting a hex value.\");\n }\n }\n\n // check if value is a valid ObjectId\n try {\n return new ObjectId(value);\n } catch (error) {\n throw new BadRequestError(\"Invalid ID.\");\n }\n}\n","import { ObjectId } from \"mongodb\";\n\nexport type TVerificationMetadata = {\n name?: string;\n app?: string;\n role?: string;\n};\n\nexport type TVerification = {\n _id?: ObjectId;\n type: string;\n email: string;\n metadata?: TVerificationMetadata;\n status?: string;\n createdAt: string;\n updatedAt?: string | null;\n expireAt: string;\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;\n updatedAt?: string | null;\n expireAt: string;\n\n constructor(value: TVerification) {\n this._id = value._id ?? new ObjectId();\n this.type = value.type ?? \"\";\n this.email = value.email ?? \"\";\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 BadRequestError,\n InternalServerError,\n logger,\n paginate,\n useAtlas,\n} from \"@goweekdays/utils\";\nimport { MVerification, TVerification } from \"../models/verification.model\";\nimport { ClientSession, ObjectId } from \"mongodb\";\nimport { TKeyValuePair } from \"../models/local.model\";\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 collection = db.collection(\"verifications\");\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 add(value: TVerification, session?: ClientSession) {\n value = new MVerification(value);\n try {\n const res = await collection.insertOne(value, { session });\n return res.insertedId;\n } catch (error) {\n logger.log({\n level: \"info\",\n message: String(error),\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 return await collection.findOne<TVerification>({ _id });\n } catch (error) {\n throw new InternalServerError(\n \"Internal server error, failed to retrieve verification.\"\n );\n }\n }\n\n async function getVerifications({\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: TKeyValuePair = { 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 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 return paginate(items, page, limit, length);\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 return await collection.find<Array<TVerification>>({ type }).toArray();\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 return await collection.updateOne(\n { _id },\n { $set: { status, updatedAt: new Date().toISOString() } },\n { session }\n );\n } catch (error) {\n throw new InternalServerError(\"Error updating verification status.\");\n }\n }\n\n return {\n createTextIndex,\n add,\n getVerifications,\n getById,\n getByIdByType,\n updateStatusById,\n };\n}\n","import {\n useMailer,\n compileHandlebar,\n logger,\n getDirectory,\n BadRequestError,\n NotFoundError,\n InternalServerError,\n useAtlas,\n} from \"@goweekdays/utils\";\nimport { TVerification } from \"../models/verification.model\";\nimport { useVerificationRepo } from \"../repositories/verification.repository\";\nimport {\n APP_ACCOUNT,\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\";\nimport { ObjectId } from \"mongodb\";\nimport { useUserRepo } from \"../repositories/user.repository\";\nimport { TKeyValuePair } from \"../models/local.model\";\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 { addUserRole, getUserByEmail, getByEmailApp } = useUserRepo();\n\n async function createUserInvite({\n email,\n metadata,\n }: {\n email: string;\n metadata: TKeyValuePair;\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 try {\n const user = await getByEmailApp(email, metadata.app);\n if (user) {\n throw new BadRequestError(\n `User already a user in ${metadata.app} app.`\n );\n }\n const res = await add(value);\n\n const dir = __dirname;\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_ACCOUNT}/verify/invitation/${res}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({\n to: email,\n subject: \"User Invite\",\n html: emailContent,\n sender: \"Education Ecosystem\",\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_ACCOUNT}/reset-password/${res}`,\n },\n filePath,\n });\n\n mailer\n .sendMail({ to: email, subject: \"Forget Password\", html: emailContent })\n .catch((error) => {\n logger.log({\n level: \"error\",\n message: `Error sending forget password email: ${error}`,\n });\n });\n\n return res;\n } catch (error) {\n throw new InternalServerError(\"Error creating one-time password\");\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 limit = 10,\n } = {}) {\n try {\n return await _getVerifications({ search, page, status, type, limit });\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-invite\" && status === \"complete\") {\n throw new BadRequestError(\n \"User already registered, please login to continue.\"\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 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\");\n\n errorByType(_id.type, \"expired\");\n }\n\n const user = await getUserByEmail(_id.email);\n\n const appMember = user?.roles?.filter((i) => i.app === _id.metadata?.app);\n\n if (appMember?.length === 0 && user && _id.type === \"user-invite\") {\n await addUserRole(\n {\n _id: user._id?.toString() as string,\n role: {\n name: _id.metadata?.name as string,\n app: _id.metadata?.app as string,\n role: _id.metadata?.role as string,\n },\n },\n session\n );\n await _updateStatusById(id, \"complete\", session);\n\n await session?.commitTransaction();\n return \"Successfully added user role.\";\n }\n\n if (appMember?.length && _id.type === \"user-invite\") {\n await _updateStatusById(id, \"expired\");\n throw new BadRequestError(\n `Invalid user invitation. User is already a user in the ${_id.metadata?.app} app.`\n );\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: ObjectId) {\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 | ObjectId, 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 return {\n createForgetPassword,\n createUserInvite,\n verify,\n getById,\n getVerifications,\n cancelUserInvitation,\n updateStatusById,\n };\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport { MUser, MUserRole, TUser, TUserRole } from \"./../models/user.model\";\nimport {\n useAtlas,\n InternalServerError,\n logger,\n BadRequestError,\n paginate,\n} from \"@goweekdays/utils\";\nimport { TKeyValuePair } from \"../models/local.model\";\nimport { TRole } from \"../models/role.model\";\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 collection = db.collection(\"users\");\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 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 try {\n return await collection.findOne<TUser>({ email });\n } catch (error) {\n throw new Error(\"Failed to get user by email.\");\n }\n }\n\n async function getByEmailApp(email: string, app: string) {\n try {\n return await collection.findOne<TUser>({ email, \"roles.app\": app });\n } catch (error) {\n throw new Error(\"Failed to get user by email.\");\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 try {\n return await collection.findOne<TUser>({ _id });\n } catch (error) {\n throw new Error(\"Failed to get user by email.\");\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: TKeyValuePair = { 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 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 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 return paginate(items, page, limit, length);\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 return await collection.updateOne(\n { _id },\n { $set: { password } },\n { session }\n );\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 return await collection.updateOne(\n { _id },\n { $set: { firstName, lastName } },\n { session }\n );\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 return await collection.updateOne(\n { _id },\n { $set: { birthMonth: month, birthDay: day, birthYear: year } },\n { session }\n );\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;\n },\n session?: ClientSession\n ) {\n // Allowed fields to prevent arbitrary updates\n const allowedFields = [\"gender\", \"email\", \"contact\", \"profile\"];\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 return `Successfully updated user ${field}.`;\n } catch (error) {\n throw new InternalServerError(`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 getByEmailApp,\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport { BadRequestError } from \"@goweekdays/utils\";\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 type: string;\n roles?: TUserRole[];\n status?: 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 type: string;\n roles?: TUserRole[];\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: 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 ?? \"\";\n this.roles = value.roles ?? [];\n if (value.roles && value.roles.length) {\n value.roles.forEach((role) => {\n try {\n role.role = new ObjectId(role.role);\n } catch (error) {\n throw new BadRequestError(\"Invalid role ID.\");\n }\n\n if (!role.app) {\n throw new BadRequestError(\"App is required.\");\n }\n\n if (!role.name) {\n throw new BadRequestError(\"Name is required.\");\n }\n\n role.status = role.status ?? \"active\";\n });\n }\n this.roles = value.roles ?? [];\n this.status = value.status ?? \"\";\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 \"@goweekdays/utils\";\nimport { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useVerificationService } from \"../services/verification.service\";\nimport { ObjectId } from \"mongodb\";\n\nexport function useVerificationController() {\n const {\n createUserInvite: _createUserInvite,\n createForgetPassword: _createForgetPassword,\n cancelUserInvitation: _cancelUserInvitation,\n verify: _verify,\n getVerifications: _getVerifications,\n } = useVerificationService();\n\n async function createUserInvite(\n req: Request,\n res: Response,\n next: NextFunction\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 name = (req.body.name as string) ?? \"\";\n\n const validation = Joi.object({\n email: Joi.string().email().required(),\n app: Joi.string().optional().allow(\"\", null),\n role: Joi.string().hex().optional().allow(\"\", null),\n name: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({\n email,\n app,\n role,\n name,\n });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createUserInvite({\n email,\n metadata: {\n app,\n role,\n name,\n },\n });\n\n res.json({ message: \"Successfully invited user.\" });\n return;\n } catch (error) {\n console.log(error);\n\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 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 _getVerifications({ status, search, page });\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 const otpObjectId = new ObjectId(otpId);\n await _cancelUserInvitation(otpObjectId);\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 { 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 { InternalServerError, useAtlas } from \"@goweekdays/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 collection = db.collection(\"tokens\");\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 return \"Token created\";\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n async function getToken(token: string) {\n try {\n return await collection.findOne({ token });\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n async function deleteToken(token: string) {\n try {\n return await collection.deleteOne({ token });\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n return {\n createToken,\n getToken,\n deleteToken,\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n NotFoundError,\n hashPassword,\n useAtlas,\n useS3,\n} from \"@goweekdays/utils\";\nimport { useUserRepo } from \"./../repositories/user.repository\";\nimport { TUser, TUserRole } from \"./../models/user.model\";\nimport { TFile } from \"../models/file.model\";\nimport { useFileRepo } from \"../repositories/file.repository\";\nimport {\n SPACES_ACCESS_KEY,\n SPACES_BUCKET,\n SPACES_ENDPOINT,\n SPACES_REGION,\n SPACES_SECRET_KEY,\n} from \"../config\";\nimport { useVerificationRepo } from \"../repositories/verification.repository\";\nimport { useVerificationService } from \"./verification.service\";\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 async function getUserById(id: string) {\n try {\n return await _getById(id);\n } catch (error) {\n throw new InternalServerError();\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 = {\n email: string;\n password: string;\n prefix?: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n suffix?: string;\n type: string;\n roles: TUserRole[];\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 user: TUser = {\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 type: value.type,\n roles: value.roles,\n status: \"active\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n const userId = 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 if (_user) {\n throw new BadRequestError(`User already exists: ${email}.`);\n }\n\n const hashedPassword = await hashPassword(password);\n\n const user: TUser = {\n email,\n password: hashedPassword,\n firstName,\n lastName,\n type: invitation.metadata?.app,\n status: \"active\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n roles: [\n {\n name: invitation.metadata?.name as string,\n app: invitation.metadata?.app,\n role: invitation.metadata?.role,\n },\n ],\n };\n\n const userId = 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(\"OTP not found\");\n }\n\n if (otpDoc.status === \"used\") {\n throw new BadRequestError(\"Invalid OTP, already used.\");\n }\n\n await updateStatusById(id, \"used\");\n\n return \"Updated password successfully\";\n } catch (error) {\n throw error;\n }\n }\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 try {\n await _updateName({ _id, firstName, lastName }, session);\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 getUserById,\n getUsers,\n createUser,\n resetPassword,\n updateName,\n updateBirthday,\n updateUserFieldById,\n updateUserProfile,\n createUserByInvite,\n };\n}\n","import {\n BadRequestError,\n InternalServerError,\n useAtlas,\n} from \"@goweekdays/utils\";\nimport { MFile, TFile } from \"../models/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 collection = db.collection(\"files\");\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 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 return \"File deleted successfully\";\n } catch (error) {\n throw new InternalServerError(\"Failed to delete file.\");\n }\n }\n\n async function getAllDraftedFiles() {\n try {\n return await collection\n .find({ $and: [{ status: \"draft\" }, { status: null }] })\n .toArray();\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 AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useUserService } from \"./../services/user.service\";\n\nexport function useUserController() {\n const {\n getUserById: _getUserById,\n updateName: _updateName,\n updateBirthday: _updateBirthday,\n updateUserFieldById: _updateUserFieldById,\n updateUserProfile: _updateUserProfile,\n getUsers: _getUsers,\n createUserByInvite: _createUserByInvite,\n } = useUserService();\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 }\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 createUserByInvite(\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\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 });\n\n const { error } = validation.validate({\n firstName,\n lastName,\n password,\n id,\n });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createUserByInvite({ firstName, lastName, password, id });\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 createUserByInvite,\n };\n}\n","import { useUserRepo } from \"./../repositories/user.repository\";\nimport {\n AppError,\n BadRequestError,\n comparePassword,\n generateToken,\n InternalServerError,\n NotFoundError,\n} from \"@goweekdays/utils\";\nimport { ACCESS_TOKEN_SECRET, REFRESH_TOKEN_SECRET } from \"./../config\";\nimport { useTokenRepo } from \"./../repositories/token.repository\";\nimport jwt from \"jsonwebtoken\";\nimport { TUser } from \"../models/user.model\";\n\nexport function useAuthService() {\n const expiresIn = \"1m\";\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 // create and return token\n const metadata = { user: _user._id };\n let refreshToken;\n\n try {\n refreshToken = generateToken({\n secret: REFRESH_TOKEN_SECRET,\n metadata,\n options: { expiresIn: \"7d\" },\n });\n } catch (error) {\n throw new BadRequestError(\"Error generating refresh token\");\n }\n\n let accessToken;\n\n try {\n accessToken = generateToken({\n secret: ACCESS_TOKEN_SECRET,\n metadata,\n options: { expiresIn },\n });\n } catch (error) {\n throw new BadRequestError(\"Error generating access token\");\n }\n\n const user = _user._id ?? \"\";\n\n try {\n await useTokenRepo().createToken({ token: refreshToken, user });\n } catch (error) {\n throw new BadRequestError(\"Error creating refresh token\");\n }\n\n return { accessToken, refreshToken, id: _user._id };\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(token: string) {\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 try {\n await useTokenRepo().deleteToken(token);\n } catch (error) {\n throw new InternalServerError(\"Error deleting token\");\n }\n\n return \"Logged out successfully\";\n }\n\n return {\n login,\n refreshToken,\n logout,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport Joi from \"joi\";\nimport { useAuthService } from \"./../services/auth.service\";\nimport {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport { useUserService } from \"../services/user.service\";\n\nexport function useAuthController() {\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 }\n\n try {\n const token = await useAuthService().login({ email, password });\n res.json(token);\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 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 token = (req.params.id as string) || \"\";\n\n if (!token) {\n next(new BadRequestError(\"Token is required\"));\n return;\n }\n\n try {\n await useAuthService().logout(token);\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 return {\n login,\n refreshToken,\n logout,\n resetPassword,\n };\n}\n","import { ObjectId } from \"mongodb\";\n\nexport type TRole = {\n _id?: ObjectId;\n name?: string;\n permissions?: Array<string>;\n type?: string;\n status?: string;\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 name?: string;\n permissions?: Array<string>;\n type?: string;\n status?: string;\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 this._id = value._id ?? new ObjectId();\n this.name = value.name ?? \"\";\n this.permissions = value.permissions ?? [];\n this.type = value.type ? value.type : \"account\";\n this.status = value.status ?? \"active\";\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 BadRequestError,\n InternalServerError,\n useAtlas,\n paginate,\n logger,\n} from \"@goweekdays/utils\";\nimport { MRole, TMiniRole, TRole } from \"../models/role.model\";\nimport { ObjectId, ClientSession } from \"mongodb\";\nimport { TKeyValuePair } from \"../models/local.model\";\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 collection = db.collection(\"roles\");\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 } 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({ name: 1, type: 1 }, { unique: true });\n } catch (error) {\n throw new InternalServerError(\"Failed to create unique index on role.\");\n }\n }\n\n async function addRole(value: TRole, session?: ClientSession) {\n value = new MRole(value);\n try {\n const res = await collection.insertOne(value, { session });\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 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 return await collection.findOne<TRole>({ user: value });\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 return await collection.findOne({ _id });\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 return await collection.findOne({ name });\n } catch (error) {\n throw new InternalServerError(\"Failed to retrieve role by name.\");\n }\n }\n\n async function getRoles({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n type = \"\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: TKeyValuePair = { status: \"active\" };\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 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 return paginate(items, page, limit, length);\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 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 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.deleteOne(\n { _id },\n {\n session,\n }\n );\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 };\n}\n","import { TFile } from \"../models/file.model\";\nimport { useFileRepo } from \"../repositories/file.repository\";\nimport { logger, useS3, useAtlas } from \"@goweekdays/utils\";\nimport {\n SPACES_ACCESS_KEY,\n SPACES_BUCKET,\n SPACES_ENDPOINT,\n SPACES_REGION,\n SPACES_SECRET_KEY,\n} from \"../config\";\nimport cron from \"node-cron\";\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 });\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 await s3.uploadObject({\n key: id,\n body: value.buffer,\n contentType: value.mimetype,\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 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 \"../services/file.service\";\nimport {\n AppError,\n BadRequestError,\n InternalServerError,\n} from \"@goweekdays/utils\";\nimport Joi from \"joi\";\n\nexport function useFileController() {\n const { createFile, deleteFile: _deleteFile } = useFileService();\n async function upload(req: Request, res: Response, next: NextFunction) {\n if (!req.file) {\n res.status(400).send(\"File is required!\");\n return;\n }\n\n try {\n const id = await createFile(req.file);\n res.json({ message: \"Successfully uploaded file\", id });\n return;\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(error));\n }\n }\n }\n\n async function deleteFile(req: Request, res: Response, next: NextFunction) {\n const id = req.params.id as string;\n\n const validation = Joi.string().required();\n\n const { error } = validation.validate(id);\n if (error) {\n next(new BadRequestError(error.message));\n }\n\n try {\n const message = await _deleteFile(id);\n res.json({ message });\n return;\n } catch (error: any) {\n if (error instanceof AppError) {\n next(error);\n } else {\n next(new InternalServerError(error));\n }\n }\n }\n\n return {\n upload,\n deleteFile,\n };\n}\n","import { TMiniRole, TRole } from \"../models/role.model\";\nimport { useRoleRepo } from \"../repositories/role.repository\";\n\nexport function useRoleService() {\n const {\n addRole,\n getRoles: _getRoles,\n getRoleByUserId: _getRoleByUserId,\n getRoleById: _getRoleById,\n getRoleByName: _getRoleByName,\n updateRole: _updateRole,\n deleteRole: _deleteRole,\n } = useRoleRepo();\n\n type TCreateRole = Pick<TRole, \"name\" | \"permissions\" | \"type\">;\n\n async function createRole(value: TCreateRole) {\n try {\n return await addRole(value);\n } catch (error) {\n throw error;\n }\n }\n\n async function getRoles({\n search = \"\",\n page = 1,\n limit = 10,\n type = \"\",\n } = {}) {\n try {\n return await _getRoles({ search, page, limit, type });\n } catch (error) {\n throw error;\n }\n }\n\n async function getRoleByUserId(value: string) {\n try {\n return await _getRoleByUserId(value);\n } catch (error) {\n throw error;\n }\n }\n\n async function getRoleById(_id: string) {\n try {\n return await _getRoleById(_id);\n } catch (error) {\n throw error;\n }\n }\n\n async function getRoleByName(name: string) {\n try {\n return await _getRoleByName(name);\n } catch (error) {\n throw error;\n }\n }\n\n async function updateRole(_id: string, value: TMiniRole) {\n try {\n return await _updateRole(_id, value);\n } catch (error) {\n throw error;\n }\n }\n\n async function deleteRole(_id: string) {\n try {\n return await _deleteRole(_id);\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createRole,\n getRoles,\n getRoleByUserId,\n getRoleById,\n getRoleByName,\n updateRole,\n deleteRole,\n };\n}\n","import { NextFunction, Request, Response } from \"express\";\nimport Joi from \"joi\";\nimport { BadRequestError } from \"@goweekdays/utils\";\nimport { useRoleService } from \"../services/role.service\";\n\nexport function useRoleController() {\n const {\n createRole: _createRole,\n getRoleById: _getRoleById,\n getRoleByUserId: _getRoleByUserId,\n getRoles: _getRoles,\n updateRole: _updateRole,\n deleteRole: _deleteRole,\n } = useRoleService();\n\n async function createRole(req: Request, res: Response, next: NextFunction) {\n const name = (req.body.name as string) ?? \"\";\n const permissions = (req.body.permissions as Array<string>) ?? [];\n const type = (req.body.type as string) ?? \"\";\n const validation = Joi.object({\n name: Joi.string().required(),\n permissions: Joi.array().items(Joi.string()).required(),\n type: Joi.string().optional().allow(\"\", null),\n });\n\n const { error } = validation.validate({ name, permissions, type });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const role = await _createRole({ name, permissions, type });\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\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 });\n\n const { error } = validation.validate({ search, page, limit, type });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getRoles({ search, page, limit, type });\n res.json(data);\n return;\n } catch (error) {\n console.log(error);\n\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 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 _deleteRole(_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 };\n}\n","import { ObjectId } from \"mongodb\";\n\nexport type TEntity = {\n _id?: ObjectId;\n name: string; // The entity's name\n username: string; // The entity's username\n type: \"strand\" | \"office\" | \"bureau\" | \"service\" | \"person\"; // Specifies the type of entry\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n status?: string; // The entity's status\n};\n\nexport class MEntity implements TEntity {\n _id?: ObjectId;\n name: string;\n username: string;\n type: \"strand\" | \"office\" | \"bureau\" | \"service\" | \"person\";\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n status?: string;\n\n constructor(value: TEntity) {\n this._id = value._id ?? new ObjectId();\n this.name = value.name ?? \"\";\n this.username = value.username ?? \"\";\n this.type = value.type;\n this.createdAt = value.createdAt ?? new Date().toISOString();\n this.updatedAt = value.updatedAt ?? \"\";\n this.deletedAt = value.deletedAt ?? \"\";\n this.status = value.status ?? \"active\";\n }\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport { MEntity, TEntity } from \"../models/entity.model\";\nimport {\n BadRequestError,\n InternalServerError,\n logger,\n paginate,\n useAtlas,\n} from \"@goweekdays/utils\";\nimport { TKeyValuePair } from \"../models/local.model\";\n\nexport function useEntityRepo() {\n const db = useAtlas.getDb();\n\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const collection = db.collection(\"entities\");\n\n async function createIndex() {\n try {\n await collection.createIndex({ name: 1 });\n await collection.createIndex({ status: 1 });\n } catch (error) {\n throw new Error(\"Failed to create index for entity.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex({ name: 1, deletedAt: 1 }, { unique: true });\n } catch (error) {\n throw new Error(\"Failed to create unique index on email.\");\n }\n }\n\n async function createEntity(value: TEntity, session?: ClientSession) {\n try {\n value = new MEntity(value);\n const res = await collection.insertOne(value, {\n session,\n });\n return res.insertedId.toString();\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(\"Entity name already exists.\");\n }\n\n throw new InternalServerError(\"Failed to create entity.\");\n }\n }\n\n async function getEntities({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: TKeyValuePair = { status: \"active\" };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\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 return paginate(items, page, limit, length);\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n async function updateEntityFieldById(\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 },\n { $set: { [field]: value } }, // Dynamically set the field\n { session }\n );\n\n return `Successfully updated entity ${field}.`;\n } catch (error) {\n throw new InternalServerError(`Failed to update entity ${field}.`);\n }\n }\n\n async function deleteEntity(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid entity ID.\");\n }\n\n try {\n return await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date().toISOString() } }\n );\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n return {\n createIndex,\n createUniqueIndex,\n createEntity,\n getEntities,\n updateEntityFieldById,\n deleteEntity,\n };\n}\n","import { InternalServerError } from \"@goweekdays/utils\";\nimport { useEntityRepo } from \"../repositories/entity.repository\";\n\nexport function useEntityService() {\n const {\n createEntity: _createEntity,\n getEntities: _getEntities,\n updateEntityFieldById: _updateEntityFieldById,\n deleteEntity: _deleteEntity,\n } = useEntityRepo();\n\n async function createEntity(value: any) {\n try {\n return await _createEntity(value);\n } catch (error) {\n throw new InternalServerError();\n }\n }\n\n async function getEntities(value: any) {\n try {\n return await _getEntities(value);\n } catch (error) {\n throw new InternalServerError();\n }\n }\n\n async function updateEntityFieldById(\n _id: string,\n field: string,\n value: string\n ) {\n try {\n return await _updateEntityFieldById({ _id, field, value });\n } catch (error) {\n throw new InternalServerError();\n }\n }\n\n async function deleteEntity(_id: string) {\n try {\n return await _deleteEntity(_id);\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createEntity,\n getEntities,\n updateEntityFieldById,\n deleteEntity,\n };\n}\n","import type { Request, Response, NextFunction } from \"express\";\nimport { useEntityService } from \"../services/entity.service\";\nimport Joi from \"joi\";\nimport { BadRequestError } from \"@goweekdays/utils\";\n\nexport function useEntityController() {\n const {\n createEntity: _createEntity,\n getEntities: _getEntities,\n updateEntityFieldById: _updateEntityFieldById,\n deleteEntity: _deleteEntity,\n } = useEntityService();\n\n async function createEntity(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const validation = Joi.object({\n name: Joi.string().required(),\n type: Joi.string().valid(\n \"strand\",\n \"office\",\n \"bureau\",\n \"service\",\n \"person\"\n ),\n });\n\n const { error } = validation.validate(value);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const id = await _createEntity(value);\n res.json({ message: \"Successfully created entity.\", id });\n return;\n } catch (error) {\n console.log(error);\n\n next(error);\n return;\n }\n }\n\n async function getEntities(req: Request, res: Response, next: NextFunction) {\n const search = req.query.search ?? \"\";\n const page = Number(req.query.page) ?? 1;\n const limit = Number(req.query.limit) ?? 10;\n\n const validation = Joi.object({\n search: Joi.string().allow(\"\"),\n page: Joi.number().min(1),\n limit: Joi.number().min(1),\n });\n\n const { error } = validation.validate(req.query);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const entities = await _getEntities({\n search,\n page,\n limit,\n });\n\n res.json(entities);\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function updateEntityFieldById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const { id, field, value } = req.body;\n\n const validation = Joi.object({\n id: Joi.string().required(),\n field: Joi.string().required(),\n value: Joi.string().required(),\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 await _updateEntityFieldById(id, field, value);\n res.json({ message: \"Entity updated.\" });\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function deleteEntity(req: Request, res: Response, next: NextFunction) {\n const { id } = req.params;\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 await _deleteEntity(id);\n res.json({ message: \"Entity deleted.\" });\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n return {\n createEntity,\n getEntities,\n updateEntityFieldById,\n deleteEntity,\n };\n}\n","import { ObjectId } from \"mongodb\";\n\nexport type TWorkflowStep = {\n name: string; // Step name\n assignedTo?: string; // User ID assigned to this step\n nextStep?: string; // Next step in the workflow\n};\n\nexport type TWorkflow = {\n _id?: ObjectId; // Workflow ID\n name: string; // Workflow name\n steps: TWorkflowStep[]; // Workflow steps\n status?: string; // Workflow status\n createdAt?: string; // Date created\n updatedAt?: string; // Date updated\n deletedAt?: string; // Date deleted\n};\n\nexport class MWorkflow implements TWorkflow {\n _id?: ObjectId;\n name: string;\n steps: TWorkflowStep[];\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n\n constructor(value: TWorkflow) {\n this._id = value._id ?? new ObjectId();\n this.name = value.name ?? \"\";\n this.steps = value.steps ?? [];\n this.status = value.status ?? \"active\";\n this.createdAt = value.createdAt ?? new Date().toISOString();\n this.updatedAt = value.updatedAt ?? \"\";\n this.deletedAt = value.deletedAt ?? \"\";\n }\n}\n","import { ClientSession, ObjectId } from \"mongodb\";\nimport { TKeyValuePair } from \"../models/local.model\";\nimport { MWorkflow, TWorkflow } from \"../models/workflow.model\";\nimport {\n BadRequestError,\n InternalServerError,\n logger,\n paginate,\n useAtlas,\n} from \"@goweekdays/utils\";\n\nexport function useWorkflowRepo() {\n const db = useAtlas.getDb();\n\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const collection = db.collection(\"workflows\");\n\n async function createIndex() {\n try {\n await collection.createIndex({ name: 1 });\n await collection.createIndex({ status: 1 });\n } catch (error) {\n throw new Error(\"Failed to create index for workflow.\");\n }\n }\n\n async function createUniqueIndex() {\n try {\n await collection.createIndex({ name: 1, deletedAt: 1 }, { unique: true });\n } catch (error) {\n throw new Error(\"Failed to create unique index for workflow.\");\n }\n }\n\n async function createWorkflow(value: TWorkflow) {\n try {\n value = new MWorkflow(value);\n const res = await collection.insertOne(value);\n return res.insertedId.toString();\n } catch (error: any) {\n const duplicated = error.message.includes(\"duplicate\");\n if (duplicated) {\n throw new BadRequestError(\"Workflow name already exists.\");\n }\n throw new InternalServerError(\"Failed to create workflow.\");\n }\n }\n\n async function getWorkflows({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: TKeyValuePair = { status: \"active\" };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\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 return paginate(items, page, limit, length);\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function getWorkflowById(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid workflow ID.\");\n }\n\n try {\n return await collection.findOne({ _id });\n } catch (error) {\n throw new InternalServerError(\"Failed to get workflow.\");\n }\n }\n\n async function updateWorkflowFieldById(\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 },\n { $set: { [field]: value } }, // Dynamically set the field\n { session }\n );\n\n return `Successfully updated entity ${field}.`;\n } catch (error) {\n throw new InternalServerError(`Failed to update entity ${field}.`);\n }\n }\n\n async function deleteWorkflow(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid entity ID.\");\n }\n\n try {\n return await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date().toISOString() } }\n );\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n return {\n createIndex,\n createUniqueIndex,\n createWorkflow,\n getWorkflows,\n getWorkflowById,\n updateWorkflowFieldById,\n deleteWorkflow,\n };\n}\n","import { useWorkflowRepo } from \"../repositories/workflow.repository\";\n\nexport function useWorkflowService() {\n const {\n createWorkflow: _createWorkflow,\n getWorkflows: _getWorkflows,\n getWorkflowById: _getWorkflowById,\n updateWorkflowFieldById: _updateWorkflowFieldById,\n deleteWorkflow: _deleteWorkflow,\n } = useWorkflowRepo();\n\n async function createWorkflow(value: any) {\n try {\n return await _createWorkflow(value);\n } catch (error) {\n throw error;\n }\n }\n\n async function getWorkflows({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n } = {}) {\n try {\n return await _getWorkflows({ search, page, limit, sort });\n } catch (error) {\n throw error;\n }\n }\n\n async function getWorkflowById(_id: string) {\n try {\n return await _getWorkflowById(_id);\n } catch (error) {\n throw error;\n }\n }\n\n async function updateWorkflowFieldById(\n _id: string,\n field: string,\n value: string\n ) {\n try {\n return await _updateWorkflowFieldById({ _id, field, value });\n } catch (error) {\n throw error;\n }\n }\n\n async function deleteWorkflow(_id: string) {\n try {\n return await _deleteWorkflow(_id);\n } catch (error) {\n throw error;\n }\n }\n\n return {\n createWorkflow,\n getWorkflows,\n getWorkflowById,\n updateWorkflowFieldById,\n deleteWorkflow,\n };\n}\n","import { NextFunction, Request, Response } from \"express\";\nimport Joi from \"joi\";\nimport { useWorkflowService } from \"../services/workflow.service\";\n\nexport function useWorkflowController() {\n const {\n createWorkflow: _createWorkflow,\n getWorkflows: _getWorkflows,\n getWorkflowById: _getWorkflowById,\n updateWorkflowFieldById: _updateWorkflowFieldById,\n deleteWorkflow: _deleteWorkflow,\n } = useWorkflowService();\n\n async function createWorkflow(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const name = (req.body.name as string) ?? \"\";\n const steps = (req.body.steps as any[]) ?? [];\n\n const validation = Joi.object({\n name: Joi.string().required(),\n steps: Joi.array()\n .items(\n Joi.object({\n name: Joi.string().required(),\n assignedTo: Joi.string().optional(),\n nextStep: Joi.string().optional,\n })\n )\n .min(3)\n .required(),\n });\n\n const { error } = validation.validate({ name, steps });\n if (error) {\n next(error);\n return;\n }\n\n try {\n const id = await _createWorkflow({ name, steps });\n res.json({ message: \"Successfully created workflow.\", id });\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function getWorkflows(req: Request, res: Response, next: NextFunction) {\n const search = (req.query.search as string) ?? \"\";\n const page = Number(req.query.page) ?? 1;\n const limit = Number(req.query.limit) ?? 10;\n\n const validation = Joi.object({\n search: Joi.string().allow(\"\"),\n page: Joi.number().min(1),\n limit: Joi.number().min(10),\n });\n\n const { error } = validation.validate(req.query);\n if (error) {\n next(error);\n return;\n }\n\n try {\n const workflows = await _getWorkflows({ search, page, limit });\n res.json(workflows);\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function getWorkflowById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const id = (req.params.id as string) ?? \"\";\n\n const validation = Joi.object({\n id: Joi.string().required(),\n });\n\n const { error } = validation.validate({ id });\n if (error) {\n next(error);\n return;\n }\n\n try {\n const workflow = await _getWorkflowById(id);\n res.json(workflow);\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function updateWorkflowFieldById(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const id = (req.body.id as string) ?? \"\";\n const field = (req.body.field as string) ?? \"\";\n const value = (req.body.value as string) ?? \"\";\n\n const validation = Joi.object({\n id: Joi.string().required(),\n field: Joi.string().required(),\n value: Joi.string().required(),\n });\n\n const { error } = validation.validate({ id, field, value });\n if (error) {\n next(error);\n return;\n }\n\n try {\n await _updateWorkflowFieldById(id, field, value);\n res.json({ message: \"Successfully updated workflow.\" });\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function deleteWorkflow(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const id = (req.body.id as string) ?? \"\";\n\n const validation = Joi.object({\n id: Joi.string().required(),\n });\n\n const { error } = validation.validate({ id });\n if (error) {\n next(error);\n return;\n }\n\n try {\n await _deleteWorkflow(id);\n res.json({ message: \"Successfully deleted workflow.\" });\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n return {\n createWorkflow,\n getWorkflows,\n getWorkflowById,\n updateWorkflowFieldById,\n deleteWorkflow,\n };\n}\n","import { ObjectId } from \"mongodb\";\n\ntype TTentative = {\n month: string;\n day: number;\n};\n\nexport type TCapBldgAct = {\n _id?: ObjectId;\n title: string;\n subject: string;\n PMISActivityCode: string;\n type: string;\n strandMandateAddressed: string;\n objectives: Array<string>;\n withCPDUnits: boolean;\n completeStaffWorkReport: string;\n withATC: null | boolean;\n ATC: string;\n conceptNote: string;\n certOfFundAvailability: string;\n budgetProposal: string;\n targets: Array<string>;\n PRCFormsTemplate: string;\n HGDGTool: string;\n EXECOMLeadEndorsement: string;\n individualResults: Array<string>;\n organizationalResults: Array<string>;\n indicative: string;\n tentative: TTentative;\n tentativeOption: TTentative;\n tentativeYear: number;\n GADAttrRate: number;\n GADAttrRateAmount: number;\n NTPCO: {\n teaching: number;\n nonteaching: number;\n teachingRelated: number;\n };\n NTPRO: {\n teaching: number;\n nonteaching: number;\n teachingRelated: number;\n };\n NTPSDO: {\n teaching: number;\n nonteaching: number;\n teachingRelated: number;\n };\n NTPSchool: {\n teaching: number;\n nonteaching: number;\n teachingRelated: number;\n };\n withSkeletonWorkforce: null | boolean;\n skeletonWorkforce: string;\n roles: Array<string>;\n rolesRate: Array<number>;\n skills: Array<string>;\n skillsRate: Array<number>;\n resourceEfficiencyRate: Array<number>;\n AOOR: Array<number>;\n AOOS: Array<string>;\n status?: string;\n createdBy: ObjectId | string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport type TCapBldgActBasicInfo = Pick<\n TCapBldgAct,\n | \"_id\"\n | \"title\"\n | \"subject\"\n | \"PMISActivityCode\"\n | \"type\"\n | \"strandMandateAddressed\"\n | \"objectives\"\n | \"withCPDUnits\"\n | \"createdBy\"\n>;\n\nexport type TCapBldgActInitRevEval = Pick<\n TCapBldgAct,\n | \"_id\"\n | \"completeStaffWorkReport\"\n | \"withATC\"\n | \"ATC\"\n | \"conceptNote\"\n | \"certOfFundAvailability\"\n | \"budgetProposal\"\n | \"targets\"\n | \"PRCFormsTemplate\"\n | \"HGDGTool\"\n | \"EXECOMLeadEndorsement\"\n | \"individualResults\"\n | \"organizationalResults\"\n | \"indicative\"\n | \"tentative\"\n | \"tentativeOption\"\n | \"tentativeYear\"\n | \"GADAttrRate\"\n | \"GADAttrRateAmount\"\n | \"NTPCO\"\n | \"NTPRO\"\n | \"NTPSDO\"\n | \"NTPSchool\"\n | \"withSkeletonWorkforce\"\n | \"skeletonWorkforce\"\n>;\n\nexport type TCapBldgActAssmtCriteria = Pick<\n TCapBldgAct,\n | \"_id\"\n | \"roles\"\n | \"rolesRate\"\n | \"skills\"\n | \"skillsRate\"\n | \"resourceEfficiencyRate\"\n | \"AOOR\"\n | \"AOOS\"\n>;\n\nexport class MCapBldgAct implements TCapBldgAct {\n _id?: ObjectId;\n title: string;\n subject: string;\n PMISActivityCode: string;\n type: string;\n strandMandateAddressed: string;\n objectives: Array<string>;\n withCPDUnits: boolean;\n completeStaffWorkReport: string;\n withATC: null | boolean;\n ATC: string;\n conceptNote: string;\n certOfFundAvailability: string;\n budgetProposal: string;\n targets: Array<string>;\n PRCFormsTemplate: string;\n HGDGTool: string;\n EXECOMLeadEndorsement: string;\n individualResults: Array<string>;\n organizationalResults: Array<string>;\n indicative: string;\n tentative: TTentative;\n tentativeOption: TTentative;\n tentativeYear: number;\n GADAttrRate: number;\n GADAttrRateAmount: number;\n NTPCO: {\n teaching: number;\n nonteaching: number;\n teachingRelated: number;\n };\n NTPRO: {\n teaching: number;\n nonteaching: number;\n teachingRelated: number;\n };\n NTPSDO: {\n teaching: number;\n nonteaching: number;\n teachingRelated: number;\n };\n NTPSchool: {\n teaching: number;\n nonteaching: number;\n teachingRelated: number;\n };\n withSkeletonWorkforce: null | boolean;\n skeletonWorkforce: string;\n roles: Array<string>;\n rolesRate: Array<number>;\n skills: Array<string>;\n skillsRate: Array<number>;\n resourceEfficiencyRate: Array<number>;\n AOOR: Array<number>;\n AOOS: Array<string>;\n status?: string;\n createdBy: ObjectId | string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n\n constructor(value: TCapBldgAct) {\n this._id = value._id ?? new ObjectId();\n this.title = value.title ?? \"\";\n this.subject = value.subject ?? \"\";\n this.PMISActivityCode = value.PMISActivityCode ?? \"\";\n this.type = value.type ?? \"\";\n this.strandMandateAddressed = value.strandMandateAddressed ?? \"\";\n this.objectives = value.objectives ?? [];\n this.withCPDUnits = value.withCPDUnits ?? false;\n this.completeStaffWorkReport = value.completeStaffWorkReport ?? \"\";\n this.withATC = value.withATC ?? null;\n this.ATC = value.ATC ?? \"\";\n this.conceptNote = value.conceptNote ?? \"\";\n this.certOfFundAvailability = value.certOfFundAvailability ?? \"\";\n this.budgetProposal = value.budgetProposal ?? \"\";\n this.targets = value.targets ?? [];\n this.PRCFormsTemplate = value.PRCFormsTemplate ?? \"\";\n this.HGDGTool = value.HGDGTool ?? \"\";\n this.EXECOMLeadEndorsement = value.EXECOMLeadEndorsement ?? \"\";\n this.individualResults = value.individualResults ?? [];\n this.organizationalResults = value.organizationalResults ?? [];\n this.indicative = value.indicative ?? \"\";\n this.tentative = value.tentative ?? { month: \"\", day: 0 };\n this.tentativeOption = value.tentativeOption ?? { month: \"\", day: 0 };\n this.tentativeYear = value.tentativeYear ?? 0;\n this.GADAttrRate = value.GADAttrRate ?? 0;\n this.GADAttrRateAmount = value.GADAttrRateAmount ?? 0;\n this.NTPCO = value.NTPCO ?? {\n teaching: 0,\n nonteaching: 0,\n teachingRelated: 0,\n };\n this.NTPRO = value.NTPRO ?? {\n teaching: 0,\n nonteaching: 0,\n teachingRelated: 0,\n };\n this.NTPSDO = value.NTPSDO ?? {\n teaching: 0,\n nonteaching: 0,\n teachingRelated: 0,\n };\n this.NTPSchool = value.NTPSchool ?? {\n teaching: 0,\n nonteaching: 0,\n teachingRelated: 0,\n };\n this.withSkeletonWorkforce = value.withSkeletonWorkforce ?? null;\n this.skeletonWorkforce = value.skeletonWorkforce ?? \"\";\n this.roles = value.roles ?? [];\n this.rolesRate = value.rolesRate ?? [];\n this.skills = value.skills ?? [];\n this.skillsRate = value.skillsRate ?? [];\n this.resourceEfficiencyRate = value.resourceEfficiencyRate ?? [];\n this.AOOR = value.AOOR ?? [];\n this.AOOS = value.AOOS ?? [];\n this.status = value.status ?? \"draft\";\n\n if (value.createdBy instanceof ObjectId) {\n try {\n value.createdBy = new ObjectId(value.createdBy);\n } catch (error) {\n throw new Error(\"Invalid createdBy ObjectId.\");\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 { ClientSession, ObjectId } from \"mongodb\";\nimport {\n MCapBldgAct,\n TCapBldgAct,\n TCapBldgActAssmtCriteria,\n TCapBldgActBasicInfo,\n TCapBldgActInitRevEval,\n} from \"../models/cap-bldg-act.model\";\nimport {\n BadRequestError,\n InternalServerError,\n logger,\n paginate,\n useAtlas,\n} from \"@goweekdays/utils\";\nimport { TKeyValuePair } from \"../models/local.model\";\n\nexport function useCapBldgActRepo() {\n const db = useAtlas.getDb();\n\n if (!db) {\n throw new InternalServerError(\"Unable to connect to server.\");\n }\n\n const collection = db.collection(\"cap-bldg-acts\");\n\n async function createIndex() {\n try {\n await collection.createIndex({ title: 1 });\n await collection.createIndex({ subject: 1 });\n await collection.createIndex({ type: 1 });\n await collection.createIndex({ status: 1 });\n } catch (error) {\n throw new Error(\"Failed to create index for cap-bldg-acts.\");\n }\n }\n\n async function createTextIndex() {\n try {\n await collection.createIndex({\n title: \"text\",\n subject: \"text\",\n type: \"text\",\n });\n } catch (error) {\n throw new Error(\"Failed to create text index on cap-bldg-acts.\");\n }\n }\n\n async function createCapBldgAct(value: TCapBldgAct, session?: ClientSession) {\n try {\n value = new MCapBldgAct(value);\n const res = await collection.insertOne(value, {\n session,\n });\n return res.insertedId.toString();\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(\"CapBldgAct name already exists.\");\n }\n\n throw new InternalServerError(\"Failed to create CapBldgAct.\");\n }\n }\n\n async function updateCapBldgActBasicInfo(\n { _id, value } = {} as {\n _id: string | ObjectId;\n value: TCapBldgActBasicInfo;\n },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid CapBldgAct ID.\");\n }\n try {\n await collection.updateOne(\n { _id },\n { $set: value },\n {\n session,\n }\n );\n } catch (error: any) {\n logger.log({ level: \"error\", message: `${error}` });\n\n throw new InternalServerError(\"Failed to update CapBldgAct basic info.\");\n }\n }\n\n async function updateCapBldgActInitRevEval(\n { _id, value } = {} as {\n _id: string | ObjectId;\n value: TCapBldgActInitRevEval;\n },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid CapBldgAct ID.\");\n }\n try {\n await collection.updateOne(\n { _id },\n { $set: value },\n {\n session,\n }\n );\n } catch (error: any) {\n logger.log({ level: \"error\", message: `${error}` });\n\n throw new InternalServerError(\n \"Failed to update CapBldgAct initial review and evaluation.\"\n );\n }\n }\n\n async function updateCapBldgActAssmtCriteria(\n { _id, value } = {} as {\n _id: string | ObjectId;\n value: TCapBldgActAssmtCriteria;\n },\n session?: ClientSession\n ) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid CapBldgAct ID.\");\n }\n try {\n await collection.updateOne(\n { _id },\n { $set: value },\n {\n session,\n }\n );\n } catch (error: any) {\n logger.log({ level: \"error\", message: `${error}` });\n\n throw new InternalServerError(\n \"Failed to update CapBldgAct assessment criteria.\"\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 CapBldgAct ID.\");\n }\n\n try {\n return await collection.findOne({ _id });\n } catch (error: any) {\n logger.log({ level: \"error\", message: `${error}` });\n throw new InternalServerError(\"Failed to create CapBldgAct.\");\n }\n }\n\n async function getCapBldgActs({\n search = \"\",\n page = 1,\n limit = 10,\n sort = {},\n status = \"draft\",\n } = {}) {\n page = page > 0 ? page - 1 : 0;\n\n const query: TKeyValuePair = { status };\n\n if (status === \"ongoing\") {\n query.status = {\n $in: [\n \"for-internal-review\",\n \"for-initial-evaluation\",\n \"for-endorsement\",\n \"for-final-review\",\n \"for-final-evaluation\",\n \"for-clearance\",\n \"for-signature\",\n \"for-approval\",\n ],\n };\n }\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: -1 };\n\n if (search) {\n query.$text = { $search: search };\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 return paginate(items, page, limit, length);\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n async function updateCapBldgActFieldById(\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 = [\n \"completeStaffWorkReport\",\n \"ATC\",\n \"certOfFundAvailability\",\n \"conceptNote\",\n \"budgetProposal\",\n \"PRCFormsTemplate\",\n \"HGDGTool\",\n \"EXECOMLeadEndorsement\",\n \"skeletonWorkforce\",\n \"status\",\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 try {\n await collection.updateOne(\n { _id },\n { $set: { [field]: value } }, // Dynamically set the field\n { session }\n );\n\n return `Successfully updated CapBldgAct ${field}.`;\n } catch (error) {\n throw new InternalServerError(`Failed to update CapBldgAct ${field}.`);\n }\n }\n\n async function deleteCapBldgAct(_id: string | ObjectId) {\n try {\n _id = new ObjectId(_id);\n } catch (error) {\n throw new BadRequestError(\"Invalid CapBldgAct ID.\");\n }\n\n try {\n return await collection.updateOne(\n { _id },\n { $set: { status: \"deleted\", deletedAt: new Date().toISOString() } }\n );\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n return {\n createIndex,\n createTextIndex,\n createCapBldgAct,\n getById,\n getCapBldgActs,\n updateCapBldgActFieldById,\n deleteCapBldgAct,\n updateCapBldgActBasicInfo,\n updateCapBldgActInitRevEval,\n updateCapBldgActAssmtCriteria,\n };\n}\n","import {\n MCapBldgAct,\n TCapBldgAct,\n TCapBldgActAssmtCriteria,\n TCapBldgActBasicInfo,\n TCapBldgActInitRevEval,\n} from \"../models/cap-bldg-act.model\";\nimport { TFile } from \"../models/file.model\";\nimport { useCapBldgActRepo } from \"../repositories/cap-bldg-act.repository\";\nimport { useAtlas, useS3 } from \"@goweekdays/utils\";\n\nimport {\n SPACES_ACCESS_KEY,\n SPACES_BUCKET,\n SPACES_ENDPOINT,\n SPACES_REGION,\n SPACES_SECRET_KEY,\n} from \"../config\";\nimport { useFileRepo } from \"../repositories/file.repository\";\n\nexport function useCapBldgActService() {\n const {\n createCapBldgAct: _createCapBldgAct,\n getCapBldgActs: _getCapBldgActs,\n getById: _getById,\n updateCapBldgActFieldById: _updateCapBldgActFieldById,\n deleteCapBldgAct: _deleteCapBldgAct,\n updateCapBldgActBasicInfo: _updateCapBldgActBasicInfo,\n updateCapBldgActInitRevEval: _updateCapBldgActInitRevEval,\n updateCapBldgActAssmtCriteria: _updateCapBldgActAssmt,\n } = useCapBldgActRepo();\n\n async function createCapBldgAct(value: TCapBldgAct) {\n try {\n value = new MCapBldgAct(value);\n return await _createCapBldgAct(value);\n } catch (error) {\n throw error;\n }\n }\n\n async function updateCapBldgActBasicInfo(\n _id: string,\n value: TCapBldgActBasicInfo\n ) {\n try {\n return await _updateCapBldgActBasicInfo({ _id, value });\n } catch (error) {\n throw error;\n }\n }\n\n async function updateCapBldgActInitRevEval(\n _id: string,\n value: TCapBldgActInitRevEval\n ) {\n try {\n return await _updateCapBldgActInitRevEval({ _id, value });\n } catch (error) {\n throw error;\n }\n }\n\n async function updateCapBldgActAssmtCriteria(\n _id: string,\n value: TCapBldgActAssmtCriteria\n ) {\n try {\n return await _updateCapBldgActAssmt({ _id, value });\n } catch (error) {\n throw error;\n }\n }\n\n async function getCapBldgActs({\n search = \"\",\n page = 1,\n status = \"\",\n limit = 10,\n } = {}) {\n try {\n return await _getCapBldgActs({ search, page, status, limit });\n } catch (error) {\n throw error;\n }\n }\n\n async function getById(id: string) {\n try {\n return await _getById(id);\n } catch (error) {\n throw error;\n }\n }\n\n async function updateCapBldgActFieldById({\n _id = \"\",\n field = \"\",\n value = \"\",\n } = {}) {\n try {\n return await _updateCapBldgActFieldById({ _id, field, value });\n } catch (error) {\n throw error;\n }\n }\n\n async function deleteCapBldgAct(id: string) {\n try {\n return await _deleteCapBldgAct(id);\n } catch (error) {\n throw error;\n }\n }\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 const { createFile: _createFile, deleteFileById } = useFileRepo();\n\n async function uploadAttachment(\n value: Express.Multer.File,\n id: string,\n field: string\n ) {\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 await s3.uploadObject({\n key: _id,\n body: value.buffer,\n contentType: value.mimetype,\n });\n\n await _updateCapBldgActFieldById({ _id: id, field, value: _id }, session);\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 async function deleteAttachment(\n attachment: string,\n id: string,\n field: string\n ) {\n const session = useAtlas.getClient()?.startSession();\n\n session?.startTransaction();\n\n try {\n await deleteFileById(attachment, session);\n await _updateCapBldgActFieldById({ _id: id, field, value: \"\" }, session);\n await s3.deleteObject(attachment);\n await session?.commitTransaction();\n\n return \"Attachment successfully deleted.\";\n } catch (error) {\n await session?.abortTransaction();\n throw error;\n } finally {\n session?.endSession();\n }\n }\n\n return {\n createCapBldgAct,\n getCapBldgActs,\n getById,\n updateCapBldgActFieldById,\n deleteCapBldgAct,\n updateCapBldgActBasicInfo,\n updateCapBldgActInitRevEval,\n updateCapBldgActAssmtCriteria,\n uploadAttachment,\n deleteAttachment,\n };\n}\n","import { Request, Response, NextFunction } from \"express\";\nimport { useCapBldgActService } from \"../services/cap-bldg-act.service\";\nimport Joi from \"joi\";\nimport { BadRequestError } from \"@goweekdays/utils\";\n\nexport function useCapBldgActController() {\n const {\n createCapBldgAct: _createCapBldgAct,\n getCapBldgActs: _getCapBldgActs,\n getById: _getById,\n updateCapBldgActBasicInfo: _updateBasicInformation,\n updateCapBldgActInitRevEval: _updateInitRevEval,\n updateCapBldgActAssmtCriteria: _updateAssmtCriteria,\n updateCapBldgActFieldById: _updateFieldById,\n uploadAttachment: _uploadAttachment,\n deleteAttachment: _deleteAttachment,\n } = useCapBldgActService();\n\n async function createCapBldgAct(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const value = req.body;\n\n const validation = Joi.object({\n title: Joi.string().required(),\n subject: Joi.string().required(),\n PMISActivityCode: Joi.string().required(),\n type: Joi.string().required(),\n strandMandateAddressed: Joi.string().required(),\n objectives: Joi.array().items(Joi.string()).min(3).max(3).required(),\n withCPDUnits: Joi.boolean().required(),\n createdBy: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(value);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _createCapBldgAct(value);\n res.json({ message: \"Successfully created CBA request.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateBasicInformation(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const value = req.body;\n const id = (req.params.id as string) ?? \"\";\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n title: Joi.string().required(),\n subject: Joi.string().required(),\n PMISActivityCode: Joi.string().required(),\n type: Joi.string().required(),\n strandMandateAddressed: Joi.string().required(),\n objectives: Joi.array().items(Joi.string()).min(3).max(3).required(),\n withCPDUnits: Joi.boolean().required(),\n });\n\n const { error } = validation.validate({ ...value, id: id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _updateBasicInformation(id, value);\n res.json({ message: \"Successfully updated CBA basic information.\" });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateInitRevEval(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const value = req.body;\n const id = (req.params.id as string) ?? \"\";\n\n const NTP = Joi.object({\n teaching: Joi.number().required(),\n nonteaching: Joi.number().required(),\n teachingRelated: Joi.number().required(),\n }).required();\n\n const tentative = Joi.object({\n month: Joi.string().required(),\n day: Joi.number().required(),\n }).required();\n\n const list = Joi.array().items(Joi.string()).min(3).max(3).required();\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n completeStaffWorkReport: Joi.string().required(),\n withATC: Joi.boolean().required(),\n ATC: Joi.string().required(),\n conceptNote: Joi.string().required(),\n certOfFundAvailability: Joi.string().required(),\n budgetProposal: Joi.string().required(),\n targets: list,\n PRCFormsTemplate: Joi.string().required(),\n HGDGTool: Joi.string().required(),\n EXECOMLeadEndorsement: Joi.string().required(),\n individualResults: list,\n organizationalResults: list,\n indicative: Joi.string().required(),\n tentative: tentative,\n tentativeOption: tentative,\n tentativeYear: Joi.number().required(),\n GADAttrRate: Joi.number().required(),\n GADAttrRateAmount: Joi.number().required(),\n NTPCO: NTP,\n NTPRO: NTP,\n NTPSDO: NTP,\n NTPSchool: NTP,\n withSkeletonWorkforce: Joi.boolean().required(),\n skeletonWorkforce: Joi.string().required(),\n });\n\n const { error } = validation.validate({ ...value, id: id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _updateInitRevEval(id, value);\n res.json({\n message: \"Successfully updated CBA initial review and evaluation.\",\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateAssmtCriteria(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const value = req.body;\n const id = (req.params.id as string) ?? \"\";\n\n const list = Joi.array().items(Joi.string()).min(3).max(3).required();\n const listOptional = Joi.array()\n .items(Joi.number().optional().allow(null))\n .optional()\n .min(0)\n .max(3);\n\n const validation = Joi.object({\n id: Joi.string().hex().required(),\n roles: list,\n rolesRate: listOptional,\n skills: list,\n skillsRate: listOptional,\n resourceEfficiencyRate: listOptional,\n AOOR: Joi.array()\n .items(Joi.number().optional().allow(null))\n .optional()\n .min(0)\n .max(5),\n AOOS: Joi.array()\n .items(Joi.string().optional().allow(null))\n .min(0)\n .max(5),\n });\n\n const { error } = validation.validate({ ...value, id: id });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _updateAssmtCriteria(id, value);\n res.json({\n message: \"Successfully updated CBA assessment criteria.\",\n });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function getCapBldgActs(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const search = (req.query.search as string) ?? \"\";\n const page = req.query.page ? Number(req.query.page) : 1;\n const limit = req.query.limit ? Number(req.query.limit) : 10;\n const status = (req.query.status as string) ?? \"\";\n\n const validation = Joi.object({\n search: Joi.string().allow(\"\"),\n page: Joi.number().min(1),\n limit: Joi.number().min(1),\n status: Joi.string().allow(\"\"),\n });\n\n const { error } = validation.validate(req.query);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const data = await _getCapBldgActs({ search, page, limit, status });\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;\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 data = await _getById(id);\n res.json(data);\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function updateFieldById(\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(\n \"completeStaffWorkReport\",\n \"ATC\",\n \"certOfFundAvailability\",\n \"conceptNote\",\n \"budgetProposal\",\n \"PRCFormsTemplate\",\n \"HGDGTool\",\n \"EXECOMLeadEndorsement\",\n \"skeletonWorkforce\",\n \"status\"\n )\n .required(),\n value: Joi.string().required(),\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 _updateFieldById({ _id, field, value });\n res.json({ message });\n } catch (error) {\n next(error);\n }\n }\n\n async function uploadAttachment(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const file = req.file;\n if (!file) {\n res.status(400).send(\"File is required!\");\n return;\n }\n\n const id = req.params.id as string;\n const field = req.body.field;\n\n const validation = Joi.object({\n id: Joi.string().required(),\n field: Joi.string().required(),\n });\n\n const { error } = validation.validate({ id, field });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const _file = await _uploadAttachment(file, id, field);\n res.json({ message: \"Successfully uploaded attachment.\", id: _file });\n return;\n } catch (error) {\n next(error);\n }\n }\n\n async function deleteAttachment(\n req: Request,\n res: Response,\n next: NextFunction\n ) {\n const id = req.params.id as string;\n const attachment = (req.body.attachment as string) ?? \"\";\n const field = (req.body.field 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 _deleteAttachment(attachment, id, field);\n res.json({ message });\n return;\n } catch (error: any) {\n next(error);\n }\n }\n\n return {\n createCapBldgAct,\n getCapBldgActs,\n getById,\n updateBasicInformation,\n updateInitRevEval,\n updateAssmtCriteria,\n updateFieldById,\n uploadAttachment,\n deleteAttachment,\n };\n}\n","import { ObjectId } from \"mongodb\";\nimport { TFile } from \"./file.model\";\n\nexport type TAttachment = Pick<TFile, \"_id\" | \"name\">;\n\nexport type TComment = {\n _id?: ObjectId;\n comment: string;\n type?: string;\n user: ObjectId | string;\n collection: string;\n document: ObjectId | string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n};\n\nexport class MComment implements TComment {\n _id?: ObjectId;\n comment: string;\n type?: string;\n user: ObjectId | string;\n collection: string;\n document: ObjectId | string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n\n constructor(value: TComment) {\n this._id = value._id ?? new ObjectId();\n this.comment = value.comment ?? \"\";\n this.type = value.type ?? \"common\";\n\n if (typeof value.user === \"string\") {\n try {\n value.user = new ObjectId(value.user);\n } catch (error) {\n throw new Error(\"Invalid user ID.\");\n }\n }\n this.user = value.user ?? \"\";\n\n this.collection = value.collection ?? \"\";\n\n if (typeof value.document === \"string\") {\n try {\n value.document = new ObjectId(value.document);\n } catch (error) {\n throw new Error(\"Invalid document ID.\");\n }\n }\n this.document = value.document;\n\n this.createdAt = value.createdAt ?? new Date().toISOString();\n this.updatedAt = value.updatedAt ?? \"\";\n this.deletedAt = value.deletedAt ?? \"\";\n }\n}\n","import { ObjectId } from \"mongodb\";\nimport { MComment, TComment } from \"../models/comment.model\";\nimport { TKeyValuePair } from \"../models/local.model\";\nimport {\n InternalServerError,\n logger,\n paginate,\n useAtlas,\n} from \"@goweekdays/utils\";\n\nexport function useCommentRepo() {\n const db = useAtlas.getDb();\n\n if (!db) {\n throw new Error(\"Database not initialized\");\n }\n\n const collection = db.collection(\"comments\");\n\n async function createIndex() {\n try {\n await collection.createIndex({ deletedAt: 1, document: 1 });\n } catch (error) {\n throw new Error(\"Failed to create index for cap-bldg-acts.\");\n }\n }\n\n async function addComment(value: TComment) {\n try {\n value = new MComment(value);\n await collection.insertOne(value);\n return \"Comment added successfully.\";\n } catch (error) {\n throw new InternalServerError(\"Failed to add comment.\");\n }\n }\n\n async function getComments(\n { search = \"\", page = 1, limit = 10, sort = {}, document = \"\" } = {} as {\n search?: string;\n page?: number;\n limit?: number;\n sort?: TKeyValuePair;\n document?: string | ObjectId;\n }\n ) {\n page = page > 0 ? page - 1 : 0;\n\n if (document) {\n try {\n document = new ObjectId(document);\n } catch (error) {\n throw new Error(\"Invalid document ID.\");\n }\n }\n\n const query: TKeyValuePair = { deletedAt: \"\", document };\n\n sort = Object.keys(sort).length > 0 ? sort : { _id: 1 };\n\n if (search) {\n query.$text = { $search: search };\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 return paginate(items, page, limit, length);\n } catch (error) {\n logger.log({ level: \"error\", message: `${error}` });\n throw error;\n }\n }\n\n return {\n createIndex,\n addComment,\n getComments,\n };\n}\n","import { TAttachment } from \"../models/comment.model\";\nimport { useCommentRepo } from \"../repositories/comment.repository\";\n\nexport function useCommentService() {\n const { addComment: _addComment, getComments: _getComments } =\n useCommentRepo();\n\n async function addComment(\n { comment, type, user, collection, document } = {} as {\n comment: string;\n type: string;\n user: string;\n collection: string;\n document: string;\n }\n ) {\n try {\n return await _addComment({\n comment,\n type,\n user,\n collection,\n document,\n });\n } catch (error) {\n throw error;\n }\n }\n\n async function getComments({ page = 1, document = \"\" } = {}) {\n try {\n return await _getComments({ page, document });\n } catch (error) {\n throw error;\n }\n }\n\n return {\n addComment,\n getComments,\n };\n}\n","import type { Request, Response, NextFunction } from \"express\";\nimport { useCommentService } from \"../services/comment.service\";\nimport Joi from \"joi\";\nimport { BadRequestError } from \"@goweekdays/utils\";\n\nexport function useCommentController() {\n const { addComment: _addComment, getComments: _getComments } =\n useCommentService();\n\n async function addComment(req: Request, res: Response, next: NextFunction) {\n const value = req.body;\n\n const validation = Joi.object({\n comment: Joi.string().required(),\n type: Joi.string().valid(\"comment\", \"approve\", \"request-changes\"),\n user: Joi.string().hex().required(),\n collection: Joi.string().required(),\n document: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate(value);\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n await _addComment({\n comment: value.comment,\n type: value.type,\n user: value.user,\n collection: value.collection,\n document: value.document,\n });\n res.json({ message: \"Successfully added comment.\" });\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n async function getComments(req: Request, res: Response, next: NextFunction) {\n const page = Number(req.query.page) ?? 1;\n const document = (req.query.document as string) ?? \"\";\n\n const validation = Joi.object({\n page: Joi.number().min(1),\n document: Joi.string().hex().required(),\n });\n\n const { error } = validation.validate({ page, document });\n if (error) {\n next(new BadRequestError(error.message));\n return;\n }\n\n try {\n const comments = await _getComments({ page, document });\n res.json(comments);\n return;\n } catch (error) {\n next(error);\n return;\n }\n }\n\n return {\n addComment,\n getComments,\n };\n}\n"],"mappings":"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","names":["bcrypt","bcrypt","config","jwt","config","config","ObjectId","BadRequestError","InternalServerError","logger","paginate","useAtlas","ObjectId","useAtlas","InternalServerError","logger","ObjectId","BadRequestError","paginate","useMailer","compileHandlebar","logger","getDirectory","BadRequestError","NotFoundError","InternalServerError","useAtlas","ObjectId","ObjectId","BadRequestError","_a","useAtlas","InternalServerError","logger","BadRequestError","paginate","useAtlas","InternalServerError","logger","BadRequestError","ObjectId","paginate","useMailer","BadRequestError","getDirectory","compileHandlebar","logger","InternalServerError","NotFoundError","useAtlas","_a","AppError","BadRequestError","InternalServerError","ObjectId","BadRequestError","error","AppError","InternalServerError","ObjectId","ObjectId","InternalServerError","useAtlas","ObjectId","useAtlas","InternalServerError","ObjectId","BadRequestError","InternalServerError","NotFoundError","hashPassword","useAtlas","useS3","BadRequestError","InternalServerError","useAtlas","ObjectId","useAtlas","InternalServerError","ObjectId","BadRequestError","InternalServerError","useAtlas","BadRequestError","hashPassword","NotFoundError","useS3","AppError","BadRequestError","InternalServerError","Joi","Joi","BadRequestError","error","AppError","InternalServerError","AppError","BadRequestError","comparePassword","generateToken","InternalServerError","NotFoundError","jwt","BadRequestError","AppError","InternalServerError","NotFoundError","comparePassword","refreshToken","generateToken","jwt","Joi","AppError","BadRequestError","InternalServerError","Joi","BadRequestError","error","AppError","InternalServerError","refreshToken","ObjectId","BadRequestError","InternalServerError","useAtlas","paginate","logger","ObjectId","useAtlas","InternalServerError","logger","BadRequestError","ObjectId","paginate","logger","useS3","useAtlas","useS3","useAtlas","logger","AppError","BadRequestError","InternalServerError","Joi","AppError","InternalServerError","Joi","BadRequestError","error","Joi","BadRequestError","Joi","BadRequestError","error","ObjectId","ObjectId","BadRequestError","InternalServerError","logger","paginate","useAtlas","useAtlas","InternalServerError","logger","BadRequestError","paginate","ObjectId","InternalServerError","InternalServerError","Joi","BadRequestError","Joi","BadRequestError","error","ObjectId","ObjectId","BadRequestError","InternalServerError","logger","paginate","useAtlas","useAtlas","InternalServerError","BadRequestError","paginate","logger","ObjectId","Joi","Joi","error","ObjectId","ObjectId","BadRequestError","InternalServerError","logger","paginate","useAtlas","useAtlas","InternalServerError","logger","BadRequestError","ObjectId","paginate","useAtlas","useS3","useS3","useAtlas","Joi","BadRequestError","Joi","BadRequestError","error","ObjectId","ObjectId","InternalServerError","logger","paginate","useAtlas","useAtlas","InternalServerError","ObjectId","paginate","logger","Joi","BadRequestError","Joi","BadRequestError","error"]}
@@ -0,0 +1,13 @@
1
+ <div style="font-family: Helvetica,Arial,sans-serif;min-width:1000px;overflow:auto;line-height:2"></div>
2
+ <div style="margin:50px auto;width:70%;padding:20px 0">
3
+ <div
4
+ style="border-bottom:1px solid #eee; font-size:1.4em;color: #00466a;text-decoration:none;font-weight:600;text-align: center;">
5
+ E-mail Verification
6
+ </div>
7
+ <p>Use the link to complete the account recovery procedure. The link is valid for {{validity}}.</p>
8
+ <div>
9
+ <a href="{{link}}">{{link}}</a>
10
+ </div>
11
+
12
+ </div>
13
+ </div>
@@ -0,0 +1,16 @@
1
+ <div style="font-family: Helvetica, Arial, sans-serif; min-width: 1000px; overflow: auto; line-height: 2">
2
+ <div style="margin: 50px auto; width: 70%; padding: 20px 0;">
3
+ <div
4
+ style="border-bottom: 1px solid #eee; font-size: 1.4em; color: #00466a; text-decoration: none; font-weight: 600; text-align: center;">
5
+ Team Member Invitation
6
+ </div>
7
+ <p>Dear {{teamMemberName}},</p>
8
+ <p>You have been invited to join the team "{{teamName}}" on our platform. Please use the link below to accept the invitation and complete your registration. This link is valid for {{validity}}.</p>
9
+ <div style="text-align: center; margin: 20px 0;">
10
+ <a href="{{link}}" style="padding: 10px 20px; color: #fff; background: #00466a; text-decoration: none; border-radius: 5px;">Accept Invitation</a>
11
+ </div>
12
+ <p>If you did not expect this email or were added to this team by mistake, please ignore this invitation.</p>
13
+ <p>Best regards,</p>
14
+ <p>DepEd Team</p>
15
+ </div>
16
+ </div>