@autofleet/sheilta 2.1.1 → 2.1.3-beta--beta-2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.cjs +1 -1
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +0 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
package/lib/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var jt=require('@autofleet/logger'),errors=require('@autofleet/errors'),
|
|
1
|
+
'use strict';var jt=require('@autofleet/logger'),errors=require('@autofleet/errors'),m=require('joi'),commonTypes=require('@autofleet/common-types');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var jt__default=/*#__PURE__*/_interopDefault(jt);var m__default=/*#__PURE__*/_interopDefault(m);var k=["eq","ne","gte","gt","lte","lt","not","in","notIn","is","like","iLike","notLike","between","and","or","overlap","contains"],E="$",Y={$eq:"=",$ne:"!=",$gte:">=",$gt:">",$lte:"<=",$lt:"<",$not:"NOT",$in:"IN",$notIn:"NOT IN",$is:"IS",$like:"LIKE",$iLike:"ILIKE",$notLike:"NOT LIKE",$and:"AND",$or:"OR"},pt=t=>{let{Op:e}=t;return k.reduce((o,r)=>(o[`${E+r}`]=e[r],o),{})};var gt=t=>Math.floor(Math.random()*Math.floor(t)),y="-",f=".",D="$",M=20,q=1,Q=100,v=1,Z=1,tt=t=>`${E}${t}${E}`,R=(t,e)=>t.includes(f)&&e.includes(t.split(f)[0]),$=(t,e)=>{let o=t;return t.includes(y)&&(o=o.split(y)[1]),R(o,e)&&([o]=o.split(f)),o},L=t=>t.includes(y),p=t=>{throw new errors.BadRequest([new Error(t)])},et=t=>t.split(f)[1],O=(t=5)=>{let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";return Array.from({length:t},()=>e.charAt(gt(e.length))).join("")},C=(t,e)=>Object.fromEntries(e.map(o=>[o,t[o]]));var ft="id",rt="DESC",bt="ASC",b="customFields.",{CUSTOM_FIELDS_FILTER_SCOPE:N,CUSTOM_FIELDS_SORT_SCOPE:G}=commonTypes.customFields,At=t=>["string","number"].includes(typeof t)||Array.isArray(t)?t:Object.entries(t).map(([e,o])=>({operator:Y[e],value:o})),Ot=(t,e={})=>{let{literalAttributes:o=[],DBFormatter:r=void 0}=e,[n,i]=t.reduce((s,c)=>{let[a,d="ASC"]=Array.isArray(c)?c:[c],l=o?.find(u=>u.attribute===a);return l?(s[1].push(l.literal),s[0].push([r?r(`"${l.attribute}" ${d}`):`${l.attribute} ${d}`])):s[0].push(c),s},[[],[]]);return [n,i]},ot=t=>{let e={};return Object.entries(t).forEach(([o,r])=>{let n=O();if(e[n]=o.split(b)[1],Array.isArray(r))r.forEach(i=>{let s=O();e[s]=typeof i=="string"?i:i.value;});else if(typeof r=="string"||typeof r=="number"){let i=O();e[i]=r;}else if(r?.operator){let i=O();e[i]=r.value;}}),e},Pt=t=>{let e={};return t.forEach(o=>{if(o.startsWith(b)){let r=O();e[r]=o.split(b)[1];}else if(o.substring(1).startsWith(b)){let r=O();e[r]=o.substring(1).split(b)[1];}}),e},ht=(t,e)=>({...Pt(t),...ot(e)}),Et=({order:t,associationModels:e=[],replacementsMap:o={}})=>{let r=[],n=new Map;return t.forEach(i=>{if([i,i.substring(1)].some(d=>d.startsWith(b))){n.has(G)||n.set(G,{});let d=i.split(b)[1];n.get(G)[d]=L(i)?rt:bt;return}let s=[$(i,e)],c=L(i);R(c?i.split(y)[1]:i,e)&&s.push(et(i)),c&&s.push(rt),r.push(s);}),{formattedOrders:r,replacementsMap:o,orderScopes:Array.from(n.entries()).map(([i,s])=>s?{method:[i,{replacementsMap:o,scopeValue:s}]}:i)}},Rt=t=>t||q,St=t=>t||M,it=(t,e={})=>{let o=t.map(r=>{let n=e[typeof r=="string"?r:r.association||r.model];return {...typeof r!="string"&&r,association:n,required:typeof r=="string"||r.required!==false,...typeof r!="string"&&r.include&&{include:it(r.include,n?.target?.associations)}}});return o=o.map(({model:r,...n})=>n),o},xt=(t,e,o,r=[])=>{let n={},i={},s=new Map;Object.entries(t).forEach(([a,d])=>{if(a.startsWith(b)){s.has(N)||s.set(N,{});let u=a.split(b)[1];s.get(N)[u]=At(d);return}if(r.includes(a)){i[a]=d;return}let l=R(a,e)?tt(a):a;n[l]=d;});let c=Array.from(s.entries()).map(([a,d])=>d?{method:[a,{replacementsMap:o,scopeValue:d}]}:a);return {formattedQuery:n,externalQueryValues:i,formattedScopes:c}},_t=(t,e,o)=>({$and:t.split(" ").map(r=>({$or:e.filter(n=>o[n].type.key==="STRING").map(n=>({[n]:{$iLike:`%${r}%`}}))}))}),It=({order:t=[],page:e=q,perPage:o=M,include:r=[],query:n={},attributes:i=null,searchTerm:s=null,jsonAttributes:c={}},a,d)=>{let l=ht(t,n),u=Object.keys(a?.associations||{}),{formattedOrders:g,orderScopes:x}=Et({order:[...t,ft],associationModels:u,replacementsMap:l}),[h,_]=Ot(g,d),I=[..._,...i||[]],F=i?.length?I:{include:I},w=it(r,a?.associations),A=Rt(e),V=St(o),B=xt(n,u,l,d?.additionalAllowedAttributes),{formattedScopes:lt,externalQueryValues:J}=B,{formattedQuery:T}=B;if(s&&!d?.skipSearchTermFormat){let ut=i?.length?i:Object.keys(a.rawAttributes),z=_t(s,ut,a.rawAttributes);T=!T||Object.keys(T).length===0?z:{$and:[T,z]};}return {jsonAttributes:c,query:T,order:h,page:A,perPage:V,include:w,scopes:[...lt,...x],...F&&{attributes:F},...Object.keys(J).length>0&&{externalQueryValues:J}}},nt=It;var Ft=t=>k.includes(t.split(E)[1]),st=(t,e=[],o=[],r=[])=>{let n=t.startsWith(D)&&t.endsWith(D)?t.slice(1,-1):t;return [...e,...o].includes(n.includes(f)?n.split(f)[0]:n)||r.includes(n)},wt=(t,e,o,r={})=>{let n=L(t);n&&t[0]!==y&&p(`${y} must be only at the beginning of the word`);let i=n?t.split(y)[1]:t,s=R(i,o),c=$(t,o),a=r?.literalAttributes?.map(d=>d.attribute)?.includes(i);!s&&c.includes(f)&&([c]=c.split(f)),e.includes(c)||s||a||p(`${t} is invalid. isLiteralAttribute: ${a}`);},Tt=(t,e)=>{e.includes(t)||p(`${t} is invalid`);},at=(t,e,o=[],r={})=>{t.forEach(n=>wt(n,e,o,r));},K=(t,e)=>{t.forEach(o=>Tt(o,e));},Mt=(t,e)=>{let{select:o=[],computed:r=[]}=t,n=o.map(c=>c.columnName)||[],i=r.map(c=>c.path.split(".")[0])||[],s=[...n,...i];K(s,e);},qt=(t,e)=>{let o=Array.isArray(t)?t:Object.keys(t);if(!o?.length)return;let r=o.find(n=>!e?.enrichmentAttributes?.includes(n));r&&p(`enrichment attribute ${r} is invalid`);},j=(t,e,o=[],r=[])=>{Object.entries(t).forEach(([n,i])=>{Array.isArray(i)?i[0]&&typeof i[0]=="object"&&i.map(s=>j(s,e,o,r)):Ft(n)||st(n,e,o,r)?i&&typeof i=="object"&&j(i,e,[],r):p(`invalid key: ${n}`);});},Lt=({page:t,perPage:e})=>{t<Z&&p("Page must be greater than 0"),(e>Q||e<v)&&p(`PerPage must be between ${v} to ${Q}`);},$t=(t,e)=>{let o=Object.keys(e);t.forEach(r=>{st(r.model,o);let n=e[r.model]?.target;n||p("model not found in associations");let{rawAttributes:i}=n,s=Object.keys(i);r.where&&j(r.where,s),r.order&&at(r.order,s),r.attributes&&K(r.attributes,s),[null,void 0,true,false].includes(r.required)||p("include.required must be a boolean");});},W=({query:t={},order:e=[],attributes:o=[],include:r=[],page:n=q,perPage:i=M,enrichments:s=[],group:c=[],jsonAttributes:a={}},d,l={})=>{let u=Object.keys(d.rawAttributes),g=Object.keys(d?.associations||{});return !o||o.length===0?o=u:K(o,u),at(e,u,g,l),j(t,u,g,l.additionalAllowedAttributes),qt(s,l),Mt(a,u),Array.isArray(c)||p("group must be an array"),r.length&&typeof r=="object"?$t(r,d?.associations):r&&typeof r!="object"&&p("include must be an array"),Lt({page:n,perPage:i}),true};var {object:U,string:P,number:dt,any:Dt,array:S,alternatives:Qt}=m__default.default.types(),vt=jt__default.default(),Ct=U.keys({query:U,attributes:S.items(P),order:S.items(P),page:dt,perPage:dt,include:S.items(Dt),searchTerm:P,group:S.items(P),enrichments:Qt.try(S.items(P),U.pattern(P,{exclude:S.items(P)})),jsonAttributes:m__default.default.object({select:m__default.default.array().items(m__default.default.object({columnName:m__default.default.string().required(),keys:m__default.default.array().items(m__default.default.string().required()).required()})).default([]),computed:m__default.default.array().items(m__default.default.object({type:m__default.default.string().valid("length").required(),path:m__default.default.string().required(),alias:m__default.default.string().required()})).default([])}).default({})}),H=(t,e,o={})=>{let{query:r,attributes:n,order:i,page:s,perPage:c,include:a,group:d,enrichments:l,jsonAttributes:u}=e,g=Ct.validate(e);if(g.error)throw new errors.BadRequest([g.error],null);W({query:r,attributes:n,order:i,page:s,perPage:c,include:a,enrichments:l,group:d,jsonAttributes:u},t,o);},Nt=(t,e={},o="body")=>async(r,n,i)=>{try{H(t,r[o],e),i();}catch(s){let{query:c,attributes:a,order:d}=r[o];errors.handleError(s,n,{logger:e.logger||vt,message:"error in query middleware",payload:{error:s,query:c,attributes:a,order:d}});}},X=(t,e,o={})=>{let{order:r,page:n,perPage:i,include:s,query:c,attributes:a,searchTerm:d,jsonAttributes:l}=e,{query:u,externalQueryValues:g,order:x,page:h,perPage:_,include:I,scopes:F,attributes:w,jsonAttributes:A}=nt({query:c,order:r,page:n,perPage:i,include:s,attributes:a,searchTerm:d,jsonAttributes:l},t,o);e.query=u,e.externalQueryValues=g,e.order=x,e.jsonAttributes=A,e.attributes=w,e.page=h,e.perPage=_,e.include=I,e.scopes=F,o.includeRawPayload&&(e.rawPayload={order:r,page:n,perPage:i,include:s,query:c,attributes:a,searchTerm:d});},Gt=(t,e={},o="body")=>async(r,n,i)=>{X(t,r[o],e),i();};var Wt=({model:t,logger:e,validationOptions:o,formatOptions:r,modelName:n=t.constructor?.name,additionalScopes:i=[],modifyQueryValues:s,onRowsRetrieved:c})=>async(a,d)=>{try{H(t,a.body,{...o,logger:e});}catch(l){let u=C(a.body,["query","order","attributes"]);errors.handleError(l,d,{logger:e,message:"error in query endpoint",payload:u});return}try{X(t,a.body,r);let l=Object.assign(C(a.body,["query","externalQueryValues","order","attributes","page","perPage","include","scopes","enrichments","jsonAttributes"]),{distinct:!0});e.info(`querying ${n}`,{queryValues:l});let u=s?.(l)??l,{scopes:g=[],query:x,perPage:h,page:_,enrichments:I,externalQueryValues:F,...w}=u,A=await t.scope([...i,...g]).findAndCountAll({where:x,limit:h,offset:(_-1)*h,...w});if(!A.rows.length||!c){d.json(A);return}let V=await c(A,u);d.json(V);}catch(l){errors.handleError(new errors.UnexpectedError(l),d,{logger:e,message:`Error while querying ${n}`,payload:{query:a.body}});}};exports.formatOperators=pt;exports.generateFilterReplacements=ot;exports.queryFormatMiddleware=Gt;exports.queryHandler=Wt;exports.queryValidationMiddleware=Nt;exports.validatePayload=W;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/lib/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/operators/index.ts","../src/utils.ts","../src/formatter/index.ts","../src/validations/index.ts","../src/middleware/index.ts","../src/handler/index.ts"],"names":["OPERATORS","OPERATOR_PREFIX","OPERATORS_TO_SQL","formatOperators","Sequelize","Op","map","o","randomInt","max","ORDER_PREFIX","ASSOCIATION_PREFIX","ASSOCIATION_PATH_WRAPPER","PER_PAGE_DEFAULT","PAGE_DEFAULT","PER_PAGE_MAX_LIMIT","PER_PAGE_MIN_LIMIT","PAGE_MIN","wrapAttributeWithOperator","attribute","isAttributeByAssociation","attributeName","associatedModels","extractAttributeNameFromOrder","order","associationModels","formattedOrder","isOrderDesc","throwBadRequestError","message","BadRequest","extractAssociatedAttributeNameFromOrder","generateRandomString","length","characters","pick","obj","keys","key","DEFAULT_ORDER","DESCENDING_KEY","ASCENDING_KEY","CUSTOM_FIELDS_QUERY_PREFIX","CUSTOM_FIELDS_FILTER_SCOPE","CUSTOM_FIELDS_SORT_SCOPE","customFields","parseCustomFieldScopeQueryValue","value","operator","conditionValue","getAttributeFromOrder","options","literalAttributes","DBFormatter","attributes","acc","item","orderStyle","found","generateFilterReplacements","conditions","replacements","condition","replacementKey","valueKey","conditionKey","operatorKey","generateOrderReplacements","replacementMap","rand","createReplacementMap","query","formatOrder","replacementsMap","formattedOrders","orderScopesMap","t","scopeKey","isOrderDescOrder","scopeName","scopeValue","formatPage","page","formatPerPage","perPage","formatInclude","include","associationsMap","formattedInclude","i","includedAssociation","_model","formatQuery","additionalAllowedAttributes","formattedQuery","externalQueryValues","formattedScopeMap","queryItemKey","queryItemValue","formattedScopes","formatSearchTerm","searchTerm","attributesToSend","rawAttributes","term","attrKey","attr","formatPayload","jsonAttributes","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","rawAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","validateJsonAttributes","s","c","validateEnrichments","enrichments","enrichmentKeys","invalidEnrichment","enrichment","validateQueryPayload","v","validatePagination","validateIncludePayload","associations","associationsKeys","target","attributeKeys","validatePayload","group","object","string","number","any","array","alternatives","Joi","fallbackLogger","Logger","jsonAttributeActions","querySchema","queryValidation","data","queryValidationMiddleware","inner","req","res","next","error","handleError","queryFormat","formattedJsonAttributes","queryFormatMiddleware","queryHandler","logger","validationOptions","formatOptions","modelName","additionalScopes","modifyQueryValues","onRowsRetrieved","payload","queryValues","modifiedQuery","scopes","where","limit","_enrichments","_externalQueryValues","rest","enrichmentResult","UnexpectedError"],"mappings":"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","file":"index.cjs","sourcesContent":["export const OPERATORS = [\n 'eq',\n 'ne',\n 'gte',\n 'gt',\n 'lte',\n 'lt',\n 'not',\n 'in',\n 'notIn',\n 'is',\n 'like',\n 'iLike',\n 'notLike',\n 'between',\n 'and',\n 'or',\n 'overlap',\n 'contains',\n];\n\nexport const OPERATOR_PREFIX = '$';\n\nexport const OPERATORS_TO_SQL = {\n $eq: '=',\n $ne: '!=',\n $gte: '>=',\n $gt: '>',\n $lte: '<=',\n $lt: '<',\n $not: 'NOT',\n $in: 'IN',\n $notIn: 'NOT IN',\n $is: 'IS',\n $like: 'LIKE',\n $iLike: 'ILIKE',\n $notLike: 'NOT LIKE',\n $and: 'AND',\n $or: 'OR',\n};\n\nexport const formatOperators = (Sequelize) => {\n const { Op } = Sequelize;\n return OPERATORS.reduce((map, o) => {\n // eslint-disable-next-line no-param-reassign\n map[`${OPERATOR_PREFIX + o}`] = Op[o];\n return map;\n }, {});\n};\n","import { BadRequest } from '@autofleet/errors';\nimport { OPERATOR_PREFIX } from './operators';\n\nconst randomInt = (max: number) => Math.floor(Math.random() * Math.floor(max));\n\nexport const ORDER_PREFIX = '-';\nexport const ASSOCIATION_PREFIX = '.';\nexport const ASSOCIATION_PATH_WRAPPER = '$';\nexport const PER_PAGE_DEFAULT = 20;\nexport const PAGE_DEFAULT = 1;\nexport const PER_PAGE_MAX_LIMIT = 100;\nexport const PER_PAGE_MIN_LIMIT = 1;\nexport const PAGE_MIN = 1;\n\nexport const wrapAttributeWithOperator = (attribute: string) => `${OPERATOR_PREFIX}${attribute}${OPERATOR_PREFIX}`;\nexport const isAttributeByAssociation = (attributeName: string, associatedModels: string[]): boolean => attributeName.includes(ASSOCIATION_PREFIX)\n && associatedModels.includes(attributeName.split(ASSOCIATION_PREFIX)[0]);\n\nexport const extractAttributeNameFromOrder = (order: string, associationModels: string[]): string => {\n let formattedOrder = order;\n if (order.includes(ORDER_PREFIX)) {\n // eslint-disable-next-line prefer-destructuring\n formattedOrder = formattedOrder.split(ORDER_PREFIX)[1];\n }\n if (isAttributeByAssociation(formattedOrder, associationModels)) {\n [formattedOrder] = formattedOrder.split(ASSOCIATION_PREFIX);\n }\n return formattedOrder;\n};\n\nexport const isOrderDesc = (order: string): boolean => order.includes(ORDER_PREFIX);\n\nexport const throwBadRequestError = (message: string) => {\n throw new BadRequest([new Error(message)]);\n};\n\nexport const extractAssociatedAttributeNameFromOrder = (order: string): string => order.split(ASSOCIATION_PREFIX)[1];\n\nexport const generateRandomString = (length = 5): string => {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n return Array.from({ length }, () => characters.charAt(randomInt(characters.length))).join('');\n};\n\nexport const pick = <T extends object, K extends keyof T = keyof T>(\n obj: T,\n keys: K[],\n): Pick<T, K> => Object.fromEntries(keys.map((key) => [key, obj[key]])) as Pick<T, K>;\n","import { customFields } from '@autofleet/common-types';\nimport {\n extractAssociatedAttributeNameFromOrder,\n extractAttributeNameFromOrder, generateRandomString,\n isAttributeByAssociation,\n isOrderDesc, ORDER_PREFIX,\n PAGE_DEFAULT,\n PER_PAGE_DEFAULT, wrapAttributeWithOperator,\n} from '../utils';\nimport type { LiteralAttribute } from '../middleware';\nimport { OPERATORS_TO_SQL } from '../operators';\n\nconst DEFAULT_ORDER = 'id';\nconst DESCENDING_KEY = 'DESC';\nconst ASCENDING_KEY = 'ASC';\nconst CUSTOM_FIELDS_QUERY_PREFIX = 'customFields.';\nconst { CUSTOM_FIELDS_FILTER_SCOPE, CUSTOM_FIELDS_SORT_SCOPE } = customFields;\ntype OrderItem = string | [string, string]\ntype SequelizeOrder = string | OrderItem[];\nexport type FormatPayloadOptions = {\n includeRawPayload?: boolean;\n literalAttributes?: LiteralAttribute[];\n DBFormatter?: any;\n skipSearchTermFormat?: boolean;\n additionalAllowedAttributes?: string[];\n};\n\ntype ConditionWithOperator = {\n operator: string;\n value: string;\n};\nexport type ConditionValue = ConditionWithOperator | ConditionWithOperator[] | string | string[];\n\nconst parseCustomFieldScopeQueryValue = (value) => {\n if (['string', 'number'].includes(typeof value) || Array.isArray(value)) {\n return value;\n }\n return Object.entries(value).map(([operator, conditionValue]) => ({\n operator: OPERATORS_TO_SQL[operator],\n value: conditionValue,\n }));\n};\n\nconst getAttributeFromOrder = (order: SequelizeOrder[], options: FormatPayloadOptions = {}): [SequelizeOrder[], SequelizeOrder[]] => {\n const { literalAttributes = [], DBFormatter = undefined } = options;\n const [formattedOrder, attributes] = order.reduce((acc, o) => {\n const [item, orderStyle = 'ASC'] = Array.isArray(o) ? o : [o];\n const found = literalAttributes?.find((obj) => obj.attribute === item);\n if (found) {\n acc[1].push(found.literal);\n acc[0].push([DBFormatter ? DBFormatter(`\"${found.attribute}\" ${orderStyle}`) : `${found.attribute} ${orderStyle}`]);\n } else {\n acc[0].push(o);\n }\n return acc;\n }, [[], []]);\n\n return [formattedOrder, attributes];\n};\n\n/**\n * Generates replacements for the given conditions.\n *\n * @param conditions - The conditions to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateFilterReplacements = (conditions: Record<string, ConditionValue>): Record<string, string> => {\n const replacements: Record<string, string> = {};\n\n Object.entries(conditions).forEach(([key, condition]) => {\n const replacementKey = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacements[replacementKey] = key.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n\n if (Array.isArray(condition)) {\n condition.forEach((value) => {\n const valueKey = generateRandomString();\n replacements[valueKey] = typeof value === 'string' ? value : value.value;\n });\n } else if (typeof condition === 'string' || typeof condition === 'number') {\n const conditionKey = generateRandomString();\n replacements[conditionKey] = condition;\n } else if (condition?.operator) {\n const operatorKey = generateRandomString();\n replacements[operatorKey] = condition.value;\n }\n });\n\n return replacements;\n};\n\n/**\n * Generates replacements for the given order array.\n *\n * @param order - The order array to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateOrderReplacements = (order: string[]): Record<string, string> => {\n const replacementMap = {};\n order.forEach((o) => {\n if (o.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n } else if (o.substring(1).startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.substring(1).split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n }\n });\n return replacementMap;\n};\n\n/**\n * Creates a combined replacement map from order and query.\n *\n * @param order - The order array.\n * @param query - The query object.\n * @returns The combined replacements object.\n */\nconst createReplacementMap = (order: string[], query: Record<string, ConditionValue>): Record<string, string> => ({\n ...generateOrderReplacements(order),\n ...generateFilterReplacements(query),\n});\n\nconst formatOrder = ({\n order,\n associationModels = [],\n replacementsMap = {},\n}: { order: string[]; associationModels?: string[]; replacementsMap?: Record<string, string>; }): {\n formattedOrders: SequelizeOrder[];\n orderScopes: (string | { method: [string, { replacementsMap: Record<string, string>; scopeValue: Record<string, 'DESC' | 'ASC'>; }] })[];\n replacementsMap: Record<string, string>;\n} => {\n const formattedOrders = [];\n const orderScopesMap = new Map<string, Record<string, 'DESC' | 'ASC'>>();\n order.forEach((o: string) => {\n if ([o, o.substring(1)].some((t) => t.startsWith(CUSTOM_FIELDS_QUERY_PREFIX))) {\n if (!orderScopesMap.has(CUSTOM_FIELDS_SORT_SCOPE)) {\n orderScopesMap.set(CUSTOM_FIELDS_SORT_SCOPE, {});\n }\n const scopeKey = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n orderScopesMap.get(CUSTOM_FIELDS_SORT_SCOPE)[scopeKey] = (isOrderDesc(o) ? DESCENDING_KEY : ASCENDING_KEY);\n return;\n }\n const formattedOrder = [extractAttributeNameFromOrder(o, associationModels)];\n const isOrderDescOrder = isOrderDesc(o);\n const isOrderAssociation = isAttributeByAssociation(isOrderDescOrder\n ? o.split(ORDER_PREFIX)[1]\n : o, associationModels);\n if (isOrderAssociation) {\n formattedOrder.push(extractAssociatedAttributeNameFromOrder(o));\n }\n if (isOrderDescOrder) {\n formattedOrder.push(DESCENDING_KEY);\n }\n formattedOrders.push(formattedOrder);\n });\n return {\n formattedOrders,\n replacementsMap,\n orderScopes: Array.from(orderScopesMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n }),\n };\n};\n\nconst formatPage = (page?: number) => page || PAGE_DEFAULT;\n\nconst formatPerPage = (perPage?: number) => perPage || PER_PAGE_DEFAULT;\n\ninterface Include {\n association?: string;\n model?: string;\n required?: boolean;\n include?: Include[];\n}\n\nconst formatInclude = (include: (string | Include)[], associationsMap = {}) => {\n let formattedInclude = include.map((i) => {\n const includedAssociation = associationsMap[typeof i === 'string' ? i : (i.association || i.model)];\n return {\n ...(typeof i !== 'string' && i),\n association: includedAssociation,\n required: typeof i === 'string' || i.required !== false,\n ...(typeof i !== 'string' && i.include && {\n include: formatInclude(i.include, includedAssociation?.target?.associations),\n }),\n };\n });\n formattedInclude = formattedInclude.map(({ model: _model, ...i }) => i);\n return formattedInclude;\n};\nconst formatQuery = (query, associationModels, replacementsMap: Record<string, string>, additionalAllowedAttributes: string[] = []) => {\n const formattedQuery: Record<string, unknown> = {};\n const externalQueryValues: Record<string, unknown> = {};\n const formattedScopeMap = new Map<string, any>();\n\n Object.entries(query).forEach(([queryItemKey, queryItemValue]) => {\n if (queryItemKey.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n if (!formattedScopeMap.has(CUSTOM_FIELDS_FILTER_SCOPE)) {\n formattedScopeMap.set(CUSTOM_FIELDS_FILTER_SCOPE, {});\n }\n const scopeKey = queryItemKey.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n formattedScopeMap.get(CUSTOM_FIELDS_FILTER_SCOPE)[scopeKey] = parseCustomFieldScopeQueryValue(queryItemValue);\n return;\n }\n if (additionalAllowedAttributes.includes(queryItemKey)) {\n externalQueryValues[queryItemKey] = queryItemValue;\n return;\n }\n const key = isAttributeByAssociation(queryItemKey, associationModels)\n ? wrapAttributeWithOperator(queryItemKey)\n : queryItemKey;\n formattedQuery[key] = queryItemValue;\n });\n\n const formattedScopes = Array.from(formattedScopeMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n });\n\n return {\n formattedQuery,\n externalQueryValues,\n formattedScopes,\n };\n};\n\nconst formatSearchTerm = (searchTerm: string, attributesToSend: string[], rawAttributes) => ({\n $and: searchTerm.split(' ').map((term) => ({\n $or: attributesToSend.filter((attrKey) => rawAttributes[attrKey].type.key === 'STRING').map((attr) => ({\n [attr]: {\n $iLike: `%${term}%`,\n },\n })),\n })),\n});\n\nconst formatPayload = ({\n order = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n include = [],\n query = {},\n attributes = null,\n searchTerm = null,\n jsonAttributes = {},\n}, model?, options?: FormatPayloadOptions) => {\n const replacementsMap = createReplacementMap(order, query);\n const associationModels = Object.keys(model?.associations || {});\n const { formattedOrders, orderScopes } = formatOrder({\n order: [...order, DEFAULT_ORDER],\n associationModels,\n replacementsMap,\n });\n const [filteredFormattedOrder, filteredLiteralAttributes] = getAttributeFromOrder(\n formattedOrders,\n options,\n );\n\n const allAttributes = [...filteredLiteralAttributes, ...(attributes || [])];\n const formattedAttribute = attributes?.length ? allAttributes : { include: allAttributes };\n const formattedInclude = formatInclude(include, model?.associations);\n const formattedPage = formatPage(page);\n const formattedPerPage = formatPerPage(perPage);\n const result = formatQuery(query, associationModels, replacementsMap, options?.additionalAllowedAttributes);\n const { formattedScopes: queryScopes, externalQueryValues } = result;\n let { formattedQuery } = result;\n if (searchTerm && !options?.skipSearchTermFormat) {\n const attributesToSend = attributes?.length ? attributes : Object.keys(model.rawAttributes);\n const queryWithSearchTerm = formatSearchTerm(searchTerm, attributesToSend, model.rawAttributes);\n formattedQuery = !formattedQuery || Object.keys(formattedQuery).length === 0 ? queryWithSearchTerm : {\n $and: [\n formattedQuery,\n queryWithSearchTerm,\n ],\n };\n }\n return {\n jsonAttributes,\n query: formattedQuery,\n order: filteredFormattedOrder,\n page: formattedPage,\n perPage: formattedPerPage,\n include: formattedInclude,\n scopes: [...queryScopes, ...orderScopes],\n ...(formattedAttribute && { attributes: formattedAttribute }),\n ...(Object.keys(externalQueryValues).length > 0 && { externalQueryValues }),\n };\n};\n\nexport default formatPayload;\n","import {\n ORDER_PREFIX,\n extractAttributeNameFromOrder,\n isOrderDesc,\n throwBadRequestError,\n PAGE_DEFAULT,\n PER_PAGE_DEFAULT,\n PAGE_MIN,\n PER_PAGE_MAX_LIMIT,\n PER_PAGE_MIN_LIMIT,\n isAttributeByAssociation,\n ASSOCIATION_PREFIX,\n ASSOCIATION_PATH_WRAPPER,\n} from '../utils';\nimport { OPERATORS, OPERATOR_PREFIX } from '../operators';\nimport type { MiddlewareValidationOption } from '../middleware';\n\nconst validateOperator = (operator: string): boolean => OPERATORS.includes(operator.split(OPERATOR_PREFIX)[1]);\n\nconst validateQueryAttribute = (\n rawAttribute: string,\n modelAttributes: string[] = [],\n associationModels: string[] = [],\n additionalAllowedAttributes: string[] = [],\n): boolean => {\n const attribute = (rawAttribute.startsWith(\n ASSOCIATION_PATH_WRAPPER,\n ) && rawAttribute.endsWith(\n ASSOCIATION_PATH_WRAPPER,\n )) ? rawAttribute.slice(1, -1) : rawAttribute;\n return [...modelAttributes, ...associationModels].includes(attribute.includes(ASSOCIATION_PREFIX)\n ? attribute.split(ASSOCIATION_PREFIX)[0] : attribute)\n || additionalAllowedAttributes.includes(attribute);\n};\n\nconst validateSingleOrder = (\n currentOrder: string,\n rawAttributes: string[],\n associationModels: string[],\n options: MiddlewareValidationOption = {},\n): void => {\n const isOrderDescOrder = isOrderDesc(currentOrder);\n if (isOrderDescOrder && currentOrder[0] !== ORDER_PREFIX) {\n throwBadRequestError(`${ORDER_PREFIX} must be only at the beginning of the word`);\n }\n const orderStringWithoutDesc = isOrderDescOrder ? currentOrder.split(ORDER_PREFIX)[1] : currentOrder;\n const isOrderAssociation = isAttributeByAssociation(orderStringWithoutDesc, associationModels);\n let formattedOrderString = extractAttributeNameFromOrder(currentOrder, associationModels);\n const isLiteralAttribute = options?.literalAttributes?.map((la) => la.attribute)?.includes(orderStringWithoutDesc);\n\n if (!isOrderAssociation && formattedOrderString.includes(ASSOCIATION_PREFIX)) {\n [formattedOrderString] = formattedOrderString.split(ASSOCIATION_PREFIX);\n }\n\n if (!(rawAttributes.includes(formattedOrderString) || isOrderAssociation || isLiteralAttribute)) {\n throwBadRequestError(`${currentOrder} is invalid. isLiteralAttribute: ${isLiteralAttribute}`);\n }\n};\n\nconst validateSingleAttribute = (currentAttribute: string, rawAttributes: string[]): void => {\n if (!rawAttributes.includes(currentAttribute)) {\n throwBadRequestError(`${currentAttribute} is invalid`);\n }\n};\n\nconst validateOrderAttributes = (\n order: string[],\n rawAttributes: string[],\n associationModels: string[] = [],\n options: MiddlewareValidationOption = {},\n): void => {\n order.forEach((o) => validateSingleOrder(o, rawAttributes, associationModels, options));\n};\n\nconst validateAttributes = (attributes: string[], rawAttributes: string[]): void => {\n attributes.forEach((a) => validateSingleAttribute(a, rawAttributes));\n};\n\ntype SelectJsonAttribute = {\n columnName: string;\n alias: string;\n keys: string[];\n};\n\ntype ComputedJsonAttribute = {\n columnName: string;\n alias: string;\n action: string;\n};\n\ntype JsonAttributes = {\n select?: SelectJsonAttribute[];\n computed?: ComputedJsonAttribute[];\n};\n\nconst validateJsonAttributes = (jsonAttributes: JsonAttributes, rawAttributes: string[]):\n void => {\n const allAttributes = [\n ...(jsonAttributes.select?.map((s) => s.columnName) || []),\n ...(jsonAttributes.computed?.map((c) => c.columnName) || []),\n ];\n\n validateAttributes(allAttributes, rawAttributes);\n};\n\nconst validateEnrichments = (enrichments: string[] | { [enrichmentName: string]: { exclude?: string[]; } }, options?: MiddlewareValidationOption): void => {\n const enrichmentKeys = Array.isArray(enrichments) ? enrichments : Object.keys(enrichments);\n if (!enrichmentKeys?.length) { return; }\n const invalidEnrichment = enrichmentKeys.find((enrichment) => !options?.enrichmentAttributes?.includes(enrichment));\n if (invalidEnrichment) {\n throwBadRequestError(`enrichment attribute ${invalidEnrichment} is invalid`);\n }\n};\n\nconst validateQueryPayload = (query, rawAttributes: string[], associationModels: string[] = [], additionalAllowedAttributes: string[] = []): void => {\n Object.entries(query).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n if (value[0] && typeof value[0] === 'object') {\n value.map((v) => validateQueryPayload(v, rawAttributes, associationModels, additionalAllowedAttributes));\n }\n } else if (validateOperator(key) || validateQueryAttribute(key, rawAttributes, associationModels, additionalAllowedAttributes)) {\n if (value && typeof value === 'object') {\n validateQueryPayload(value, rawAttributes, [], additionalAllowedAttributes);\n }\n } else {\n throwBadRequestError(`invalid key: ${key}`);\n }\n });\n};\n\nconst validatePagination = ({\n page,\n perPage,\n}) => {\n if (page < PAGE_MIN) {\n throwBadRequestError('Page must be greater than 0');\n }\n\n if (perPage > PER_PAGE_MAX_LIMIT || perPage < PER_PAGE_MIN_LIMIT) {\n throwBadRequestError(`PerPage must be between ${PER_PAGE_MIN_LIMIT} to ${PER_PAGE_MAX_LIMIT}`);\n }\n};\n\nconst validateIncludePayload = (include, associations): void => {\n const associationsKeys = Object.keys(associations);\n include.forEach((i) => {\n validateQueryAttribute(i.model, associationsKeys);\n const target = associations[i.model]?.target;\n if (!target) {\n throwBadRequestError('model not found in associations');\n }\n\n const { rawAttributes } = target;\n const attributeKeys = Object.keys(rawAttributes);\n if (i.where) {\n validateQueryPayload(i.where, attributeKeys);\n }\n if (i.order) {\n validateOrderAttributes(i.order, attributeKeys);\n }\n if (i.attributes) {\n validateAttributes(i.attributes, attributeKeys);\n }\n if (![null, undefined, true, false].includes(i.required)) {\n throwBadRequestError('include.required must be a boolean');\n }\n });\n};\n\nexport const validatePayload = (\n {\n query = {},\n order = [],\n attributes = [],\n include = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n enrichments = [],\n group = [],\n jsonAttributes = {},\n },\n model?,\n options: MiddlewareValidationOption = {},\n): boolean => {\n const rawAttributes = Object.keys(model.rawAttributes);\n const associationModels = Object.keys(model?.associations || {});\n if (!attributes || attributes.length === 0) {\n // eslint-disable-next-line no-param-reassign\n attributes = rawAttributes;\n } else {\n validateAttributes(attributes, rawAttributes);\n }\n\n validateOrderAttributes(order, rawAttributes, associationModels, options);\n validateQueryPayload(query, rawAttributes, associationModels, options.additionalAllowedAttributes);\n validateEnrichments(enrichments, options);\n validateJsonAttributes(jsonAttributes, rawAttributes);\n\n if (!Array.isArray(group)) {\n throwBadRequestError('group must be an array');\n }\n if (include.length && typeof include === 'object') {\n validateIncludePayload(include, model?.associations);\n } else if (include && typeof include !== 'object') {\n throwBadRequestError('include must be an array');\n }\n\n validatePagination({\n page,\n perPage,\n });\n return true;\n};\n","import type { Handler } from 'express';\nimport Logger, { type LoggerInstanceManager } from '@autofleet/logger';\nimport { BadRequest, handleError } from '@autofleet/errors';\nimport Joi from 'joi';\nimport formatPayload, { type FormatPayloadOptions } from '../formatter';\nimport { validatePayload } from '../validations';\n\nconst {\n object, string, number, any, array, alternatives,\n} = Joi.types();\nconst fallbackLogger = Logger();\n\nconst jsonAttributeActions = ['length'] as const;\n\nconst querySchema = object.keys({\n query: object,\n attributes: array.items(string),\n order: array.items(string),\n page: number,\n perPage: number,\n include: array.items(any),\n searchTerm: string,\n group: array.items(string),\n enrichments: alternatives.try(array.items(string), object.pattern(string, { exclude: array.items(string) })),\n jsonAttributes: Joi.object({\n select: Joi.array().items(\n Joi.object({\n columnName: Joi.string().required(),\n keys: Joi.array().items(Joi.string().required()).required(),\n alias: Joi.string().optional(),\n }),\n ).default([]),\n computed: Joi.array().items(\n Joi.object({\n columnName: Joi.string().required(),\n action: Joi.string().valid(...jsonAttributeActions).required(),\n alias: Joi.string().required(),\n }),\n ).default([]),\n }).default({}),\n});\n\ntype literal = any;\ntype LiteralQuery = (literal | string)[] | literal;\nexport type LiteralAttribute = { attribute: string; literal: LiteralQuery };\nexport type MiddlewareValidationOption = {\n literalAttributes?: LiteralAttribute[];\n enrichmentAttributes?: string[];\n additionalAllowedAttributes?: string[];\n logger?: LoggerInstanceManager;\n};\n\ntype ReqKeys = 'body' | 'query';\n\nexport const queryValidation = (model: any, data: any, options: MiddlewareValidationOption = {}) => {\n const {\n query,\n attributes,\n order,\n page,\n perPage,\n include,\n group,\n enrichments,\n jsonAttributes,\n } = data;\n\n const result = querySchema.validate(data);\n if (result.error) {\n throw new BadRequest([result.error], null);\n }\n validatePayload({\n query,\n attributes,\n order,\n page,\n perPage,\n include,\n enrichments,\n group,\n jsonAttributes,\n }, model, options);\n};\n\n/** consider using @see {@link queryHandler} directly */\nexport const queryValidationMiddleware = (model: any, options: MiddlewareValidationOption = {}, inner: ReqKeys = 'body'): Handler => async (req, res, next): Promise<void> => {\n try {\n queryValidation(model, req[inner], options);\n next();\n } catch (error) {\n const { query, attributes, order } = req[inner];\n handleError(error, res, {\n logger: options.logger || fallbackLogger,\n message: 'error in query middleware',\n payload: {\n error,\n query,\n attributes,\n order,\n },\n });\n }\n};\n\nexport const queryFormat = (model: any, data: any, options: FormatPayloadOptions = {}) => {\n const {\n order,\n page,\n perPage,\n include,\n query,\n attributes,\n searchTerm,\n jsonAttributes,\n } = data;\n\n const {\n query: formattedQuery,\n externalQueryValues,\n order: formattedOrder,\n page: formattedPage,\n perPage: formattedPerPage,\n include: formattedInclude,\n scopes: formattedScopes,\n attributes: formattedAttribute,\n jsonAttributes: formattedJsonAttributes,\n } = formatPayload({\n query,\n order,\n page,\n perPage,\n include,\n attributes,\n searchTerm,\n jsonAttributes,\n }, model, options);\n\n /* eslint-disable no-param-reassign */\n data.query = formattedQuery;\n data.externalQueryValues = externalQueryValues;\n data.order = formattedOrder;\n data.jsonAttributes = formattedJsonAttributes;\n data.attributes = formattedAttribute;\n data.page = formattedPage;\n data.perPage = formattedPerPage;\n data.include = formattedInclude;\n data.scopes = formattedScopes;\n if (options.includeRawPayload) {\n data.rawPayload = {\n order,\n page,\n perPage,\n include,\n query,\n attributes,\n searchTerm,\n };\n }\n /* eslint-enable no-param-reassign */\n};\n\n/** consider using @see {@link queryHandler} directly */\nexport const queryFormatMiddleware = (model: any, options: FormatPayloadOptions = {}, inner: ReqKeys = 'body'): Handler => async (req, res, next): Promise<void> => {\n queryFormat(model, req[inner], options);\n next();\n};\n","import type { Handler } from 'express';\nimport { type LoggerInstanceManager } from '@autofleet/logger';\nimport { UnexpectedError, handleError } from '@autofleet/errors';\nimport formatPayload, { type FormatPayloadOptions } from '../formatter';\nimport { pick } from '../utils';\nimport { type MiddlewareValidationOption, queryFormat, queryValidation } from '../middleware';\n\ninterface QueryValues extends ReturnType<typeof formatPayload> {\n enrichments?: string[] | Record<string, { exclude: string[] }>;\n distinct: boolean;\n searchTerm?: string;\n}\n\ninterface QueryHandlerOptions {\n /** The sequelize model too which querying abilities are added. */\n model: any;\n /** Optional settings for validation. */\n validationOptions?: Omit<MiddlewareValidationOption, 'logger'>;\n /** Optional settings for payload formatting */\n formatOptions?: FormatPayloadOptions;\n logger: LoggerInstanceManager;\n /** The name of model to be printed in logs. defaults to `model`s constructor name. */\n modelName?: string;\n /** Sequelize scopes of the model to be used within the query. @example ['userScope'] */\n additionalScopes?: string[];\n /** Callback to allow modifying the query values prior to querying the DB */\n modifyQueryValues?: (queryValues: QueryValues) => QueryValues;\n /** Optional callback to modify endpoint's response based on the DBs response. */\n onRowsRetrieved?: (data: { rows: any[]; count: number; }, queryValues: QueryValues) => any;\n}\n\nexport const queryHandler = ({\n model, logger, validationOptions, formatOptions, modelName = model.constructor?.name, additionalScopes = [], modifyQueryValues, onRowsRetrieved,\n}: QueryHandlerOptions): Handler => async (req, res) => {\n try {\n queryValidation(model, req.body, { ...validationOptions, logger });\n } catch (error) {\n const payload = pick(req.body as QueryValues, ['query', 'order', 'attributes'] as const);\n handleError(error, res, { logger, message: 'error in query endpoint', payload });\n return;\n }\n try {\n queryFormat(model, req.body, formatOptions);\n\n const queryValues = Object.assign(\n pick(req.body as QueryValues, ['query', 'externalQueryValues', 'order', 'attributes', 'page', 'perPage', 'include', 'scopes', 'enrichments', 'jsonAttributes'] as const),\n { distinct: true },\n );\n\n logger.info(`querying ${modelName}`, { queryValues });\n\n const modifiedQuery = modifyQueryValues?.(queryValues) ?? queryValues;\n const {\n scopes = [],\n query: where,\n perPage: limit,\n page,\n enrichments: _enrichments,\n externalQueryValues: _externalQueryValues,\n ...rest\n } = modifiedQuery;\n\n const result = await model.scope([...additionalScopes, ...scopes]).findAndCountAll({\n where,\n limit,\n offset: (page - 1) * limit,\n ...rest,\n });\n\n if (!result.rows.length || !onRowsRetrieved) {\n res.json(result);\n return;\n }\n\n const enrichmentResult = await onRowsRetrieved(result, modifiedQuery);\n\n res.json(enrichmentResult);\n } catch (error) {\n handleError(new UnexpectedError(error), res, { logger, message: `Error while querying ${modelName}`, payload: { query: req.body } });\n }\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/operators/index.ts","../src/utils.ts","../src/formatter/index.ts","../src/validations/index.ts","../src/middleware/index.ts","../src/handler/index.ts"],"names":["OPERATORS","OPERATOR_PREFIX","OPERATORS_TO_SQL","formatOperators","Sequelize","Op","map","o","randomInt","max","ORDER_PREFIX","ASSOCIATION_PREFIX","ASSOCIATION_PATH_WRAPPER","PER_PAGE_DEFAULT","PAGE_DEFAULT","PER_PAGE_MAX_LIMIT","PER_PAGE_MIN_LIMIT","PAGE_MIN","wrapAttributeWithOperator","attribute","isAttributeByAssociation","attributeName","associatedModels","extractAttributeNameFromOrder","order","associationModels","formattedOrder","isOrderDesc","throwBadRequestError","message","BadRequest","extractAssociatedAttributeNameFromOrder","generateRandomString","length","characters","pick","obj","keys","key","DEFAULT_ORDER","DESCENDING_KEY","ASCENDING_KEY","CUSTOM_FIELDS_QUERY_PREFIX","CUSTOM_FIELDS_FILTER_SCOPE","CUSTOM_FIELDS_SORT_SCOPE","customFields","parseCustomFieldScopeQueryValue","value","operator","conditionValue","getAttributeFromOrder","options","literalAttributes","DBFormatter","attributes","acc","item","orderStyle","found","generateFilterReplacements","conditions","replacements","condition","replacementKey","valueKey","conditionKey","operatorKey","generateOrderReplacements","replacementMap","rand","createReplacementMap","query","formatOrder","replacementsMap","formattedOrders","orderScopesMap","t","scopeKey","isOrderDescOrder","scopeName","scopeValue","formatPage","page","formatPerPage","perPage","formatInclude","include","associationsMap","formattedInclude","i","includedAssociation","_model","formatQuery","additionalAllowedAttributes","formattedQuery","externalQueryValues","formattedScopeMap","queryItemKey","queryItemValue","formattedScopes","formatSearchTerm","searchTerm","attributesToSend","rawAttributes","term","attrKey","attr","formatPayload","jsonAttributes","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","rawAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","validateJasonAttributes","select","computed","selectAttributes","s","computedAttributes","allFields","validateEnrichments","enrichments","enrichmentKeys","invalidEnrichment","enrichment","validateQueryPayload","v","validatePagination","validateIncludePayload","associations","associationsKeys","target","attributeKeys","validatePayload","group","object","string","number","any","array","alternatives","Joi","fallbackLogger","Logger","querySchema","queryValidation","data","queryValidationMiddleware","inner","req","res","next","error","handleError","queryFormat","formattedJsonAttributes","queryFormatMiddleware","queryHandler","logger","validationOptions","formatOptions","modelName","additionalScopes","modifyQueryValues","onRowsRetrieved","payload","queryValues","modifiedQuery","scopes","where","limit","_enrichments","_externalQueryValues","rest","enrichmentResult","UnexpectedError"],"mappings":"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","file":"index.cjs","sourcesContent":["export const OPERATORS = [\n 'eq',\n 'ne',\n 'gte',\n 'gt',\n 'lte',\n 'lt',\n 'not',\n 'in',\n 'notIn',\n 'is',\n 'like',\n 'iLike',\n 'notLike',\n 'between',\n 'and',\n 'or',\n 'overlap',\n 'contains',\n];\n\nexport const OPERATOR_PREFIX = '$';\n\nexport const OPERATORS_TO_SQL = {\n $eq: '=',\n $ne: '!=',\n $gte: '>=',\n $gt: '>',\n $lte: '<=',\n $lt: '<',\n $not: 'NOT',\n $in: 'IN',\n $notIn: 'NOT IN',\n $is: 'IS',\n $like: 'LIKE',\n $iLike: 'ILIKE',\n $notLike: 'NOT LIKE',\n $and: 'AND',\n $or: 'OR',\n};\n\nexport const formatOperators = (Sequelize) => {\n const { Op } = Sequelize;\n return OPERATORS.reduce((map, o) => {\n // eslint-disable-next-line no-param-reassign\n map[`${OPERATOR_PREFIX + o}`] = Op[o];\n return map;\n }, {});\n};\n","import { BadRequest } from '@autofleet/errors';\nimport { OPERATOR_PREFIX } from './operators';\n\nconst randomInt = (max: number) => Math.floor(Math.random() * Math.floor(max));\n\nexport const ORDER_PREFIX = '-';\nexport const ASSOCIATION_PREFIX = '.';\nexport const ASSOCIATION_PATH_WRAPPER = '$';\nexport const PER_PAGE_DEFAULT = 20;\nexport const PAGE_DEFAULT = 1;\nexport const PER_PAGE_MAX_LIMIT = 100;\nexport const PER_PAGE_MIN_LIMIT = 1;\nexport const PAGE_MIN = 1;\n\nexport const wrapAttributeWithOperator = (attribute: string) => `${OPERATOR_PREFIX}${attribute}${OPERATOR_PREFIX}`;\nexport const isAttributeByAssociation = (attributeName: string, associatedModels: string[]): boolean => attributeName.includes(ASSOCIATION_PREFIX)\n && associatedModels.includes(attributeName.split(ASSOCIATION_PREFIX)[0]);\n\nexport const extractAttributeNameFromOrder = (order: string, associationModels: string[]): string => {\n let formattedOrder = order;\n if (order.includes(ORDER_PREFIX)) {\n // eslint-disable-next-line prefer-destructuring\n formattedOrder = formattedOrder.split(ORDER_PREFIX)[1];\n }\n if (isAttributeByAssociation(formattedOrder, associationModels)) {\n [formattedOrder] = formattedOrder.split(ASSOCIATION_PREFIX);\n }\n return formattedOrder;\n};\n\nexport const isOrderDesc = (order: string): boolean => order.includes(ORDER_PREFIX);\n\nexport const throwBadRequestError = (message: string) => {\n throw new BadRequest([new Error(message)]);\n};\n\nexport const extractAssociatedAttributeNameFromOrder = (order: string): string => order.split(ASSOCIATION_PREFIX)[1];\n\nexport const generateRandomString = (length = 5): string => {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n return Array.from({ length }, () => characters.charAt(randomInt(characters.length))).join('');\n};\n\nexport const pick = <T extends object, K extends keyof T = keyof T>(\n obj: T,\n keys: K[],\n): Pick<T, K> => Object.fromEntries(keys.map((key) => [key, obj[key]])) as Pick<T, K>;\n","import { customFields } from '@autofleet/common-types';\nimport {\n extractAssociatedAttributeNameFromOrder,\n extractAttributeNameFromOrder, generateRandomString,\n isAttributeByAssociation,\n isOrderDesc, ORDER_PREFIX,\n PAGE_DEFAULT,\n PER_PAGE_DEFAULT, wrapAttributeWithOperator,\n} from '../utils';\nimport type { LiteralAttribute } from '../middleware';\nimport { OPERATORS_TO_SQL } from '../operators';\nimport Joi from \"joi\";\n\nconst DEFAULT_ORDER = 'id';\nconst DESCENDING_KEY = 'DESC';\nconst ASCENDING_KEY = 'ASC';\nconst CUSTOM_FIELDS_QUERY_PREFIX = 'customFields.';\nconst { CUSTOM_FIELDS_FILTER_SCOPE, CUSTOM_FIELDS_SORT_SCOPE } = customFields;\ntype OrderItem = string | [string, string]\ntype SequelizeOrder = string | OrderItem[];\nexport type FormatPayloadOptions = {\n includeRawPayload?: boolean;\n literalAttributes?: LiteralAttribute[];\n DBFormatter?: any;\n skipSearchTermFormat?: boolean;\n additionalAllowedAttributes?: string[];\n};\n\ntype ConditionWithOperator = {\n operator: string;\n value: string;\n};\nexport type ConditionValue = ConditionWithOperator | ConditionWithOperator[] | string | string[];\n\nconst parseCustomFieldScopeQueryValue = (value) => {\n if (['string', 'number'].includes(typeof value) || Array.isArray(value)) {\n return value;\n }\n return Object.entries(value).map(([operator, conditionValue]) => ({\n operator: OPERATORS_TO_SQL[operator],\n value: conditionValue,\n }));\n};\n\nconst getAttributeFromOrder = (order: SequelizeOrder[], options: FormatPayloadOptions = {}): [SequelizeOrder[], SequelizeOrder[]] => {\n const { literalAttributes = [], DBFormatter = undefined } = options;\n const [formattedOrder, attributes] = order.reduce((acc, o) => {\n const [item, orderStyle = 'ASC'] = Array.isArray(o) ? o : [o];\n const found = literalAttributes?.find((obj) => obj.attribute === item);\n if (found) {\n acc[1].push(found.literal);\n acc[0].push([DBFormatter ? DBFormatter(`\"${found.attribute}\" ${orderStyle}`) : `${found.attribute} ${orderStyle}`]);\n } else {\n acc[0].push(o);\n }\n return acc;\n }, [[], []]);\n\n return [formattedOrder, attributes];\n};\n\n/**\n * Generates replacements for the given conditions.\n *\n * @param conditions - The conditions to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateFilterReplacements = (conditions: Record<string, ConditionValue>): Record<string, string> => {\n const replacements: Record<string, string> = {};\n\n Object.entries(conditions).forEach(([key, condition]) => {\n const replacementKey = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacements[replacementKey] = key.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n\n if (Array.isArray(condition)) {\n condition.forEach((value) => {\n const valueKey = generateRandomString();\n replacements[valueKey] = typeof value === 'string' ? value : value.value;\n });\n } else if (typeof condition === 'string' || typeof condition === 'number') {\n const conditionKey = generateRandomString();\n replacements[conditionKey] = condition;\n } else if (condition?.operator) {\n const operatorKey = generateRandomString();\n replacements[operatorKey] = condition.value;\n }\n });\n\n return replacements;\n};\n\n/**\n * Generates replacements for the given order array.\n *\n * @param order - The order array to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateOrderReplacements = (order: string[]): Record<string, string> => {\n const replacementMap = {};\n order.forEach((o) => {\n if (o.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n } else if (o.substring(1).startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.substring(1).split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n }\n });\n return replacementMap;\n};\n\n/**\n * Creates a combined replacement map from order and query.\n *\n * @param order - The order array.\n * @param query - The query object.\n * @returns The combined replacements object.\n */\nconst createReplacementMap = (order: string[], query: Record<string, ConditionValue>): Record<string, string> => ({\n ...generateOrderReplacements(order),\n ...generateFilterReplacements(query),\n});\n\nconst formatOrder = ({\n order,\n associationModels = [],\n replacementsMap = {},\n}: { order: string[]; associationModels?: string[]; replacementsMap?: Record<string, string>; }): {\n formattedOrders: SequelizeOrder[];\n orderScopes: (string | { method: [string, { replacementsMap: Record<string, string>; scopeValue: Record<string, 'DESC' | 'ASC'>; }] })[];\n replacementsMap: Record<string, string>;\n} => {\n const formattedOrders = [];\n const orderScopesMap = new Map<string, Record<string, 'DESC' | 'ASC'>>();\n order.forEach((o: string) => {\n if ([o, o.substring(1)].some((t) => t.startsWith(CUSTOM_FIELDS_QUERY_PREFIX))) {\n if (!orderScopesMap.has(CUSTOM_FIELDS_SORT_SCOPE)) {\n orderScopesMap.set(CUSTOM_FIELDS_SORT_SCOPE, {});\n }\n const scopeKey = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n orderScopesMap.get(CUSTOM_FIELDS_SORT_SCOPE)[scopeKey] = (isOrderDesc(o) ? DESCENDING_KEY : ASCENDING_KEY);\n return;\n }\n const formattedOrder = [extractAttributeNameFromOrder(o, associationModels)];\n const isOrderDescOrder = isOrderDesc(o);\n const isOrderAssociation = isAttributeByAssociation(isOrderDescOrder\n ? o.split(ORDER_PREFIX)[1]\n : o, associationModels);\n if (isOrderAssociation) {\n formattedOrder.push(extractAssociatedAttributeNameFromOrder(o));\n }\n if (isOrderDescOrder) {\n formattedOrder.push(DESCENDING_KEY);\n }\n formattedOrders.push(formattedOrder);\n });\n return {\n formattedOrders,\n replacementsMap,\n orderScopes: Array.from(orderScopesMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n }),\n };\n};\n\nconst formatPage = (page?: number) => page || PAGE_DEFAULT;\n\nconst formatPerPage = (perPage?: number) => perPage || PER_PAGE_DEFAULT;\n\ninterface Include {\n association?: string;\n model?: string;\n required?: boolean;\n include?: Include[];\n}\n\nconst formatInclude = (include: (string | Include)[], associationsMap = {}) => {\n let formattedInclude = include.map((i) => {\n const includedAssociation = associationsMap[typeof i === 'string' ? i : (i.association || i.model)];\n return {\n ...(typeof i !== 'string' && i),\n association: includedAssociation,\n required: typeof i === 'string' || i.required !== false,\n ...(typeof i !== 'string' && i.include && {\n include: formatInclude(i.include, includedAssociation?.target?.associations),\n }),\n };\n });\n formattedInclude = formattedInclude.map(({ model: _model, ...i }) => i);\n return formattedInclude;\n};\nconst formatQuery = (query, associationModels, replacementsMap: Record<string, string>, additionalAllowedAttributes: string[] = []) => {\n const formattedQuery: Record<string, unknown> = {};\n const externalQueryValues: Record<string, unknown> = {};\n const formattedScopeMap = new Map<string, any>();\n\n Object.entries(query).forEach(([queryItemKey, queryItemValue]) => {\n if (queryItemKey.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n if (!formattedScopeMap.has(CUSTOM_FIELDS_FILTER_SCOPE)) {\n formattedScopeMap.set(CUSTOM_FIELDS_FILTER_SCOPE, {});\n }\n const scopeKey = queryItemKey.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n formattedScopeMap.get(CUSTOM_FIELDS_FILTER_SCOPE)[scopeKey] = parseCustomFieldScopeQueryValue(queryItemValue);\n return;\n }\n if (additionalAllowedAttributes.includes(queryItemKey)) {\n externalQueryValues[queryItemKey] = queryItemValue;\n return;\n }\n const key = isAttributeByAssociation(queryItemKey, associationModels)\n ? wrapAttributeWithOperator(queryItemKey)\n : queryItemKey;\n formattedQuery[key] = queryItemValue;\n });\n\n const formattedScopes = Array.from(formattedScopeMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n });\n\n return {\n formattedQuery,\n externalQueryValues,\n formattedScopes,\n };\n};\n\nconst formatSearchTerm = (searchTerm: string, attributesToSend: string[], rawAttributes) => ({\n $and: searchTerm.split(' ').map((term) => ({\n $or: attributesToSend.filter((attrKey) => rawAttributes[attrKey].type.key === 'STRING').map((attr) => ({\n [attr]: {\n $iLike: `%${term}%`,\n },\n })),\n })),\n});\n\nconst formatPayload = ({\n order = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n include = [],\n query = {},\n attributes = null,\n searchTerm = null,\n jsonAttributes = {},\n}, model?, options?: FormatPayloadOptions) => {\n const replacementsMap = createReplacementMap(order, query);\n const associationModels = Object.keys(model?.associations || {});\n const { formattedOrders, orderScopes } = formatOrder({\n order: [...order, DEFAULT_ORDER],\n associationModels,\n replacementsMap,\n });\n const [filteredFormattedOrder, filteredLiteralAttributes] = getAttributeFromOrder(\n formattedOrders,\n options,\n );\n\n const allAttributes = [...filteredLiteralAttributes, ...(attributes || [])];\n const formattedAttribute = attributes?.length ? allAttributes : { include: allAttributes };\n const formattedInclude = formatInclude(include, model?.associations);\n const formattedPage = formatPage(page);\n const formattedPerPage = formatPerPage(perPage);\n const result = formatQuery(query, associationModels, replacementsMap, options?.additionalAllowedAttributes);\n const { formattedScopes: queryScopes, externalQueryValues } = result;\n let { formattedQuery } = result;\n\n if (searchTerm && !options?.skipSearchTermFormat) {\n const attributesToSend = attributes?.length ? attributes : Object.keys(model.rawAttributes);\n const queryWithSearchTerm = formatSearchTerm(searchTerm, attributesToSend, model.rawAttributes);\n formattedQuery = !formattedQuery || Object.keys(formattedQuery).length === 0 ? queryWithSearchTerm : {\n $and: [\n formattedQuery,\n queryWithSearchTerm,\n ],\n };\n }\n\n // compare json attributes to model\n // this is the structure\n // jsonAttributes: Joi.object({\n // select: Joi.array().items(\n // Joi.object({\n // columnName: Joi.string().required(),\n // keys: Joi.array().items(Joi.string().required()).required(),\n // }),\n // ).default([]),\n // computed: Joi.array().items(\n // Joi.object({\n // type: Joi.string().valid('length').required(),\n // path: Joi.string().required(),\n // alias: Joi.string().required(),\n // }),\n // ).default([]),\n // }).default({}),\n // for each columnName or for path(take only the first field before the .) check if it's a valid col form the model\n\n return {\n jsonAttributes,\n query: formattedQuery,\n order: filteredFormattedOrder,\n page: formattedPage,\n perPage: formattedPerPage,\n include: formattedInclude,\n scopes: [...queryScopes, ...orderScopes],\n ...(formattedAttribute && { attributes: formattedAttribute }),\n ...(Object.keys(externalQueryValues).length > 0 && { externalQueryValues }),\n };\n};\n\nexport default formatPayload;\n","import {\n ORDER_PREFIX,\n extractAttributeNameFromOrder,\n isOrderDesc,\n throwBadRequestError,\n PAGE_DEFAULT,\n PER_PAGE_DEFAULT,\n PAGE_MIN,\n PER_PAGE_MAX_LIMIT,\n PER_PAGE_MIN_LIMIT,\n isAttributeByAssociation,\n ASSOCIATION_PREFIX,\n ASSOCIATION_PATH_WRAPPER,\n} from '../utils';\nimport { OPERATORS, OPERATOR_PREFIX } from '../operators';\nimport type { MiddlewareValidationOption } from '../middleware';\n\nconst validateOperator = (operator: string): boolean => OPERATORS.includes(operator.split(OPERATOR_PREFIX)[1]);\n\nconst validateQueryAttribute = (\n rawAttribute: string,\n modelAttributes: string[] = [],\n associationModels: string[] = [],\n additionalAllowedAttributes: string[] = [],\n): boolean => {\n const attribute = (rawAttribute.startsWith(\n ASSOCIATION_PATH_WRAPPER,\n ) && rawAttribute.endsWith(\n ASSOCIATION_PATH_WRAPPER,\n )) ? rawAttribute.slice(1, -1) : rawAttribute;\n return [...modelAttributes, ...associationModels].includes(attribute.includes(ASSOCIATION_PREFIX)\n ? attribute.split(ASSOCIATION_PREFIX)[0] : attribute)\n || additionalAllowedAttributes.includes(attribute);\n};\n\nconst validateSingleOrder = (\n currentOrder: string,\n rawAttributes: string[],\n associationModels: string[],\n options: MiddlewareValidationOption = {},\n): void => {\n const isOrderDescOrder = isOrderDesc(currentOrder);\n if (isOrderDescOrder && currentOrder[0] !== ORDER_PREFIX) {\n throwBadRequestError(`${ORDER_PREFIX} must be only at the beginning of the word`);\n }\n const orderStringWithoutDesc = isOrderDescOrder ? currentOrder.split(ORDER_PREFIX)[1] : currentOrder;\n const isOrderAssociation = isAttributeByAssociation(orderStringWithoutDesc, associationModels);\n let formattedOrderString = extractAttributeNameFromOrder(currentOrder, associationModels);\n const isLiteralAttribute = options?.literalAttributes?.map((la) => la.attribute)?.includes(orderStringWithoutDesc);\n\n if (!isOrderAssociation && formattedOrderString.includes(ASSOCIATION_PREFIX)) {\n [formattedOrderString] = formattedOrderString.split(ASSOCIATION_PREFIX);\n }\n\n if (!(rawAttributes.includes(formattedOrderString) || isOrderAssociation || isLiteralAttribute)) {\n throwBadRequestError(`${currentOrder} is invalid. isLiteralAttribute: ${isLiteralAttribute}`);\n }\n};\n\nconst validateSingleAttribute = (currentAttribute: string, rawAttributes: string[]): void => {\n if (!rawAttributes.includes(currentAttribute)) {\n throwBadRequestError(`${currentAttribute} is invalid`);\n }\n};\n\nconst validateOrderAttributes = (\n order: string[],\n rawAttributes: string[],\n associationModels: string[] = [],\n options: MiddlewareValidationOption = {},\n): void => {\n order.forEach((o) => validateSingleOrder(o, rawAttributes, associationModels, options));\n};\n\nconst validateAttributes = (attributes: string[], rawAttributes: string[]): void => {\n attributes.forEach((a) => validateSingleAttribute(a, rawAttributes));\n};\n\ninterface JsonAttributes {\n select?: { columnName: string; keys: string[] }[];\n computed?: { type: string; path: string; alias: string }[];\n}\n\nconst validateJasonAttributes = (jsonAttributes: JsonAttributes, rawAttributes: string[]): void => {\n const { select = [], computed = [] } = jsonAttributes;\n const selectAttributes = select.map((s) => s.columnName) || [];\n const computedAttributes = computed.map((c) => c.path.split('.')[0]) || [];\n const allFields = [...selectAttributes, ...computedAttributes];\n\n validateAttributes(allFields, rawAttributes);\n};\n\nconst validateEnrichments = (enrichments: string[] | { [enrichmentName: string]: { exclude?: string[]; } }, options?: MiddlewareValidationOption): void => {\n const enrichmentKeys = Array.isArray(enrichments) ? enrichments : Object.keys(enrichments);\n if (!enrichmentKeys?.length) { return; }\n const invalidEnrichment = enrichmentKeys.find((enrichment) => !options?.enrichmentAttributes?.includes(enrichment));\n if (invalidEnrichment) {\n throwBadRequestError(`enrichment attribute ${invalidEnrichment} is invalid`);\n }\n};\n\nconst validateQueryPayload = (query, rawAttributes: string[], associationModels: string[] = [], additionalAllowedAttributes: string[] = []): void => {\n Object.entries(query).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n if (value[0] && typeof value[0] === 'object') {\n value.map((v) => validateQueryPayload(v, rawAttributes, associationModels, additionalAllowedAttributes));\n }\n } else if (validateOperator(key) || validateQueryAttribute(key, rawAttributes, associationModels, additionalAllowedAttributes)) {\n if (value && typeof value === 'object') {\n validateQueryPayload(value, rawAttributes, [], additionalAllowedAttributes);\n }\n } else {\n throwBadRequestError(`invalid key: ${key}`);\n }\n });\n};\n\nconst validatePagination = ({\n page,\n perPage,\n}) => {\n if (page < PAGE_MIN) {\n throwBadRequestError('Page must be greater than 0');\n }\n\n if (perPage > PER_PAGE_MAX_LIMIT || perPage < PER_PAGE_MIN_LIMIT) {\n throwBadRequestError(`PerPage must be between ${PER_PAGE_MIN_LIMIT} to ${PER_PAGE_MAX_LIMIT}`);\n }\n};\n\nconst validateIncludePayload = (include, associations): void => {\n const associationsKeys = Object.keys(associations);\n include.forEach((i) => {\n validateQueryAttribute(i.model, associationsKeys);\n const target = associations[i.model]?.target;\n if (!target) {\n throwBadRequestError('model not found in associations');\n }\n\n const { rawAttributes } = target;\n const attributeKeys = Object.keys(rawAttributes);\n if (i.where) {\n validateQueryPayload(i.where, attributeKeys);\n }\n if (i.order) {\n validateOrderAttributes(i.order, attributeKeys);\n }\n if (i.attributes) {\n validateAttributes(i.attributes, attributeKeys);\n }\n if (![null, undefined, true, false].includes(i.required)) {\n throwBadRequestError('include.required must be a boolean');\n }\n });\n};\n\nexport const validatePayload = (\n {\n query = {},\n order = [],\n attributes = [],\n include = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n enrichments = [],\n group = [],\n jsonAttributes = {},\n },\n model?,\n options: MiddlewareValidationOption = {},\n): boolean => {\n const rawAttributes = Object.keys(model.rawAttributes);\n const associationModels = Object.keys(model?.associations || {});\n if (!attributes || attributes.length === 0) {\n // eslint-disable-next-line no-param-reassign\n attributes = rawAttributes;\n } else {\n validateAttributes(attributes, rawAttributes);\n }\n\n validateOrderAttributes(order, rawAttributes, associationModels, options);\n validateQueryPayload(query, rawAttributes, associationModels, options.additionalAllowedAttributes);\n validateEnrichments(enrichments, options);\n validateJasonAttributes(jsonAttributes, rawAttributes);\n\n if (!Array.isArray(group)) {\n throwBadRequestError('group must be an array');\n }\n if (include.length && typeof include === 'object') {\n validateIncludePayload(include, model?.associations);\n } else if (include && typeof include !== 'object') {\n throwBadRequestError('include must be an array');\n }\n\n validatePagination({\n page,\n perPage,\n });\n return true;\n};\n","import type { Handler } from 'express';\nimport Logger, { type LoggerInstanceManager } from '@autofleet/logger';\nimport { BadRequest, handleError } from '@autofleet/errors';\nimport Joi from 'joi';\nimport formatPayload, { type FormatPayloadOptions } from '../formatter';\nimport { validatePayload } from '../validations';\n\nconst {\n object, string, number, any, array, alternatives,\n} = Joi.types();\nconst fallbackLogger = Logger();\n\nconst querySchema = object.keys({\n query: object,\n attributes: array.items(string),\n order: array.items(string),\n page: number,\n perPage: number,\n include: array.items(any),\n searchTerm: string,\n group: array.items(string),\n enrichments: alternatives.try(array.items(string), object.pattern(string, { exclude: array.items(string) })),\n jsonAttributes: Joi.object({\n select: Joi.array().items(\n Joi.object({\n columnName: Joi.string().required(),\n keys: Joi.array().items(Joi.string().required()).required(),\n }),\n ).default([]),\n computed: Joi.array().items(\n Joi.object({\n type: Joi.string().valid('length').required(),\n path: Joi.string().required(),\n alias: Joi.string().required(),\n }),\n ).default([]),\n }).default({}),\n});\n\ntype literal = any;\ntype LiteralQuery = (literal | string)[] | literal;\nexport type LiteralAttribute = { attribute: string; literal: LiteralQuery };\nexport type MiddlewareValidationOption = {\n literalAttributes?: LiteralAttribute[];\n enrichmentAttributes?: string[];\n additionalAllowedAttributes?: string[];\n logger?: LoggerInstanceManager;\n};\n\ntype ReqKeys = 'body' | 'query';\n\nexport const queryValidation = (model: any, data: any, options: MiddlewareValidationOption = {}) => {\n const {\n query,\n attributes,\n order,\n page,\n perPage,\n include,\n group,\n enrichments,\n jsonAttributes,\n } = data;\n\n const result = querySchema.validate(data);\n if (result.error) {\n throw new BadRequest([result.error], null);\n }\n validatePayload({\n query,\n attributes,\n order,\n page,\n perPage,\n include,\n enrichments,\n group,\n jsonAttributes,\n }, model, options);\n};\n\n/** consider using @see {@link queryHandler} directly */\nexport const queryValidationMiddleware = (model: any, options: MiddlewareValidationOption = {}, inner: ReqKeys = 'body'): Handler => async (req, res, next): Promise<void> => {\n try {\n queryValidation(model, req[inner], options);\n next();\n } catch (error) {\n const { query, attributes, order } = req[inner];\n handleError(error, res, {\n logger: options.logger || fallbackLogger,\n message: 'error in query middleware',\n payload: {\n error,\n query,\n attributes,\n order,\n },\n });\n }\n};\n\nexport const queryFormat = (model: any, data: any, options: FormatPayloadOptions = {}) => {\n const {\n order,\n page,\n perPage,\n include,\n query,\n attributes,\n searchTerm,\n jsonAttributes,\n } = data;\n\n const {\n query: formattedQuery,\n externalQueryValues,\n order: formattedOrder,\n page: formattedPage,\n perPage: formattedPerPage,\n include: formattedInclude,\n scopes: formattedScopes,\n attributes: formattedAttribute,\n jsonAttributes: formattedJsonAttributes,\n } = formatPayload({\n query,\n order,\n page,\n perPage,\n include,\n attributes,\n searchTerm,\n jsonAttributes,\n }, model, options);\n\n /* eslint-disable no-param-reassign */\n data.query = formattedQuery;\n data.externalQueryValues = externalQueryValues;\n data.order = formattedOrder;\n data.jsonAttributes = formattedJsonAttributes;\n data.attributes = formattedAttribute;\n data.page = formattedPage;\n data.perPage = formattedPerPage;\n data.include = formattedInclude;\n data.scopes = formattedScopes;\n if (options.includeRawPayload) {\n data.rawPayload = {\n order,\n page,\n perPage,\n include,\n query,\n attributes,\n searchTerm,\n };\n }\n /* eslint-enable no-param-reassign */\n};\n\n/** consider using @see {@link queryHandler} directly */\nexport const queryFormatMiddleware = (model: any, options: FormatPayloadOptions = {}, inner: ReqKeys = 'body'): Handler => async (req, res, next): Promise<void> => {\n queryFormat(model, req[inner], options);\n next();\n};\n","import type { Handler } from 'express';\nimport { type LoggerInstanceManager } from '@autofleet/logger';\nimport { UnexpectedError, handleError } from '@autofleet/errors';\nimport formatPayload, { type FormatPayloadOptions } from '../formatter';\nimport { pick } from '../utils';\nimport { type MiddlewareValidationOption, queryFormat, queryValidation } from '../middleware';\n\ninterface QueryValues extends ReturnType<typeof formatPayload> {\n enrichments?: string[] | Record<string, { exclude: string[] }>;\n distinct: boolean;\n}\n\ninterface QueryHandlerOptions {\n /** The sequelize model too which querying abilities are added. */\n model: any;\n /** Optional settings for validation. */\n validationOptions?: Omit<MiddlewareValidationOption, 'logger'>;\n /** Optional settings for payload formatting */\n formatOptions?: FormatPayloadOptions;\n logger: LoggerInstanceManager;\n /** The name of model to be printed in logs. defaults to `model`s constructor name. */\n modelName?: string;\n /** Sequelize scopes of the model to be used within the query. @example ['userScope'] */\n additionalScopes?: string[];\n /** Callback to allow modifying the query values prior to querying the DB */\n modifyQueryValues?: (queryValues: QueryValues) => QueryValues;\n /** Optional callback to modify endpoint's response based on the DBs response. */\n onRowsRetrieved?: (data: { rows: any[]; count: number; }, queryValues: QueryValues) => any;\n}\n\nexport const queryHandler = ({\n model, logger, validationOptions, formatOptions, modelName = model.constructor?.name, additionalScopes = [], modifyQueryValues, onRowsRetrieved,\n}: QueryHandlerOptions): Handler => async (req, res) => {\n try {\n queryValidation(model, req.body, { ...validationOptions, logger });\n } catch (error) {\n const payload = pick(req.body as QueryValues, ['query', 'order', 'attributes'] as const);\n handleError(error, res, { logger, message: 'error in query endpoint', payload });\n return;\n }\n try {\n queryFormat(model, req.body, formatOptions);\n\n const queryValues = Object.assign(\n pick(req.body as QueryValues, ['query', 'externalQueryValues', 'order', 'attributes', 'page', 'perPage', 'include', 'scopes', 'enrichments', 'jsonAttributes'] as const),\n { distinct: true },\n );\n\n logger.info(`querying ${modelName}`, { queryValues });\n\n const modifiedQuery = modifyQueryValues?.(queryValues) ?? queryValues;\n const {\n scopes = [],\n query: where,\n perPage: limit,\n page,\n enrichments: _enrichments,\n externalQueryValues: _externalQueryValues,\n ...rest\n } = modifiedQuery;\n\n const result = await model.scope([...additionalScopes, ...scopes]).findAndCountAll({\n where,\n limit,\n offset: (page - 1) * limit,\n ...rest,\n });\n\n if (!result.rows.length || !onRowsRetrieved) {\n res.json(result);\n return;\n }\n\n const enrichmentResult = await onRowsRetrieved(result, modifiedQuery);\n\n res.json(enrichmentResult);\n } catch (error) {\n handleError(new UnexpectedError(error), res, { logger, message: `Error while querying ${modelName}`, payload: { query: req.body } });\n }\n};\n"]}
|
package/lib/index.d.cts
CHANGED
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import jt from'@autofleet/logger';import {handleError,UnexpectedError,BadRequest}from'@autofleet/errors';import
|
|
1
|
+
import jt from'@autofleet/logger';import {handleError,UnexpectedError,BadRequest}from'@autofleet/errors';import m from'joi';import {customFields}from'@autofleet/common-types';var k=["eq","ne","gte","gt","lte","lt","not","in","notIn","is","like","iLike","notLike","between","and","or","overlap","contains"],E="$",Y={$eq:"=",$ne:"!=",$gte:">=",$gt:">",$lte:"<=",$lt:"<",$not:"NOT",$in:"IN",$notIn:"NOT IN",$is:"IS",$like:"LIKE",$iLike:"ILIKE",$notLike:"NOT LIKE",$and:"AND",$or:"OR"},pt=t=>{let{Op:e}=t;return k.reduce((o,r)=>(o[`${E+r}`]=e[r],o),{})};var gt=t=>Math.floor(Math.random()*Math.floor(t)),y="-",f=".",D="$",M=20,q=1,Q=100,v=1,Z=1,tt=t=>`${E}${t}${E}`,R=(t,e)=>t.includes(f)&&e.includes(t.split(f)[0]),$=(t,e)=>{let o=t;return t.includes(y)&&(o=o.split(y)[1]),R(o,e)&&([o]=o.split(f)),o},L=t=>t.includes(y),p=t=>{throw new BadRequest([new Error(t)])},et=t=>t.split(f)[1],O=(t=5)=>{let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";return Array.from({length:t},()=>e.charAt(gt(e.length))).join("")},C=(t,e)=>Object.fromEntries(e.map(o=>[o,t[o]]));var ft="id",rt="DESC",bt="ASC",b="customFields.",{CUSTOM_FIELDS_FILTER_SCOPE:N,CUSTOM_FIELDS_SORT_SCOPE:G}=customFields,At=t=>["string","number"].includes(typeof t)||Array.isArray(t)?t:Object.entries(t).map(([e,o])=>({operator:Y[e],value:o})),Ot=(t,e={})=>{let{literalAttributes:o=[],DBFormatter:r=void 0}=e,[n,i]=t.reduce((s,c)=>{let[a,d="ASC"]=Array.isArray(c)?c:[c],l=o?.find(u=>u.attribute===a);return l?(s[1].push(l.literal),s[0].push([r?r(`"${l.attribute}" ${d}`):`${l.attribute} ${d}`])):s[0].push(c),s},[[],[]]);return [n,i]},ot=t=>{let e={};return Object.entries(t).forEach(([o,r])=>{let n=O();if(e[n]=o.split(b)[1],Array.isArray(r))r.forEach(i=>{let s=O();e[s]=typeof i=="string"?i:i.value;});else if(typeof r=="string"||typeof r=="number"){let i=O();e[i]=r;}else if(r?.operator){let i=O();e[i]=r.value;}}),e},Pt=t=>{let e={};return t.forEach(o=>{if(o.startsWith(b)){let r=O();e[r]=o.split(b)[1];}else if(o.substring(1).startsWith(b)){let r=O();e[r]=o.substring(1).split(b)[1];}}),e},ht=(t,e)=>({...Pt(t),...ot(e)}),Et=({order:t,associationModels:e=[],replacementsMap:o={}})=>{let r=[],n=new Map;return t.forEach(i=>{if([i,i.substring(1)].some(d=>d.startsWith(b))){n.has(G)||n.set(G,{});let d=i.split(b)[1];n.get(G)[d]=L(i)?rt:bt;return}let s=[$(i,e)],c=L(i);R(c?i.split(y)[1]:i,e)&&s.push(et(i)),c&&s.push(rt),r.push(s);}),{formattedOrders:r,replacementsMap:o,orderScopes:Array.from(n.entries()).map(([i,s])=>s?{method:[i,{replacementsMap:o,scopeValue:s}]}:i)}},Rt=t=>t||q,St=t=>t||M,it=(t,e={})=>{let o=t.map(r=>{let n=e[typeof r=="string"?r:r.association||r.model];return {...typeof r!="string"&&r,association:n,required:typeof r=="string"||r.required!==false,...typeof r!="string"&&r.include&&{include:it(r.include,n?.target?.associations)}}});return o=o.map(({model:r,...n})=>n),o},xt=(t,e,o,r=[])=>{let n={},i={},s=new Map;Object.entries(t).forEach(([a,d])=>{if(a.startsWith(b)){s.has(N)||s.set(N,{});let u=a.split(b)[1];s.get(N)[u]=At(d);return}if(r.includes(a)){i[a]=d;return}let l=R(a,e)?tt(a):a;n[l]=d;});let c=Array.from(s.entries()).map(([a,d])=>d?{method:[a,{replacementsMap:o,scopeValue:d}]}:a);return {formattedQuery:n,externalQueryValues:i,formattedScopes:c}},_t=(t,e,o)=>({$and:t.split(" ").map(r=>({$or:e.filter(n=>o[n].type.key==="STRING").map(n=>({[n]:{$iLike:`%${r}%`}}))}))}),It=({order:t=[],page:e=q,perPage:o=M,include:r=[],query:n={},attributes:i=null,searchTerm:s=null,jsonAttributes:c={}},a,d)=>{let l=ht(t,n),u=Object.keys(a?.associations||{}),{formattedOrders:g,orderScopes:x}=Et({order:[...t,ft],associationModels:u,replacementsMap:l}),[h,_]=Ot(g,d),I=[..._,...i||[]],F=i?.length?I:{include:I},w=it(r,a?.associations),A=Rt(e),V=St(o),B=xt(n,u,l,d?.additionalAllowedAttributes),{formattedScopes:lt,externalQueryValues:J}=B,{formattedQuery:T}=B;if(s&&!d?.skipSearchTermFormat){let ut=i?.length?i:Object.keys(a.rawAttributes),z=_t(s,ut,a.rawAttributes);T=!T||Object.keys(T).length===0?z:{$and:[T,z]};}return {jsonAttributes:c,query:T,order:h,page:A,perPage:V,include:w,scopes:[...lt,...x],...F&&{attributes:F},...Object.keys(J).length>0&&{externalQueryValues:J}}},nt=It;var Ft=t=>k.includes(t.split(E)[1]),st=(t,e=[],o=[],r=[])=>{let n=t.startsWith(D)&&t.endsWith(D)?t.slice(1,-1):t;return [...e,...o].includes(n.includes(f)?n.split(f)[0]:n)||r.includes(n)},wt=(t,e,o,r={})=>{let n=L(t);n&&t[0]!==y&&p(`${y} must be only at the beginning of the word`);let i=n?t.split(y)[1]:t,s=R(i,o),c=$(t,o),a=r?.literalAttributes?.map(d=>d.attribute)?.includes(i);!s&&c.includes(f)&&([c]=c.split(f)),e.includes(c)||s||a||p(`${t} is invalid. isLiteralAttribute: ${a}`);},Tt=(t,e)=>{e.includes(t)||p(`${t} is invalid`);},at=(t,e,o=[],r={})=>{t.forEach(n=>wt(n,e,o,r));},K=(t,e)=>{t.forEach(o=>Tt(o,e));},Mt=(t,e)=>{let{select:o=[],computed:r=[]}=t,n=o.map(c=>c.columnName)||[],i=r.map(c=>c.path.split(".")[0])||[],s=[...n,...i];K(s,e);},qt=(t,e)=>{let o=Array.isArray(t)?t:Object.keys(t);if(!o?.length)return;let r=o.find(n=>!e?.enrichmentAttributes?.includes(n));r&&p(`enrichment attribute ${r} is invalid`);},j=(t,e,o=[],r=[])=>{Object.entries(t).forEach(([n,i])=>{Array.isArray(i)?i[0]&&typeof i[0]=="object"&&i.map(s=>j(s,e,o,r)):Ft(n)||st(n,e,o,r)?i&&typeof i=="object"&&j(i,e,[],r):p(`invalid key: ${n}`);});},Lt=({page:t,perPage:e})=>{t<Z&&p("Page must be greater than 0"),(e>Q||e<v)&&p(`PerPage must be between ${v} to ${Q}`);},$t=(t,e)=>{let o=Object.keys(e);t.forEach(r=>{st(r.model,o);let n=e[r.model]?.target;n||p("model not found in associations");let{rawAttributes:i}=n,s=Object.keys(i);r.where&&j(r.where,s),r.order&&at(r.order,s),r.attributes&&K(r.attributes,s),[null,void 0,true,false].includes(r.required)||p("include.required must be a boolean");});},W=({query:t={},order:e=[],attributes:o=[],include:r=[],page:n=q,perPage:i=M,enrichments:s=[],group:c=[],jsonAttributes:a={}},d,l={})=>{let u=Object.keys(d.rawAttributes),g=Object.keys(d?.associations||{});return !o||o.length===0?o=u:K(o,u),at(e,u,g,l),j(t,u,g,l.additionalAllowedAttributes),qt(s,l),Mt(a,u),Array.isArray(c)||p("group must be an array"),r.length&&typeof r=="object"?$t(r,d?.associations):r&&typeof r!="object"&&p("include must be an array"),Lt({page:n,perPage:i}),true};var {object:U,string:P,number:dt,any:Dt,array:S,alternatives:Qt}=m.types(),vt=jt(),Ct=U.keys({query:U,attributes:S.items(P),order:S.items(P),page:dt,perPage:dt,include:S.items(Dt),searchTerm:P,group:S.items(P),enrichments:Qt.try(S.items(P),U.pattern(P,{exclude:S.items(P)})),jsonAttributes:m.object({select:m.array().items(m.object({columnName:m.string().required(),keys:m.array().items(m.string().required()).required()})).default([]),computed:m.array().items(m.object({type:m.string().valid("length").required(),path:m.string().required(),alias:m.string().required()})).default([])}).default({})}),H=(t,e,o={})=>{let{query:r,attributes:n,order:i,page:s,perPage:c,include:a,group:d,enrichments:l,jsonAttributes:u}=e,g=Ct.validate(e);if(g.error)throw new BadRequest([g.error],null);W({query:r,attributes:n,order:i,page:s,perPage:c,include:a,enrichments:l,group:d,jsonAttributes:u},t,o);},Nt=(t,e={},o="body")=>async(r,n,i)=>{try{H(t,r[o],e),i();}catch(s){let{query:c,attributes:a,order:d}=r[o];handleError(s,n,{logger:e.logger||vt,message:"error in query middleware",payload:{error:s,query:c,attributes:a,order:d}});}},X=(t,e,o={})=>{let{order:r,page:n,perPage:i,include:s,query:c,attributes:a,searchTerm:d,jsonAttributes:l}=e,{query:u,externalQueryValues:g,order:x,page:h,perPage:_,include:I,scopes:F,attributes:w,jsonAttributes:A}=nt({query:c,order:r,page:n,perPage:i,include:s,attributes:a,searchTerm:d,jsonAttributes:l},t,o);e.query=u,e.externalQueryValues=g,e.order=x,e.jsonAttributes=A,e.attributes=w,e.page=h,e.perPage=_,e.include=I,e.scopes=F,o.includeRawPayload&&(e.rawPayload={order:r,page:n,perPage:i,include:s,query:c,attributes:a,searchTerm:d});},Gt=(t,e={},o="body")=>async(r,n,i)=>{X(t,r[o],e),i();};var Wt=({model:t,logger:e,validationOptions:o,formatOptions:r,modelName:n=t.constructor?.name,additionalScopes:i=[],modifyQueryValues:s,onRowsRetrieved:c})=>async(a,d)=>{try{H(t,a.body,{...o,logger:e});}catch(l){let u=C(a.body,["query","order","attributes"]);handleError(l,d,{logger:e,message:"error in query endpoint",payload:u});return}try{X(t,a.body,r);let l=Object.assign(C(a.body,["query","externalQueryValues","order","attributes","page","perPage","include","scopes","enrichments","jsonAttributes"]),{distinct:!0});e.info(`querying ${n}`,{queryValues:l});let u=s?.(l)??l,{scopes:g=[],query:x,perPage:h,page:_,enrichments:I,externalQueryValues:F,...w}=u,A=await t.scope([...i,...g]).findAndCountAll({where:x,limit:h,offset:(_-1)*h,...w});if(!A.rows.length||!c){d.json(A);return}let V=await c(A,u);d.json(V);}catch(l){handleError(new UnexpectedError(l),d,{logger:e,message:`Error while querying ${n}`,payload:{query:a.body}});}};export{pt as formatOperators,ot as generateFilterReplacements,Gt as queryFormatMiddleware,Wt as queryHandler,Nt as queryValidationMiddleware,W as validatePayload};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/operators/index.ts","../src/utils.ts","../src/formatter/index.ts","../src/validations/index.ts","../src/middleware/index.ts","../src/handler/index.ts"],"names":["OPERATORS","OPERATOR_PREFIX","OPERATORS_TO_SQL","formatOperators","Sequelize","Op","map","o","randomInt","max","ORDER_PREFIX","ASSOCIATION_PREFIX","ASSOCIATION_PATH_WRAPPER","PER_PAGE_DEFAULT","PAGE_DEFAULT","PER_PAGE_MAX_LIMIT","PER_PAGE_MIN_LIMIT","PAGE_MIN","wrapAttributeWithOperator","attribute","isAttributeByAssociation","attributeName","associatedModels","extractAttributeNameFromOrder","order","associationModels","formattedOrder","isOrderDesc","throwBadRequestError","message","BadRequest","extractAssociatedAttributeNameFromOrder","generateRandomString","length","characters","pick","obj","keys","key","DEFAULT_ORDER","DESCENDING_KEY","ASCENDING_KEY","CUSTOM_FIELDS_QUERY_PREFIX","CUSTOM_FIELDS_FILTER_SCOPE","CUSTOM_FIELDS_SORT_SCOPE","customFields","parseCustomFieldScopeQueryValue","value","operator","conditionValue","getAttributeFromOrder","options","literalAttributes","DBFormatter","attributes","acc","item","orderStyle","found","generateFilterReplacements","conditions","replacements","condition","replacementKey","valueKey","conditionKey","operatorKey","generateOrderReplacements","replacementMap","rand","createReplacementMap","query","formatOrder","replacementsMap","formattedOrders","orderScopesMap","t","scopeKey","isOrderDescOrder","scopeName","scopeValue","formatPage","page","formatPerPage","perPage","formatInclude","include","associationsMap","formattedInclude","i","includedAssociation","_model","formatQuery","additionalAllowedAttributes","formattedQuery","externalQueryValues","formattedScopeMap","queryItemKey","queryItemValue","formattedScopes","formatSearchTerm","searchTerm","attributesToSend","rawAttributes","term","attrKey","attr","formatPayload","jsonAttributes","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","rawAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","validateJsonAttributes","s","c","validateEnrichments","enrichments","enrichmentKeys","invalidEnrichment","enrichment","validateQueryPayload","v","validatePagination","validateIncludePayload","associations","associationsKeys","target","attributeKeys","validatePayload","group","object","string","number","any","array","alternatives","Joi","fallbackLogger","Logger","jsonAttributeActions","querySchema","queryValidation","data","queryValidationMiddleware","inner","req","res","next","error","handleError","queryFormat","formattedJsonAttributes","queryFormatMiddleware","queryHandler","logger","validationOptions","formatOptions","modelName","additionalScopes","modifyQueryValues","onRowsRetrieved","payload","queryValues","modifiedQuery","scopes","where","limit","_enrichments","_externalQueryValues","rest","enrichmentResult","UnexpectedError"],"mappings":"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","file":"index.js","sourcesContent":["export const OPERATORS = [\n 'eq',\n 'ne',\n 'gte',\n 'gt',\n 'lte',\n 'lt',\n 'not',\n 'in',\n 'notIn',\n 'is',\n 'like',\n 'iLike',\n 'notLike',\n 'between',\n 'and',\n 'or',\n 'overlap',\n 'contains',\n];\n\nexport const OPERATOR_PREFIX = '$';\n\nexport const OPERATORS_TO_SQL = {\n $eq: '=',\n $ne: '!=',\n $gte: '>=',\n $gt: '>',\n $lte: '<=',\n $lt: '<',\n $not: 'NOT',\n $in: 'IN',\n $notIn: 'NOT IN',\n $is: 'IS',\n $like: 'LIKE',\n $iLike: 'ILIKE',\n $notLike: 'NOT LIKE',\n $and: 'AND',\n $or: 'OR',\n};\n\nexport const formatOperators = (Sequelize) => {\n const { Op } = Sequelize;\n return OPERATORS.reduce((map, o) => {\n // eslint-disable-next-line no-param-reassign\n map[`${OPERATOR_PREFIX + o}`] = Op[o];\n return map;\n }, {});\n};\n","import { BadRequest } from '@autofleet/errors';\nimport { OPERATOR_PREFIX } from './operators';\n\nconst randomInt = (max: number) => Math.floor(Math.random() * Math.floor(max));\n\nexport const ORDER_PREFIX = '-';\nexport const ASSOCIATION_PREFIX = '.';\nexport const ASSOCIATION_PATH_WRAPPER = '$';\nexport const PER_PAGE_DEFAULT = 20;\nexport const PAGE_DEFAULT = 1;\nexport const PER_PAGE_MAX_LIMIT = 100;\nexport const PER_PAGE_MIN_LIMIT = 1;\nexport const PAGE_MIN = 1;\n\nexport const wrapAttributeWithOperator = (attribute: string) => `${OPERATOR_PREFIX}${attribute}${OPERATOR_PREFIX}`;\nexport const isAttributeByAssociation = (attributeName: string, associatedModels: string[]): boolean => attributeName.includes(ASSOCIATION_PREFIX)\n && associatedModels.includes(attributeName.split(ASSOCIATION_PREFIX)[0]);\n\nexport const extractAttributeNameFromOrder = (order: string, associationModels: string[]): string => {\n let formattedOrder = order;\n if (order.includes(ORDER_PREFIX)) {\n // eslint-disable-next-line prefer-destructuring\n formattedOrder = formattedOrder.split(ORDER_PREFIX)[1];\n }\n if (isAttributeByAssociation(formattedOrder, associationModels)) {\n [formattedOrder] = formattedOrder.split(ASSOCIATION_PREFIX);\n }\n return formattedOrder;\n};\n\nexport const isOrderDesc = (order: string): boolean => order.includes(ORDER_PREFIX);\n\nexport const throwBadRequestError = (message: string) => {\n throw new BadRequest([new Error(message)]);\n};\n\nexport const extractAssociatedAttributeNameFromOrder = (order: string): string => order.split(ASSOCIATION_PREFIX)[1];\n\nexport const generateRandomString = (length = 5): string => {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n return Array.from({ length }, () => characters.charAt(randomInt(characters.length))).join('');\n};\n\nexport const pick = <T extends object, K extends keyof T = keyof T>(\n obj: T,\n keys: K[],\n): Pick<T, K> => Object.fromEntries(keys.map((key) => [key, obj[key]])) as Pick<T, K>;\n","import { customFields } from '@autofleet/common-types';\nimport {\n extractAssociatedAttributeNameFromOrder,\n extractAttributeNameFromOrder, generateRandomString,\n isAttributeByAssociation,\n isOrderDesc, ORDER_PREFIX,\n PAGE_DEFAULT,\n PER_PAGE_DEFAULT, wrapAttributeWithOperator,\n} from '../utils';\nimport type { LiteralAttribute } from '../middleware';\nimport { OPERATORS_TO_SQL } from '../operators';\n\nconst DEFAULT_ORDER = 'id';\nconst DESCENDING_KEY = 'DESC';\nconst ASCENDING_KEY = 'ASC';\nconst CUSTOM_FIELDS_QUERY_PREFIX = 'customFields.';\nconst { CUSTOM_FIELDS_FILTER_SCOPE, CUSTOM_FIELDS_SORT_SCOPE } = customFields;\ntype OrderItem = string | [string, string]\ntype SequelizeOrder = string | OrderItem[];\nexport type FormatPayloadOptions = {\n includeRawPayload?: boolean;\n literalAttributes?: LiteralAttribute[];\n DBFormatter?: any;\n skipSearchTermFormat?: boolean;\n additionalAllowedAttributes?: string[];\n};\n\ntype ConditionWithOperator = {\n operator: string;\n value: string;\n};\nexport type ConditionValue = ConditionWithOperator | ConditionWithOperator[] | string | string[];\n\nconst parseCustomFieldScopeQueryValue = (value) => {\n if (['string', 'number'].includes(typeof value) || Array.isArray(value)) {\n return value;\n }\n return Object.entries(value).map(([operator, conditionValue]) => ({\n operator: OPERATORS_TO_SQL[operator],\n value: conditionValue,\n }));\n};\n\nconst getAttributeFromOrder = (order: SequelizeOrder[], options: FormatPayloadOptions = {}): [SequelizeOrder[], SequelizeOrder[]] => {\n const { literalAttributes = [], DBFormatter = undefined } = options;\n const [formattedOrder, attributes] = order.reduce((acc, o) => {\n const [item, orderStyle = 'ASC'] = Array.isArray(o) ? o : [o];\n const found = literalAttributes?.find((obj) => obj.attribute === item);\n if (found) {\n acc[1].push(found.literal);\n acc[0].push([DBFormatter ? DBFormatter(`\"${found.attribute}\" ${orderStyle}`) : `${found.attribute} ${orderStyle}`]);\n } else {\n acc[0].push(o);\n }\n return acc;\n }, [[], []]);\n\n return [formattedOrder, attributes];\n};\n\n/**\n * Generates replacements for the given conditions.\n *\n * @param conditions - The conditions to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateFilterReplacements = (conditions: Record<string, ConditionValue>): Record<string, string> => {\n const replacements: Record<string, string> = {};\n\n Object.entries(conditions).forEach(([key, condition]) => {\n const replacementKey = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacements[replacementKey] = key.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n\n if (Array.isArray(condition)) {\n condition.forEach((value) => {\n const valueKey = generateRandomString();\n replacements[valueKey] = typeof value === 'string' ? value : value.value;\n });\n } else if (typeof condition === 'string' || typeof condition === 'number') {\n const conditionKey = generateRandomString();\n replacements[conditionKey] = condition;\n } else if (condition?.operator) {\n const operatorKey = generateRandomString();\n replacements[operatorKey] = condition.value;\n }\n });\n\n return replacements;\n};\n\n/**\n * Generates replacements for the given order array.\n *\n * @param order - The order array to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateOrderReplacements = (order: string[]): Record<string, string> => {\n const replacementMap = {};\n order.forEach((o) => {\n if (o.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n } else if (o.substring(1).startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.substring(1).split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n }\n });\n return replacementMap;\n};\n\n/**\n * Creates a combined replacement map from order and query.\n *\n * @param order - The order array.\n * @param query - The query object.\n * @returns The combined replacements object.\n */\nconst createReplacementMap = (order: string[], query: Record<string, ConditionValue>): Record<string, string> => ({\n ...generateOrderReplacements(order),\n ...generateFilterReplacements(query),\n});\n\nconst formatOrder = ({\n order,\n associationModels = [],\n replacementsMap = {},\n}: { order: string[]; associationModels?: string[]; replacementsMap?: Record<string, string>; }): {\n formattedOrders: SequelizeOrder[];\n orderScopes: (string | { method: [string, { replacementsMap: Record<string, string>; scopeValue: Record<string, 'DESC' | 'ASC'>; }] })[];\n replacementsMap: Record<string, string>;\n} => {\n const formattedOrders = [];\n const orderScopesMap = new Map<string, Record<string, 'DESC' | 'ASC'>>();\n order.forEach((o: string) => {\n if ([o, o.substring(1)].some((t) => t.startsWith(CUSTOM_FIELDS_QUERY_PREFIX))) {\n if (!orderScopesMap.has(CUSTOM_FIELDS_SORT_SCOPE)) {\n orderScopesMap.set(CUSTOM_FIELDS_SORT_SCOPE, {});\n }\n const scopeKey = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n orderScopesMap.get(CUSTOM_FIELDS_SORT_SCOPE)[scopeKey] = (isOrderDesc(o) ? DESCENDING_KEY : ASCENDING_KEY);\n return;\n }\n const formattedOrder = [extractAttributeNameFromOrder(o, associationModels)];\n const isOrderDescOrder = isOrderDesc(o);\n const isOrderAssociation = isAttributeByAssociation(isOrderDescOrder\n ? o.split(ORDER_PREFIX)[1]\n : o, associationModels);\n if (isOrderAssociation) {\n formattedOrder.push(extractAssociatedAttributeNameFromOrder(o));\n }\n if (isOrderDescOrder) {\n formattedOrder.push(DESCENDING_KEY);\n }\n formattedOrders.push(formattedOrder);\n });\n return {\n formattedOrders,\n replacementsMap,\n orderScopes: Array.from(orderScopesMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n }),\n };\n};\n\nconst formatPage = (page?: number) => page || PAGE_DEFAULT;\n\nconst formatPerPage = (perPage?: number) => perPage || PER_PAGE_DEFAULT;\n\ninterface Include {\n association?: string;\n model?: string;\n required?: boolean;\n include?: Include[];\n}\n\nconst formatInclude = (include: (string | Include)[], associationsMap = {}) => {\n let formattedInclude = include.map((i) => {\n const includedAssociation = associationsMap[typeof i === 'string' ? i : (i.association || i.model)];\n return {\n ...(typeof i !== 'string' && i),\n association: includedAssociation,\n required: typeof i === 'string' || i.required !== false,\n ...(typeof i !== 'string' && i.include && {\n include: formatInclude(i.include, includedAssociation?.target?.associations),\n }),\n };\n });\n formattedInclude = formattedInclude.map(({ model: _model, ...i }) => i);\n return formattedInclude;\n};\nconst formatQuery = (query, associationModels, replacementsMap: Record<string, string>, additionalAllowedAttributes: string[] = []) => {\n const formattedQuery: Record<string, unknown> = {};\n const externalQueryValues: Record<string, unknown> = {};\n const formattedScopeMap = new Map<string, any>();\n\n Object.entries(query).forEach(([queryItemKey, queryItemValue]) => {\n if (queryItemKey.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n if (!formattedScopeMap.has(CUSTOM_FIELDS_FILTER_SCOPE)) {\n formattedScopeMap.set(CUSTOM_FIELDS_FILTER_SCOPE, {});\n }\n const scopeKey = queryItemKey.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n formattedScopeMap.get(CUSTOM_FIELDS_FILTER_SCOPE)[scopeKey] = parseCustomFieldScopeQueryValue(queryItemValue);\n return;\n }\n if (additionalAllowedAttributes.includes(queryItemKey)) {\n externalQueryValues[queryItemKey] = queryItemValue;\n return;\n }\n const key = isAttributeByAssociation(queryItemKey, associationModels)\n ? wrapAttributeWithOperator(queryItemKey)\n : queryItemKey;\n formattedQuery[key] = queryItemValue;\n });\n\n const formattedScopes = Array.from(formattedScopeMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n });\n\n return {\n formattedQuery,\n externalQueryValues,\n formattedScopes,\n };\n};\n\nconst formatSearchTerm = (searchTerm: string, attributesToSend: string[], rawAttributes) => ({\n $and: searchTerm.split(' ').map((term) => ({\n $or: attributesToSend.filter((attrKey) => rawAttributes[attrKey].type.key === 'STRING').map((attr) => ({\n [attr]: {\n $iLike: `%${term}%`,\n },\n })),\n })),\n});\n\nconst formatPayload = ({\n order = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n include = [],\n query = {},\n attributes = null,\n searchTerm = null,\n jsonAttributes = {},\n}, model?, options?: FormatPayloadOptions) => {\n const replacementsMap = createReplacementMap(order, query);\n const associationModels = Object.keys(model?.associations || {});\n const { formattedOrders, orderScopes } = formatOrder({\n order: [...order, DEFAULT_ORDER],\n associationModels,\n replacementsMap,\n });\n const [filteredFormattedOrder, filteredLiteralAttributes] = getAttributeFromOrder(\n formattedOrders,\n options,\n );\n\n const allAttributes = [...filteredLiteralAttributes, ...(attributes || [])];\n const formattedAttribute = attributes?.length ? allAttributes : { include: allAttributes };\n const formattedInclude = formatInclude(include, model?.associations);\n const formattedPage = formatPage(page);\n const formattedPerPage = formatPerPage(perPage);\n const result = formatQuery(query, associationModels, replacementsMap, options?.additionalAllowedAttributes);\n const { formattedScopes: queryScopes, externalQueryValues } = result;\n let { formattedQuery } = result;\n if (searchTerm && !options?.skipSearchTermFormat) {\n const attributesToSend = attributes?.length ? attributes : Object.keys(model.rawAttributes);\n const queryWithSearchTerm = formatSearchTerm(searchTerm, attributesToSend, model.rawAttributes);\n formattedQuery = !formattedQuery || Object.keys(formattedQuery).length === 0 ? queryWithSearchTerm : {\n $and: [\n formattedQuery,\n queryWithSearchTerm,\n ],\n };\n }\n return {\n jsonAttributes,\n query: formattedQuery,\n order: filteredFormattedOrder,\n page: formattedPage,\n perPage: formattedPerPage,\n include: formattedInclude,\n scopes: [...queryScopes, ...orderScopes],\n ...(formattedAttribute && { attributes: formattedAttribute }),\n ...(Object.keys(externalQueryValues).length > 0 && { externalQueryValues }),\n };\n};\n\nexport default formatPayload;\n","import {\n ORDER_PREFIX,\n extractAttributeNameFromOrder,\n isOrderDesc,\n throwBadRequestError,\n PAGE_DEFAULT,\n PER_PAGE_DEFAULT,\n PAGE_MIN,\n PER_PAGE_MAX_LIMIT,\n PER_PAGE_MIN_LIMIT,\n isAttributeByAssociation,\n ASSOCIATION_PREFIX,\n ASSOCIATION_PATH_WRAPPER,\n} from '../utils';\nimport { OPERATORS, OPERATOR_PREFIX } from '../operators';\nimport type { MiddlewareValidationOption } from '../middleware';\n\nconst validateOperator = (operator: string): boolean => OPERATORS.includes(operator.split(OPERATOR_PREFIX)[1]);\n\nconst validateQueryAttribute = (\n rawAttribute: string,\n modelAttributes: string[] = [],\n associationModels: string[] = [],\n additionalAllowedAttributes: string[] = [],\n): boolean => {\n const attribute = (rawAttribute.startsWith(\n ASSOCIATION_PATH_WRAPPER,\n ) && rawAttribute.endsWith(\n ASSOCIATION_PATH_WRAPPER,\n )) ? rawAttribute.slice(1, -1) : rawAttribute;\n return [...modelAttributes, ...associationModels].includes(attribute.includes(ASSOCIATION_PREFIX)\n ? attribute.split(ASSOCIATION_PREFIX)[0] : attribute)\n || additionalAllowedAttributes.includes(attribute);\n};\n\nconst validateSingleOrder = (\n currentOrder: string,\n rawAttributes: string[],\n associationModels: string[],\n options: MiddlewareValidationOption = {},\n): void => {\n const isOrderDescOrder = isOrderDesc(currentOrder);\n if (isOrderDescOrder && currentOrder[0] !== ORDER_PREFIX) {\n throwBadRequestError(`${ORDER_PREFIX} must be only at the beginning of the word`);\n }\n const orderStringWithoutDesc = isOrderDescOrder ? currentOrder.split(ORDER_PREFIX)[1] : currentOrder;\n const isOrderAssociation = isAttributeByAssociation(orderStringWithoutDesc, associationModels);\n let formattedOrderString = extractAttributeNameFromOrder(currentOrder, associationModels);\n const isLiteralAttribute = options?.literalAttributes?.map((la) => la.attribute)?.includes(orderStringWithoutDesc);\n\n if (!isOrderAssociation && formattedOrderString.includes(ASSOCIATION_PREFIX)) {\n [formattedOrderString] = formattedOrderString.split(ASSOCIATION_PREFIX);\n }\n\n if (!(rawAttributes.includes(formattedOrderString) || isOrderAssociation || isLiteralAttribute)) {\n throwBadRequestError(`${currentOrder} is invalid. isLiteralAttribute: ${isLiteralAttribute}`);\n }\n};\n\nconst validateSingleAttribute = (currentAttribute: string, rawAttributes: string[]): void => {\n if (!rawAttributes.includes(currentAttribute)) {\n throwBadRequestError(`${currentAttribute} is invalid`);\n }\n};\n\nconst validateOrderAttributes = (\n order: string[],\n rawAttributes: string[],\n associationModels: string[] = [],\n options: MiddlewareValidationOption = {},\n): void => {\n order.forEach((o) => validateSingleOrder(o, rawAttributes, associationModels, options));\n};\n\nconst validateAttributes = (attributes: string[], rawAttributes: string[]): void => {\n attributes.forEach((a) => validateSingleAttribute(a, rawAttributes));\n};\n\ntype SelectJsonAttribute = {\n columnName: string;\n alias: string;\n keys: string[];\n};\n\ntype ComputedJsonAttribute = {\n columnName: string;\n alias: string;\n action: string;\n};\n\ntype JsonAttributes = {\n select?: SelectJsonAttribute[];\n computed?: ComputedJsonAttribute[];\n};\n\nconst validateJsonAttributes = (jsonAttributes: JsonAttributes, rawAttributes: string[]):\n void => {\n const allAttributes = [\n ...(jsonAttributes.select?.map((s) => s.columnName) || []),\n ...(jsonAttributes.computed?.map((c) => c.columnName) || []),\n ];\n\n validateAttributes(allAttributes, rawAttributes);\n};\n\nconst validateEnrichments = (enrichments: string[] | { [enrichmentName: string]: { exclude?: string[]; } }, options?: MiddlewareValidationOption): void => {\n const enrichmentKeys = Array.isArray(enrichments) ? enrichments : Object.keys(enrichments);\n if (!enrichmentKeys?.length) { return; }\n const invalidEnrichment = enrichmentKeys.find((enrichment) => !options?.enrichmentAttributes?.includes(enrichment));\n if (invalidEnrichment) {\n throwBadRequestError(`enrichment attribute ${invalidEnrichment} is invalid`);\n }\n};\n\nconst validateQueryPayload = (query, rawAttributes: string[], associationModels: string[] = [], additionalAllowedAttributes: string[] = []): void => {\n Object.entries(query).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n if (value[0] && typeof value[0] === 'object') {\n value.map((v) => validateQueryPayload(v, rawAttributes, associationModels, additionalAllowedAttributes));\n }\n } else if (validateOperator(key) || validateQueryAttribute(key, rawAttributes, associationModels, additionalAllowedAttributes)) {\n if (value && typeof value === 'object') {\n validateQueryPayload(value, rawAttributes, [], additionalAllowedAttributes);\n }\n } else {\n throwBadRequestError(`invalid key: ${key}`);\n }\n });\n};\n\nconst validatePagination = ({\n page,\n perPage,\n}) => {\n if (page < PAGE_MIN) {\n throwBadRequestError('Page must be greater than 0');\n }\n\n if (perPage > PER_PAGE_MAX_LIMIT || perPage < PER_PAGE_MIN_LIMIT) {\n throwBadRequestError(`PerPage must be between ${PER_PAGE_MIN_LIMIT} to ${PER_PAGE_MAX_LIMIT}`);\n }\n};\n\nconst validateIncludePayload = (include, associations): void => {\n const associationsKeys = Object.keys(associations);\n include.forEach((i) => {\n validateQueryAttribute(i.model, associationsKeys);\n const target = associations[i.model]?.target;\n if (!target) {\n throwBadRequestError('model not found in associations');\n }\n\n const { rawAttributes } = target;\n const attributeKeys = Object.keys(rawAttributes);\n if (i.where) {\n validateQueryPayload(i.where, attributeKeys);\n }\n if (i.order) {\n validateOrderAttributes(i.order, attributeKeys);\n }\n if (i.attributes) {\n validateAttributes(i.attributes, attributeKeys);\n }\n if (![null, undefined, true, false].includes(i.required)) {\n throwBadRequestError('include.required must be a boolean');\n }\n });\n};\n\nexport const validatePayload = (\n {\n query = {},\n order = [],\n attributes = [],\n include = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n enrichments = [],\n group = [],\n jsonAttributes = {},\n },\n model?,\n options: MiddlewareValidationOption = {},\n): boolean => {\n const rawAttributes = Object.keys(model.rawAttributes);\n const associationModels = Object.keys(model?.associations || {});\n if (!attributes || attributes.length === 0) {\n // eslint-disable-next-line no-param-reassign\n attributes = rawAttributes;\n } else {\n validateAttributes(attributes, rawAttributes);\n }\n\n validateOrderAttributes(order, rawAttributes, associationModels, options);\n validateQueryPayload(query, rawAttributes, associationModels, options.additionalAllowedAttributes);\n validateEnrichments(enrichments, options);\n validateJsonAttributes(jsonAttributes, rawAttributes);\n\n if (!Array.isArray(group)) {\n throwBadRequestError('group must be an array');\n }\n if (include.length && typeof include === 'object') {\n validateIncludePayload(include, model?.associations);\n } else if (include && typeof include !== 'object') {\n throwBadRequestError('include must be an array');\n }\n\n validatePagination({\n page,\n perPage,\n });\n return true;\n};\n","import type { Handler } from 'express';\nimport Logger, { type LoggerInstanceManager } from '@autofleet/logger';\nimport { BadRequest, handleError } from '@autofleet/errors';\nimport Joi from 'joi';\nimport formatPayload, { type FormatPayloadOptions } from '../formatter';\nimport { validatePayload } from '../validations';\n\nconst {\n object, string, number, any, array, alternatives,\n} = Joi.types();\nconst fallbackLogger = Logger();\n\nconst jsonAttributeActions = ['length'] as const;\n\nconst querySchema = object.keys({\n query: object,\n attributes: array.items(string),\n order: array.items(string),\n page: number,\n perPage: number,\n include: array.items(any),\n searchTerm: string,\n group: array.items(string),\n enrichments: alternatives.try(array.items(string), object.pattern(string, { exclude: array.items(string) })),\n jsonAttributes: Joi.object({\n select: Joi.array().items(\n Joi.object({\n columnName: Joi.string().required(),\n keys: Joi.array().items(Joi.string().required()).required(),\n alias: Joi.string().optional(),\n }),\n ).default([]),\n computed: Joi.array().items(\n Joi.object({\n columnName: Joi.string().required(),\n action: Joi.string().valid(...jsonAttributeActions).required(),\n alias: Joi.string().required(),\n }),\n ).default([]),\n }).default({}),\n});\n\ntype literal = any;\ntype LiteralQuery = (literal | string)[] | literal;\nexport type LiteralAttribute = { attribute: string; literal: LiteralQuery };\nexport type MiddlewareValidationOption = {\n literalAttributes?: LiteralAttribute[];\n enrichmentAttributes?: string[];\n additionalAllowedAttributes?: string[];\n logger?: LoggerInstanceManager;\n};\n\ntype ReqKeys = 'body' | 'query';\n\nexport const queryValidation = (model: any, data: any, options: MiddlewareValidationOption = {}) => {\n const {\n query,\n attributes,\n order,\n page,\n perPage,\n include,\n group,\n enrichments,\n jsonAttributes,\n } = data;\n\n const result = querySchema.validate(data);\n if (result.error) {\n throw new BadRequest([result.error], null);\n }\n validatePayload({\n query,\n attributes,\n order,\n page,\n perPage,\n include,\n enrichments,\n group,\n jsonAttributes,\n }, model, options);\n};\n\n/** consider using @see {@link queryHandler} directly */\nexport const queryValidationMiddleware = (model: any, options: MiddlewareValidationOption = {}, inner: ReqKeys = 'body'): Handler => async (req, res, next): Promise<void> => {\n try {\n queryValidation(model, req[inner], options);\n next();\n } catch (error) {\n const { query, attributes, order } = req[inner];\n handleError(error, res, {\n logger: options.logger || fallbackLogger,\n message: 'error in query middleware',\n payload: {\n error,\n query,\n attributes,\n order,\n },\n });\n }\n};\n\nexport const queryFormat = (model: any, data: any, options: FormatPayloadOptions = {}) => {\n const {\n order,\n page,\n perPage,\n include,\n query,\n attributes,\n searchTerm,\n jsonAttributes,\n } = data;\n\n const {\n query: formattedQuery,\n externalQueryValues,\n order: formattedOrder,\n page: formattedPage,\n perPage: formattedPerPage,\n include: formattedInclude,\n scopes: formattedScopes,\n attributes: formattedAttribute,\n jsonAttributes: formattedJsonAttributes,\n } = formatPayload({\n query,\n order,\n page,\n perPage,\n include,\n attributes,\n searchTerm,\n jsonAttributes,\n }, model, options);\n\n /* eslint-disable no-param-reassign */\n data.query = formattedQuery;\n data.externalQueryValues = externalQueryValues;\n data.order = formattedOrder;\n data.jsonAttributes = formattedJsonAttributes;\n data.attributes = formattedAttribute;\n data.page = formattedPage;\n data.perPage = formattedPerPage;\n data.include = formattedInclude;\n data.scopes = formattedScopes;\n if (options.includeRawPayload) {\n data.rawPayload = {\n order,\n page,\n perPage,\n include,\n query,\n attributes,\n searchTerm,\n };\n }\n /* eslint-enable no-param-reassign */\n};\n\n/** consider using @see {@link queryHandler} directly */\nexport const queryFormatMiddleware = (model: any, options: FormatPayloadOptions = {}, inner: ReqKeys = 'body'): Handler => async (req, res, next): Promise<void> => {\n queryFormat(model, req[inner], options);\n next();\n};\n","import type { Handler } from 'express';\nimport { type LoggerInstanceManager } from '@autofleet/logger';\nimport { UnexpectedError, handleError } from '@autofleet/errors';\nimport formatPayload, { type FormatPayloadOptions } from '../formatter';\nimport { pick } from '../utils';\nimport { type MiddlewareValidationOption, queryFormat, queryValidation } from '../middleware';\n\ninterface QueryValues extends ReturnType<typeof formatPayload> {\n enrichments?: string[] | Record<string, { exclude: string[] }>;\n distinct: boolean;\n searchTerm?: string;\n}\n\ninterface QueryHandlerOptions {\n /** The sequelize model too which querying abilities are added. */\n model: any;\n /** Optional settings for validation. */\n validationOptions?: Omit<MiddlewareValidationOption, 'logger'>;\n /** Optional settings for payload formatting */\n formatOptions?: FormatPayloadOptions;\n logger: LoggerInstanceManager;\n /** The name of model to be printed in logs. defaults to `model`s constructor name. */\n modelName?: string;\n /** Sequelize scopes of the model to be used within the query. @example ['userScope'] */\n additionalScopes?: string[];\n /** Callback to allow modifying the query values prior to querying the DB */\n modifyQueryValues?: (queryValues: QueryValues) => QueryValues;\n /** Optional callback to modify endpoint's response based on the DBs response. */\n onRowsRetrieved?: (data: { rows: any[]; count: number; }, queryValues: QueryValues) => any;\n}\n\nexport const queryHandler = ({\n model, logger, validationOptions, formatOptions, modelName = model.constructor?.name, additionalScopes = [], modifyQueryValues, onRowsRetrieved,\n}: QueryHandlerOptions): Handler => async (req, res) => {\n try {\n queryValidation(model, req.body, { ...validationOptions, logger });\n } catch (error) {\n const payload = pick(req.body as QueryValues, ['query', 'order', 'attributes'] as const);\n handleError(error, res, { logger, message: 'error in query endpoint', payload });\n return;\n }\n try {\n queryFormat(model, req.body, formatOptions);\n\n const queryValues = Object.assign(\n pick(req.body as QueryValues, ['query', 'externalQueryValues', 'order', 'attributes', 'page', 'perPage', 'include', 'scopes', 'enrichments', 'jsonAttributes'] as const),\n { distinct: true },\n );\n\n logger.info(`querying ${modelName}`, { queryValues });\n\n const modifiedQuery = modifyQueryValues?.(queryValues) ?? queryValues;\n const {\n scopes = [],\n query: where,\n perPage: limit,\n page,\n enrichments: _enrichments,\n externalQueryValues: _externalQueryValues,\n ...rest\n } = modifiedQuery;\n\n const result = await model.scope([...additionalScopes, ...scopes]).findAndCountAll({\n where,\n limit,\n offset: (page - 1) * limit,\n ...rest,\n });\n\n if (!result.rows.length || !onRowsRetrieved) {\n res.json(result);\n return;\n }\n\n const enrichmentResult = await onRowsRetrieved(result, modifiedQuery);\n\n res.json(enrichmentResult);\n } catch (error) {\n handleError(new UnexpectedError(error), res, { logger, message: `Error while querying ${modelName}`, payload: { query: req.body } });\n }\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/operators/index.ts","../src/utils.ts","../src/formatter/index.ts","../src/validations/index.ts","../src/middleware/index.ts","../src/handler/index.ts"],"names":["OPERATORS","OPERATOR_PREFIX","OPERATORS_TO_SQL","formatOperators","Sequelize","Op","map","o","randomInt","max","ORDER_PREFIX","ASSOCIATION_PREFIX","ASSOCIATION_PATH_WRAPPER","PER_PAGE_DEFAULT","PAGE_DEFAULT","PER_PAGE_MAX_LIMIT","PER_PAGE_MIN_LIMIT","PAGE_MIN","wrapAttributeWithOperator","attribute","isAttributeByAssociation","attributeName","associatedModels","extractAttributeNameFromOrder","order","associationModels","formattedOrder","isOrderDesc","throwBadRequestError","message","BadRequest","extractAssociatedAttributeNameFromOrder","generateRandomString","length","characters","pick","obj","keys","key","DEFAULT_ORDER","DESCENDING_KEY","ASCENDING_KEY","CUSTOM_FIELDS_QUERY_PREFIX","CUSTOM_FIELDS_FILTER_SCOPE","CUSTOM_FIELDS_SORT_SCOPE","customFields","parseCustomFieldScopeQueryValue","value","operator","conditionValue","getAttributeFromOrder","options","literalAttributes","DBFormatter","attributes","acc","item","orderStyle","found","generateFilterReplacements","conditions","replacements","condition","replacementKey","valueKey","conditionKey","operatorKey","generateOrderReplacements","replacementMap","rand","createReplacementMap","query","formatOrder","replacementsMap","formattedOrders","orderScopesMap","t","scopeKey","isOrderDescOrder","scopeName","scopeValue","formatPage","page","formatPerPage","perPage","formatInclude","include","associationsMap","formattedInclude","i","includedAssociation","_model","formatQuery","additionalAllowedAttributes","formattedQuery","externalQueryValues","formattedScopeMap","queryItemKey","queryItemValue","formattedScopes","formatSearchTerm","searchTerm","attributesToSend","rawAttributes","term","attrKey","attr","formatPayload","jsonAttributes","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","rawAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","validateJasonAttributes","select","computed","selectAttributes","s","computedAttributes","allFields","validateEnrichments","enrichments","enrichmentKeys","invalidEnrichment","enrichment","validateQueryPayload","v","validatePagination","validateIncludePayload","associations","associationsKeys","target","attributeKeys","validatePayload","group","object","string","number","any","array","alternatives","Joi","fallbackLogger","Logger","querySchema","queryValidation","data","queryValidationMiddleware","inner","req","res","next","error","handleError","queryFormat","formattedJsonAttributes","queryFormatMiddleware","queryHandler","logger","validationOptions","formatOptions","modelName","additionalScopes","modifyQueryValues","onRowsRetrieved","payload","queryValues","modifiedQuery","scopes","where","limit","_enrichments","_externalQueryValues","rest","enrichmentResult","UnexpectedError"],"mappings":"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","file":"index.js","sourcesContent":["export const OPERATORS = [\n 'eq',\n 'ne',\n 'gte',\n 'gt',\n 'lte',\n 'lt',\n 'not',\n 'in',\n 'notIn',\n 'is',\n 'like',\n 'iLike',\n 'notLike',\n 'between',\n 'and',\n 'or',\n 'overlap',\n 'contains',\n];\n\nexport const OPERATOR_PREFIX = '$';\n\nexport const OPERATORS_TO_SQL = {\n $eq: '=',\n $ne: '!=',\n $gte: '>=',\n $gt: '>',\n $lte: '<=',\n $lt: '<',\n $not: 'NOT',\n $in: 'IN',\n $notIn: 'NOT IN',\n $is: 'IS',\n $like: 'LIKE',\n $iLike: 'ILIKE',\n $notLike: 'NOT LIKE',\n $and: 'AND',\n $or: 'OR',\n};\n\nexport const formatOperators = (Sequelize) => {\n const { Op } = Sequelize;\n return OPERATORS.reduce((map, o) => {\n // eslint-disable-next-line no-param-reassign\n map[`${OPERATOR_PREFIX + o}`] = Op[o];\n return map;\n }, {});\n};\n","import { BadRequest } from '@autofleet/errors';\nimport { OPERATOR_PREFIX } from './operators';\n\nconst randomInt = (max: number) => Math.floor(Math.random() * Math.floor(max));\n\nexport const ORDER_PREFIX = '-';\nexport const ASSOCIATION_PREFIX = '.';\nexport const ASSOCIATION_PATH_WRAPPER = '$';\nexport const PER_PAGE_DEFAULT = 20;\nexport const PAGE_DEFAULT = 1;\nexport const PER_PAGE_MAX_LIMIT = 100;\nexport const PER_PAGE_MIN_LIMIT = 1;\nexport const PAGE_MIN = 1;\n\nexport const wrapAttributeWithOperator = (attribute: string) => `${OPERATOR_PREFIX}${attribute}${OPERATOR_PREFIX}`;\nexport const isAttributeByAssociation = (attributeName: string, associatedModels: string[]): boolean => attributeName.includes(ASSOCIATION_PREFIX)\n && associatedModels.includes(attributeName.split(ASSOCIATION_PREFIX)[0]);\n\nexport const extractAttributeNameFromOrder = (order: string, associationModels: string[]): string => {\n let formattedOrder = order;\n if (order.includes(ORDER_PREFIX)) {\n // eslint-disable-next-line prefer-destructuring\n formattedOrder = formattedOrder.split(ORDER_PREFIX)[1];\n }\n if (isAttributeByAssociation(formattedOrder, associationModels)) {\n [formattedOrder] = formattedOrder.split(ASSOCIATION_PREFIX);\n }\n return formattedOrder;\n};\n\nexport const isOrderDesc = (order: string): boolean => order.includes(ORDER_PREFIX);\n\nexport const throwBadRequestError = (message: string) => {\n throw new BadRequest([new Error(message)]);\n};\n\nexport const extractAssociatedAttributeNameFromOrder = (order: string): string => order.split(ASSOCIATION_PREFIX)[1];\n\nexport const generateRandomString = (length = 5): string => {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n return Array.from({ length }, () => characters.charAt(randomInt(characters.length))).join('');\n};\n\nexport const pick = <T extends object, K extends keyof T = keyof T>(\n obj: T,\n keys: K[],\n): Pick<T, K> => Object.fromEntries(keys.map((key) => [key, obj[key]])) as Pick<T, K>;\n","import { customFields } from '@autofleet/common-types';\nimport {\n extractAssociatedAttributeNameFromOrder,\n extractAttributeNameFromOrder, generateRandomString,\n isAttributeByAssociation,\n isOrderDesc, ORDER_PREFIX,\n PAGE_DEFAULT,\n PER_PAGE_DEFAULT, wrapAttributeWithOperator,\n} from '../utils';\nimport type { LiteralAttribute } from '../middleware';\nimport { OPERATORS_TO_SQL } from '../operators';\nimport Joi from \"joi\";\n\nconst DEFAULT_ORDER = 'id';\nconst DESCENDING_KEY = 'DESC';\nconst ASCENDING_KEY = 'ASC';\nconst CUSTOM_FIELDS_QUERY_PREFIX = 'customFields.';\nconst { CUSTOM_FIELDS_FILTER_SCOPE, CUSTOM_FIELDS_SORT_SCOPE } = customFields;\ntype OrderItem = string | [string, string]\ntype SequelizeOrder = string | OrderItem[];\nexport type FormatPayloadOptions = {\n includeRawPayload?: boolean;\n literalAttributes?: LiteralAttribute[];\n DBFormatter?: any;\n skipSearchTermFormat?: boolean;\n additionalAllowedAttributes?: string[];\n};\n\ntype ConditionWithOperator = {\n operator: string;\n value: string;\n};\nexport type ConditionValue = ConditionWithOperator | ConditionWithOperator[] | string | string[];\n\nconst parseCustomFieldScopeQueryValue = (value) => {\n if (['string', 'number'].includes(typeof value) || Array.isArray(value)) {\n return value;\n }\n return Object.entries(value).map(([operator, conditionValue]) => ({\n operator: OPERATORS_TO_SQL[operator],\n value: conditionValue,\n }));\n};\n\nconst getAttributeFromOrder = (order: SequelizeOrder[], options: FormatPayloadOptions = {}): [SequelizeOrder[], SequelizeOrder[]] => {\n const { literalAttributes = [], DBFormatter = undefined } = options;\n const [formattedOrder, attributes] = order.reduce((acc, o) => {\n const [item, orderStyle = 'ASC'] = Array.isArray(o) ? o : [o];\n const found = literalAttributes?.find((obj) => obj.attribute === item);\n if (found) {\n acc[1].push(found.literal);\n acc[0].push([DBFormatter ? DBFormatter(`\"${found.attribute}\" ${orderStyle}`) : `${found.attribute} ${orderStyle}`]);\n } else {\n acc[0].push(o);\n }\n return acc;\n }, [[], []]);\n\n return [formattedOrder, attributes];\n};\n\n/**\n * Generates replacements for the given conditions.\n *\n * @param conditions - The conditions to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateFilterReplacements = (conditions: Record<string, ConditionValue>): Record<string, string> => {\n const replacements: Record<string, string> = {};\n\n Object.entries(conditions).forEach(([key, condition]) => {\n const replacementKey = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacements[replacementKey] = key.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n\n if (Array.isArray(condition)) {\n condition.forEach((value) => {\n const valueKey = generateRandomString();\n replacements[valueKey] = typeof value === 'string' ? value : value.value;\n });\n } else if (typeof condition === 'string' || typeof condition === 'number') {\n const conditionKey = generateRandomString();\n replacements[conditionKey] = condition;\n } else if (condition?.operator) {\n const operatorKey = generateRandomString();\n replacements[operatorKey] = condition.value;\n }\n });\n\n return replacements;\n};\n\n/**\n * Generates replacements for the given order array.\n *\n * @param order - The order array to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateOrderReplacements = (order: string[]): Record<string, string> => {\n const replacementMap = {};\n order.forEach((o) => {\n if (o.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n } else if (o.substring(1).startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.substring(1).split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n }\n });\n return replacementMap;\n};\n\n/**\n * Creates a combined replacement map from order and query.\n *\n * @param order - The order array.\n * @param query - The query object.\n * @returns The combined replacements object.\n */\nconst createReplacementMap = (order: string[], query: Record<string, ConditionValue>): Record<string, string> => ({\n ...generateOrderReplacements(order),\n ...generateFilterReplacements(query),\n});\n\nconst formatOrder = ({\n order,\n associationModels = [],\n replacementsMap = {},\n}: { order: string[]; associationModels?: string[]; replacementsMap?: Record<string, string>; }): {\n formattedOrders: SequelizeOrder[];\n orderScopes: (string | { method: [string, { replacementsMap: Record<string, string>; scopeValue: Record<string, 'DESC' | 'ASC'>; }] })[];\n replacementsMap: Record<string, string>;\n} => {\n const formattedOrders = [];\n const orderScopesMap = new Map<string, Record<string, 'DESC' | 'ASC'>>();\n order.forEach((o: string) => {\n if ([o, o.substring(1)].some((t) => t.startsWith(CUSTOM_FIELDS_QUERY_PREFIX))) {\n if (!orderScopesMap.has(CUSTOM_FIELDS_SORT_SCOPE)) {\n orderScopesMap.set(CUSTOM_FIELDS_SORT_SCOPE, {});\n }\n const scopeKey = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n orderScopesMap.get(CUSTOM_FIELDS_SORT_SCOPE)[scopeKey] = (isOrderDesc(o) ? DESCENDING_KEY : ASCENDING_KEY);\n return;\n }\n const formattedOrder = [extractAttributeNameFromOrder(o, associationModels)];\n const isOrderDescOrder = isOrderDesc(o);\n const isOrderAssociation = isAttributeByAssociation(isOrderDescOrder\n ? o.split(ORDER_PREFIX)[1]\n : o, associationModels);\n if (isOrderAssociation) {\n formattedOrder.push(extractAssociatedAttributeNameFromOrder(o));\n }\n if (isOrderDescOrder) {\n formattedOrder.push(DESCENDING_KEY);\n }\n formattedOrders.push(formattedOrder);\n });\n return {\n formattedOrders,\n replacementsMap,\n orderScopes: Array.from(orderScopesMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n }),\n };\n};\n\nconst formatPage = (page?: number) => page || PAGE_DEFAULT;\n\nconst formatPerPage = (perPage?: number) => perPage || PER_PAGE_DEFAULT;\n\ninterface Include {\n association?: string;\n model?: string;\n required?: boolean;\n include?: Include[];\n}\n\nconst formatInclude = (include: (string | Include)[], associationsMap = {}) => {\n let formattedInclude = include.map((i) => {\n const includedAssociation = associationsMap[typeof i === 'string' ? i : (i.association || i.model)];\n return {\n ...(typeof i !== 'string' && i),\n association: includedAssociation,\n required: typeof i === 'string' || i.required !== false,\n ...(typeof i !== 'string' && i.include && {\n include: formatInclude(i.include, includedAssociation?.target?.associations),\n }),\n };\n });\n formattedInclude = formattedInclude.map(({ model: _model, ...i }) => i);\n return formattedInclude;\n};\nconst formatQuery = (query, associationModels, replacementsMap: Record<string, string>, additionalAllowedAttributes: string[] = []) => {\n const formattedQuery: Record<string, unknown> = {};\n const externalQueryValues: Record<string, unknown> = {};\n const formattedScopeMap = new Map<string, any>();\n\n Object.entries(query).forEach(([queryItemKey, queryItemValue]) => {\n if (queryItemKey.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n if (!formattedScopeMap.has(CUSTOM_FIELDS_FILTER_SCOPE)) {\n formattedScopeMap.set(CUSTOM_FIELDS_FILTER_SCOPE, {});\n }\n const scopeKey = queryItemKey.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n formattedScopeMap.get(CUSTOM_FIELDS_FILTER_SCOPE)[scopeKey] = parseCustomFieldScopeQueryValue(queryItemValue);\n return;\n }\n if (additionalAllowedAttributes.includes(queryItemKey)) {\n externalQueryValues[queryItemKey] = queryItemValue;\n return;\n }\n const key = isAttributeByAssociation(queryItemKey, associationModels)\n ? wrapAttributeWithOperator(queryItemKey)\n : queryItemKey;\n formattedQuery[key] = queryItemValue;\n });\n\n const formattedScopes = Array.from(formattedScopeMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n });\n\n return {\n formattedQuery,\n externalQueryValues,\n formattedScopes,\n };\n};\n\nconst formatSearchTerm = (searchTerm: string, attributesToSend: string[], rawAttributes) => ({\n $and: searchTerm.split(' ').map((term) => ({\n $or: attributesToSend.filter((attrKey) => rawAttributes[attrKey].type.key === 'STRING').map((attr) => ({\n [attr]: {\n $iLike: `%${term}%`,\n },\n })),\n })),\n});\n\nconst formatPayload = ({\n order = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n include = [],\n query = {},\n attributes = null,\n searchTerm = null,\n jsonAttributes = {},\n}, model?, options?: FormatPayloadOptions) => {\n const replacementsMap = createReplacementMap(order, query);\n const associationModels = Object.keys(model?.associations || {});\n const { formattedOrders, orderScopes } = formatOrder({\n order: [...order, DEFAULT_ORDER],\n associationModels,\n replacementsMap,\n });\n const [filteredFormattedOrder, filteredLiteralAttributes] = getAttributeFromOrder(\n formattedOrders,\n options,\n );\n\n const allAttributes = [...filteredLiteralAttributes, ...(attributes || [])];\n const formattedAttribute = attributes?.length ? allAttributes : { include: allAttributes };\n const formattedInclude = formatInclude(include, model?.associations);\n const formattedPage = formatPage(page);\n const formattedPerPage = formatPerPage(perPage);\n const result = formatQuery(query, associationModels, replacementsMap, options?.additionalAllowedAttributes);\n const { formattedScopes: queryScopes, externalQueryValues } = result;\n let { formattedQuery } = result;\n\n if (searchTerm && !options?.skipSearchTermFormat) {\n const attributesToSend = attributes?.length ? attributes : Object.keys(model.rawAttributes);\n const queryWithSearchTerm = formatSearchTerm(searchTerm, attributesToSend, model.rawAttributes);\n formattedQuery = !formattedQuery || Object.keys(formattedQuery).length === 0 ? queryWithSearchTerm : {\n $and: [\n formattedQuery,\n queryWithSearchTerm,\n ],\n };\n }\n\n // compare json attributes to model\n // this is the structure\n // jsonAttributes: Joi.object({\n // select: Joi.array().items(\n // Joi.object({\n // columnName: Joi.string().required(),\n // keys: Joi.array().items(Joi.string().required()).required(),\n // }),\n // ).default([]),\n // computed: Joi.array().items(\n // Joi.object({\n // type: Joi.string().valid('length').required(),\n // path: Joi.string().required(),\n // alias: Joi.string().required(),\n // }),\n // ).default([]),\n // }).default({}),\n // for each columnName or for path(take only the first field before the .) check if it's a valid col form the model\n\n return {\n jsonAttributes,\n query: formattedQuery,\n order: filteredFormattedOrder,\n page: formattedPage,\n perPage: formattedPerPage,\n include: formattedInclude,\n scopes: [...queryScopes, ...orderScopes],\n ...(formattedAttribute && { attributes: formattedAttribute }),\n ...(Object.keys(externalQueryValues).length > 0 && { externalQueryValues }),\n };\n};\n\nexport default formatPayload;\n","import {\n ORDER_PREFIX,\n extractAttributeNameFromOrder,\n isOrderDesc,\n throwBadRequestError,\n PAGE_DEFAULT,\n PER_PAGE_DEFAULT,\n PAGE_MIN,\n PER_PAGE_MAX_LIMIT,\n PER_PAGE_MIN_LIMIT,\n isAttributeByAssociation,\n ASSOCIATION_PREFIX,\n ASSOCIATION_PATH_WRAPPER,\n} from '../utils';\nimport { OPERATORS, OPERATOR_PREFIX } from '../operators';\nimport type { MiddlewareValidationOption } from '../middleware';\n\nconst validateOperator = (operator: string): boolean => OPERATORS.includes(operator.split(OPERATOR_PREFIX)[1]);\n\nconst validateQueryAttribute = (\n rawAttribute: string,\n modelAttributes: string[] = [],\n associationModels: string[] = [],\n additionalAllowedAttributes: string[] = [],\n): boolean => {\n const attribute = (rawAttribute.startsWith(\n ASSOCIATION_PATH_WRAPPER,\n ) && rawAttribute.endsWith(\n ASSOCIATION_PATH_WRAPPER,\n )) ? rawAttribute.slice(1, -1) : rawAttribute;\n return [...modelAttributes, ...associationModels].includes(attribute.includes(ASSOCIATION_PREFIX)\n ? attribute.split(ASSOCIATION_PREFIX)[0] : attribute)\n || additionalAllowedAttributes.includes(attribute);\n};\n\nconst validateSingleOrder = (\n currentOrder: string,\n rawAttributes: string[],\n associationModels: string[],\n options: MiddlewareValidationOption = {},\n): void => {\n const isOrderDescOrder = isOrderDesc(currentOrder);\n if (isOrderDescOrder && currentOrder[0] !== ORDER_PREFIX) {\n throwBadRequestError(`${ORDER_PREFIX} must be only at the beginning of the word`);\n }\n const orderStringWithoutDesc = isOrderDescOrder ? currentOrder.split(ORDER_PREFIX)[1] : currentOrder;\n const isOrderAssociation = isAttributeByAssociation(orderStringWithoutDesc, associationModels);\n let formattedOrderString = extractAttributeNameFromOrder(currentOrder, associationModels);\n const isLiteralAttribute = options?.literalAttributes?.map((la) => la.attribute)?.includes(orderStringWithoutDesc);\n\n if (!isOrderAssociation && formattedOrderString.includes(ASSOCIATION_PREFIX)) {\n [formattedOrderString] = formattedOrderString.split(ASSOCIATION_PREFIX);\n }\n\n if (!(rawAttributes.includes(formattedOrderString) || isOrderAssociation || isLiteralAttribute)) {\n throwBadRequestError(`${currentOrder} is invalid. isLiteralAttribute: ${isLiteralAttribute}`);\n }\n};\n\nconst validateSingleAttribute = (currentAttribute: string, rawAttributes: string[]): void => {\n if (!rawAttributes.includes(currentAttribute)) {\n throwBadRequestError(`${currentAttribute} is invalid`);\n }\n};\n\nconst validateOrderAttributes = (\n order: string[],\n rawAttributes: string[],\n associationModels: string[] = [],\n options: MiddlewareValidationOption = {},\n): void => {\n order.forEach((o) => validateSingleOrder(o, rawAttributes, associationModels, options));\n};\n\nconst validateAttributes = (attributes: string[], rawAttributes: string[]): void => {\n attributes.forEach((a) => validateSingleAttribute(a, rawAttributes));\n};\n\ninterface JsonAttributes {\n select?: { columnName: string; keys: string[] }[];\n computed?: { type: string; path: string; alias: string }[];\n}\n\nconst validateJasonAttributes = (jsonAttributes: JsonAttributes, rawAttributes: string[]): void => {\n const { select = [], computed = [] } = jsonAttributes;\n const selectAttributes = select.map((s) => s.columnName) || [];\n const computedAttributes = computed.map((c) => c.path.split('.')[0]) || [];\n const allFields = [...selectAttributes, ...computedAttributes];\n\n validateAttributes(allFields, rawAttributes);\n};\n\nconst validateEnrichments = (enrichments: string[] | { [enrichmentName: string]: { exclude?: string[]; } }, options?: MiddlewareValidationOption): void => {\n const enrichmentKeys = Array.isArray(enrichments) ? enrichments : Object.keys(enrichments);\n if (!enrichmentKeys?.length) { return; }\n const invalidEnrichment = enrichmentKeys.find((enrichment) => !options?.enrichmentAttributes?.includes(enrichment));\n if (invalidEnrichment) {\n throwBadRequestError(`enrichment attribute ${invalidEnrichment} is invalid`);\n }\n};\n\nconst validateQueryPayload = (query, rawAttributes: string[], associationModels: string[] = [], additionalAllowedAttributes: string[] = []): void => {\n Object.entries(query).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n if (value[0] && typeof value[0] === 'object') {\n value.map((v) => validateQueryPayload(v, rawAttributes, associationModels, additionalAllowedAttributes));\n }\n } else if (validateOperator(key) || validateQueryAttribute(key, rawAttributes, associationModels, additionalAllowedAttributes)) {\n if (value && typeof value === 'object') {\n validateQueryPayload(value, rawAttributes, [], additionalAllowedAttributes);\n }\n } else {\n throwBadRequestError(`invalid key: ${key}`);\n }\n });\n};\n\nconst validatePagination = ({\n page,\n perPage,\n}) => {\n if (page < PAGE_MIN) {\n throwBadRequestError('Page must be greater than 0');\n }\n\n if (perPage > PER_PAGE_MAX_LIMIT || perPage < PER_PAGE_MIN_LIMIT) {\n throwBadRequestError(`PerPage must be between ${PER_PAGE_MIN_LIMIT} to ${PER_PAGE_MAX_LIMIT}`);\n }\n};\n\nconst validateIncludePayload = (include, associations): void => {\n const associationsKeys = Object.keys(associations);\n include.forEach((i) => {\n validateQueryAttribute(i.model, associationsKeys);\n const target = associations[i.model]?.target;\n if (!target) {\n throwBadRequestError('model not found in associations');\n }\n\n const { rawAttributes } = target;\n const attributeKeys = Object.keys(rawAttributes);\n if (i.where) {\n validateQueryPayload(i.where, attributeKeys);\n }\n if (i.order) {\n validateOrderAttributes(i.order, attributeKeys);\n }\n if (i.attributes) {\n validateAttributes(i.attributes, attributeKeys);\n }\n if (![null, undefined, true, false].includes(i.required)) {\n throwBadRequestError('include.required must be a boolean');\n }\n });\n};\n\nexport const validatePayload = (\n {\n query = {},\n order = [],\n attributes = [],\n include = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n enrichments = [],\n group = [],\n jsonAttributes = {},\n },\n model?,\n options: MiddlewareValidationOption = {},\n): boolean => {\n const rawAttributes = Object.keys(model.rawAttributes);\n const associationModels = Object.keys(model?.associations || {});\n if (!attributes || attributes.length === 0) {\n // eslint-disable-next-line no-param-reassign\n attributes = rawAttributes;\n } else {\n validateAttributes(attributes, rawAttributes);\n }\n\n validateOrderAttributes(order, rawAttributes, associationModels, options);\n validateQueryPayload(query, rawAttributes, associationModels, options.additionalAllowedAttributes);\n validateEnrichments(enrichments, options);\n validateJasonAttributes(jsonAttributes, rawAttributes);\n\n if (!Array.isArray(group)) {\n throwBadRequestError('group must be an array');\n }\n if (include.length && typeof include === 'object') {\n validateIncludePayload(include, model?.associations);\n } else if (include && typeof include !== 'object') {\n throwBadRequestError('include must be an array');\n }\n\n validatePagination({\n page,\n perPage,\n });\n return true;\n};\n","import type { Handler } from 'express';\nimport Logger, { type LoggerInstanceManager } from '@autofleet/logger';\nimport { BadRequest, handleError } from '@autofleet/errors';\nimport Joi from 'joi';\nimport formatPayload, { type FormatPayloadOptions } from '../formatter';\nimport { validatePayload } from '../validations';\n\nconst {\n object, string, number, any, array, alternatives,\n} = Joi.types();\nconst fallbackLogger = Logger();\n\nconst querySchema = object.keys({\n query: object,\n attributes: array.items(string),\n order: array.items(string),\n page: number,\n perPage: number,\n include: array.items(any),\n searchTerm: string,\n group: array.items(string),\n enrichments: alternatives.try(array.items(string), object.pattern(string, { exclude: array.items(string) })),\n jsonAttributes: Joi.object({\n select: Joi.array().items(\n Joi.object({\n columnName: Joi.string().required(),\n keys: Joi.array().items(Joi.string().required()).required(),\n }),\n ).default([]),\n computed: Joi.array().items(\n Joi.object({\n type: Joi.string().valid('length').required(),\n path: Joi.string().required(),\n alias: Joi.string().required(),\n }),\n ).default([]),\n }).default({}),\n});\n\ntype literal = any;\ntype LiteralQuery = (literal | string)[] | literal;\nexport type LiteralAttribute = { attribute: string; literal: LiteralQuery };\nexport type MiddlewareValidationOption = {\n literalAttributes?: LiteralAttribute[];\n enrichmentAttributes?: string[];\n additionalAllowedAttributes?: string[];\n logger?: LoggerInstanceManager;\n};\n\ntype ReqKeys = 'body' | 'query';\n\nexport const queryValidation = (model: any, data: any, options: MiddlewareValidationOption = {}) => {\n const {\n query,\n attributes,\n order,\n page,\n perPage,\n include,\n group,\n enrichments,\n jsonAttributes,\n } = data;\n\n const result = querySchema.validate(data);\n if (result.error) {\n throw new BadRequest([result.error], null);\n }\n validatePayload({\n query,\n attributes,\n order,\n page,\n perPage,\n include,\n enrichments,\n group,\n jsonAttributes,\n }, model, options);\n};\n\n/** consider using @see {@link queryHandler} directly */\nexport const queryValidationMiddleware = (model: any, options: MiddlewareValidationOption = {}, inner: ReqKeys = 'body'): Handler => async (req, res, next): Promise<void> => {\n try {\n queryValidation(model, req[inner], options);\n next();\n } catch (error) {\n const { query, attributes, order } = req[inner];\n handleError(error, res, {\n logger: options.logger || fallbackLogger,\n message: 'error in query middleware',\n payload: {\n error,\n query,\n attributes,\n order,\n },\n });\n }\n};\n\nexport const queryFormat = (model: any, data: any, options: FormatPayloadOptions = {}) => {\n const {\n order,\n page,\n perPage,\n include,\n query,\n attributes,\n searchTerm,\n jsonAttributes,\n } = data;\n\n const {\n query: formattedQuery,\n externalQueryValues,\n order: formattedOrder,\n page: formattedPage,\n perPage: formattedPerPage,\n include: formattedInclude,\n scopes: formattedScopes,\n attributes: formattedAttribute,\n jsonAttributes: formattedJsonAttributes,\n } = formatPayload({\n query,\n order,\n page,\n perPage,\n include,\n attributes,\n searchTerm,\n jsonAttributes,\n }, model, options);\n\n /* eslint-disable no-param-reassign */\n data.query = formattedQuery;\n data.externalQueryValues = externalQueryValues;\n data.order = formattedOrder;\n data.jsonAttributes = formattedJsonAttributes;\n data.attributes = formattedAttribute;\n data.page = formattedPage;\n data.perPage = formattedPerPage;\n data.include = formattedInclude;\n data.scopes = formattedScopes;\n if (options.includeRawPayload) {\n data.rawPayload = {\n order,\n page,\n perPage,\n include,\n query,\n attributes,\n searchTerm,\n };\n }\n /* eslint-enable no-param-reassign */\n};\n\n/** consider using @see {@link queryHandler} directly */\nexport const queryFormatMiddleware = (model: any, options: FormatPayloadOptions = {}, inner: ReqKeys = 'body'): Handler => async (req, res, next): Promise<void> => {\n queryFormat(model, req[inner], options);\n next();\n};\n","import type { Handler } from 'express';\nimport { type LoggerInstanceManager } from '@autofleet/logger';\nimport { UnexpectedError, handleError } from '@autofleet/errors';\nimport formatPayload, { type FormatPayloadOptions } from '../formatter';\nimport { pick } from '../utils';\nimport { type MiddlewareValidationOption, queryFormat, queryValidation } from '../middleware';\n\ninterface QueryValues extends ReturnType<typeof formatPayload> {\n enrichments?: string[] | Record<string, { exclude: string[] }>;\n distinct: boolean;\n}\n\ninterface QueryHandlerOptions {\n /** The sequelize model too which querying abilities are added. */\n model: any;\n /** Optional settings for validation. */\n validationOptions?: Omit<MiddlewareValidationOption, 'logger'>;\n /** Optional settings for payload formatting */\n formatOptions?: FormatPayloadOptions;\n logger: LoggerInstanceManager;\n /** The name of model to be printed in logs. defaults to `model`s constructor name. */\n modelName?: string;\n /** Sequelize scopes of the model to be used within the query. @example ['userScope'] */\n additionalScopes?: string[];\n /** Callback to allow modifying the query values prior to querying the DB */\n modifyQueryValues?: (queryValues: QueryValues) => QueryValues;\n /** Optional callback to modify endpoint's response based on the DBs response. */\n onRowsRetrieved?: (data: { rows: any[]; count: number; }, queryValues: QueryValues) => any;\n}\n\nexport const queryHandler = ({\n model, logger, validationOptions, formatOptions, modelName = model.constructor?.name, additionalScopes = [], modifyQueryValues, onRowsRetrieved,\n}: QueryHandlerOptions): Handler => async (req, res) => {\n try {\n queryValidation(model, req.body, { ...validationOptions, logger });\n } catch (error) {\n const payload = pick(req.body as QueryValues, ['query', 'order', 'attributes'] as const);\n handleError(error, res, { logger, message: 'error in query endpoint', payload });\n return;\n }\n try {\n queryFormat(model, req.body, formatOptions);\n\n const queryValues = Object.assign(\n pick(req.body as QueryValues, ['query', 'externalQueryValues', 'order', 'attributes', 'page', 'perPage', 'include', 'scopes', 'enrichments', 'jsonAttributes'] as const),\n { distinct: true },\n );\n\n logger.info(`querying ${modelName}`, { queryValues });\n\n const modifiedQuery = modifyQueryValues?.(queryValues) ?? queryValues;\n const {\n scopes = [],\n query: where,\n perPage: limit,\n page,\n enrichments: _enrichments,\n externalQueryValues: _externalQueryValues,\n ...rest\n } = modifiedQuery;\n\n const result = await model.scope([...additionalScopes, ...scopes]).findAndCountAll({\n where,\n limit,\n offset: (page - 1) * limit,\n ...rest,\n });\n\n if (!result.rows.length || !onRowsRetrieved) {\n res.json(result);\n return;\n }\n\n const enrichmentResult = await onRowsRetrieved(result, modifiedQuery);\n\n res.json(enrichmentResult);\n } catch (error) {\n handleError(new UnexpectedError(error), res, { logger, message: `Error while querying ${modelName}`, payload: { query: req.body } });\n }\n};\n"]}
|