@promind/honey 1.38.7 → 1.38.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/config/index.ts","src/config/database.ts","src/services/express.ts","src/utils/error.ts","src/services/honey.ts","src/controllers/index.ts","src/controllers/interfaces.ts","src/controllers/create.ts","src/utils/formatter.ts","src/controllers/read.ts","src/controllers/update.ts","src/controllers/upsert.ts","src/controllers/delete.ts","src/services/postgres.ts","src/utils/postgres.ts","src/utils/db.ts","src/utils/helpers.ts","src/utils/port.ts","src/utils/validation.ts"],"sourcesContent":["import { QueryTypes as QTypes } from 'sequelize';\n\nimport Config from './config';\nimport { DBOptions } from './config/database';\nimport ExpressApp from './services/express';\nimport Honey from './services/honey';\nimport Postgres from './services/postgres';\nimport { normalizePort } from './utils/port';\nimport { Metadata } from './interfaces/express';\n\nprocess.on('SIGINT', () => {\n // process reload ongoing\n // close connections, clear cache, etc\n // by default, you have 1600ms\n process.exit(0);\n});\n\nexport function createHoney(\n port: string,\n dbOptions: string | DBOptions,\n metadata?: Metadata\n) {\n new Config(dbOptions);\n\n const portVal = normalizePort(port || process.env.PORT || '3000');\n const express = new ExpressApp(portVal, metadata);\n const postgres = new Postgres();\n const honey = new Honey(express, postgres);\n\n return honey;\n}\n\nexport const defineModel = Config.defineModel.bind(Config);\n\nfunction getQueryTypes() {\n const { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT } = QTypes;\n\n const exposedTypes = { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT };\n return exposedTypes;\n}\n\nconst QueryTypes = getQueryTypes();\n\nexport { QueryTypes };\nexport { default as runDbQuery, createModel } from './utils/db';\nexport { default as HttpError, handleHttpError } from './utils/error';\nexport { default as Honey } from './services/honey';\nexport type {\n Middleware,\n ExitMiddleware,\n Request,\n Response\n} from './interfaces/express';\nexport * from 'sequelize';\nexport { validateRequestData } from './utils/validation';\n","import path from 'path';\nimport dotenv from 'dotenv';\n\nimport initDB, { DBOptions } from './database';\nimport {\n Model,\n ModelAttributes,\n ModelOptions,\n Sequelize\n} from 'sequelize/types';\ndotenv.config();\ndotenv.config({ path: path.join(__dirname, '.env') });\n\nexport default class Config {\n public static db: Sequelize;\n\n public static getEnv = (key: string) => {\n return process.env[key];\n };\n\n constructor(options: DBOptions | string) {\n Config.db = initDB(options);\n }\n\n static get isLive() {\n return process.env.NODE_ENV === 'production';\n }\n\n public static defineModel(\n modelName: string,\n attributes: ModelAttributes<Model<any, any>, any>,\n options?: ModelOptions<Model<any, any>> | undefined\n ) {\n return this.db.define(modelName, attributes, options);\n }\n}\n","import { Sequelize } from 'sequelize';\n\nexport interface DBOptions {\n host: string;\n port: number | string;\n user: string;\n password: string;\n database: string;\n}\n\nexport default function initDB(options: string | DBOptions) {\n let uri = '';\n if (typeof options === 'string') {\n uri = options;\n } else {\n uri = `postgres://${options.user}:${options.password}@${options.host}:${options.port}/${options.database}`;\n }\n const sequelize = new Sequelize(uri, {\n logging: false\n });\n\n sequelize\n .authenticate()\n .then(() => {\n console.log('DB Connection established successfully');\n })\n .catch((err) => {\n console.log('DB Connection failed');\n console.error(err);\n });\n\n return sequelize;\n}\n","import cookieParser from 'cookie-parser';\nimport express from 'express';\nimport logger from 'morgan';\nimport cors from 'cors';\nimport http from 'http';\nimport expressOasGenerator from 'express-oas-generator';\nimport '../config';\nimport HttpError from '../utils/error';\nimport { AddressInfo } from 'net';\nimport { Metadata } from '../interfaces/express';\n\n/**\n * Event listener for HTTP server \"error\" event.\n */\nconst onError = (port: string | number) => {\n return (error: any) => {\n if (error.syscall !== 'listen') {\n throw error;\n }\n\n const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;\n\n // handle specific listen errors with friendly messages\n switch (error.code) {\n case 'EACCES':\n console.error(`${bind} requires elevated privileges`);\n process.exit(1);\n case 'EADDRINUSE':\n console.error(`${bind} is already in use`);\n process.exit(1);\n default:\n throw error;\n }\n };\n};\n\n/**\n * Event listener for HTTP server \"listening\" event.\n */\nconst onListening = (server: http.Server) => {\n return () => {\n const addr = server.address();\n const bind =\n typeof addr === 'string'\n ? `pipe ${addr}`\n : `port ${(addr as AddressInfo).port}`;\n console.log(\n `%c Honey Server started on ${bind} `,\n 'background: #222; color: #bada55; font-size: 32px'\n );\n };\n};\n\nclass ExpressApp {\n public app = express();\n public appRoutes = express.Router();\n private fallbackErrMessage = 'Endpoint does not exist';\n private routePrefix = '/api';\n\n constructor(\n port: string | number,\n private metadata?: Metadata\n ) {\n this.fallbackErrMessage =\n this.metadata?.fallbackErrorMessage || this.fallbackErrMessage;\n this.routePrefix = this.metadata?.routePrefix || this.routePrefix;\n this.initMiddlewares();\n this.setupErrorFallback();\n this.app.set('port', port);\n }\n\n public listen() {\n expressOasGenerator.handleRequests();\n const port = Number(this.app.get('port'));\n const server = this.app.listen(port);\n server.on('error', onError(port));\n server.on('listening', onListening(server));\n }\n\n private initMiddlewares() {\n const corsOptions: cors.CorsOptions = {\n origin: '*',\n methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',\n allowedHeaders: '*',\n exposedHeaders: '*',\n credentials: true,\n optionsSuccessStatus: 204\n };\n\n expressOasGenerator.handleResponses(this.app, {} as any);\n this.app.use(logger('dev'));\n this.app.use(cors(corsOptions));\n this.app.use(\n express.json({\n limit: '50mb',\n verify(req: any, _res, buf) {\n req.rawBody = buf;\n }\n })\n );\n this.app.use(express.urlencoded({ limit: '50mb', extended: false }));\n this.app.use(cookieParser());\n this.app.use(this.routePrefix, this.appRoutes);\n }\n\n private setupErrorFallback() {\n this.app.use((_, res) => {\n const err = new HttpError(this.fallbackErrMessage, 404);\n\n return res.status(err.status).json({ message: err.message });\n });\n // error handler\n this.app.use((err: any, _, res: any) => {\n return res\n .status(err.status || 500)\n .send({ message: 'Something went wrong' });\n });\n }\n}\n\nexport default ExpressApp;\n","import { Response } from 'express';\n\nexport default class HttpError extends Error {\n constructor(\n message: string,\n public status: number\n ) {\n super(message || 'Something went wrong');\n }\n}\n\nexport const handleHttpError = (err: HttpError, res: Response) => {\n return res\n .status(err.status || 500)\n .send({ message: err.message || 'Something went wrong' });\n};\n","import Config from '../config';\nimport {\n createController,\n deleteByIdController,\n getByIdController,\n getByQueryController,\n updateByIdController,\n upsertByIdController,\n upsertController,\n updateController,\n deleteController\n} from '../controllers';\nimport {\n ICreate,\n ICrud,\n IDelete,\n IDeleteById,\n IGet,\n IGetById,\n IUpdate,\n IUpdateById,\n IUpsert,\n IUpsertById\n} from '../interfaces/crud';\nimport { ExitMiddleware, Middleware } from '../interfaces/express';\nimport { NextFunction, Request, Response } from 'express';\nimport ExpressApp from './express';\nimport Postgres from './postgres';\n\n// eslint-disable-next-line\nconst defaultExitMiddleware: ExitMiddleware = (data, req, res, next) => {\n if (process.env.NODE_ENV !== 'production') console.log('Response:', data);\n};\n\nexport default class Honey {\n constructor(\n public express: ExpressApp,\n private postgres: Postgres\n ) {}\n\n get routes() {\n return this.express.appRoutes;\n }\n\n get db() {\n return Config.db;\n }\n\n private crud({\n method,\n path,\n controller,\n middleware = [],\n exitMiddleware = [defaultExitMiddleware]\n }: ICrud) {\n const dbCheck = async (req: Request, res: Response, next: NextFunction) => {\n if (!Config.db) {\n return res.status(503).send({\n message: 'DB Initialization in progress'\n });\n } else {\n next();\n }\n };\n this.express.appRoutes[method](\n path,\n dbCheck,\n ...middleware,\n controller,\n ...exitMiddleware\n );\n }\n\n public addMiddleware(middleware: Middleware[]) {\n this.express.appRoutes.use(...middleware);\n }\n\n public startServer() {\n this.express.listen();\n }\n\n public create({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n processResponseData,\n processErrorResponse,\n table,\n methodOverride\n }: ICreate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = createController({\n db: this.postgres,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n });\n\n this.crud({\n method: methodOverride || 'post',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public get({\n resource,\n fields,\n filter,\n format,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table\n }: IGet) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = getByQueryController({\n db: this.postgres,\n resource,\n fields,\n filterQuery: filter,\n format,\n processResponseData,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public getById({\n resource,\n fields,\n idField,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n filter\n }: IGetById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = getByIdController({\n db: this.postgres,\n resource,\n fields,\n idField: idField || 'id',\n processResponseData,\n processErrorResponse,\n filterQuery: filter\n });\n\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public updateById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n filter,\n processErrorResponse,\n processResponseData\n }: IUpdateById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = updateByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public update({\n resource,\n params,\n filter,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData\n }: IUpdate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = updateController({\n db: this.postgres,\n resource,\n params,\n message,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsertById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData\n }: IUpsertById) {\n const path = pathOverride || `/${resource}/:id/upsert`;\n resource = table || resource;\n\n const controller = upsertByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsert({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n conflictTarget,\n table,\n processErrorResponse,\n processResponseData\n }: IUpsert) {\n const path = pathOverride || `/${resource}/:id/upsert`;\n resource = table || resource;\n\n const controller = upsertController({\n db: this.postgres,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public deleteById({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n idField,\n filter,\n table,\n processErrorResponse\n }: IDeleteById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteByIdController({\n db: this.postgres,\n resource,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public delete({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n filter,\n table,\n processErrorResponse\n }: IDelete) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteController({\n db: this.postgres,\n resource,\n message,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n}\n","export { Controller } from './interfaces';\nexport { default as createController } from './create';\nexport { getByIdController, getByQueryController } from './read';\nexport { updateByIdController, updateController } from './update';\nexport { upsertByIdController, upsertController } from './upsert';\nexport { deleteByIdController, deleteController } from './delete';\n","import { NextFunction, Request, Response } from 'express';\n\nexport type Controller = (\n req: Request,\n res: Response,\n next: NextFunction\n) => void;\n","import { CreateControllerParams } from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { extractInsertData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport default function createController({\n db,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n}: CreateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = extractInsertData(req.body, params);\n\n const data = await db.create(resource, body);\n const id = data[0].id;\n\n res.send({\n message,\n data:\n req.body.dataOverride ||\n (processResponseData\n ? await processResponseData({ id }, req)\n : { id })\n });\n next({ message, data: { id } });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { Request } from 'express';\nimport { ICreate, IUpdateById } from '../interfaces/crud';\nimport {\n Filter,\n FilterLocation,\n FilterOps,\n FilterParam,\n GetFilterParam,\n GetQueryFilter,\n UpdateOpParam\n} from '../shared/interface';\nimport HttpError from './error';\n\nconst formatters: Record<string, Function> = {\n string: String,\n number: Number,\n boolean: Boolean,\n json: JSON.stringify,\n object: JSON.stringify\n};\n\nexport const extractInsertData = (\n body: Record<string, any>,\n params: ICreate['params']\n) => {\n const result: Record<string, string | number | boolean | Date | Object> = {};\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === '@updatedAt') {\n result[key] = new Date();\n return;\n }\n\n if (!Object.keys(body).includes(key)) return;\n\n const formatter = formatters[value];\n result[key] =\n formatter && ![null, undefined].includes(body[key])\n ? formatter(body[key])\n : body[key];\n });\n\n return result;\n};\n\nexport const generateUpdateData = (\n body: Record<string, any>,\n params: IUpdateById['params']\n) => {\n const result = Object.entries(params).reduce((acc, [key, value]) => {\n if (!Object.keys(body).includes(key) && value !== '@updatedAt')\n return { ...acc };\n\n let formattedValue: any;\n if (value === '@updatedAt') {\n formattedValue = new Date();\n } else {\n formattedValue = ![null, undefined].includes(body[key])\n ? formatters[typeof body[key]](body[key])\n : body[key];\n }\n\n return {\n ...acc,\n [key]: {\n value: formattedValue,\n operator: value === '@updatedAt' ? 'replace' : value\n }\n };\n }, {} as UpdateOpParam);\n\n return result;\n};\n\nconst retrieveParamFromLocation = (\n req: Request,\n location: FilterLocation,\n key: string\n) => {\n if (location === 'request') return (req as any)[key];\n\n return req[location][key];\n};\n\nexport const formatReadFilter = (\n filterParams: Record<string, any>,\n filter: GetQueryFilter,\n req: Request\n) => {\n const result: Filter = {};\n\n Object.entries(filter).forEach(([key, param]) => {\n if (key === '$or') {\n const val = formatReadFilter(\n filterParams,\n param as Record<string, GetFilterParam>,\n req\n ) as Record<string, FilterParam>;\n\n result[key] = val;\n } else {\n let valueToUse: any;\n if (param.overrideValue) {\n if (typeof param.overrideValue === 'function') {\n valueToUse = param.overrideValue(req);\n } else {\n valueToUse = param.overrideValue;\n }\n } else if (!!param.location) {\n valueToUse = retrieveParamFromLocation(\n req,\n param.location as FilterLocation,\n key\n );\n } else {\n valueToUse = filterParams[key];\n }\n\n if (typeof valueToUse === 'undefined') {\n throw new HttpError('Missing filter parameter', 400);\n }\n\n const valueFormatter = formatters[(param as GetFilterParam).value];\n result[key] = {\n operator: param.operator as FilterOps,\n value: valueFormatter(valueToUse)\n };\n }\n });\n\n return result;\n};\n","import {\n GetByIdControllerParams,\n GetByQueryControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function getByIdController({\n db,\n resource,\n fields,\n idField = 'id',\n processResponseData,\n processErrorResponse,\n filterQuery = {}\n}: GetByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const id = req.params.id;\n\n const filter = formatReadFilter(req.query, filterQuery, req);\n\n const data = await db.read(resource, fields, {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n });\n\n if (!data?.length) {\n throw new HttpError('Record does not exist', 404);\n }\n\n res.send({\n data: processResponseData\n ? await processResponseData(data[0], req)\n : data[0]\n });\n next({ data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function getByQueryController({\n db,\n resource,\n fields,\n filterQuery,\n format,\n processResponseData,\n processErrorResponse\n}: GetByQueryControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const filter =\n filterQuery && formatReadFilter(req.query, filterQuery, req);\n\n let data: Record<string, any>[] = await db.read(\n resource,\n fields,\n filter,\n paginate,\n format\n );\n let total = 0;\n if (paginate) {\n total = Number(data[0]?.['honey_total_count'] || 0);\n data = data.map((item: Record<string, any>) => {\n delete item['honey_total_count'];\n return item;\n });\n }\n\n if (processResponseData) {\n data = await processResponseData(data, req);\n } else if (!data?.length) {\n throw new HttpError('No records found', 404);\n }\n const response = {\n data,\n meta: {\n ...(!!paginate && {\n pagination: {\n total,\n pageSize: limit,\n page,\n pageCount: Math.ceil(total / limit)\n }\n })\n }\n };\n res.send(response);\n next(response);\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpdateByIdControllerParams,\n UpdateControllerParams\n} from '../interfaces/crud';\nimport { Filter } from '../shared/interface';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter, generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function updateByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData,\n filterQuery = {}\n}: UpdateByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const additionalFilter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n const filter: Filter = {\n [idField]: {\n operator: '=',\n value: req.params.id\n },\n ...additionalFilter\n };\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function updateController({\n db,\n resource,\n params,\n message,\n filterQuery,\n processErrorResponse,\n processResponseData\n}: UpdateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpsertByIdControllerParams,\n UpsertControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function upsertByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData\n}: UpsertByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n req.body[idField] = req.params.id;\n params = { ...params, [idField]: 'replace' };\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(resource, body, [idField]);\n\n const data = processResponseData\n ? processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function upsertController({\n db,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData\n}: UpsertControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(resource, body, conflictTarget);\n\n const data = processResponseData\n ? processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n DeleteByIdControllerParams,\n DeleteControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\nimport { formatReadFilter } from '../utils/formatter';\n\nexport function deleteByIdController({\n db,\n resource,\n message,\n idField = 'id',\n processErrorResponse,\n filterQuery = {}\n}: DeleteByIdControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const id = req.params[idField || 'id'];\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n });\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function deleteController({\n db,\n resource,\n message,\n processErrorResponse,\n filterQuery\n}: DeleteControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, filter);\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import config from '../config';\nimport {\n generateCreateQuery,\n generateDeleteQuery,\n generateReadQuery,\n generateUpdateQuery,\n generateUpsertQuery\n} from '../utils/postgres';\nimport { QueryTypes } from 'sequelize';\nimport { Filter, UpdateOpParam } from '../shared/interface';\n\nexport default class Postgres {\n public async read(\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string }\n ) {\n const { query, replacements } = generateReadQuery(\n table,\n fields,\n filter,\n paginate,\n format\n );\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async create(\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n ) {\n const { query, replacements } = generateCreateQuery(table, data);\n\n const res: any = await config.db.query(query, {\n type: QueryTypes.INSERT,\n raw: true,\n replacements: [...replacements]\n });\n\n // inserted ids\n return res[0] as { id: string | number }[];\n }\n\n public async update(table: string, data: UpdateOpParam, filter?: Filter) {\n const { query, replacements } = generateUpdateQuery(table, data, filter);\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async delete(table: string, filter?: Filter) {\n const { query, replacements } = generateDeleteQuery(table, filter);\n\n await config.db.query(query, {\n type: QueryTypes.DELETE,\n raw: true,\n replacements: [...replacements]\n });\n }\n\n public async upsert(\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[]\n ) {\n const { query, replacements } = generateUpsertQuery(\n table,\n data,\n conflictTarget\n );\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n\n return result;\n }\n}\n","import { Knex } from 'knex';\nimport { Filter, FilterParam, UpdateOpParam } from '../shared/interface';\nimport { getKnex } from './db';\n\nexport const applyFilter = (query: Knex.QueryBuilder, filter: Filter = {}) => {\n Object.entries(filter).forEach(([field, data]) => {\n if (field === '$or') {\n query.where((builder) => {\n Object.entries(data).forEach(([orField, orData], index) => {\n const method = index === 0 ? 'where' : 'orWhere';\n const orParam = orData as FilterParam;\n\n if (['like', 'not like'].includes(orParam.operator)) {\n builder[method](orField, 'ilike', `%${orParam.value}%`);\n } else {\n builder[method](orField, orParam.operator, orParam.value);\n }\n });\n });\n } else {\n const param = data as FilterParam;\n\n if (['like', 'not like'].includes(param.operator)) {\n query.where(\n field,\n param.operator === 'like' ? 'ilike' : 'not ilike',\n `%${param.value}%`\n );\n } else {\n query.where(field, param.operator, param.value);\n }\n }\n });\n\n return query;\n};\n\nexport const generateCreateQuery = (\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n) => {\n const knex = getKnex();\n const { sql: query, bindings: replacements } = knex(table)\n .insert(data)\n .returning('id')\n .toSQL();\n\n return { query, replacements };\n};\n\nexport const generateReadQuery = (\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string }\n) => {\n const knex = getKnex();\n\n let q = knex(table).select(fields);\n\n // Add total count if pagination is needed\n if (paginate) {\n // Using knex.raw to create the count column with the same name as in original code\n q = knex(table).select([\n ...fields.map((field) => knex.raw(`?? as ??`, [field, field])),\n knex.raw('count(??) OVER() AS honey_total_count', [fields[0]])\n ]);\n }\n\n // Apply filters\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n // Apply sorting\n if (format?.sort && format.sortField) {\n q.orderBy(format.sortField, format.sort);\n }\n\n // Apply pagination\n if (paginate) {\n q.limit(paginate.limit).offset(paginate.limit * (paginate.page - 1));\n }\n\n const { sql: query, bindings: replacements } = q.toSQL();\n\n return { query, replacements };\n};\nexport const generateUpdateQuery = (\n table: string,\n data: UpdateOpParam,\n filter?: Filter\n) => {\n const knex = getKnex();\n let q = knex(table);\n\n // Build the update object\n const updateData: Record<string, Knex.Raw> = {};\n\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData as any;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [field, param.value]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [field, param.value]);\n } else {\n updateData[field] = param.value;\n }\n });\n\n // Apply filter conditions\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q\n .update(updateData)\n .returning('*')\n .toSQL();\n console.log(query, replacements);\n return { query, replacements };\n};\nexport const generateDeleteQuery = (table: string, filter?: Filter) => {\n const knex = getKnex();\n let q = knex(table);\n\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q.delete().toSQL();\n return { query, replacements };\n};\n\nexport const generateUpsertQuery = (\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[]\n) => {\n const knex = getKnex();\n\n // Prepare insert data\n const insertData: Record<string, UpdateOpParam[string]['value']> = {};\n Object.entries(data).forEach(([field, fieldData]) => {\n insertData[field] = fieldData.value;\n });\n\n // Prepare update data for conflict resolution\n const updateData: Record<string, Knex.Raw | UpdateOpParam[string]['value']> =\n {};\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else {\n updateData[field] = param.value;\n }\n });\n\n const { sql: query, bindings: replacements } = knex(table)\n .insert(insertData)\n .onConflict(conflictTarget)\n .merge(updateData)\n .returning('*')\n .toSQL();\n\n return { query, replacements };\n};\n","import {\n Model,\n ModelAttributes,\n ModelOptions,\n ModelStatic,\n QueryOptions\n} from 'sequelize';\nimport Knex from 'knex';\n\nimport Config from '../config';\nimport createSingleton from './helpers';\n\nexport default function runDbQuery(query: string, params?: QueryOptions) {\n params = params || {};\n\n return Config.db.query(query, {\n ...params,\n raw: true\n });\n}\n\nclass ModelCreator {\n private static model: Record<string, ModelStatic<Model>> = {};\n\n public static createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n >(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n ): ModelStatic<Model<TModelAttributes, TCreationAttributes>> {\n if (!this.model[modelName]) {\n this.model[modelName] = Config.db.define(modelName, attributes, options);\n }\n\n return this.model[modelName];\n }\n}\n\nexport function createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n>(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n) {\n return ModelCreator.createModel.bind(ModelCreator)(\n modelName,\n attributes,\n options\n );\n}\n\nexport const getKnex = () =>\n createSingleton('knex', () => {\n return Knex({ client: 'pg' });\n });\n","export class Singleton {\n private static instances: Map<string, any> = new Map();\n\n public static getInstance<T>(identifier: string, initFn?: () => T): T {\n if (!this.instances.has(identifier) && initFn) {\n this.instances.set(identifier, initFn());\n }\n\n return this.instances.get(identifier) as T;\n }\n}\n\nexport default function createSingleton<T>(\n identifier: string,\n initFn?: () => T\n): T {\n return Singleton.getInstance(identifier, initFn);\n}\n","export function normalizePort(val: string) {\n const port = parseInt(val, 10);\n\n if (isNaN(port)) {\n // named pipe\n return val;\n }\n\n if (port >= 0) {\n // port number\n return port;\n }\n\n throw new Error('Invalid port number');\n}\n","import { ObjectSchema, ValidationOptions } from 'joi';\nimport { Middleware } from 'src/interfaces/express';\nimport HttpError, { handleHttpError } from './error';\n\nexport const validateRequestData =\n (\n schema: ObjectSchema,\n location: 'body' | 'params' | 'query' | 'headers' | 'cookies' = 'body',\n options: ValidationOptions = { allowUnknown: true }\n ): Middleware =>\n async (req, res, next) => {\n try {\n const validationResult = schema.validate(req[location], options);\n const validationError = validationResult.error?.message;\n if (validationError) {\n throw new HttpError(validationError, 422);\n }\n\n return next();\n } catch (error: any) {\n handleHttpError(error, res);\n }\n };\n\nexport default validateRequestData;\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"}
1
+ {"mappings":"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","sources":["src/index.ts","src/config/index.ts","src/config/database.ts","src/services/express.ts","src/utils/error.ts","src/services/honey.ts","src/controllers/index.ts","src/controllers/interfaces.ts","src/controllers/create.ts","src/utils/formatter.ts","src/controllers/read.ts","src/controllers/update.ts","src/controllers/upsert.ts","src/controllers/delete.ts","src/controllers/query.ts","src/utils/db.ts","src/utils/helpers.ts","src/services/postgres.ts","src/utils/postgres.ts","src/utils/port.ts","src/utils/validation.ts"],"sourcesContent":["import { QueryTypes as QTypes } from 'sequelize';\n\nimport Config from './config';\nimport { DBOptions } from './config/database';\nimport ExpressApp from './services/express';\nimport Honey from './services/honey';\nimport Postgres from './services/postgres';\nimport { normalizePort } from './utils/port';\nimport { Metadata } from './interfaces/express';\n\nprocess.on('SIGINT', () => {\n // process reload ongoing\n // close connections, clear cache, etc\n // by default, you have 1600ms\n process.exit(0);\n});\n\nexport function createHoney(\n port: string,\n dbOptions: string | DBOptions,\n metadata?: Metadata\n) {\n new Config(dbOptions);\n\n const portVal = normalizePort(port || process.env.PORT || '3000');\n const express = new ExpressApp(portVal, metadata);\n const postgres = new Postgres();\n const honey = new Honey(express, postgres);\n\n return honey;\n}\n\nexport const defineModel = Config.defineModel.bind(Config);\n\nfunction getQueryTypes() {\n const { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT } = QTypes;\n\n const exposedTypes = { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT };\n return exposedTypes;\n}\n\nconst QueryTypes = getQueryTypes();\n\nexport { QueryTypes };\nexport { default as runDbQuery, createModel } from './utils/db';\nexport { default as HttpError, handleHttpError } from './utils/error';\nexport { default as Honey } from './services/honey';\nexport type {\n Middleware,\n ExitMiddleware,\n Request,\n Response\n} from './interfaces/express';\nexport * from 'sequelize';\nexport { validateRequestData } from './utils/validation';\n","import path from 'path';\nimport dotenv from 'dotenv';\n\nimport initDB, { DBOptions } from './database';\nimport {\n Model,\n ModelAttributes,\n ModelOptions,\n Sequelize\n} from 'sequelize/types';\ndotenv.config();\ndotenv.config({ path: path.join(__dirname, '.env') });\n\nexport default class Config {\n public static db: Sequelize;\n\n public static getEnv = (key: string) => {\n return process.env[key];\n };\n\n constructor(options: DBOptions | string) {\n Config.db = initDB(options);\n }\n\n static get isLive() {\n return process.env.NODE_ENV === 'production';\n }\n\n public static defineModel(\n modelName: string,\n attributes: ModelAttributes<Model<any, any>, any>,\n options?: ModelOptions<Model<any, any>> | undefined\n ) {\n return this.db.define(modelName, attributes, options);\n }\n}\n","import { Sequelize } from 'sequelize';\n\nexport interface DBOptions {\n host: string;\n port: number | string;\n user: string;\n password: string;\n database: string;\n}\n\nexport default function initDB(options: string | DBOptions) {\n let uri = '';\n if (typeof options === 'string') {\n uri = options;\n } else {\n uri = `postgres://${options.user}:${options.password}@${options.host}:${options.port}/${options.database}`;\n }\n const sequelize = new Sequelize(uri, {\n logging: false\n });\n\n sequelize\n .authenticate()\n .then(() => {\n console.log('DB Connection established successfully');\n })\n .catch((err) => {\n console.log('DB Connection failed');\n console.error(err);\n });\n\n return sequelize;\n}\n","import cookieParser from 'cookie-parser';\nimport express from 'express';\nimport logger from 'morgan';\nimport cors from 'cors';\nimport http from 'http';\nimport expressOasGenerator from 'express-oas-generator';\nimport '../config';\nimport HttpError from '../utils/error';\nimport { AddressInfo } from 'net';\nimport { Metadata } from '../interfaces/express';\n\n/**\n * Event listener for HTTP server \"error\" event.\n */\nconst onError = (port: string | number) => {\n return (error: any) => {\n if (error.syscall !== 'listen') {\n throw error;\n }\n\n const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;\n\n // handle specific listen errors with friendly messages\n switch (error.code) {\n case 'EACCES':\n console.error(`${bind} requires elevated privileges`);\n process.exit(1);\n case 'EADDRINUSE':\n console.error(`${bind} is already in use`);\n process.exit(1);\n default:\n throw error;\n }\n };\n};\n\n/**\n * Event listener for HTTP server \"listening\" event.\n */\nconst onListening = (server: http.Server) => {\n return () => {\n const addr = server.address();\n const bind =\n typeof addr === 'string'\n ? `pipe ${addr}`\n : `port ${(addr as AddressInfo).port}`;\n console.log(\n `%c Honey Server started on ${bind} `,\n 'background: #222; color: #bada55; font-size: 32px'\n );\n };\n};\n\nclass ExpressApp {\n public app = express();\n public appRoutes = express.Router();\n private fallbackErrMessage = 'Endpoint does not exist';\n private routePrefix = '/api';\n\n constructor(\n port: string | number,\n private metadata?: Metadata\n ) {\n this.fallbackErrMessage =\n this.metadata?.fallbackErrorMessage || this.fallbackErrMessage;\n this.routePrefix = this.metadata?.routePrefix || this.routePrefix;\n this.initMiddlewares();\n this.setupErrorFallback();\n this.app.set('port', port);\n }\n\n public listen() {\n expressOasGenerator.handleRequests();\n const port = Number(this.app.get('port'));\n const server = this.app.listen(port);\n server.on('error', onError(port));\n server.on('listening', onListening(server));\n }\n\n private initMiddlewares() {\n const corsOptions: cors.CorsOptions = {\n origin: '*',\n methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',\n allowedHeaders: '*',\n exposedHeaders: '*',\n credentials: true,\n optionsSuccessStatus: 204\n };\n\n expressOasGenerator.handleResponses(this.app, {} as any);\n this.app.use(logger('dev'));\n this.app.use(cors(corsOptions));\n this.app.use(\n express.json({\n limit: '50mb',\n verify(req: any, _res, buf) {\n req.rawBody = buf;\n }\n })\n );\n this.app.use(express.urlencoded({ limit: '50mb', extended: false }));\n this.app.use(cookieParser());\n this.app.use(this.routePrefix, this.appRoutes);\n }\n\n private setupErrorFallback() {\n this.app.use((_, res) => {\n const err = new HttpError(this.fallbackErrMessage, 404);\n\n return res.status(err.status).json({ message: err.message });\n });\n // error handler\n this.app.use((err: any, _, res: any) => {\n return res\n .status(err.status || 500)\n .send({ message: 'Something went wrong' });\n });\n }\n}\n\nexport default ExpressApp;\n","import { Response } from 'express';\n\nexport default class HttpError extends Error {\n constructor(\n message: string,\n public status: number\n ) {\n super(message || 'Something went wrong');\n }\n}\n\nexport const handleHttpError = (err: HttpError, res: Response) => {\n return res\n .status(err.status || 500)\n .send({ message: err.message || 'Something went wrong' });\n};\n","import Config from '../config';\nimport {\n createController,\n deleteByIdController,\n getByIdController,\n getByQueryController,\n updateByIdController,\n upsertByIdController,\n upsertController,\n updateController,\n deleteController,\n queryController\n} from '../controllers';\nimport {\n ICreate,\n ICrud,\n IDelete,\n IDeleteById,\n IGet,\n IGetById,\n IUpdate,\n IUpdateById,\n IUpsert,\n IUpsertById,\n IQuery\n} from '../interfaces/crud';\nimport { ExitMiddleware, Middleware } from '../interfaces/express';\nimport { NextFunction, Request, Response } from 'express';\nimport ExpressApp from './express';\nimport Postgres from './postgres';\n\n// eslint-disable-next-line\nconst defaultExitMiddleware: ExitMiddleware = (data, req, res, next) => {\n if (process.env.NODE_ENV !== 'production') console.log('Response:', data);\n};\n\nexport default class Honey {\n constructor(\n public express: ExpressApp,\n private postgres: Postgres\n ) {}\n\n get routes() {\n return this.express.appRoutes;\n }\n\n get db() {\n return Config.db;\n }\n\n private crud({\n method,\n path,\n controller,\n middleware = [],\n exitMiddleware = [defaultExitMiddleware]\n }: ICrud) {\n const dbCheck = async (req: Request, res: Response, next: NextFunction) => {\n if (!Config.db) {\n return res.status(503).send({\n message: 'DB Initialization in progress'\n });\n } else {\n next();\n }\n };\n this.express.appRoutes[method](\n path,\n dbCheck,\n ...middleware,\n controller,\n ...exitMiddleware\n );\n }\n\n public addMiddleware(middleware: Middleware[]) {\n this.express.appRoutes.use(...middleware);\n }\n\n public startServer() {\n this.express.listen();\n }\n\n public create({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n processResponseData,\n processErrorResponse,\n table,\n methodOverride\n }: ICreate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = createController({\n db: this.postgres,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n });\n\n this.crud({\n method: methodOverride || 'post',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public get({\n resource,\n fields,\n filter,\n format,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n joins\n }: IGet) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = getByQueryController({\n db: this.postgres,\n resource,\n fields,\n filterQuery: filter,\n format,\n processResponseData,\n processErrorResponse,\n joins\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public getById({\n resource,\n fields,\n idField,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n filter,\n joins\n }: IGetById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = getByIdController({\n db: this.postgres,\n resource,\n fields,\n idField: idField || 'id',\n processResponseData,\n processErrorResponse,\n filterQuery: filter,\n joins\n });\n\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public updateById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n filter,\n processErrorResponse,\n processResponseData\n }: IUpdateById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = updateByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public update({\n resource,\n params,\n filter,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData\n }: IUpdate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = updateController({\n db: this.postgres,\n resource,\n params,\n message,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsertById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData\n }: IUpsertById) {\n const path = pathOverride || `/${resource}/:id/upsert`;\n resource = table || resource;\n\n const controller = upsertByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsert({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n conflictTarget,\n table,\n processErrorResponse,\n processResponseData\n }: IUpsert) {\n const path = pathOverride || `/${resource}/:id/upsert`;\n resource = table || resource;\n\n const controller = upsertController({\n db: this.postgres,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public deleteById({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n idField,\n filter,\n table,\n processErrorResponse\n }: IDeleteById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteByIdController({\n db: this.postgres,\n resource,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public delete({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n filter,\n table,\n processErrorResponse\n }: IDelete) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteController({\n db: this.postgres,\n resource,\n message,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public query({\n resource,\n query,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processErrorResponse,\n processResponseData\n }: IQuery) {\n const path = pathOverride || `/${resource}`;\n\n const controller = queryController({\n db: this.postgres,\n query,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n}\n","export { Controller } from './interfaces';\nexport { default as createController } from './create';\nexport { getByIdController, getByQueryController } from './read';\nexport { updateByIdController, updateController } from './update';\nexport { upsertByIdController, upsertController } from './upsert';\nexport { deleteByIdController, deleteController } from './delete';\nexport * from './query';\n","import { NextFunction, Request, Response } from 'express';\n\nexport type Controller = (\n req: Request,\n res: Response,\n next: NextFunction\n) => void;\n","import { CreateControllerParams } from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { extractInsertData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport default function createController({\n db,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n}: CreateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = extractInsertData(req.body, params);\n\n const data = await db.create(resource, body);\n const id = data[0].id;\n\n res.send({\n message,\n data:\n req.body.dataOverride ||\n (processResponseData\n ? await processResponseData({ id }, req)\n : { id })\n });\n next({ message, data: { id } });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { Request } from 'express';\nimport { ICreate, IUpdateById } from '../interfaces/crud';\nimport {\n Filter,\n FilterLocation,\n FilterOps,\n FilterParam,\n GetFilterParam,\n GetQueryFilter,\n UpdateOpParam\n} from '../shared/interface';\nimport HttpError from './error';\n\nconst formatters: Record<string, Function> = {\n string: String,\n number: Number,\n boolean: Boolean,\n json: JSON.stringify,\n object: JSON.stringify\n};\n\nexport const extractInsertData = (\n body: Record<string, any>,\n params: ICreate['params']\n) => {\n const result: Record<string, string | number | boolean | Date | Object> = {};\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === '@updatedAt') {\n result[key] = new Date();\n return;\n }\n\n if (!Object.keys(body).includes(key)) return;\n\n const formatter = formatters[value];\n result[key] =\n formatter && ![null, undefined].includes(body[key])\n ? formatter(body[key])\n : body[key];\n });\n\n return result;\n};\n\nexport const generateUpdateData = (\n body: Record<string, any>,\n params: IUpdateById['params']\n) => {\n const result = Object.entries(params).reduce((acc, [key, value]) => {\n if (!Object.keys(body).includes(key) && value !== '@updatedAt')\n return { ...acc };\n\n let formattedValue: any;\n if (value === '@updatedAt') {\n formattedValue = new Date();\n } else {\n formattedValue = ![null, undefined].includes(body[key])\n ? formatters[typeof body[key]](body[key])\n : body[key];\n }\n\n return {\n ...acc,\n [key]: {\n value: formattedValue,\n operator: value === '@updatedAt' ? 'replace' : value\n }\n };\n }, {} as UpdateOpParam);\n\n return result;\n};\n\nconst retrieveParamFromLocation = (\n req: Request,\n location: FilterLocation,\n key: string\n) => {\n if (location === 'request') return (req as any)[key];\n\n return req[location][key];\n};\n\nexport const formatReadFilter = (\n filterParams: Record<string, any>,\n filter: GetQueryFilter,\n req: Request\n) => {\n const result: Filter = {};\n\n Object.entries(filter).forEach(([key, param]) => {\n if (key === '$or') {\n const val = formatReadFilter(\n filterParams,\n param as Record<string, GetFilterParam>,\n req\n ) as Record<string, FilterParam>;\n\n result[key] = val;\n } else {\n let valueToUse: any;\n if (param.overrideValue) {\n if (typeof param.overrideValue === 'function') {\n valueToUse = param.overrideValue(req);\n } else {\n valueToUse = param.overrideValue;\n }\n } else if (!!param.location) {\n valueToUse = retrieveParamFromLocation(\n req,\n param.location as FilterLocation,\n key\n );\n } else {\n valueToUse = filterParams[key];\n }\n\n if (typeof valueToUse === 'undefined') {\n throw new HttpError('Missing filter parameter', 400);\n }\n\n const valueFormatter = formatters[(param as GetFilterParam).value];\n result[key] = {\n operator: param.operator as FilterOps,\n value: valueFormatter(valueToUse)\n };\n }\n });\n\n return result;\n};\n","import {\n GetByIdControllerParams,\n GetByQueryControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function getByIdController({\n db,\n resource,\n fields,\n idField = 'id',\n processResponseData,\n processErrorResponse,\n filterQuery = {},\n joins\n}: GetByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const id = req.params.id;\n\n const filter = formatReadFilter(req.query, filterQuery, req);\n\n const data = await db.read(\n resource,\n fields,\n {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n },\n undefined,\n undefined,\n joins\n );\n\n if (!data?.length) {\n throw new HttpError('Record does not exist', 404);\n }\n\n res.send({\n data: processResponseData\n ? await processResponseData(data[0], req)\n : data[0]\n });\n next({ data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function getByQueryController({\n db,\n resource,\n fields,\n filterQuery,\n format,\n processResponseData,\n processErrorResponse,\n joins\n}: GetByQueryControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const filter =\n filterQuery && formatReadFilter(req.query, filterQuery, req);\n\n let data: Record<string, any>[] = await db.read(\n resource,\n fields,\n filter,\n paginate,\n format,\n joins\n );\n let total = 0;\n if (paginate) {\n total = Number(data[0]?.['honey_total_count'] || 0);\n data = data.map((item: Record<string, any>) => {\n delete item['honey_total_count'];\n return item;\n });\n }\n\n if (processResponseData) {\n data = await processResponseData(data, req);\n } else if (!data?.length) {\n throw new HttpError('No records found', 404);\n }\n const response = {\n data,\n meta: {\n ...(!!paginate && {\n pagination: {\n total,\n pageSize: limit,\n page,\n pageCount: Math.ceil(total / limit)\n }\n })\n }\n };\n res.send(response);\n next(response);\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpdateByIdControllerParams,\n UpdateControllerParams\n} from '../interfaces/crud';\nimport { Filter } from '../shared/interface';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter, generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function updateByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData,\n filterQuery = {}\n}: UpdateByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const additionalFilter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n const filter: Filter = {\n [idField]: {\n operator: '=',\n value: req.params.id\n },\n ...additionalFilter\n };\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function updateController({\n db,\n resource,\n params,\n message,\n filterQuery,\n processErrorResponse,\n processResponseData\n}: UpdateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpsertByIdControllerParams,\n UpsertControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function upsertByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData\n}: UpsertByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n req.body[idField] = req.params.id;\n params = { ...params, [idField]: 'replace' };\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(resource, body, [idField]);\n\n const data = processResponseData\n ? processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function upsertController({\n db,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData\n}: UpsertControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(resource, body, conflictTarget);\n\n const data = processResponseData\n ? processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n DeleteByIdControllerParams,\n DeleteControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\nimport { formatReadFilter } from '../utils/formatter';\n\nexport function deleteByIdController({\n db,\n resource,\n message,\n idField = 'id',\n processErrorResponse,\n filterQuery = {}\n}: DeleteByIdControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const id = req.params[idField || 'id'];\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n });\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function deleteController({\n db,\n resource,\n message,\n processErrorResponse,\n filterQuery\n}: DeleteControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, filter);\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { NextFunction, Request, Response } from 'express';\nimport { getKnex } from '../utils/db';\nimport { QueryControllerParams } from '../interfaces/crud';\n\nexport function queryController({\n db,\n query,\n processErrorResponse,\n processResponseData\n}: QueryControllerParams) {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const knex = getKnex();\n let queryBuilder = query(knex, req);\n if (paginate) {\n queryBuilder = queryBuilder\n .limit(paginate.limit)\n .offset(paginate.limit * (paginate.page - 1));\n }\n const { sql, bindings } = queryBuilder.toSQL();\n\n const result = await db.query(sql, [...bindings]);\n\n if (processResponseData) {\n return res.send({ data: processResponseData(result, req) });\n }\n\n return res.send({ data: result });\n } catch (e) {\n if (processErrorResponse) {\n return next(processErrorResponse(e as Error));\n }\n return next(e);\n }\n };\n}\n","import {\n Model,\n ModelAttributes,\n ModelOptions,\n ModelStatic,\n QueryOptions\n} from 'sequelize';\nimport Knex from 'knex';\n\nimport Config from '../config';\nimport createSingleton from './helpers';\n\nexport default function runDbQuery(query: string, params?: QueryOptions) {\n params = params || {};\n\n return Config.db.query(query, {\n ...params,\n raw: true\n });\n}\n\nclass ModelCreator {\n private static model: Record<string, ModelStatic<Model>> = {};\n\n public static createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n >(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n ): ModelStatic<Model<TModelAttributes, TCreationAttributes>> {\n if (!this.model[modelName]) {\n this.model[modelName] = Config.db.define(modelName, attributes, options);\n }\n\n return this.model[modelName];\n }\n}\n\nexport function createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n>(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n) {\n return ModelCreator.createModel.bind(ModelCreator)(\n modelName,\n attributes,\n options\n );\n}\n\nexport const getKnex = () =>\n createSingleton('knex', () => {\n return Knex({ client: 'pg' });\n });\n","export class Singleton {\n private static instances: Map<string, any> = new Map();\n\n public static getInstance<T>(identifier: string, initFn?: () => T): T {\n if (!this.instances.has(identifier) && initFn) {\n this.instances.set(identifier, initFn());\n }\n\n return this.instances.get(identifier) as T;\n }\n}\n\nexport default function createSingleton<T>(\n identifier: string,\n initFn?: () => T\n): T {\n return Singleton.getInstance(identifier, initFn);\n}\n","import config from '../config';\nimport {\n generateCreateQuery,\n generateDeleteQuery,\n generateReadQuery,\n generateUpdateQuery,\n generateUpsertQuery\n} from '../utils/postgres';\nimport { QueryTypes } from 'sequelize';\nimport { Filter, UpdateOpParam, Join } from '../shared/interface';\n\nexport default class Postgres {\n public async read(\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string },\n joins?: Join[]\n ) {\n const { query, replacements } = generateReadQuery(\n table,\n fields,\n filter,\n paginate,\n format,\n joins\n );\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async query(query: string, replacements: any[]) {\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async create(\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n ) {\n const { query, replacements } = generateCreateQuery(table, data);\n\n const res: any = await config.db.query(query, {\n type: QueryTypes.INSERT,\n raw: true,\n replacements: [...replacements]\n });\n\n // inserted ids\n return res[0] as { id: string | number }[];\n }\n\n public async update(table: string, data: UpdateOpParam, filter?: Filter) {\n const { query, replacements } = generateUpdateQuery(table, data, filter);\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async delete(table: string, filter?: Filter) {\n const { query, replacements } = generateDeleteQuery(table, filter);\n\n await config.db.query(query, {\n type: QueryTypes.DELETE,\n raw: true,\n replacements: [...replacements]\n });\n }\n\n public async upsert(\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[]\n ) {\n const { query, replacements } = generateUpsertQuery(\n table,\n data,\n conflictTarget\n );\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n\n return result;\n }\n}\n","import { Knex } from 'knex';\nimport { Filter, FilterParam, UpdateOpParam, Join } from '../shared/interface';\nimport { getKnex } from './db';\n\nexport const applyFilter = (query: Knex.QueryBuilder, filter: Filter = {}) => {\n Object.entries(filter).forEach(([field, data]) => {\n if (field === '$or') {\n query.where((builder) => {\n Object.entries(data).forEach(([orField, orData], index) => {\n const method = index === 0 ? 'where' : 'orWhere';\n const orParam = orData as FilterParam;\n\n if (['like', 'not like'].includes(orParam.operator)) {\n builder[method](orField, 'ilike', `%${orParam.value}%`);\n } else {\n builder[method](orField, orParam.operator, orParam.value);\n }\n });\n });\n } else {\n const param = data as FilterParam;\n\n if (['like', 'not like'].includes(param.operator)) {\n query.where(\n field,\n param.operator === 'like' ? 'ilike' : 'not ilike',\n `%${param.value}%`\n );\n } else {\n query.where(field, param.operator, param.value);\n }\n }\n });\n\n return query;\n};\n\nexport const generateCreateQuery = (\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n) => {\n const knex = getKnex();\n const { sql: query, bindings: replacements } = knex(table)\n .insert(data)\n .returning('id')\n .toSQL();\n\n return { query, replacements };\n};\n\nexport const generateReadQuery = (\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string },\n joins?: Join[]\n) => {\n const knex = getKnex();\n\n let q = knex(table).select(fields);\n\n // Add total count if pagination is needed\n if (paginate) {\n // Using knex.raw to create the count column with the same name as in original code\n q = knex(table).select([\n ...fields.map((field) => knex.raw(`?? as ??`, [field, field])),\n knex.raw('count(??) OVER() AS honey_total_count', [fields[0]])\n ]);\n }\n\n // Apply joins\n if (joins && joins.length > 0) {\n joins.forEach((join) => {\n const joinTable = join.alias\n ? `${join.table} as ${join.alias}`\n : join.table;\n const joinType = join.type || 'inner';\n const operator = join.on.operator || '=';\n\n switch (joinType) {\n case 'left':\n q.leftJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'right':\n q.rightJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'full':\n q.fullOuterJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'cross':\n q.crossJoin(\n join.alias\n ? knex.raw('?? as ??', [join.table, join.alias])\n : knex.raw('??', [join.table])\n );\n break;\n case 'inner':\n default:\n q.innerJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n }\n });\n }\n\n // Apply filters\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n // Apply sorting\n if (format?.sort && format.sortField) {\n q.orderBy(format.sortField, format.sort);\n }\n\n // Apply pagination\n if (paginate) {\n q.limit(paginate.limit).offset(paginate.limit * (paginate.page - 1));\n }\n\n const { sql: query, bindings: replacements } = q.toSQL();\n\n return { query, replacements };\n};\nexport const generateUpdateQuery = (\n table: string,\n data: UpdateOpParam,\n filter?: Filter\n) => {\n const knex = getKnex();\n let q = knex(table);\n\n // Build the update object\n const updateData: Record<string, Knex.Raw> = {};\n\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData as any;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [field, param.value]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [field, param.value]);\n } else {\n updateData[field] = param.value;\n }\n });\n\n // Apply filter conditions\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q\n .update(updateData)\n .returning('*')\n .toSQL();\n console.log(query, replacements);\n return { query, replacements };\n};\nexport const generateDeleteQuery = (table: string, filter?: Filter) => {\n const knex = getKnex();\n let q = knex(table);\n\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q.delete().toSQL();\n return { query, replacements };\n};\n\nexport const generateUpsertQuery = (\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[]\n) => {\n const knex = getKnex();\n\n // Prepare insert data\n const insertData: Record<string, UpdateOpParam[string]['value']> = {};\n Object.entries(data).forEach(([field, fieldData]) => {\n insertData[field] = fieldData.value;\n });\n\n // Prepare update data for conflict resolution\n const updateData: Record<string, Knex.Raw | UpdateOpParam[string]['value']> =\n {};\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else {\n updateData[field] = param.value;\n }\n });\n\n const { sql: query, bindings: replacements } = knex(table)\n .insert(insertData)\n .onConflict(conflictTarget)\n .merge(updateData)\n .returning('*')\n .toSQL();\n\n return { query, replacements };\n};\n","export function normalizePort(val: string) {\n const port = parseInt(val, 10);\n\n if (isNaN(port)) {\n // named pipe\n return val;\n }\n\n if (port >= 0) {\n // port number\n return port;\n }\n\n throw new Error('Invalid port number');\n}\n","import { ObjectSchema, ValidationOptions } from 'joi';\nimport { Middleware } from 'src/interfaces/express';\nimport HttpError, { handleHttpError } from './error';\n\nexport const validateRequestData =\n (\n schema: ObjectSchema,\n location: 'body' | 'params' | 'query' | 'headers' | 'cookies' = 'body',\n options: ValidationOptions = { allowUnknown: true }\n ): Middleware =>\n async (req, res, next) => {\n try {\n const validationResult = schema.validate(req[location], options);\n const validationError = validationResult.error?.message;\n if (validationError) {\n throw new HttpError(validationError, 422);\n }\n\n return next();\n } catch (error: any) {\n handleHttpError(error, res);\n }\n };\n\nexport default validateRequestData;\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"}
package/dist/module.js CHANGED
@@ -274,7 +274,7 @@ function $e54b5bd1ebc8718c$export$2e2bcd8739ae039({ db: db, resource: resource,
274
274
 
275
275
 
276
276
 
277
- function $68f7d8a50ef9b68c$export$7b6dde2038c44e91({ db: db, resource: resource, fields: fields, idField: idField = 'id', processResponseData: processResponseData, processErrorResponse: processErrorResponse, filterQuery: filterQuery = {} }) {
277
+ function $68f7d8a50ef9b68c$export$7b6dde2038c44e91({ db: db, resource: resource, fields: fields, idField: idField = 'id', processResponseData: processResponseData, processErrorResponse: processErrorResponse, filterQuery: filterQuery = {}, joins: joins }) {
278
278
  return async function(req, res, next) {
279
279
  try {
280
280
  const id = req.params.id;
@@ -285,7 +285,7 @@ function $68f7d8a50ef9b68c$export$7b6dde2038c44e91({ db: db, resource: resource,
285
285
  operator: '='
286
286
  },
287
287
  ...filter
288
- });
288
+ }, undefined, undefined, joins);
289
289
  if (!data?.length) throw new (0, $eb799189062d1297$export$2e2bcd8739ae039)('Record does not exist', 404);
290
290
  res.send({
291
291
  data: processResponseData ? await processResponseData(data[0], req) : data[0]
@@ -303,7 +303,7 @@ function $68f7d8a50ef9b68c$export$7b6dde2038c44e91({ db: db, resource: resource,
303
303
  }
304
304
  };
305
305
  }
306
- function $68f7d8a50ef9b68c$export$7b48d281d65870ad({ db: db, resource: resource, fields: fields, filterQuery: filterQuery, format: format, processResponseData: processResponseData, processErrorResponse: processErrorResponse }) {
306
+ function $68f7d8a50ef9b68c$export$7b48d281d65870ad({ db: db, resource: resource, fields: fields, filterQuery: filterQuery, format: format, processResponseData: processResponseData, processErrorResponse: processErrorResponse, joins: joins }) {
307
307
  return async function(req, res, next) {
308
308
  try {
309
309
  const page = Number(req.query.page);
@@ -313,7 +313,7 @@ function $68f7d8a50ef9b68c$export$7b48d281d65870ad({ db: db, resource: resource,
313
313
  limit: limit || 10
314
314
  } : undefined;
315
315
  const filter = filterQuery && (0, $5f19ecb00e146b8f$export$390602d0ccf68ce6)(req.query, filterQuery, req);
316
- let data = await db.read(resource, fields, filter, paginate, format);
316
+ let data = await db.read(resource, fields, filter, paginate, format, joins);
317
317
  let total = 0;
318
318
  if (paginate) {
319
319
  total = Number(data[0]?.['honey_total_count'] || 0);
@@ -526,6 +526,78 @@ function $7d3c5c82f06381f1$export$4208857769c75f40({ db: db, resource: resource,
526
526
 
527
527
 
528
528
 
529
+ class $61b68d622202eb93$export$d8ee7b97a871dca3 {
530
+ static{
531
+ this.instances = new Map();
532
+ }
533
+ static getInstance(identifier, initFn) {
534
+ if (!this.instances.has(identifier) && initFn) this.instances.set(identifier, initFn());
535
+ return this.instances.get(identifier);
536
+ }
537
+ }
538
+ function $61b68d622202eb93$export$2e2bcd8739ae039(identifier, initFn) {
539
+ return $61b68d622202eb93$export$d8ee7b97a871dca3.getInstance(identifier, initFn);
540
+ }
541
+
542
+
543
+ function $254994df946b8040$export$2e2bcd8739ae039(query, params) {
544
+ params = params || {};
545
+ return (0, $b05f0a427b6f271e$export$2e2bcd8739ae039).db.query(query, {
546
+ ...params,
547
+ raw: true
548
+ });
549
+ }
550
+ class $254994df946b8040$var$ModelCreator {
551
+ static{
552
+ this.model = {};
553
+ }
554
+ static createModel(modelName, attributes, options) {
555
+ if (!this.model[modelName]) this.model[modelName] = (0, $b05f0a427b6f271e$export$2e2bcd8739ae039).db.define(modelName, attributes, options);
556
+ return this.model[modelName];
557
+ }
558
+ }
559
+ function $254994df946b8040$export$2f453c7f7b0d002b(modelName, attributes, options) {
560
+ return $254994df946b8040$var$ModelCreator.createModel.bind($254994df946b8040$var$ModelCreator)(modelName, attributes, options);
561
+ }
562
+ const $254994df946b8040$export$a858f29c02f648c6 = ()=>(0, $61b68d622202eb93$export$2e2bcd8739ae039)('knex', ()=>{
563
+ return (0, $dTx2I$knex)({
564
+ client: 'pg'
565
+ });
566
+ });
567
+
568
+
569
+ function $b46ec79dd5acbe5b$export$d1ec1b5a0afb5051({ db: db, query: query, processErrorResponse: processErrorResponse, processResponseData: processResponseData }) {
570
+ return async (req, res, next)=>{
571
+ try {
572
+ const page = Number(req.query.page);
573
+ const limit = Number(req.query.limit);
574
+ const paginate = limit || page ? {
575
+ page: page || 1,
576
+ limit: limit || 10
577
+ } : undefined;
578
+ const knex = (0, $254994df946b8040$export$a858f29c02f648c6)();
579
+ let queryBuilder = query(knex, req);
580
+ if (paginate) queryBuilder = queryBuilder.limit(paginate.limit).offset(paginate.limit * (paginate.page - 1));
581
+ const { sql: sql, bindings: bindings } = queryBuilder.toSQL();
582
+ const result = await db.query(sql, [
583
+ ...bindings
584
+ ]);
585
+ if (processResponseData) return res.send({
586
+ data: processResponseData(result, req)
587
+ });
588
+ return res.send({
589
+ data: result
590
+ });
591
+ } catch (e) {
592
+ if (processErrorResponse) return next(processErrorResponse(e));
593
+ return next(e);
594
+ }
595
+ };
596
+ }
597
+
598
+
599
+
600
+
529
601
  // eslint-disable-next-line
530
602
  const $c492fd1e48c9c1cf$var$defaultExitMiddleware = (data, req, res, next)=>{
531
603
  if (process.env.NODE_ENV !== 'production') console.log('Response:', data);
@@ -577,7 +649,7 @@ class $c492fd1e48c9c1cf$export$2e2bcd8739ae039 {
577
649
  exitMiddleware: exitMiddleware
578
650
  });
579
651
  }
580
- get({ resource: resource, fields: fields, filter: filter, format: format, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table }) {
652
+ get({ resource: resource, fields: fields, filter: filter, format: format, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, joins: joins }) {
581
653
  const path = pathOverride || `/${resource}`;
582
654
  resource = table || resource;
583
655
  const controller = (0, $68f7d8a50ef9b68c$export$7b48d281d65870ad)({
@@ -587,7 +659,8 @@ class $c492fd1e48c9c1cf$export$2e2bcd8739ae039 {
587
659
  filterQuery: filter,
588
660
  format: format,
589
661
  processResponseData: processResponseData,
590
- processErrorResponse: processErrorResponse
662
+ processErrorResponse: processErrorResponse,
663
+ joins: joins
591
664
  });
592
665
  this.crud({
593
666
  method: methodOverride || 'get',
@@ -597,7 +670,7 @@ class $c492fd1e48c9c1cf$export$2e2bcd8739ae039 {
597
670
  exitMiddleware: exitMiddleware
598
671
  });
599
672
  }
600
- getById({ resource: resource, fields: fields, idField: idField, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, filter: filter }) {
673
+ getById({ resource: resource, fields: fields, idField: idField, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, filter: filter, joins: joins }) {
601
674
  const path = pathOverride || `/${resource}/:id`;
602
675
  resource = table || resource;
603
676
  const controller = (0, $68f7d8a50ef9b68c$export$7b6dde2038c44e91)({
@@ -607,7 +680,8 @@ class $c492fd1e48c9c1cf$export$2e2bcd8739ae039 {
607
680
  idField: idField || 'id',
608
681
  processResponseData: processResponseData,
609
682
  processErrorResponse: processErrorResponse,
610
- filterQuery: filter
683
+ filterQuery: filter,
684
+ joins: joins
611
685
  });
612
686
  this.crud({
613
687
  method: methodOverride || 'get',
@@ -735,50 +809,25 @@ class $c492fd1e48c9c1cf$export$2e2bcd8739ae039 {
735
809
  exitMiddleware: exitMiddleware
736
810
  });
737
811
  }
738
- }
739
-
740
-
741
-
742
-
743
-
744
- class $61b68d622202eb93$export$d8ee7b97a871dca3 {
745
- static{
746
- this.instances = new Map();
747
- }
748
- static getInstance(identifier, initFn) {
749
- if (!this.instances.has(identifier) && initFn) this.instances.set(identifier, initFn());
750
- return this.instances.get(identifier);
812
+ query({ resource: resource, query: query, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processErrorResponse: processErrorResponse, processResponseData: processResponseData }) {
813
+ const path = pathOverride || `/${resource}`;
814
+ const controller = (0, $b46ec79dd5acbe5b$export$d1ec1b5a0afb5051)({
815
+ db: this.postgres,
816
+ query: query,
817
+ processErrorResponse: processErrorResponse,
818
+ processResponseData: processResponseData
819
+ });
820
+ this.crud({
821
+ method: methodOverride || 'get',
822
+ path: path,
823
+ controller: controller,
824
+ middleware: middleware,
825
+ exitMiddleware: exitMiddleware
826
+ });
751
827
  }
752
828
  }
753
- function $61b68d622202eb93$export$2e2bcd8739ae039(identifier, initFn) {
754
- return $61b68d622202eb93$export$d8ee7b97a871dca3.getInstance(identifier, initFn);
755
- }
756
829
 
757
830
 
758
- function $254994df946b8040$export$2e2bcd8739ae039(query, params) {
759
- params = params || {};
760
- return (0, $b05f0a427b6f271e$export$2e2bcd8739ae039).db.query(query, {
761
- ...params,
762
- raw: true
763
- });
764
- }
765
- class $254994df946b8040$var$ModelCreator {
766
- static{
767
- this.model = {};
768
- }
769
- static createModel(modelName, attributes, options) {
770
- if (!this.model[modelName]) this.model[modelName] = (0, $b05f0a427b6f271e$export$2e2bcd8739ae039).db.define(modelName, attributes, options);
771
- return this.model[modelName];
772
- }
773
- }
774
- function $254994df946b8040$export$2f453c7f7b0d002b(modelName, attributes, options) {
775
- return $254994df946b8040$var$ModelCreator.createModel.bind($254994df946b8040$var$ModelCreator)(modelName, attributes, options);
776
- }
777
- const $254994df946b8040$export$a858f29c02f648c6 = ()=>(0, $61b68d622202eb93$export$2e2bcd8739ae039)('knex', ()=>{
778
- return (0, $dTx2I$knex)({
779
- client: 'pg'
780
- });
781
- });
782
831
 
783
832
 
784
833
  const $bf24bb53f537fa46$export$1b001418845b471c = (query, filter = {})=>{
@@ -813,7 +862,7 @@ const $bf24bb53f537fa46$export$53b231d60a00019b = (table, data)=>{
813
862
  replacements: replacements
814
863
  };
815
864
  };
816
- const $bf24bb53f537fa46$export$60d67f341ad4c4 = (table, fields, filter, paginate, format)=>{
865
+ const $bf24bb53f537fa46$export$60d67f341ad4c4 = (table, fields, filter, paginate, format, joins)=>{
817
866
  const knex = (0, $254994df946b8040$export$a858f29c02f648c6)();
818
867
  let q = knex(table).select(fields);
819
868
  // Add total count if pagination is needed
@@ -827,6 +876,35 @@ const $bf24bb53f537fa46$export$60d67f341ad4c4 = (table, fields, filter, paginate
827
876
  fields[0]
828
877
  ])
829
878
  ]);
879
+ // Apply joins
880
+ if (joins && joins.length > 0) joins.forEach((join)=>{
881
+ const joinTable = join.alias ? `${join.table} as ${join.alias}` : join.table;
882
+ const joinType = join.type || 'inner';
883
+ const operator = join.on.operator || '=';
884
+ switch(joinType){
885
+ case 'left':
886
+ q.leftJoin(joinTable, join.on.left, operator, join.on.right);
887
+ break;
888
+ case 'right':
889
+ q.rightJoin(joinTable, join.on.left, operator, join.on.right);
890
+ break;
891
+ case 'full':
892
+ q.fullOuterJoin(joinTable, join.on.left, operator, join.on.right);
893
+ break;
894
+ case 'cross':
895
+ q.crossJoin(join.alias ? knex.raw('?? as ??', [
896
+ join.table,
897
+ join.alias
898
+ ]) : knex.raw('??', [
899
+ join.table
900
+ ]));
901
+ break;
902
+ case 'inner':
903
+ default:
904
+ q.innerJoin(joinTable, join.on.left, operator, join.on.right);
905
+ break;
906
+ }
907
+ });
830
908
  // Apply filters
831
909
  if (filter) q = $bf24bb53f537fa46$export$1b001418845b471c(q, filter);
832
910
  // Apply sorting
@@ -906,8 +984,18 @@ const $bf24bb53f537fa46$export$65b914f34962db1e = (table, data, conflictTarget)=
906
984
 
907
985
 
908
986
  class $094f143c50bc237e$export$2e2bcd8739ae039 {
909
- async read(table, fields, filter, paginate, format) {
910
- const { query: query, replacements: replacements } = (0, $bf24bb53f537fa46$export$60d67f341ad4c4)(table, fields, filter, paginate, format);
987
+ async read(table, fields, filter, paginate, format, joins) {
988
+ const { query: query, replacements: replacements } = (0, $bf24bb53f537fa46$export$60d67f341ad4c4)(table, fields, filter, paginate, format, joins);
989
+ const result = await (0, $b05f0a427b6f271e$export$2e2bcd8739ae039).db.query(query, {
990
+ type: (0, $dTx2I$QueryTypes).SELECT,
991
+ raw: true,
992
+ replacements: [
993
+ ...replacements
994
+ ]
995
+ });
996
+ return result;
997
+ }
998
+ async query(query, replacements) {
911
999
  const result = await (0, $b05f0a427b6f271e$export$2e2bcd8739ae039).db.query(query, {
912
1000
  type: (0, $dTx2I$QueryTypes).SELECT,
913
1001
  raw: true,