@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/CHANGELOG.md +6 -0
- package/dist/index.d.ts +34 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +139 -51
- package/dist/index.js.map +1 -1
- package/dist/module.js +139 -51
- package/dist/module.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
745
|
-
|
|
746
|
-
this.
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
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,
|