@autofleet/sheilta 2.0.2 → 2.0.3-beta-1492407c.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var Tt=require('@autofleet/logger'),errors=require('@autofleet/errors'),qt=require('joi'),commonTypes=require('@autofleet/common-types');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Tt__default=/*#__PURE__*/_interopDefault(Tt);var qt__default=/*#__PURE__*/_interopDefault(qt);var D=["eq","ne","gte","gt","lte","lt","not","in","notIn","is","like","iLike","notLike","between","and","or","overlap","contains"],E="$",B={$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"},ct=t=>{let{Op:e}=t;return D.reduce((o,r)=>(o[`${E+r}`]=e[r],o),{})};var ut=t=>Math.floor(Math.random()*Math.floor(t)),m="-",g=".",F=20,I=1,Q=100,k=1,H=1,z=t=>`${E}${t}${E}`,P=(t,e)=>t.includes(g)&&e.includes(t.split(g)[0]),$=(t,e)=>{let o=t;return t.includes(m)&&(o=o.split(m)[1]),P(o,e)&&([o]=o.split(g)),o},M=t=>t.includes(m),p=t=>{throw new errors.BadRequest([new Error(t)])},Y=t=>t.split(g)[1],f=(t=5)=>{let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";return Array.from({length:t},()=>e.charAt(ut(e.length))).join("")},v=(t,e)=>Object.fromEntries(e.map(o=>[o,t[o]]));var mt="id",J="DESC",gt="ASC",y="customFields.",{CUSTOM_FIELDS_FILTER_SCOPE:j,CUSTOM_FIELDS_SORT_SCOPE:C}=commonTypes.customFields,yt=t=>["string","number"].includes(typeof t)||Array.isArray(t)?t:Object.entries(t).map(([e,o])=>({operator:B[e],value:o})),ft=(t,e={})=>{let{literalAttributes:o=[],DBFormatter:r=void 0}=e,[i,n]=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 [i,n]},Z=t=>{let e={};return Object.entries(t).forEach(([o,r])=>{let i=f();if(e[i]=o.split(y)[1],Array.isArray(r))r.forEach(n=>{let s=f();e[s]=typeof n=="string"?n:n.value;});else if(typeof r=="string"||typeof r=="number"){let n=f();e[n]=r;}else if(r?.operator){let n=f();e[n]=r.value;}}),e},Ot=t=>{let e={};return t.forEach(o=>{if(o.startsWith(y)){let r=f();e[r]=o.split(y)[1];}else if(o.substring(1).startsWith(y)){let r=f();e[r]=o.substring(1).split(y)[1];}}),e},bt=(t,e)=>({...Ot(t),...Z(e)}),At=({order:t,associationModels:e=[],replacementsMap:o={}})=>{let r=[],i=new Map;return t.forEach(n=>{if([n,n.substring(1)].some(d=>d.startsWith(y))){i.has(C)||i.set(C,{});let d=n.split(y)[1];i.get(C)[d]=M(n)?J:gt;return}let s=[$(n,e)],c=M(n);P(c?n.split(m)[1]:n,e)&&s.push(Y(n)),c&&s.push(J),r.push(s);}),{formattedOrders:r,replacementsMap:o,orderScopes:Array.from(i.entries()).map(([n,s])=>s?{method:[n,{replacementsMap:o,scopeValue:s}]}:n)}},Et=t=>t||I,Pt=t=>t||F,tt=(t,e={})=>{let o=t.map(r=>{let i=e[typeof r=="string"?r:r.association||r.model];return {...typeof r!="string"&&r,association:i,required:typeof r=="string"||r.required!==false,...typeof r!="string"&&r.include&&{include:tt(r.include,i?.target?.associations)}}});return o=o.map(({model:r,...i})=>i),o},ht=(t,e,o,r=[])=>{let i={},n={},s=new Map;Object.entries(t).forEach(([a,d])=>{if(a.startsWith(y)){s.has(j)||s.set(j,{});let u=a.split(y)[1];s.get(j)[u]=yt(d);return}if(r.includes(a)){n[a]=d;return}let l=P(a,e)?z(a):a;i[l]=d;});let c=Array.from(s.entries()).map(([a,d])=>d?{method:[a,{replacementsMap:o,scopeValue:d}]}:a);return {formattedQuery:i,externalQueryValues:n,formattedScopes:c}},Rt=(t,e,o)=>({$and:t.split(" ").map(r=>({$or:e.filter(i=>o[i].type.key==="STRING").map(i=>({[i]:{$iLike:`%${r}%`}}))}))}),St=({order:t=[],page:e=I,perPage:o=F,include:r=[],query:i={},attributes:n=null,searchTerm:s=null},c,a)=>{let d=bt(t,i),l=Object.keys(c?.associations||{}),{formattedOrders:u,orderScopes:R}=At({order:[...t,mt],associationModels:l,replacementsMap:d}),[S,b]=ft(u,a),A=[...b,...n||[]],x=n?.length?A:{include:A},T=tt(r,c?.associations),V=Et(e),w=Pt(o),L=ht(i,l,d,a?.additionalAllowedAttributes),{formattedScopes:at,externalQueryValues:W}=L,{formattedQuery:_}=L;if(s&&!a?.skipSearchTermFormat){let dt=n?.length?n:Object.keys(c.rawAttributes),X=Rt(s,dt,c.rawAttributes);_=!_||Object.keys(_).length===0?X:{$and:[_,X]};}return {query:_,order:S,page:V,perPage:w,include:T,scopes:[...at,...R],...x&&{attributes:x},...Object.keys(W).length>0&&{externalQueryValues:W}}},et=St;var xt=t=>D.includes(t.split(E)[1]),rt=(t,e=[],o=[],r=[])=>[...e,...o].includes(t.includes(g)?t.split(g)[0]:t)||r.includes(t),wt=(t,e,o,r={})=>{let i=M(t);i&&t[0]!==m&&p(`${m} must be only at the beginning of the word`);let n=i?t.split(m)[1]:t,s=P(n,o),c=$(t,o),a=r?.literalAttributes?.map(d=>d.attribute)?.includes(n);!s&&c.includes(g)&&([c]=c.split(g)),e.includes(c)||s||a||p(`${t} is invalid. isLiteralAttribute: ${a}`);},_t=(t,e)=>{e.includes(t)||p(`${t} is invalid`);},ot=(t,e,o=[],r={})=>{t.forEach(i=>wt(i,e,o,r));},nt=(t,e)=>{t.forEach(o=>_t(o,e));},Ft=(t,e)=>{let o=Array.isArray(t)?t:Object.keys(t);if(!o?.length)return;let r=o.find(i=>!e?.enrichmentAttributes?.includes(i));r&&p(`enrichment attribute ${r} is invalid`);},q=(t,e,o=[],r=[])=>{Object.entries(t).forEach(([i,n])=>{Array.isArray(n)?n[0]&&typeof n[0]=="object"&&n.map(s=>q(s,e,o,r)):xt(i)||rt(i,e,o,r)?n&&typeof n=="object"&&q(n,e,[],r):p(`invalid key: ${i}`);});},It=({page:t,perPage:e})=>{t<H&&p("Page must be greater than 0"),(e>Q||e<k)&&p(`PerPage must be between ${k} to ${Q}`);},Mt=(t,e)=>{let o=Object.keys(e);t.forEach(r=>{rt(r.model,o);let i=e[r.model]?.target;i||p("model not found in associations");let{rawAttributes:n}=i,s=Object.keys(n);r.where&&q(r.where,s),r.order&&ot(r.order,s),r.attributes&&nt(r.attributes,s),[null,void 0,true,false].includes(r.required)||p("include.required must be a boolean");});},N=({query:t={},order:e=[],attributes:o=[],include:r=[],page:i=I,perPage:n=F,enrichments:s=[],group:c=[]},a,d={})=>{let l=Object.keys(a.rawAttributes),u=Object.keys(a?.associations||{});return !o||o.length===0?o=l:nt(o,l),ot(e,l,u,d),q(t,l,u,d.additionalAllowedAttributes),Ft(s,d),Array.isArray(c)||p("group must be an array"),r.length&&typeof r=="object"?Mt(r,a?.associations):r&&typeof r!="object"&&p("include must be an array"),It({page:i,perPage:n}),true};var {object:G,string:O,number:it,any:Vt,array:h,alternatives:Dt}=qt__default.default.types(),Qt=Tt__default.default(),kt=G.keys({query:G,attributes:h.items(O),order:h.items(O),page:it,perPage:it,include:h.items(Vt),searchTerm:O,group:h.items(O),enrichments:Dt.try(h.items(O),G.pattern(O,{exclude:h.items(O)}))}),K=(t,e,o={})=>{let{query:r,attributes:i,order:n,page:s,perPage:c,include:a,group:d,enrichments:l}=e,u=kt.validate(e);if(u.error)throw new errors.BadRequest([u.error],null);N({query:r,attributes:i,order:n,page:s,perPage:c,include:a,enrichments:l,group:d},t,o);},vt=(t,e={},o="body")=>async(r,i,n)=>{try{K(t,r[o],e),n();}catch(s){let{query:c,attributes:a,order:d}=r[o];errors.handleError(s,i,{logger:e.logger||Qt,message:"error in query middleware",payload:{error:s,query:c,attributes:a,order:d}});}},U=(t,e,o={})=>{let{order:r,page:i,perPage:n,include:s,query:c,attributes:a,searchTerm:d}=e,{query:l,externalQueryValues:u,order:R,page:S,perPage:b,include:A,scopes:x,attributes:T}=et({query:c,order:r,page:i,perPage:n,include:s,attributes:a,searchTerm:d},t,o);e.query=l,e.externalQueryValues=u,e.order=R,e.attributes=T,e.page=S,e.perPage=b,e.include=A,e.scopes=x,o.includeRawPayload&&(e.rawPayload={order:r,page:i,perPage:n,include:s,query:c,attributes:a,searchTerm:d});},jt=(t,e={},o="body")=>async(r,i,n)=>{U(t,r[o],e),n();};var Nt=({model:t,logger:e,validationOptions:o,formatOptions:r,modelName:i=t.constructor?.name,additionalScopes:n=[],modifyQueryValues:s,onRowsRetrieved:c})=>async(a,d)=>{try{K(t,a.body,{...o,logger:e});}catch(l){let u=v(a.body,["query","order","attributes"]);errors.handleError(l,d,{logger:e,message:"error in query endpoint",payload:u});return}try{U(t,a.body,r);let l=Object.assign(v(a.body,["query","externalQueryValues","order","attributes","page","perPage","include","scopes","enrichments"]),{distinct:!0});e.info(`querying ${i}`,{queryValues:l});let u=s?.(l)??l,{scopes:R=[],query:S,perPage:b,page:A,enrichments:x,externalQueryValues:T,...V}=u,w=await t.scope([...n,...R]).findAndCountAll({where:S,limit:b,offset:(A-1)*b,...V});if(!w.rows.length||!c){d.json(w);return}let L=await c(w,u);d.json(L);}catch(l){errors.handleError(new errors.UnexpectedError(l),d,{logger:e,message:`Error while querying ${i}`,payload:{query:a.body}});}};exports.formatOperators=ct;exports.generateFilterReplacements=Z;exports.queryFormatMiddleware=jt;exports.queryHandler=Nt;exports.queryValidationMiddleware=vt;exports.validatePayload=N;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var Lt=require('@autofleet/logger'),errors=require('@autofleet/errors'),Vt=require('joi'),commonTypes=require('@autofleet/common-types');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Lt__default=/*#__PURE__*/_interopDefault(Lt);var Vt__default=/*#__PURE__*/_interopDefault(Vt);var D=["eq","ne","gte","gt","lte","lt","not","in","notIn","is","like","iLike","notLike","between","and","or","overlap","contains"],A="$",H={$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"},lt=t=>{let{Op:e}=t;return D.reduce((o,r)=>(o[`${A+r}`]=e[r],o),{})};var pt=t=>Math.floor(Math.random()*Math.floor(t)),m="-",g=".",M=20,T=1,Q=100,k=1,z=1,Y=t=>`${A}${t}${A}`,E=(t,e)=>t.includes(g)&&e.includes(t.split(g)[0]),$=(t,e)=>{let o=t;return t.includes(m)&&(o=o.split(m)[1]),E(o,e)&&([o]=o.split(g)),o},L=t=>t.includes(m),p=t=>{throw new errors.BadRequest([new Error(t)])},J=t=>t.split(g)[1],f=(t=5)=>{let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";return Array.from({length:t},()=>e.charAt(pt(e.length))).join("")},v=(t,e)=>Object.fromEntries(e.map(o=>[o,t[o]]));var gt="id",Z="DESC",yt="ASC",y="customFields.",{CUSTOM_FIELDS_FILTER_SCOPE:j,CUSTOM_FIELDS_SORT_SCOPE:C}=commonTypes.customFields,ft=t=>["string","number"].includes(typeof t)||Array.isArray(t)?t:Object.entries(t).map(([e,o])=>({operator:H[e],value:o})),Ot=(t,e={})=>{let{literalAttributes:o=[],DBFormatter:r=void 0}=e,[i,n]=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 [i,n]},tt=t=>{let e={};return Object.entries(t).forEach(([o,r])=>{let i=f();if(e[i]=o.split(y)[1],Array.isArray(r))r.forEach(n=>{let s=f();e[s]=typeof n=="string"?n:n.value;});else if(typeof r=="string"||typeof r=="number"){let n=f();e[n]=r;}else if(r?.operator){let n=f();e[n]=r.value;}}),e},bt=t=>{let e={};return t.forEach(o=>{if(o.startsWith(y)){let r=f();e[r]=o.split(y)[1];}else if(o.substring(1).startsWith(y)){let r=f();e[r]=o.substring(1).split(y)[1];}}),e},At=(t,e)=>({...bt(t),...tt(e)}),Et=({order:t,associationModels:e=[],replacementsMap:o={}})=>{let r=[],i=new Map;return t.forEach(n=>{if([n,n.substring(1)].some(d=>d.startsWith(y))){i.has(C)||i.set(C,{});let d=n.split(y)[1];i.get(C)[d]=L(n)?Z:yt;return}let s=[$(n,e)],c=L(n);E(c?n.split(m)[1]:n,e)&&s.push(J(n)),c&&s.push(Z),r.push(s);}),{formattedOrders:r,replacementsMap:o,orderScopes:Array.from(i.entries()).map(([n,s])=>s?{method:[n,{replacementsMap:o,scopeValue:s}]}:n)}},ht=t=>t||T,Pt=t=>t||M,et=(t,e={})=>{let o=t.map(r=>{let i=e[typeof r=="string"?r:r.association||r.model];return {...typeof r!="string"&&r,association:i,required:typeof r=="string"||r.required!==false,...typeof r!="string"&&r.include&&{include:et(r.include,i?.target?.associations)}}});return o=o.map(({model:r,...i})=>i),o},Rt=(t,e,o,r=[])=>{let i={},n={},s=new Map;Object.entries(t).forEach(([a,d])=>{if(a.startsWith(y)){s.has(j)||s.set(j,{});let u=a.split(y)[1];s.get(j)[u]=ft(d);return}if(r.includes(a)){n[a]=d;return}let l=E(a,e)?Y(a):a;i[l]=d;});let c=Array.from(s.entries()).map(([a,d])=>d?{method:[a,{replacementsMap:o,scopeValue:d}]}:a);return {formattedQuery:i,externalQueryValues:n,formattedScopes:c}},St=(t,e,o)=>({$and:t.split(" ").map(r=>({$or:e.filter(i=>o[i].type.key==="STRING").map(i=>({[i]:{$iLike:`%${r}%`}}))}))}),xt=({order:t=[],page:e=T,perPage:o=M,include:r=[],query:i={},attributes:n=null,searchTerm:s=null,group:c},a,d)=>{let l=At(t,i),u=Object.keys(a?.associations||{}),{formattedOrders:P,orderScopes:R}=Et({order:!t.length&&Array.isArray(c)&&c.length?t:[...t,gt],associationModels:u,replacementsMap:l}),[b,S]=Ot(P,d),x=[...S,...n||[]],w=n?.length?x:{include:x},_=et(r,a?.associations),F=ht(e),V=Pt(o),W=Rt(i,u,l,d?.additionalAllowedAttributes),{formattedScopes:dt,externalQueryValues:X}=W,{formattedQuery:I}=W;if(s&&!d?.skipSearchTermFormat){let ct=n?.length?n:Object.keys(a.rawAttributes),B=St(s,ct,a.rawAttributes);I=!I||Object.keys(I).length===0?B:{$and:[I,B]};}return {query:I,order:b,page:F,perPage:V,include:_,scopes:[...dt,...R],...w&&{attributes:w},...Object.keys(X).length>0&&{externalQueryValues:X}}},rt=xt;var wt=t=>D.includes(t.split(A)[1]),ot=(t,e=[],o=[],r=[])=>[...e,...o].includes(t.includes(g)?t.split(g)[0]:t)||r.includes(t),_t=(t,e,o,r={})=>{let i=L(t);i&&t[0]!==m&&p(`${m} must be only at the beginning of the word`);let n=i?t.split(m)[1]:t,s=E(n,o),c=$(t,o),a=r?.literalAttributes?.map(d=>d.attribute)?.includes(n);!s&&c.includes(g)&&([c]=c.split(g)),e.includes(c)||s||a||p(`${t} is invalid. isLiteralAttribute: ${a}`);},Ft=(t,e)=>{e.includes(t)||p(`${t} is invalid`);},nt=(t,e,o=[],r={})=>{t.forEach(i=>_t(i,e,o,r));},it=(t,e)=>{t.forEach(o=>Ft(o,e));},It=(t,e)=>{let o=Array.isArray(t)?t:Object.keys(t);if(!o?.length)return;let r=o.find(i=>!e?.enrichmentAttributes?.includes(i));r&&p(`enrichment attribute ${r} is invalid`);},q=(t,e,o=[],r=[])=>{Object.entries(t).forEach(([i,n])=>{Array.isArray(n)?n[0]&&typeof n[0]=="object"&&n.map(s=>q(s,e,o,r)):wt(i)||ot(i,e,o,r)?n&&typeof n=="object"&&q(n,e,[],r):p(`invalid key: ${i}`);});},Mt=({page:t,perPage:e})=>{t<z&&p("Page must be greater than 0"),(e>Q||e<k)&&p(`PerPage must be between ${k} to ${Q}`);},Tt=(t,e)=>{let o=Object.keys(e);t.forEach(r=>{ot(r.model,o);let i=e[r.model]?.target;i||p("model not found in associations");let{rawAttributes:n}=i,s=Object.keys(n);r.where&&q(r.where,s),r.order&&nt(r.order,s),r.attributes&&it(r.attributes,s),[null,void 0,true,false].includes(r.required)||p("include.required must be a boolean");});},N=({query:t={},order:e=[],attributes:o=[],include:r=[],page:i=T,perPage:n=M,enrichments:s=[],group:c=[]},a,d={})=>{let l=Object.keys(a.rawAttributes),u=Object.keys(a?.associations||{});return !o||o.length===0?o=l:it(o,l),nt(e,l,u,d),q(t,l,u,d.additionalAllowedAttributes),It(s,d),Array.isArray(c)||p("group must be an array"),r.length&&typeof r=="object"?Tt(r,a?.associations):r&&typeof r!="object"&&p("include must be an array"),Mt({page:i,perPage:n}),true};var {object:G,string:O,number:st,any:Dt,array:h,alternatives:Qt}=Vt__default.default.types(),kt=Lt__default.default(),vt=G.keys({query:G,attributes:h.items(O),order:h.items(O),page:st,perPage:st,include:h.items(Dt),searchTerm:O,group:h.items(O),enrichments:Qt.try(h.items(O),G.pattern(O,{exclude:h.items(O)}))}),K=(t,e,o={})=>{let{query:r,attributes:i,order:n,page:s,perPage:c,include:a,group:d,enrichments:l}=e,u=vt.validate(e);if(u.error)throw new errors.BadRequest([u.error],null);N({query:r,attributes:i,order:n,page:s,perPage:c,include:a,enrichments:l,group:d},t,o);},jt=(t,e={},o="body")=>async(r,i,n)=>{try{K(t,r[o],e),n();}catch(s){let{query:c,attributes:a,order:d}=r[o];errors.handleError(s,i,{logger:e.logger||kt,message:"error in query middleware",payload:{error:s,query:c,attributes:a,order:d}});}},U=(t,e,o={})=>{let{order:r,page:i,perPage:n,include:s,query:c,attributes:a,searchTerm:d,group:l}=e,{query:u,externalQueryValues:P,order:R,page:b,perPage:S,include:x,scopes:w,attributes:_}=rt({query:c,order:r,page:i,perPage:n,include:s,attributes:a,searchTerm:d,group:l},t,o);e.query=u,e.externalQueryValues=P,e.order=R,e.attributes=_,e.page=b,e.perPage=S,e.include=x,e.scopes=w,o.includeRawPayload&&(e.rawPayload={order:r,page:i,perPage:n,include:s,query:c,attributes:a,searchTerm:d});},Ct=(t,e={},o="body")=>async(r,i,n)=>{U(t,r[o],e),n();};var Gt=({model:t,logger:e,validationOptions:o,formatOptions:r,modelName:i=t.constructor?.name,additionalScopes:n=[],modifyQueryValues:s,onRowsRetrieved:c})=>async(a,d)=>{try{K(t,a.body,{...o,logger:e});}catch(l){let u=v(a.body,["query","order","attributes"]);errors.handleError(l,d,{logger:e,message:"error in query endpoint",payload:u});return}try{U(t,a.body,r);let l=Object.assign(v(a.body,["query","externalQueryValues","order","attributes","page","perPage","include","scopes","enrichments"]),{distinct:!0});e.info(`querying ${i}`,{queryValues:l});let u=s?.(l)??l,{scopes:P=[],query:R,perPage:b,page:S,enrichments:x,externalQueryValues:w,..._}=u,F=await t.scope([...n,...P]).findAndCountAll({where:R,limit:b,offset:(S-1)*b,..._});if(!F.rows.length||!c){d.json(F);return}let V=await c(F,u);d.json(V);}catch(l){errors.handleError(new errors.UnexpectedError(l),d,{logger:e,message:`Error while querying ${i}`,payload:{query:a.body}});}};exports.formatOperators=lt;exports.generateFilterReplacements=tt;exports.queryFormatMiddleware=Ct;exports.queryHandler=Gt;exports.queryValidationMiddleware=jt;exports.validatePayload=N;//# 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","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","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","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","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 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}, 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 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} 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 attribute: string,\n modelAttributes: string[] = [],\n associationModels: string[] = [],\n additionalAllowedAttributes: string[] = [],\n): boolean => (\n [...modelAttributes, ...associationModels].includes(attribute.includes(ASSOCIATION_PREFIX) ? 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};\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 },\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\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});\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 } = 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 }, 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 } = 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 } = formatPayload({\n query,\n order,\n page,\n perPage,\n include,\n attributes,\n searchTerm,\n }, model, options);\n\n /* eslint-disable no-param-reassign */\n data.query = formattedQuery;\n data.externalQueryValues = externalQueryValues;\n data.order = formattedOrder;\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'] 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","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","group","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","validateEnrichments","enrichments","enrichmentKeys","invalidEnrichment","enrichment","validateQueryPayload","v","validatePagination","validateIncludePayload","associations","associationsKeys","target","attributeKeys","validatePayload","object","string","number","any","array","alternatives","Joi","fallbackLogger","Logger","querySchema","queryValidation","data","queryValidationMiddleware","inner","req","res","next","error","handleError","queryFormat","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 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 group,\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.length && Array.isArray(group) && group.length) ? 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 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} 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 attribute: string,\n modelAttributes: string[] = [],\n associationModels: string[] = [],\n additionalAllowedAttributes: string[] = [],\n): boolean => (\n [...modelAttributes, ...associationModels].includes(attribute.includes(ASSOCIATION_PREFIX) ? 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};\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 },\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\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});\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 } = 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 }, 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 group,\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 } = formatPayload({\n query,\n order,\n page,\n perPage,\n include,\n attributes,\n searchTerm,\n group,\n }, model, options);\n\n /* eslint-disable no-param-reassign */\n data.query = formattedQuery;\n data.externalQueryValues = externalQueryValues;\n data.order = formattedOrder;\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'] 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
@@ -24,7 +24,7 @@ type ConditionValue = ConditionWithOperator | ConditionWithOperator[] | string |
24
24
  * @returns The replacements object.
25
25
  */
26
26
  declare const generateFilterReplacements: (conditions: Record<string, ConditionValue>) => Record<string, string>;
27
- declare const formatPayload: ({ order, page, perPage, include, query, attributes, searchTerm, }: {
27
+ declare const formatPayload: ({ order, page, perPage, include, query, attributes, searchTerm, group, }: {
28
28
  order?: any[];
29
29
  page?: number;
30
30
  perPage?: number;
@@ -32,6 +32,7 @@ declare const formatPayload: ({ order, page, perPage, include, query, attributes
32
32
  query?: {};
33
33
  attributes?: any;
34
34
  searchTerm?: any;
35
+ group: any;
35
36
  }, model?: any, options?: FormatPayloadOptions) => {
36
37
  externalQueryValues: Record<string, unknown>;
37
38
  attributes: any[] | {
package/lib/index.d.ts CHANGED
@@ -24,7 +24,7 @@ type ConditionValue = ConditionWithOperator | ConditionWithOperator[] | string |
24
24
  * @returns The replacements object.
25
25
  */
26
26
  declare const generateFilterReplacements: (conditions: Record<string, ConditionValue>) => Record<string, string>;
27
- declare const formatPayload: ({ order, page, perPage, include, query, attributes, searchTerm, }: {
27
+ declare const formatPayload: ({ order, page, perPage, include, query, attributes, searchTerm, group, }: {
28
28
  order?: any[];
29
29
  page?: number;
30
30
  perPage?: number;
@@ -32,6 +32,7 @@ declare const formatPayload: ({ order, page, perPage, include, query, attributes
32
32
  query?: {};
33
33
  attributes?: any;
34
34
  searchTerm?: any;
35
+ group: any;
35
36
  }, model?: any, options?: FormatPayloadOptions) => {
36
37
  externalQueryValues: Record<string, unknown>;
37
38
  attributes: any[] | {
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import Tt from'@autofleet/logger';import {handleError,UnexpectedError,BadRequest}from'@autofleet/errors';import qt from'joi';import {customFields}from'@autofleet/common-types';var D=["eq","ne","gte","gt","lte","lt","not","in","notIn","is","like","iLike","notLike","between","and","or","overlap","contains"],E="$",B={$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"},ct=t=>{let{Op:e}=t;return D.reduce((o,r)=>(o[`${E+r}`]=e[r],o),{})};var ut=t=>Math.floor(Math.random()*Math.floor(t)),m="-",g=".",F=20,I=1,Q=100,k=1,H=1,z=t=>`${E}${t}${E}`,P=(t,e)=>t.includes(g)&&e.includes(t.split(g)[0]),$=(t,e)=>{let o=t;return t.includes(m)&&(o=o.split(m)[1]),P(o,e)&&([o]=o.split(g)),o},M=t=>t.includes(m),p=t=>{throw new BadRequest([new Error(t)])},Y=t=>t.split(g)[1],f=(t=5)=>{let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";return Array.from({length:t},()=>e.charAt(ut(e.length))).join("")},v=(t,e)=>Object.fromEntries(e.map(o=>[o,t[o]]));var mt="id",J="DESC",gt="ASC",y="customFields.",{CUSTOM_FIELDS_FILTER_SCOPE:j,CUSTOM_FIELDS_SORT_SCOPE:C}=customFields,yt=t=>["string","number"].includes(typeof t)||Array.isArray(t)?t:Object.entries(t).map(([e,o])=>({operator:B[e],value:o})),ft=(t,e={})=>{let{literalAttributes:o=[],DBFormatter:r=void 0}=e,[i,n]=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 [i,n]},Z=t=>{let e={};return Object.entries(t).forEach(([o,r])=>{let i=f();if(e[i]=o.split(y)[1],Array.isArray(r))r.forEach(n=>{let s=f();e[s]=typeof n=="string"?n:n.value;});else if(typeof r=="string"||typeof r=="number"){let n=f();e[n]=r;}else if(r?.operator){let n=f();e[n]=r.value;}}),e},Ot=t=>{let e={};return t.forEach(o=>{if(o.startsWith(y)){let r=f();e[r]=o.split(y)[1];}else if(o.substring(1).startsWith(y)){let r=f();e[r]=o.substring(1).split(y)[1];}}),e},bt=(t,e)=>({...Ot(t),...Z(e)}),At=({order:t,associationModels:e=[],replacementsMap:o={}})=>{let r=[],i=new Map;return t.forEach(n=>{if([n,n.substring(1)].some(d=>d.startsWith(y))){i.has(C)||i.set(C,{});let d=n.split(y)[1];i.get(C)[d]=M(n)?J:gt;return}let s=[$(n,e)],c=M(n);P(c?n.split(m)[1]:n,e)&&s.push(Y(n)),c&&s.push(J),r.push(s);}),{formattedOrders:r,replacementsMap:o,orderScopes:Array.from(i.entries()).map(([n,s])=>s?{method:[n,{replacementsMap:o,scopeValue:s}]}:n)}},Et=t=>t||I,Pt=t=>t||F,tt=(t,e={})=>{let o=t.map(r=>{let i=e[typeof r=="string"?r:r.association||r.model];return {...typeof r!="string"&&r,association:i,required:typeof r=="string"||r.required!==false,...typeof r!="string"&&r.include&&{include:tt(r.include,i?.target?.associations)}}});return o=o.map(({model:r,...i})=>i),o},ht=(t,e,o,r=[])=>{let i={},n={},s=new Map;Object.entries(t).forEach(([a,d])=>{if(a.startsWith(y)){s.has(j)||s.set(j,{});let u=a.split(y)[1];s.get(j)[u]=yt(d);return}if(r.includes(a)){n[a]=d;return}let l=P(a,e)?z(a):a;i[l]=d;});let c=Array.from(s.entries()).map(([a,d])=>d?{method:[a,{replacementsMap:o,scopeValue:d}]}:a);return {formattedQuery:i,externalQueryValues:n,formattedScopes:c}},Rt=(t,e,o)=>({$and:t.split(" ").map(r=>({$or:e.filter(i=>o[i].type.key==="STRING").map(i=>({[i]:{$iLike:`%${r}%`}}))}))}),St=({order:t=[],page:e=I,perPage:o=F,include:r=[],query:i={},attributes:n=null,searchTerm:s=null},c,a)=>{let d=bt(t,i),l=Object.keys(c?.associations||{}),{formattedOrders:u,orderScopes:R}=At({order:[...t,mt],associationModels:l,replacementsMap:d}),[S,b]=ft(u,a),A=[...b,...n||[]],x=n?.length?A:{include:A},T=tt(r,c?.associations),V=Et(e),w=Pt(o),L=ht(i,l,d,a?.additionalAllowedAttributes),{formattedScopes:at,externalQueryValues:W}=L,{formattedQuery:_}=L;if(s&&!a?.skipSearchTermFormat){let dt=n?.length?n:Object.keys(c.rawAttributes),X=Rt(s,dt,c.rawAttributes);_=!_||Object.keys(_).length===0?X:{$and:[_,X]};}return {query:_,order:S,page:V,perPage:w,include:T,scopes:[...at,...R],...x&&{attributes:x},...Object.keys(W).length>0&&{externalQueryValues:W}}},et=St;var xt=t=>D.includes(t.split(E)[1]),rt=(t,e=[],o=[],r=[])=>[...e,...o].includes(t.includes(g)?t.split(g)[0]:t)||r.includes(t),wt=(t,e,o,r={})=>{let i=M(t);i&&t[0]!==m&&p(`${m} must be only at the beginning of the word`);let n=i?t.split(m)[1]:t,s=P(n,o),c=$(t,o),a=r?.literalAttributes?.map(d=>d.attribute)?.includes(n);!s&&c.includes(g)&&([c]=c.split(g)),e.includes(c)||s||a||p(`${t} is invalid. isLiteralAttribute: ${a}`);},_t=(t,e)=>{e.includes(t)||p(`${t} is invalid`);},ot=(t,e,o=[],r={})=>{t.forEach(i=>wt(i,e,o,r));},nt=(t,e)=>{t.forEach(o=>_t(o,e));},Ft=(t,e)=>{let o=Array.isArray(t)?t:Object.keys(t);if(!o?.length)return;let r=o.find(i=>!e?.enrichmentAttributes?.includes(i));r&&p(`enrichment attribute ${r} is invalid`);},q=(t,e,o=[],r=[])=>{Object.entries(t).forEach(([i,n])=>{Array.isArray(n)?n[0]&&typeof n[0]=="object"&&n.map(s=>q(s,e,o,r)):xt(i)||rt(i,e,o,r)?n&&typeof n=="object"&&q(n,e,[],r):p(`invalid key: ${i}`);});},It=({page:t,perPage:e})=>{t<H&&p("Page must be greater than 0"),(e>Q||e<k)&&p(`PerPage must be between ${k} to ${Q}`);},Mt=(t,e)=>{let o=Object.keys(e);t.forEach(r=>{rt(r.model,o);let i=e[r.model]?.target;i||p("model not found in associations");let{rawAttributes:n}=i,s=Object.keys(n);r.where&&q(r.where,s),r.order&&ot(r.order,s),r.attributes&&nt(r.attributes,s),[null,void 0,true,false].includes(r.required)||p("include.required must be a boolean");});},N=({query:t={},order:e=[],attributes:o=[],include:r=[],page:i=I,perPage:n=F,enrichments:s=[],group:c=[]},a,d={})=>{let l=Object.keys(a.rawAttributes),u=Object.keys(a?.associations||{});return !o||o.length===0?o=l:nt(o,l),ot(e,l,u,d),q(t,l,u,d.additionalAllowedAttributes),Ft(s,d),Array.isArray(c)||p("group must be an array"),r.length&&typeof r=="object"?Mt(r,a?.associations):r&&typeof r!="object"&&p("include must be an array"),It({page:i,perPage:n}),true};var {object:G,string:O,number:it,any:Vt,array:h,alternatives:Dt}=qt.types(),Qt=Tt(),kt=G.keys({query:G,attributes:h.items(O),order:h.items(O),page:it,perPage:it,include:h.items(Vt),searchTerm:O,group:h.items(O),enrichments:Dt.try(h.items(O),G.pattern(O,{exclude:h.items(O)}))}),K=(t,e,o={})=>{let{query:r,attributes:i,order:n,page:s,perPage:c,include:a,group:d,enrichments:l}=e,u=kt.validate(e);if(u.error)throw new BadRequest([u.error],null);N({query:r,attributes:i,order:n,page:s,perPage:c,include:a,enrichments:l,group:d},t,o);},vt=(t,e={},o="body")=>async(r,i,n)=>{try{K(t,r[o],e),n();}catch(s){let{query:c,attributes:a,order:d}=r[o];handleError(s,i,{logger:e.logger||Qt,message:"error in query middleware",payload:{error:s,query:c,attributes:a,order:d}});}},U=(t,e,o={})=>{let{order:r,page:i,perPage:n,include:s,query:c,attributes:a,searchTerm:d}=e,{query:l,externalQueryValues:u,order:R,page:S,perPage:b,include:A,scopes:x,attributes:T}=et({query:c,order:r,page:i,perPage:n,include:s,attributes:a,searchTerm:d},t,o);e.query=l,e.externalQueryValues=u,e.order=R,e.attributes=T,e.page=S,e.perPage=b,e.include=A,e.scopes=x,o.includeRawPayload&&(e.rawPayload={order:r,page:i,perPage:n,include:s,query:c,attributes:a,searchTerm:d});},jt=(t,e={},o="body")=>async(r,i,n)=>{U(t,r[o],e),n();};var Nt=({model:t,logger:e,validationOptions:o,formatOptions:r,modelName:i=t.constructor?.name,additionalScopes:n=[],modifyQueryValues:s,onRowsRetrieved:c})=>async(a,d)=>{try{K(t,a.body,{...o,logger:e});}catch(l){let u=v(a.body,["query","order","attributes"]);handleError(l,d,{logger:e,message:"error in query endpoint",payload:u});return}try{U(t,a.body,r);let l=Object.assign(v(a.body,["query","externalQueryValues","order","attributes","page","perPage","include","scopes","enrichments"]),{distinct:!0});e.info(`querying ${i}`,{queryValues:l});let u=s?.(l)??l,{scopes:R=[],query:S,perPage:b,page:A,enrichments:x,externalQueryValues:T,...V}=u,w=await t.scope([...n,...R]).findAndCountAll({where:S,limit:b,offset:(A-1)*b,...V});if(!w.rows.length||!c){d.json(w);return}let L=await c(w,u);d.json(L);}catch(l){handleError(new UnexpectedError(l),d,{logger:e,message:`Error while querying ${i}`,payload:{query:a.body}});}};export{ct as formatOperators,Z as generateFilterReplacements,jt as queryFormatMiddleware,Nt as queryHandler,vt as queryValidationMiddleware,N as validatePayload};//# sourceMappingURL=index.js.map
1
+ import Lt from'@autofleet/logger';import {handleError,UnexpectedError,BadRequest}from'@autofleet/errors';import Vt from'joi';import {customFields}from'@autofleet/common-types';var D=["eq","ne","gte","gt","lte","lt","not","in","notIn","is","like","iLike","notLike","between","and","or","overlap","contains"],A="$",H={$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"},lt=t=>{let{Op:e}=t;return D.reduce((o,r)=>(o[`${A+r}`]=e[r],o),{})};var pt=t=>Math.floor(Math.random()*Math.floor(t)),m="-",g=".",M=20,T=1,Q=100,k=1,z=1,Y=t=>`${A}${t}${A}`,E=(t,e)=>t.includes(g)&&e.includes(t.split(g)[0]),$=(t,e)=>{let o=t;return t.includes(m)&&(o=o.split(m)[1]),E(o,e)&&([o]=o.split(g)),o},L=t=>t.includes(m),p=t=>{throw new BadRequest([new Error(t)])},J=t=>t.split(g)[1],f=(t=5)=>{let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";return Array.from({length:t},()=>e.charAt(pt(e.length))).join("")},v=(t,e)=>Object.fromEntries(e.map(o=>[o,t[o]]));var gt="id",Z="DESC",yt="ASC",y="customFields.",{CUSTOM_FIELDS_FILTER_SCOPE:j,CUSTOM_FIELDS_SORT_SCOPE:C}=customFields,ft=t=>["string","number"].includes(typeof t)||Array.isArray(t)?t:Object.entries(t).map(([e,o])=>({operator:H[e],value:o})),Ot=(t,e={})=>{let{literalAttributes:o=[],DBFormatter:r=void 0}=e,[i,n]=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 [i,n]},tt=t=>{let e={};return Object.entries(t).forEach(([o,r])=>{let i=f();if(e[i]=o.split(y)[1],Array.isArray(r))r.forEach(n=>{let s=f();e[s]=typeof n=="string"?n:n.value;});else if(typeof r=="string"||typeof r=="number"){let n=f();e[n]=r;}else if(r?.operator){let n=f();e[n]=r.value;}}),e},bt=t=>{let e={};return t.forEach(o=>{if(o.startsWith(y)){let r=f();e[r]=o.split(y)[1];}else if(o.substring(1).startsWith(y)){let r=f();e[r]=o.substring(1).split(y)[1];}}),e},At=(t,e)=>({...bt(t),...tt(e)}),Et=({order:t,associationModels:e=[],replacementsMap:o={}})=>{let r=[],i=new Map;return t.forEach(n=>{if([n,n.substring(1)].some(d=>d.startsWith(y))){i.has(C)||i.set(C,{});let d=n.split(y)[1];i.get(C)[d]=L(n)?Z:yt;return}let s=[$(n,e)],c=L(n);E(c?n.split(m)[1]:n,e)&&s.push(J(n)),c&&s.push(Z),r.push(s);}),{formattedOrders:r,replacementsMap:o,orderScopes:Array.from(i.entries()).map(([n,s])=>s?{method:[n,{replacementsMap:o,scopeValue:s}]}:n)}},ht=t=>t||T,Pt=t=>t||M,et=(t,e={})=>{let o=t.map(r=>{let i=e[typeof r=="string"?r:r.association||r.model];return {...typeof r!="string"&&r,association:i,required:typeof r=="string"||r.required!==false,...typeof r!="string"&&r.include&&{include:et(r.include,i?.target?.associations)}}});return o=o.map(({model:r,...i})=>i),o},Rt=(t,e,o,r=[])=>{let i={},n={},s=new Map;Object.entries(t).forEach(([a,d])=>{if(a.startsWith(y)){s.has(j)||s.set(j,{});let u=a.split(y)[1];s.get(j)[u]=ft(d);return}if(r.includes(a)){n[a]=d;return}let l=E(a,e)?Y(a):a;i[l]=d;});let c=Array.from(s.entries()).map(([a,d])=>d?{method:[a,{replacementsMap:o,scopeValue:d}]}:a);return {formattedQuery:i,externalQueryValues:n,formattedScopes:c}},St=(t,e,o)=>({$and:t.split(" ").map(r=>({$or:e.filter(i=>o[i].type.key==="STRING").map(i=>({[i]:{$iLike:`%${r}%`}}))}))}),xt=({order:t=[],page:e=T,perPage:o=M,include:r=[],query:i={},attributes:n=null,searchTerm:s=null,group:c},a,d)=>{let l=At(t,i),u=Object.keys(a?.associations||{}),{formattedOrders:P,orderScopes:R}=Et({order:!t.length&&Array.isArray(c)&&c.length?t:[...t,gt],associationModels:u,replacementsMap:l}),[b,S]=Ot(P,d),x=[...S,...n||[]],w=n?.length?x:{include:x},_=et(r,a?.associations),F=ht(e),V=Pt(o),W=Rt(i,u,l,d?.additionalAllowedAttributes),{formattedScopes:dt,externalQueryValues:X}=W,{formattedQuery:I}=W;if(s&&!d?.skipSearchTermFormat){let ct=n?.length?n:Object.keys(a.rawAttributes),B=St(s,ct,a.rawAttributes);I=!I||Object.keys(I).length===0?B:{$and:[I,B]};}return {query:I,order:b,page:F,perPage:V,include:_,scopes:[...dt,...R],...w&&{attributes:w},...Object.keys(X).length>0&&{externalQueryValues:X}}},rt=xt;var wt=t=>D.includes(t.split(A)[1]),ot=(t,e=[],o=[],r=[])=>[...e,...o].includes(t.includes(g)?t.split(g)[0]:t)||r.includes(t),_t=(t,e,o,r={})=>{let i=L(t);i&&t[0]!==m&&p(`${m} must be only at the beginning of the word`);let n=i?t.split(m)[1]:t,s=E(n,o),c=$(t,o),a=r?.literalAttributes?.map(d=>d.attribute)?.includes(n);!s&&c.includes(g)&&([c]=c.split(g)),e.includes(c)||s||a||p(`${t} is invalid. isLiteralAttribute: ${a}`);},Ft=(t,e)=>{e.includes(t)||p(`${t} is invalid`);},nt=(t,e,o=[],r={})=>{t.forEach(i=>_t(i,e,o,r));},it=(t,e)=>{t.forEach(o=>Ft(o,e));},It=(t,e)=>{let o=Array.isArray(t)?t:Object.keys(t);if(!o?.length)return;let r=o.find(i=>!e?.enrichmentAttributes?.includes(i));r&&p(`enrichment attribute ${r} is invalid`);},q=(t,e,o=[],r=[])=>{Object.entries(t).forEach(([i,n])=>{Array.isArray(n)?n[0]&&typeof n[0]=="object"&&n.map(s=>q(s,e,o,r)):wt(i)||ot(i,e,o,r)?n&&typeof n=="object"&&q(n,e,[],r):p(`invalid key: ${i}`);});},Mt=({page:t,perPage:e})=>{t<z&&p("Page must be greater than 0"),(e>Q||e<k)&&p(`PerPage must be between ${k} to ${Q}`);},Tt=(t,e)=>{let o=Object.keys(e);t.forEach(r=>{ot(r.model,o);let i=e[r.model]?.target;i||p("model not found in associations");let{rawAttributes:n}=i,s=Object.keys(n);r.where&&q(r.where,s),r.order&&nt(r.order,s),r.attributes&&it(r.attributes,s),[null,void 0,true,false].includes(r.required)||p("include.required must be a boolean");});},N=({query:t={},order:e=[],attributes:o=[],include:r=[],page:i=T,perPage:n=M,enrichments:s=[],group:c=[]},a,d={})=>{let l=Object.keys(a.rawAttributes),u=Object.keys(a?.associations||{});return !o||o.length===0?o=l:it(o,l),nt(e,l,u,d),q(t,l,u,d.additionalAllowedAttributes),It(s,d),Array.isArray(c)||p("group must be an array"),r.length&&typeof r=="object"?Tt(r,a?.associations):r&&typeof r!="object"&&p("include must be an array"),Mt({page:i,perPage:n}),true};var {object:G,string:O,number:st,any:Dt,array:h,alternatives:Qt}=Vt.types(),kt=Lt(),vt=G.keys({query:G,attributes:h.items(O),order:h.items(O),page:st,perPage:st,include:h.items(Dt),searchTerm:O,group:h.items(O),enrichments:Qt.try(h.items(O),G.pattern(O,{exclude:h.items(O)}))}),K=(t,e,o={})=>{let{query:r,attributes:i,order:n,page:s,perPage:c,include:a,group:d,enrichments:l}=e,u=vt.validate(e);if(u.error)throw new BadRequest([u.error],null);N({query:r,attributes:i,order:n,page:s,perPage:c,include:a,enrichments:l,group:d},t,o);},jt=(t,e={},o="body")=>async(r,i,n)=>{try{K(t,r[o],e),n();}catch(s){let{query:c,attributes:a,order:d}=r[o];handleError(s,i,{logger:e.logger||kt,message:"error in query middleware",payload:{error:s,query:c,attributes:a,order:d}});}},U=(t,e,o={})=>{let{order:r,page:i,perPage:n,include:s,query:c,attributes:a,searchTerm:d,group:l}=e,{query:u,externalQueryValues:P,order:R,page:b,perPage:S,include:x,scopes:w,attributes:_}=rt({query:c,order:r,page:i,perPage:n,include:s,attributes:a,searchTerm:d,group:l},t,o);e.query=u,e.externalQueryValues=P,e.order=R,e.attributes=_,e.page=b,e.perPage=S,e.include=x,e.scopes=w,o.includeRawPayload&&(e.rawPayload={order:r,page:i,perPage:n,include:s,query:c,attributes:a,searchTerm:d});},Ct=(t,e={},o="body")=>async(r,i,n)=>{U(t,r[o],e),n();};var Gt=({model:t,logger:e,validationOptions:o,formatOptions:r,modelName:i=t.constructor?.name,additionalScopes:n=[],modifyQueryValues:s,onRowsRetrieved:c})=>async(a,d)=>{try{K(t,a.body,{...o,logger:e});}catch(l){let u=v(a.body,["query","order","attributes"]);handleError(l,d,{logger:e,message:"error in query endpoint",payload:u});return}try{U(t,a.body,r);let l=Object.assign(v(a.body,["query","externalQueryValues","order","attributes","page","perPage","include","scopes","enrichments"]),{distinct:!0});e.info(`querying ${i}`,{queryValues:l});let u=s?.(l)??l,{scopes:P=[],query:R,perPage:b,page:S,enrichments:x,externalQueryValues:w,..._}=u,F=await t.scope([...n,...P]).findAndCountAll({where:R,limit:b,offset:(S-1)*b,..._});if(!F.rows.length||!c){d.json(F);return}let V=await c(F,u);d.json(V);}catch(l){handleError(new UnexpectedError(l),d,{logger:e,message:`Error while querying ${i}`,payload:{query:a.body}});}};export{lt as formatOperators,tt as generateFilterReplacements,Ct as queryFormatMiddleware,Gt as queryHandler,jt as queryValidationMiddleware,N 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","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","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","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","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 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}, 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 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} 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 attribute: string,\n modelAttributes: string[] = [],\n associationModels: string[] = [],\n additionalAllowedAttributes: string[] = [],\n): boolean => (\n [...modelAttributes, ...associationModels].includes(attribute.includes(ASSOCIATION_PREFIX) ? 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};\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 },\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\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});\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 } = 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 }, 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 } = 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 } = formatPayload({\n query,\n order,\n page,\n perPage,\n include,\n attributes,\n searchTerm,\n }, model, options);\n\n /* eslint-disable no-param-reassign */\n data.query = formattedQuery;\n data.externalQueryValues = externalQueryValues;\n data.order = formattedOrder;\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'] 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","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","group","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","validateEnrichments","enrichments","enrichmentKeys","invalidEnrichment","enrichment","validateQueryPayload","v","validatePagination","validateIncludePayload","associations","associationsKeys","target","attributeKeys","validatePayload","object","string","number","any","array","alternatives","Joi","fallbackLogger","Logger","querySchema","queryValidation","data","queryValidationMiddleware","inner","req","res","next","error","handleError","queryFormat","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 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 group,\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.length && Array.isArray(group) && group.length) ? 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 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} 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 attribute: string,\n modelAttributes: string[] = [],\n associationModels: string[] = [],\n additionalAllowedAttributes: string[] = [],\n): boolean => (\n [...modelAttributes, ...associationModels].includes(attribute.includes(ASSOCIATION_PREFIX) ? 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};\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 },\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\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});\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 } = 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 }, 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 group,\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 } = formatPayload({\n query,\n order,\n page,\n perPage,\n include,\n attributes,\n searchTerm,\n group,\n }, model, options);\n\n /* eslint-disable no-param-reassign */\n data.query = formattedQuery;\n data.externalQueryValues = externalQueryValues;\n data.order = formattedOrder;\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'] 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/sheilta",
3
- "version": "2.0.2",
3
+ "version": "2.0.3-beta-1492407c.1",
4
4
  "description": "Middlewares for validation and parsing of endpoints meant for data querying.",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",