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

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 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
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"],P="$",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"},lt=t=>{let{Op:e}=t;return D.reduce((o,r)=>(o[`${P+r}`]=e[r],o),{})};var pt=t=>Math.floor(Math.random()*Math.floor(t)),m="-",g=".",Q="$",w=20,F=1,k=100,C=1,z=1,Y=t=>`${P}${t}${P}`,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},T=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:N}=commonTypes.customFields,ft=t=>["string","number"].includes(typeof t)||Array.isArray(t)?t:Object.entries(t).map(([e,o])=>({operator:B[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},At=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)=>({...At(t),...tt(e)}),Pt=({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(N)||i.set(N,{});let d=n.split(y)[1];i.get(N)[d]=T(n)?Z:yt;return}let s=[$(n,e)],c=T(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)}},Et=t=>t||F,ht=t=>t||w,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=F,perPage:o=w,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}=Pt({order:[...t,gt],associationModels:l,replacementsMap:d}),[S,A]=Ot(u,a),b=[...A,...n||[]],x=n?.length?b:{include:b},M=et(r,c?.associations),V=Et(e),_=ht(o),L=Rt(i,l,d,a?.additionalAllowedAttributes),{formattedScopes:dt,externalQueryValues:H}=L,{formattedQuery:I}=L;if(s&&!a?.skipSearchTermFormat){let ct=n?.length?n:Object.keys(c.rawAttributes),X=St(s,ct,c.rawAttributes);I=!I||Object.keys(I).length===0?X:{$and:[I,X]};}return {query:I,order:S,page:V,perPage:_,include:M,scopes:[...dt,...R],...x&&{attributes:x},...Object.keys(H).length>0&&{externalQueryValues:H}}},rt=xt;var _t=t=>D.includes(t.split(P)[1]),ot=(t,e=[],o=[],r=[])=>{let i=t.startsWith(Q)&&t.endsWith(Q)?t.slice(1,-1):t;return [...e,...o].includes(i.includes(g)?i.split(g)[0]:i)||r.includes(i)},It=(t,e,o,r={})=>{let i=T(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}`);},wt=(t,e)=>{e.includes(t)||p(`${t} is invalid`);},nt=(t,e,o=[],r={})=>{t.forEach(i=>It(i,e,o,r));},it=(t,e)=>{t.forEach(o=>wt(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)):_t(i)||ot(i,e,o,r)?n&&typeof n=="object"&&q(n,e,[],r):p(`invalid key: ${i}`);});},Tt=({page:t,perPage:e})=>{t<z&&p("Page must be greater than 0"),(e>k||e<C)&&p(`PerPage must be between ${C} to ${k}`);},Mt=(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");});},G=({query:t={},order:e=[],attributes:o=[],include:r=[],page:i=F,perPage:n=w,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),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"),Tt({page:i,perPage:n}),true};var {object:K,string:O,number:st,any:Dt,array:h,alternatives:Qt}=Vt__default.default.types(),kt=Lt__default.default(),Ct=K.keys({query:K,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),K.pattern(O,{exclude:h.items(O)}))}),W=(t,e,o={})=>{let{query:r,attributes:i,order:n,page:s,perPage:c,include:a,group:d,enrichments:l}=e,u=Ct.validate(e);if(u.error)throw new errors.BadRequest([u.error],null);G({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{W(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}=e,{query:l,externalQueryValues:u,order:R,page:S,perPage:A,include:b,scopes:x,attributes:M}=rt({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=M,e.page=S,e.perPage=A,e.include=b,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 Gt=({model:t,logger:e,validationOptions:o,formatOptions:r,modelName:i=t.constructor?.name,additionalScopes:n=[],modifyQueryValues:s,onRowsRetrieved:c})=>async(a,d)=>{try{W(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:A,page:b,enrichments:x,externalQueryValues:M,...V}=u,_=await t.scope([...n,...R]).findAndCountAll({where:S,limit:A,offset:(b-1)*A,...V});if(!_.rows.length||!c){d.json(_);return}let L=await c(_,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=lt;exports.generateFilterReplacements=tt;exports.queryFormatMiddleware=jt;exports.queryHandler=Gt;exports.queryValidationMiddleware=vt;exports.validatePayload=G;//# 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","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"]}
1
+ {"version":3,"sources":["../src/operators/index.ts","../src/utils.ts","../src/formatter/index.ts","../src/validations/index.ts","../src/middleware/index.ts","../src/handler/index.ts"],"names":["OPERATORS","OPERATOR_PREFIX","OPERATORS_TO_SQL","formatOperators","Sequelize","Op","map","o","randomInt","max","ORDER_PREFIX","ASSOCIATION_PREFIX","ASSOCIATION_PATH_WRAPPER","PER_PAGE_DEFAULT","PAGE_DEFAULT","PER_PAGE_MAX_LIMIT","PER_PAGE_MIN_LIMIT","PAGE_MIN","wrapAttributeWithOperator","attribute","isAttributeByAssociation","attributeName","associatedModels","extractAttributeNameFromOrder","order","associationModels","formattedOrder","isOrderDesc","throwBadRequestError","message","BadRequest","extractAssociatedAttributeNameFromOrder","generateRandomString","length","characters","pick","obj","keys","key","DEFAULT_ORDER","DESCENDING_KEY","ASCENDING_KEY","CUSTOM_FIELDS_QUERY_PREFIX","CUSTOM_FIELDS_FILTER_SCOPE","CUSTOM_FIELDS_SORT_SCOPE","customFields","parseCustomFieldScopeQueryValue","value","operator","conditionValue","getAttributeFromOrder","options","literalAttributes","DBFormatter","attributes","acc","item","orderStyle","found","generateFilterReplacements","conditions","replacements","condition","replacementKey","valueKey","conditionKey","operatorKey","generateOrderReplacements","replacementMap","rand","createReplacementMap","query","formatOrder","replacementsMap","formattedOrders","orderScopesMap","t","scopeKey","isOrderDescOrder","scopeName","scopeValue","formatPage","page","formatPerPage","perPage","formatInclude","include","associationsMap","formattedInclude","i","includedAssociation","_model","formatQuery","additionalAllowedAttributes","formattedQuery","externalQueryValues","formattedScopeMap","queryItemKey","queryItemValue","formattedScopes","formatSearchTerm","searchTerm","attributesToSend","rawAttributes","term","attrKey","attr","formatPayload","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","rawAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","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":"yTAAO,IAAMA,CAAY,CAAA,CACvB,IACA,CAAA,IAAA,CACA,KACA,CAAA,IAAA,CACA,KACA,CAAA,IAAA,CACA,KACA,CAAA,IAAA,CACA,OACA,CAAA,IAAA,CACA,OACA,OACA,CAAA,SAAA,CACA,SACA,CAAA,KAAA,CACA,IACA,CAAA,SAAA,CACA,UACF,CAAA,CAEaC,EAAkB,GAElBC,CAAAA,CAAAA,CAAmB,CAC9B,GAAA,CAAK,GACL,CAAA,GAAA,CAAK,IACL,CAAA,IAAA,CAAM,KACN,GAAK,CAAA,GAAA,CACL,IAAM,CAAA,IAAA,CACN,GAAK,CAAA,GAAA,CACL,IAAM,CAAA,KAAA,CACN,IAAK,IACL,CAAA,MAAA,CAAQ,QACR,CAAA,GAAA,CAAK,IACL,CAAA,KAAA,CAAO,MACP,CAAA,MAAA,CAAQ,QACR,QAAU,CAAA,UAAA,CACV,IAAM,CAAA,KAAA,CACN,GAAK,CAAA,IACP,CAEaC,CAAAA,EAAAA,CAAmBC,GAAc,CAC5C,GAAM,CAAE,EAAA,CAAAC,CAAG,CAAA,CAAID,CACf,CAAA,OAAOJ,EAAU,MAAO,CAAA,CAACM,CAAKC,CAAAA,CAAAA,IAE5BD,CAAI,CAAA,CAAA,EAAGL,CAAkBM,CAAAA,CAAC,CAAE,CAAA,CAAA,CAAIF,CAAGE,CAAAA,CAAC,CAC7BD,CAAAA,CAAAA,CAAAA,CACN,EAAE,CACP,EC7CA,IAAME,EAAaC,CAAAA,CAAAA,EAAgB,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,CAAI,IAAK,CAAA,KAAA,CAAMA,CAAG,CAAC,CAEhEC,CAAAA,CAAAA,CAAe,IACfC,CAAqB,CAAA,GAAA,CACrBC,CAA2B,CAAA,GAAA,CAC3BC,CAAmB,CAAA,EAAA,CACnBC,CAAe,CAAA,CAAA,CACfC,EAAqB,GACrBC,CAAAA,CAAAA,CAAqB,CACrBC,CAAAA,CAAAA,CAAW,CAEXC,CAAAA,CAAAA,CAA6BC,CAAsB,EAAA,CAAA,EAAGlB,CAAe,CAAGkB,EAAAA,CAAS,CAAGlB,EAAAA,CAAe,CACnGmB,CAAAA,CAAAA,CAAAA,CAA2B,CAACC,CAAAA,CAAuBC,CAAwCD,GAAAA,CAAAA,CAAc,QAASV,CAAAA,CAAkB,CAC5IW,EAAAA,CAAAA,CAAiB,QAASD,CAAAA,CAAAA,CAAc,MAAMV,CAAkB,CAAA,CAAE,CAAC,CAAC,CAE5DY,CAAAA,CAAAA,CAAgC,CAACC,CAAAA,CAAeC,IAAwC,CACnG,IAAIC,CAAiBF,CAAAA,CAAAA,CACrB,OAAIA,CAAAA,CAAM,QAASd,CAAAA,CAAY,IAE7BgB,CAAiBA,CAAAA,CAAAA,CAAe,KAAMhB,CAAAA,CAAY,CAAE,CAAA,CAAC,CAEnDU,CAAAA,CAAAA,CAAAA,CAAyBM,EAAgBD,CAAiB,CAAA,GAC5D,CAACC,CAAc,CAAIA,CAAAA,CAAAA,CAAe,KAAMf,CAAAA,CAAkB,GAErDe,CACT,CAAA,CAEaC,CAAeH,CAAAA,CAAAA,EAA2BA,CAAM,CAAA,QAAA,CAASd,CAAY,CAAA,CAErEkB,EAAwBC,CAAoB,EAAA,CACvD,MAAM,IAAIC,iBAAW,CAAA,CAAC,IAAI,KAAA,CAAMD,CAAO,CAAC,CAAC,CAC3C,CAAA,CAEaE,CAA2CP,CAAAA,CAAAA,EAA0BA,CAAM,CAAA,KAAA,CAAMb,CAAkB,CAAE,CAAA,CAAC,CAEtGqB,CAAAA,CAAAA,CAAuB,CAACC,CAAAA,CAAS,CAAc,GAAA,CAC1D,IAAMC,CAAa,CAAA,sDAAA,CACnB,OAAO,KAAA,CAAM,IAAK,CAAA,CAAE,MAAAD,CAAAA,CAAO,EAAG,IAAMC,CAAAA,CAAW,MAAO1B,CAAAA,EAAAA,CAAU0B,CAAW,CAAA,MAAM,CAAC,CAAC,EAAE,IAAK,CAAA,EAAE,CAC9F,CAAA,CAEaC,CAAO,CAAA,CAClBC,CACAC,CAAAA,CAAAA,GACe,OAAO,WAAYA,CAAAA,CAAAA,CAAK,GAAKC,CAAAA,CAAAA,EAAQ,CAACA,CAAAA,CAAKF,CAAIE,CAAAA,CAAG,CAAC,CAAC,CAAC,CClCtE,CAAA,IAAMC,EAAgB,CAAA,IAAA,CAChBC,CAAiB,CAAA,MAAA,CACjBC,GAAgB,KAChBC,CAAAA,CAAAA,CAA6B,eAC7B,CAAA,CAAE,0BAAAC,CAAAA,CAAAA,CAA4B,wBAAAC,CAAAA,CAAyB,EAAIC,wBAiB3DC,CAAAA,EAAAA,CAAmCC,CACnC,EAAA,CAAC,QAAU,CAAA,QAAQ,CAAE,CAAA,QAAA,CAAS,OAAOA,CAAK,CAAK,EAAA,KAAA,CAAM,OAAQA,CAAAA,CAAK,CAC7DA,CAAAA,CAAAA,CAEF,OAAO,OAAQA,CAAAA,CAAK,CAAE,CAAA,GAAA,CAAI,CAAC,CAACC,CAAUC,CAAAA,CAAc,KAAO,CAChE,QAAA,CAAU/C,CAAiB8C,CAAAA,CAAQ,CACnC,CAAA,KAAA,CAAOC,CACT,CAAA,CAAE,EAGEC,EAAwB,CAAA,CAAC1B,CAAyB2B,CAAAA,CAAAA,CAAgC,EAAC,GAA4C,CACnI,GAAM,CAAE,iBAAAC,CAAAA,CAAAA,CAAoB,EAAC,CAAG,WAAAC,CAAAA,CAAAA,CAAc,MAAU,CAAA,CAAIF,EACtD,CAACzB,CAAAA,CAAgB4B,CAAU,CAAA,CAAI9B,CAAM,CAAA,MAAA,CAAO,CAAC+B,CAAAA,CAAKhD,IAAM,CAC5D,GAAM,CAACiD,CAAAA,CAAMC,CAAa,CAAA,KAAK,CAAI,CAAA,KAAA,CAAM,QAAQlD,CAAC,CAAA,CAAIA,CAAI,CAAA,CAACA,CAAC,CAAA,CACtDmD,CAAQN,CAAAA,CAAAA,EAAmB,KAAMhB,CAAQA,EAAAA,CAAAA,CAAI,SAAcoB,GAAAA,CAAI,CACrE,CAAA,OAAIE,CACFH,EAAAA,CAAAA,CAAI,CAAC,CAAE,CAAA,IAAA,CAAKG,CAAM,CAAA,OAAO,CACzBH,CAAAA,CAAAA,CAAI,CAAC,CAAA,CAAE,KAAK,CAACF,CAAAA,CAAcA,CAAY,CAAA,CAAA,CAAA,EAAIK,CAAM,CAAA,SAAS,CAAKD,EAAAA,EAAAA,CAAU,EAAE,CAAI,CAAA,CAAA,EAAGC,CAAM,CAAA,SAAS,CAAID,CAAAA,EAAAA,CAAU,CAAE,CAAA,CAAC,GAElHF,CAAI,CAAA,CAAC,CAAE,CAAA,IAAA,CAAKhD,CAAC,CAAA,CAERgD,CACT,CAAA,CAAG,CAAC,EAAC,CAAG,EAAE,CAAC,CAAA,CAEX,OAAO,CAAC7B,EAAgB4B,CAAU,CACpC,CAQaK,CAAAA,EAAAA,CAA8BC,CAAuE,EAAA,CAChH,IAAMC,CAAAA,CAAuC,EAE7C,CAAA,OAAA,MAAA,CAAO,OAAQD,CAAAA,CAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,CAACtB,CAAKwB,CAAAA,CAAS,CAAM,GAAA,CACvD,IAAMC,CAAAA,CAAiB/B,CAAqB,EAAA,CAI5C,GAFA6B,CAAaE,CAAAA,CAAc,CAAIzB,CAAAA,CAAAA,CAAI,KAAMI,CAAAA,CAA0B,CAAE,CAAA,CAAC,EAElE,KAAM,CAAA,OAAA,CAAQoB,CAAS,CAAA,CACzBA,CAAU,CAAA,OAAA,CAASf,CAAU,EAAA,CAC3B,IAAMiB,CAAWhC,CAAAA,CAAAA,EACjB6B,CAAAA,CAAAA,CAAaG,CAAQ,CAAA,CAAI,OAAOjB,CAAAA,EAAU,SAAWA,CAAQA,CAAAA,CAAAA,CAAM,MACrE,CAAC,CACQ,CAAA,KAAA,GAAA,OAAOe,CAAc,EAAA,QAAA,EAAY,OAAOA,CAAc,EAAA,QAAA,CAAU,CACzE,IAAMG,CAAejC,CAAAA,CAAAA,EACrB6B,CAAAA,CAAAA,CAAaI,CAAY,CAAIH,CAAAA,EAC/B,CAAWA,KAAAA,GAAAA,CAAAA,EAAW,QAAU,CAAA,CAC9B,IAAMI,CAAAA,CAAclC,GACpB6B,CAAAA,CAAAA,CAAaK,CAAW,CAAA,CAAIJ,CAAU,CAAA,MACxC,CACF,CAAC,EAEMD,CACT,CAAA,CAQaM,EAA6B3C,CAAAA,CAAAA,EAA4C,CACpF,IAAM4C,CAAiB,CAAA,GACvB,OAAA5C,CAAAA,CAAM,OAAS,CAAA,CAAA,EAAM,CACnB,GAAI,CAAE,CAAA,UAAA,CAAWkB,CAA0B,CAAG,CAAA,CAC5C,IAAM2B,CAAAA,CAAOrC,CAAqB,EAAA,CAElCoC,CAAeC,CAAAA,CAAI,EAAI,CAAE,CAAA,KAAA,CAAM3B,CAA0B,CAAA,CAAE,CAAC,EAC9D,CAAW,KAAA,GAAA,CAAA,CAAE,UAAU,CAAC,CAAA,CAAE,UAAWA,CAAAA,CAA0B,CAAG,CAAA,CAChE,IAAM2B,CAAAA,CAAOrC,GAEboC,CAAAA,CAAAA,CAAeC,CAAI,CAAA,CAAI,CAAE,CAAA,SAAA,CAAU,CAAC,CAAA,CAAE,MAAM3B,CAA0B,CAAA,CAAE,CAAC,EAC3E,CACF,CAAC,CACM0B,CAAAA,CACT,EASME,EAAuB,CAAA,CAAC9C,CAAiB+C,CAAAA,CAAAA,IAAmE,CAChH,GAAGJ,EAA0B3C,CAAAA,CAAK,CAClC,CAAA,GAAGmC,EAA2BY,CAAAA,CAAK,CACrC,CAAA,CAAA,CAEMC,EAAc,CAAA,CAAC,CACnB,KAAAhD,CAAAA,CAAAA,CACA,iBAAAC,CAAAA,CAAAA,CAAoB,EAAC,CACrB,eAAAgD,CAAAA,CAAAA,CAAkB,EACpB,CAAA,GAIK,CACH,IAAMC,CAAkB,CAAA,EAClBC,CAAAA,CAAAA,CAAiB,IAAI,GAC3B,CAAA,OAAAnD,CAAM,CAAA,OAAA,CAASjB,CAAc,EAAA,CAC3B,GAAI,CAACA,EAAGA,CAAE,CAAA,SAAA,CAAU,CAAC,CAAC,CAAE,CAAA,IAAA,CAAMqE,CAAMA,EAAAA,CAAAA,CAAE,WAAWlC,CAA0B,CAAC,CAAG,CAAA,CACxEiC,CAAe,CAAA,GAAA,CAAI/B,CAAwB,CAAA,EAC9C+B,EAAe,GAAI/B,CAAAA,CAAAA,CAA0B,EAAE,CAEjD,CAAA,IAAMiC,CAAWtE,CAAAA,CAAAA,CAAE,MAAMmC,CAA0B,CAAA,CAAE,CAAC,CAAA,CACtDiC,CAAe,CAAA,GAAA,CAAI/B,CAAwB,CAAA,CAAEiC,CAAQ,CAAA,CAAKlD,CAAYpB,CAAAA,CAAC,CAAIiC,CAAAA,CAAAA,CAAiBC,EAC5F,CAAA,MACF,CACA,IAAMf,CAAAA,CAAiB,CAACH,CAAAA,CAA8BhB,CAAGkB,CAAAA,CAAiB,CAAC,CAAA,CACrEqD,EAAmBnD,CAAYpB,CAAAA,CAAC,CACXa,CAAAA,CAAAA,CAAyB0D,CAChDvE,CAAAA,CAAAA,CAAE,KAAMG,CAAAA,CAAY,EAAE,CAAC,CAAA,CACvBH,CAAGkB,CAAAA,CAAiB,CAEtBC,EAAAA,CAAAA,CAAe,IAAKK,CAAAA,CAAAA,CAAwCxB,CAAC,CAAC,CAAA,CAE5DuE,CACFpD,EAAAA,CAAAA,CAAe,IAAKc,CAAAA,CAAc,CAEpCkC,CAAAA,CAAAA,CAAgB,KAAKhD,CAAc,EACrC,CAAC,CAAA,CACM,CACL,eAAA,CAAAgD,CACA,CAAA,eAAA,CAAAD,EACA,WAAa,CAAA,KAAA,CAAM,IAAKE,CAAAA,CAAAA,CAAe,OAAQ,EAAC,CAAE,CAAA,GAAA,CAAI,CAAC,CAACI,CAAAA,CAAWC,CAAU,CAAA,GACtEA,CAGE,CAAA,CACL,MAAQ,CAAA,CAACD,CAAW,CAAA,CAClB,eAAAN,CAAAA,CAAAA,CACA,UAAAO,CAAAA,CACF,CAAC,CACH,EAPSD,CAQV,CACH,CACF,CAAA,CAEME,EAAcC,CAAAA,CAAAA,EAAkBA,CAAQpE,EAAAA,CAAAA,CAExCqE,GAAiBC,CAAqBA,EAAAA,CAAAA,EAAWvE,CASjDwE,CAAAA,EAAAA,CAAgB,CAACC,CAAAA,CAA+BC,CAAkB,CAAA,KAAO,CAC7E,IAAIC,CAAmBF,CAAAA,CAAAA,CAAQ,GAAKG,CAAAA,CAAAA,EAAM,CACxC,IAAMC,EAAsBH,CAAgB,CAAA,OAAOE,CAAM,EAAA,QAAA,CAAWA,CAAKA,CAAAA,CAAAA,CAAE,WAAeA,EAAAA,CAAAA,CAAE,KAAM,CAClG,CAAA,OAAO,CACL,GAAI,OAAOA,CAAAA,EAAM,QAAYA,EAAAA,CAAAA,CAC7B,YAAaC,CACb,CAAA,QAAA,CAAU,OAAOD,CAAAA,EAAM,QAAYA,EAAAA,CAAAA,CAAE,QAAa,GAAA,KAAA,CAClD,GAAI,OAAOA,CAAAA,EAAM,QAAYA,EAAAA,CAAAA,CAAE,OAAW,EAAA,CACxC,OAASJ,CAAAA,EAAAA,CAAcI,EAAE,OAASC,CAAAA,CAAAA,EAAqB,MAAQ,EAAA,YAAY,CAC7E,CACF,CACF,CAAC,EACD,OAAAF,CAAAA,CAAmBA,CAAiB,CAAA,GAAA,CAAI,CAAC,CAAE,KAAOG,CAAAA,CAAAA,CAAQ,GAAG,CAAE,CAAA,GAAM,CAAC,CAAA,CAC/DH,CACT,CAAA,CACMI,EAAc,CAAA,CAACrB,EAAO9C,CAAmBgD,CAAAA,CAAAA,CAAyCoB,CAAwC,CAAA,EAAO,GAAA,CACrI,IAAMC,CAAAA,CAA0C,EAC1CC,CAAAA,CAAAA,CAA+C,EAAC,CAChDC,CAAoB,CAAA,IAAI,GAE9B,CAAA,MAAA,CAAO,QAAQzB,CAAK,CAAA,CAAE,OAAQ,CAAA,CAAC,CAAC0B,CAAAA,CAAcC,CAAc,CAAA,GAAM,CAChE,GAAID,CAAAA,CAAa,UAAWvD,CAAAA,CAA0B,CAAG,CAAA,CAClDsD,CAAkB,CAAA,GAAA,CAAIrD,CAA0B,CACnDqD,EAAAA,CAAAA,CAAkB,GAAIrD,CAAAA,CAAAA,CAA4B,EAAE,CAEtD,CAAA,IAAMkC,CAAWoB,CAAAA,CAAAA,CAAa,KAAMvD,CAAAA,CAA0B,CAAE,CAAA,CAAC,CACjEsD,CAAAA,CAAAA,CAAkB,IAAIrD,CAA0B,CAAA,CAAEkC,CAAQ,CAAA,CAAI/B,EAAgCoD,CAAAA,CAAc,CAC5G,CAAA,MACF,CACA,GAAIL,CAAAA,CAA4B,QAASI,CAAAA,CAAY,CAAG,CAAA,CACtDF,CAAoBE,CAAAA,CAAY,EAAIC,CACpC,CAAA,MACF,CACA,IAAM5D,CAAMlB,CAAAA,CAAAA,CAAyB6E,CAAcxE,CAAAA,CAAiB,EAChEP,CAA0B+E,CAAAA,CAAY,CACtCA,CAAAA,CAAAA,CACJH,CAAexD,CAAAA,CAAG,CAAI4D,CAAAA,EACxB,CAAC,CAED,CAAA,IAAMC,CAAkB,CAAA,KAAA,CAAM,IAAKH,CAAAA,CAAAA,CAAkB,OAAQ,EAAC,EAAE,GAAI,CAAA,CAAC,CAACjB,CAAAA,CAAWC,CAAU,CAAA,GACpFA,CAGE,CAAA,CACL,OAAQ,CAACD,CAAAA,CAAW,CAClB,eAAA,CAAAN,CACA,CAAA,UAAA,CAAAO,CACF,CAAC,CACH,CAPSD,CAAAA,CAQV,CAED,CAAA,OAAO,CACL,cAAA,CAAAe,CACA,CAAA,mBAAA,CAAAC,EACA,eAAAI,CAAAA,CACF,CACF,CAAA,CAEMC,EAAmB,CAAA,CAACC,CAAoBC,CAAAA,CAAAA,CAA4BC,KAAmB,CAC3F,IAAA,CAAMF,CAAW,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,GAAKG,CAAAA,CAAAA,GAAU,CACzC,GAAKF,CAAAA,CAAAA,CAAiB,MAAQG,CAAAA,CAAAA,EAAYF,CAAcE,CAAAA,CAAO,CAAE,CAAA,IAAA,CAAK,MAAQ,QAAQ,CAAA,CAAE,GAAKC,CAAAA,CAAAA,GAAU,CACrG,CAACA,CAAI,EAAG,CACN,MAAQ,CAAA,CAAA,CAAA,EAAIF,CAAI,CAAA,CAAA,CAClB,CACF,CAAA,CAAE,CACJ,CAAA,CAAE,CACJ,CAEMG,CAAAA,CAAAA,EAAAA,CAAgB,CAAC,CACrB,KAAAnF,CAAAA,CAAAA,CAAQ,EAAC,CACT,KAAA0D,CAAOpE,CAAAA,CAAAA,CACP,OAAAsE,CAAAA,CAAAA,CAAUvE,CACV,CAAA,OAAA,CAAAyE,CAAU,CAAA,EACV,CAAA,KAAA,CAAAf,CAAQ,CAAA,EACR,CAAA,UAAA,CAAAjB,CAAa,CAAA,IAAA,CACb,WAAA+C,CAAa,CAAA,IACf,CAAGO,CAAAA,CAAAA,CAAQzD,CAAmC,GAAA,CAC5C,IAAMsB,CAAAA,CAAkBH,GAAqB9C,CAAO+C,CAAAA,CAAK,CACnD9C,CAAAA,CAAAA,CAAoB,MAAO,CAAA,IAAA,CAAKmF,CAAO,EAAA,YAAA,EAAgB,EAAE,CAAA,CACzD,CAAE,eAAA,CAAAlC,CAAiB,CAAA,WAAA,CAAAmC,CAAY,CAAA,CAAIrC,GAAY,CACnD,KAAA,CAAO,CAAC,GAAGhD,CAAOe,CAAAA,EAAa,CAC/B,CAAA,iBAAA,CAAAd,EACA,eAAAgD,CAAAA,CACF,CAAC,CAAA,CACK,CAACqC,CAAAA,CAAwBC,CAAyB,CAAA,CAAI7D,GAC1DwB,CACAvB,CAAAA,CACF,CAEM6D,CAAAA,CAAAA,CAAgB,CAAC,GAAGD,CAA2B,CAAA,GAAIzD,GAAc,EAAG,CACpE2D,CAAAA,CAAAA,CAAqB3D,CAAY,EAAA,MAAA,CAAS0D,CAAgB,CAAA,CAAE,QAASA,CAAc,CAAA,CACnFxB,CAAmBH,CAAAA,EAAAA,CAAcC,CAASsB,CAAAA,CAAAA,EAAO,YAAY,CAAA,CAC7DM,EAAgBjC,EAAWC,CAAAA,CAAI,CAC/BiC,CAAAA,CAAAA,CAAmBhC,EAAcC,CAAAA,CAAO,CACxCgC,CAAAA,CAAAA,CAASxB,GAAYrB,CAAO9C,CAAAA,CAAAA,CAAmBgD,CAAiBtB,CAAAA,CAAAA,EAAS,2BAA2B,CAAA,CACpG,CAAE,eAAA,CAAiBkE,GAAa,mBAAAtB,CAAAA,CAAoB,CAAIqB,CAAAA,CAAAA,CAC1D,CAAE,cAAA,CAAAtB,CAAe,CAAA,CAAIsB,EACzB,GAAIf,CAAAA,EAAc,CAAClD,CAAAA,EAAS,oBAAsB,CAAA,CAChD,IAAMmD,EAAAA,CAAmBhD,GAAY,MAASA,CAAAA,CAAAA,CAAa,MAAO,CAAA,IAAA,CAAKsD,CAAM,CAAA,aAAa,CACpFU,CAAAA,CAAAA,CAAsBlB,GAAiBC,CAAYC,CAAAA,EAAAA,CAAkBM,CAAM,CAAA,aAAa,CAC9Fd,CAAAA,CAAAA,CAAiB,CAACA,CAAAA,EAAkB,OAAO,IAAKA,CAAAA,CAAc,CAAE,CAAA,MAAA,GAAW,CAAIwB,CAAAA,CAAAA,CAAsB,CACnG,IAAA,CAAM,CACJxB,CAAAA,CACAwB,CACF,CACF,EACF,CACA,OAAO,CACL,MAAOxB,CACP,CAAA,KAAA,CAAOgB,CACP,CAAA,IAAA,CAAMI,CACN,CAAA,OAAA,CAASC,CACT,CAAA,OAAA,CAAS3B,EACT,MAAQ,CAAA,CAAC,GAAG6B,EAAAA,CAAa,GAAGR,CAAW,CACvC,CAAA,GAAII,GAAsB,CAAE,UAAA,CAAYA,CAAmB,CAAA,CAC3D,GAAI,MAAA,CAAO,IAAKlB,CAAAA,CAAmB,EAAE,MAAS,CAAA,CAAA,EAAK,CAAE,mBAAA,CAAAA,CAAoB,CAC3E,CACF,CAAA,CAEOwB,GAAQZ,GChSf,IAAMa,EAAoBxE,CAAAA,CAAAA,EAA8BhD,CAAU,CAAA,QAAA,CAASgD,CAAS,CAAA,KAAA,CAAM/C,CAAe,CAAE,CAAA,CAAC,CAAC,CAAA,CAEvGwH,EAAyB,CAAA,CAC7BC,CACAC,CAAAA,CAAAA,CAA4B,EAC5BlG,CAAAA,CAAAA,CAA8B,EAAC,CAC/BoE,CAAwC,CAAA,EAC5B,GAAA,CACZ,IAAM1E,CAAAA,CAAauG,CAAa,CAAA,UAAA,CAC9B9G,CACF,CAAA,EAAK8G,CAAa,CAAA,QAAA,CAChB9G,CACF,CAAK8G,CAAAA,CAAAA,CAAa,KAAM,CAAA,CAAA,CAAG,EAAE,CAAA,CAAIA,CACjC,CAAA,OAAO,CAAC,GAAGC,CAAAA,CAAiB,GAAGlG,CAAiB,CAAE,CAAA,QAAA,CAASN,CAAU,CAAA,QAAA,CAASR,CAAkB,CAC5FQ,CAAAA,CAAAA,CAAU,KAAMR,CAAAA,CAAkB,CAAE,CAAA,CAAC,CAAIQ,CAAAA,CAAS,GACnD0E,CAA4B,CAAA,QAAA,CAAS1E,CAAS,CACnD,CAEMyG,CAAAA,EAAAA,CAAsB,CAC1BC,CAAAA,CACAtB,EACA9E,CACA0B,CAAAA,CAAAA,CAAsC,EAAC,GAC9B,CACT,IAAM2B,CAAmBnD,CAAAA,CAAAA,CAAYkG,CAAY,CAC7C/C,CAAAA,CAAAA,EAAoB+C,CAAa,CAAA,CAAC,CAAMnH,GAAAA,CAAAA,EAC1CkB,CAAqB,CAAA,CAAA,EAAGlB,CAAY,CAA4C,0CAAA,CAAA,CAAA,CAElF,IAAMoH,CAAAA,CAAyBhD,CAAmB+C,CAAAA,CAAAA,CAAa,KAAMnH,CAAAA,CAAY,CAAE,CAAA,CAAC,CAAImH,CAAAA,CAAAA,CAClFE,CAAqB3G,CAAAA,CAAAA,CAAyB0G,CAAwBrG,CAAAA,CAAiB,EACzFuG,CAAuBzG,CAAAA,CAAAA,CAA8BsG,CAAcpG,CAAAA,CAAiB,CAClFwG,CAAAA,CAAAA,CAAqB9E,CAAS,EAAA,iBAAA,EAAmB,IAAK+E,CAAOA,EAAAA,CAAAA,CAAG,SAAS,CAAA,EAAG,QAASJ,CAAAA,CAAsB,CAE7G,CAAA,CAACC,GAAsBC,CAAqB,CAAA,QAAA,CAASrH,CAAkB,CAAA,GACzE,CAACqH,CAAoB,CAAIA,CAAAA,CAAAA,CAAqB,MAAMrH,CAAkB,CAAA,CAAA,CAGlE4F,CAAc,CAAA,QAAA,CAASyB,CAAoB,CAAA,EAAKD,CAAsBE,EAAAA,CAAAA,EAC1ErG,EAAqB,CAAGiG,EAAAA,CAAY,CAAoCI,iCAAAA,EAAAA,CAAkB,CAAE,CAAA,EAEhG,CAEME,CAAAA,EAAAA,CAA0B,CAACC,CAA0B7B,CAAAA,CAAAA,GAAkC,CACtFA,CAAAA,CAAc,QAAS6B,CAAAA,CAAgB,CAC1CxG,EAAAA,CAAAA,CAAqB,GAAGwG,CAAgB,CAAA,WAAA,CAAa,EAEzD,CAAA,CAEMC,EAA0B,CAAA,CAC9B7G,CACA+E,CAAAA,CAAAA,CACA9E,EAA8B,EAAC,CAC/B0B,CAAsC,CAAA,EAC7B,GAAA,CACT3B,CAAM,CAAA,OAAA,CAASjB,GAAMqH,EAAoBrH,CAAAA,CAAAA,CAAGgG,CAAe9E,CAAAA,CAAAA,CAAmB0B,CAAO,CAAC,EACxF,CAAA,CAEMmF,GAAqB,CAAChF,CAAAA,CAAsBiD,CAAkC,GAAA,CAClFjD,CAAW,CAAA,OAAA,CAASiF,CAAMJ,EAAAA,EAAAA,CAAwBI,EAAGhC,CAAa,CAAC,EACrE,CAAA,CACMiC,EAAsB,CAAA,CAACC,CAA+EtF,CAAAA,CAAAA,GAA+C,CACzJ,IAAMuF,CAAAA,CAAiB,KAAM,CAAA,OAAA,CAAQD,CAAW,CAAA,CAAIA,CAAc,CAAA,MAAA,CAAO,KAAKA,CAAW,CAAA,CACzF,GAAI,CAACC,CAAgB,EAAA,MAAA,CAAU,OAC/B,IAAMC,EAAoBD,CAAe,CAAA,IAAA,CAAME,CAAe,EAAA,CAACzF,CAAS,EAAA,oBAAA,EAAsB,QAASyF,CAAAA,CAAU,CAAC,CAC9GD,CAAAA,CAAAA,EACF/G,CAAqB,CAAA,CAAA,qBAAA,EAAwB+G,CAAiB,CAAA,WAAA,CAAa,EAE/E,CAAA,CAEME,CAAuB,CAAA,CAACtE,CAAOgC,CAAAA,CAAAA,CAAyB9E,CAA8B,CAAA,EAAIoE,CAAAA,CAAAA,CAAwC,EAAa,GAAA,CACnJ,MAAO,CAAA,OAAA,CAAQtB,CAAK,CAAA,CAAE,OAAQ,CAAA,CAAC,CAACjC,CAAKS,CAAAA,CAAK,CAAM,GAAA,CAC1C,KAAM,CAAA,OAAA,CAAQA,CAAK,CAAA,CACjBA,EAAM,CAAC,CAAA,EAAK,OAAOA,CAAAA,CAAM,CAAC,CAAA,EAAM,QAClCA,EAAAA,CAAAA,CAAM,IAAK+F,CAAMD,EAAAA,CAAAA,CAAqBC,CAAGvC,CAAAA,CAAAA,CAAe9E,CAAmBoE,CAAAA,CAA2B,CAAC,CAAA,CAEhG2B,GAAiBlF,CAAG,CAAA,EAAKmF,EAAuBnF,CAAAA,CAAAA,CAAKiE,CAAe9E,CAAAA,CAAAA,CAAmBoE,CAA2B,CAAA,CACvH9C,GAAS,OAAOA,CAAAA,EAAU,QAC5B8F,EAAAA,CAAAA,CAAqB9F,CAAOwD,CAAAA,CAAAA,CAAe,EAAC,CAAGV,CAA2B,CAG5EjE,CAAAA,CAAAA,CAAqB,CAAgBU,aAAAA,EAAAA,CAAG,CAAE,CAAA,EAE9C,CAAC,EACH,EAEMyG,EAAqB,CAAA,CAAC,CAC1B,IAAA,CAAA7D,CACA,CAAA,OAAA,CAAAE,CACF,CAAA,GAAM,CACAF,CAAOjE,CAAAA,CAAAA,EACTW,CAAqB,CAAA,6BAA6B,CAGhDwD,CAAAA,CAAAA,CAAAA,CAAUrE,CAAsBqE,EAAAA,CAAAA,CAAUpE,IAC5CY,CAAqB,CAAA,CAAA,wBAAA,EAA2BZ,CAAkB,CAAA,IAAA,EAAOD,CAAkB,CAAA,CAAE,EAEjG,CAAA,CAEMiI,GAAyB,CAAC1D,CAAAA,CAAS2D,CAAuB,GAAA,CAC9D,IAAMC,CAAAA,CAAmB,MAAO,CAAA,IAAA,CAAKD,CAAY,CACjD3D,CAAAA,CAAAA,CAAQ,OAASG,CAAAA,CAAAA,EAAM,CACrBgC,EAAAA,CAAuBhC,CAAE,CAAA,KAAA,CAAOyD,CAAgB,CAChD,CAAA,IAAMC,CAASF,CAAAA,CAAAA,CAAaxD,CAAE,CAAA,KAAK,CAAG,EAAA,MAAA,CACjC0D,GACHvH,CAAqB,CAAA,iCAAiC,CAGxD,CAAA,GAAM,CAAE,aAAA,CAAA2E,CAAc,CAAA,CAAI4C,EACpBC,CAAgB,CAAA,MAAA,CAAO,IAAK7C,CAAAA,CAAa,CAC3Cd,CAAAA,CAAAA,CAAE,KACJoD,EAAAA,CAAAA,CAAqBpD,CAAE,CAAA,KAAA,CAAO2D,CAAa,CAAA,CAEzC3D,CAAE,CAAA,KAAA,EACJ4C,EAAwB5C,CAAAA,CAAAA,CAAE,MAAO2D,CAAa,CAAA,CAE5C3D,CAAE,CAAA,UAAA,EACJ6C,EAAmB7C,CAAAA,CAAAA,CAAE,UAAY2D,CAAAA,CAAa,EAE3C,CAAC,IAAA,CAAM,MAAW,CAAA,IAAA,CAAM,KAAK,CAAA,CAAE,QAAS3D,CAAAA,CAAAA,CAAE,QAAQ,CACrD7D,EAAAA,CAAAA,CAAqB,oCAAoC,EAE7D,CAAC,EACH,CAEayH,CAAAA,CAAAA,CAAkB,CAC7B,CACE,KAAA,CAAA9E,CAAQ,CAAA,EACR,CAAA,KAAA,CAAA/C,CAAQ,CAAA,GACR,UAAA8B,CAAAA,CAAAA,CAAa,EAAC,CACd,OAAAgC,CAAAA,CAAAA,CAAU,EAAC,CACX,KAAAJ,CAAOpE,CAAAA,CAAAA,CACP,OAAAsE,CAAAA,CAAAA,CAAUvE,CACV,CAAA,WAAA,CAAA4H,CAAc,CAAA,GACd,KAAAa,CAAAA,CAAAA,CAAQ,EACV,CACA1C,CAAAA,CAAAA,CACAzD,CAAsC,CAAA,KAC1B,CACZ,IAAMoD,CAAgB,CAAA,MAAA,CAAO,IAAKK,CAAAA,CAAAA,CAAM,aAAa,CAAA,CAC/CnF,EAAoB,MAAO,CAAA,IAAA,CAAKmF,CAAO,EAAA,YAAA,EAAgB,EAAE,CAC/D,CAAA,OAAI,CAACtD,CAAcA,EAAAA,CAAAA,CAAW,MAAW,GAAA,CAAA,CAEvCA,CAAaiD,CAAAA,CAAAA,CAEb+B,EAAmBhF,CAAAA,CAAAA,CAAYiD,CAAa,CAG9C8B,CAAAA,EAAAA,CAAwB7G,CAAO+E,CAAAA,CAAAA,CAAe9E,CAAmB0B,CAAAA,CAAO,CACxE0F,CAAAA,CAAAA,CAAqBtE,EAAOgC,CAAe9E,CAAAA,CAAAA,CAAmB0B,CAAQ,CAAA,2BAA2B,CACjGqF,CAAAA,EAAAA,CAAoBC,CAAatF,CAAAA,CAAO,EAEnC,KAAM,CAAA,OAAA,CAAQmG,CAAK,CAAA,EACtB1H,CAAqB,CAAA,wBAAwB,CAE3C0D,CAAAA,CAAAA,CAAQ,QAAU,OAAOA,CAAAA,EAAY,QACvC0D,CAAAA,EAAAA,CAAuB1D,CAASsB,CAAAA,CAAAA,EAAO,YAAY,CAAA,CAC1CtB,GAAW,OAAOA,CAAAA,EAAY,QACvC1D,EAAAA,CAAAA,CAAqB,0BAA0B,CAAA,CAGjDmH,EAAmB,CAAA,CACjB,IAAA7D,CAAAA,CAAAA,CACA,OAAAE,CAAAA,CACF,CAAC,CAAA,CACM,IACT,MC/KM,CACJ,MAAA,CAAAmE,CAAQ,CAAA,MAAA,CAAAC,CAAQ,CAAA,MAAA,CAAAC,EAAQ,CAAA,GAAA,CAAAC,GAAK,KAAAC,CAAAA,CAAAA,CAAO,YAAAC,CAAAA,EACtC,CAAIC,CAAAA,mBAAAA,CAAI,KAAM,EAAA,CACRC,GAAiBC,mBAAO,EAAA,CAExBC,EAAcT,CAAAA,CAAAA,CAAO,IAAK,CAAA,CAC9B,KAAOA,CAAAA,CAAAA,CACP,WAAYI,CAAM,CAAA,KAAA,CAAMH,CAAM,CAAA,CAC9B,KAAOG,CAAAA,CAAAA,CAAM,KAAMH,CAAAA,CAAM,EACzB,IAAMC,CAAAA,EAAAA,CACN,OAASA,CAAAA,EAAAA,CACT,OAASE,CAAAA,CAAAA,CAAM,KAAMD,CAAAA,EAAG,EACxB,UAAYF,CAAAA,CAAAA,CACZ,KAAOG,CAAAA,CAAAA,CAAM,KAAMH,CAAAA,CAAM,CACzB,CAAA,WAAA,CAAaI,GAAa,GAAID,CAAAA,CAAAA,CAAM,KAAMH,CAAAA,CAAM,CAAGD,CAAAA,CAAAA,CAAO,OAAQC,CAAAA,CAAAA,CAAQ,CAAE,OAASG,CAAAA,CAAAA,CAAM,KAAMH,CAAAA,CAAM,CAAE,CAAC,CAAC,CAC7G,CAAC,CAaYS,CAAAA,CAAAA,CAAkB,CAACrD,CAAAA,CAAYsD,CAAW/G,CAAAA,CAAAA,CAAsC,EAAC,GAAM,CAClG,GAAM,CACJ,KAAAoB,CAAAA,CAAAA,CACA,UAAAjB,CAAAA,CAAAA,CACA,KAAA9B,CAAAA,CAAAA,CACA,KAAA0D,CACA,CAAA,OAAA,CAAAE,CACA,CAAA,OAAA,CAAAE,CACA,CAAA,KAAA,CAAAgE,CACA,CAAA,WAAA,CAAAb,CACF,CAAIyB,CAAAA,CAAAA,CAEE9C,CAAS4C,CAAAA,EAAAA,CAAY,QAASE,CAAAA,CAAI,CACxC,CAAA,GAAI9C,EAAO,KACT,CAAA,MAAM,IAAItF,iBAAAA,CAAW,CAACsF,CAAAA,CAAO,KAAK,CAAA,CAAG,IAAI,CAE3CiC,CAAAA,CAAAA,CAAgB,CACd,KAAA,CAAA9E,CACA,CAAA,UAAA,CAAAjB,CACA,CAAA,KAAA,CAAA9B,EACA,IAAA0D,CAAAA,CAAAA,CACA,OAAAE,CAAAA,CAAAA,CACA,OAAAE,CAAAA,CAAAA,CACA,WAAAmD,CAAAA,CAAAA,CACA,KAAAa,CAAAA,CACF,CAAG1C,CAAAA,CAAAA,CAAOzD,CAAO,EACnB,CAGagH,CAAAA,EAAAA,CAA4B,CAACvD,CAAYzD,CAAAA,CAAAA,CAAsC,EAAC,CAAGiH,CAAiB,CAAA,MAAA,GAAoB,MAAOC,CAAAA,CAAKC,EAAKC,CAAwB,GAAA,CAC5K,GAAI,CACFN,CAAgBrD,CAAAA,CAAAA,CAAOyD,CAAID,CAAAA,CAAK,EAAGjH,CAAO,CAAA,CAC1CoH,CAAK,GACP,CAASC,MAAAA,CAAAA,CAAO,CACd,GAAM,CAAE,KAAAjG,CAAAA,CAAAA,CAAO,UAAAjB,CAAAA,CAAAA,CAAY,KAAA9B,CAAAA,CAAM,CAAI6I,CAAAA,CAAAA,CAAID,CAAK,CAC9CK,CAAAA,kBAAAA,CAAYD,CAAOF,CAAAA,CAAAA,CAAK,CACtB,MAAA,CAAQnH,CAAQ,CAAA,MAAA,EAAU2G,GAC1B,OAAS,CAAA,2BAAA,CACT,OAAS,CAAA,CACP,KAAAU,CAAAA,CAAAA,CACA,KAAAjG,CAAAA,CAAAA,CACA,WAAAjB,CACA,CAAA,KAAA,CAAA9B,CACF,CACF,CAAC,EACH,CACF,CAAA,CAEakJ,EAAc,CAAC9D,CAAAA,CAAYsD,CAAW/G,CAAAA,CAAAA,CAAgC,EAAC,GAAM,CACxF,GAAM,CACJ,KAAA3B,CAAAA,CAAAA,CACA,IAAA0D,CAAAA,CAAAA,CACA,OAAAE,CAAAA,CAAAA,CACA,OAAAE,CAAAA,CAAAA,CACA,MAAAf,CACA,CAAA,UAAA,CAAAjB,CACA,CAAA,UAAA,CAAA+C,CACF,CAAA,CAAI6D,CAEE,CAAA,CACJ,MAAOpE,CACP,CAAA,mBAAA,CAAAC,CACA,CAAA,KAAA,CAAOrE,CACP,CAAA,IAAA,CAAMwF,CACN,CAAA,OAAA,CAASC,EACT,OAAS3B,CAAAA,CAAAA,CACT,MAAQW,CAAAA,CAAAA,CACR,UAAYc,CAAAA,CACd,CAAIM,CAAAA,EAAAA,CAAc,CAChB,KAAAhD,CAAAA,CAAAA,CACA,KAAA/C,CAAAA,CAAAA,CACA,IAAA0D,CAAAA,CAAAA,CACA,OAAAE,CAAAA,CAAAA,CACA,QAAAE,CACA,CAAA,UAAA,CAAAhC,CACA,CAAA,UAAA,CAAA+C,CACF,CAAA,CAAGO,CAAOzD,CAAAA,CAAO,EAGjB+G,CAAK,CAAA,KAAA,CAAQpE,CACboE,CAAAA,CAAAA,CAAK,mBAAsBnE,CAAAA,CAAAA,CAC3BmE,CAAK,CAAA,KAAA,CAAQxI,CACbwI,CAAAA,CAAAA,CAAK,UAAajD,CAAAA,CAAAA,CAClBiD,CAAK,CAAA,IAAA,CAAOhD,CACZgD,CAAAA,CAAAA,CAAK,QAAU/C,CACf+C,CAAAA,CAAAA,CAAK,OAAU1E,CAAAA,CAAAA,CACf0E,CAAK,CAAA,MAAA,CAAS/D,CACVhD,CAAAA,CAAAA,CAAQ,oBACV+G,CAAK,CAAA,UAAA,CAAa,CAChB,KAAA,CAAA1I,CACA,CAAA,IAAA,CAAA0D,CACA,CAAA,OAAA,CAAAE,EACA,OAAAE,CAAAA,CAAAA,CACA,KAAAf,CAAAA,CAAAA,CACA,UAAAjB,CAAAA,CAAAA,CACA,UAAA+C,CAAAA,CACF,GAGJ,CAGasE,CAAAA,EAAAA,CAAwB,CAAC/D,CAAAA,CAAYzD,CAAgC,CAAA,EAAIiH,CAAAA,CAAAA,CAAiB,SAAoB,MAAOC,CAAAA,CAAKC,CAAKC,CAAAA,CAAAA,GAAwB,CAClKG,CAAAA,CAAY9D,CAAOyD,CAAAA,CAAAA,CAAID,CAAK,CAAGjH,CAAAA,CAAO,CACtCoH,CAAAA,CAAAA,GACF,EC9GO,IAAMK,EAAe,CAAA,CAAC,CAC3B,KAAA,CAAAhE,EAAO,MAAAiE,CAAAA,CAAAA,CAAQ,iBAAAC,CAAAA,CAAAA,CAAmB,aAAAC,CAAAA,CAAAA,CAAe,SAAAC,CAAAA,CAAAA,CAAYpE,EAAM,WAAa,EAAA,IAAA,CAAM,gBAAAqE,CAAAA,CAAAA,CAAmB,EAAC,CAAG,iBAAAC,CAAAA,CAAAA,CAAmB,gBAAAC,CAClI,CAAA,GAAoC,MAAOd,CAAAA,CAAKC,CAAQ,GAAA,CACtD,GAAI,CACFL,EAAgBrD,CAAOyD,CAAAA,CAAAA,CAAI,IAAM,CAAA,CAAE,GAAGS,CAAAA,CAAmB,MAAAD,CAAAA,CAAO,CAAC,EACnE,CAAA,MAASL,CAAO,CAAA,CACd,IAAMY,CAAAA,CAAUjJ,CAAKkI,CAAAA,CAAAA,CAAI,KAAqB,CAAC,OAAA,CAAS,OAAS,CAAA,YAAY,CAAU,CAAA,CACvFI,kBAAYD,CAAAA,CAAAA,CAAOF,EAAK,CAAE,MAAA,CAAAO,CAAQ,CAAA,OAAA,CAAS,yBAA2B,CAAA,OAAA,CAAAO,CAAQ,CAAC,EAC/E,MACF,CACA,GAAI,CACFV,CAAY9D,CAAAA,CAAAA,CAAOyD,CAAI,CAAA,IAAA,CAAMU,CAAa,CAAA,CAE1C,IAAMM,CAAAA,CAAc,MAAO,CAAA,MAAA,CACzBlJ,CAAKkI,CAAAA,CAAAA,CAAI,KAAqB,CAAC,OAAA,CAAS,qBAAuB,CAAA,OAAA,CAAS,YAAc,CAAA,MAAA,CAAQ,SAAW,CAAA,SAAA,CAAW,SAAU,aAAa,CAAU,CACrJ,CAAA,CAAE,QAAU,CAAA,CAAA,CAAK,CACnB,CAAA,CAEAQ,EAAO,IAAK,CAAA,CAAA,SAAA,EAAYG,CAAS,CAAA,CAAA,CAAI,CAAE,WAAA,CAAAK,CAAY,CAAC,EAEpD,IAAMC,CAAAA,CAAgBJ,CAAoBG,GAAAA,CAAW,CAAKA,EAAAA,CAAAA,CACpD,CACJ,MAAA,CAAAE,EAAS,EAAC,CACV,KAAOC,CAAAA,CAAAA,CACP,OAASC,CAAAA,CAAAA,CACT,IAAAvG,CAAAA,CAAAA,CACA,YAAawG,CACb,CAAA,mBAAA,CAAqBC,CACrB,CAAA,GAAGC,CACL,CAAA,CAAIN,CAEElE,CAAAA,CAAAA,CAAS,MAAMR,CAAM,CAAA,KAAA,CAAM,CAAC,GAAGqE,CAAkB,CAAA,GAAGM,CAAM,CAAC,EAAE,eAAgB,CAAA,CACjF,KAAAC,CAAAA,CAAAA,CACA,KAAAC,CAAAA,CAAAA,CACA,MAASvG,CAAAA,CAAAA,CAAAA,CAAO,GAAKuG,CACrB,CAAA,GAAGG,CACL,CAAC,CAED,CAAA,GAAI,CAACxE,CAAAA,CAAO,KAAK,MAAU,EAAA,CAAC+D,CAAiB,CAAA,CAC3Cb,CAAI,CAAA,IAAA,CAAKlD,CAAM,CAAA,CACf,MACF,CAEA,IAAMyE,CAAmB,CAAA,MAAMV,CAAgB/D,CAAAA,CAAAA,CAAQkE,CAAa,CAAA,CAEpEhB,EAAI,IAAKuB,CAAAA,CAAgB,EAC3B,CAAA,MAASrB,CAAO,CAAA,CACdC,kBAAY,CAAA,IAAIqB,uBAAgBtB,CAAK,CAAA,CAAGF,CAAK,CAAA,CAAE,MAAAO,CAAAA,CAAAA,CAAQ,OAAS,CAAA,CAAA,qBAAA,EAAwBG,CAAS,CAAI,CAAA,CAAA,OAAA,CAAS,CAAE,KAAA,CAAOX,CAAI,CAAA,IAAK,CAAE,CAAC,EACrI,CACF","file":"index.cjs","sourcesContent":["export const OPERATORS = [\n 'eq',\n 'ne',\n 'gte',\n 'gt',\n 'lte',\n 'lt',\n 'not',\n 'in',\n 'notIn',\n 'is',\n 'like',\n 'iLike',\n 'notLike',\n 'between',\n 'and',\n 'or',\n 'overlap',\n 'contains',\n];\n\nexport const OPERATOR_PREFIX = '$';\n\nexport const OPERATORS_TO_SQL = {\n $eq: '=',\n $ne: '!=',\n $gte: '>=',\n $gt: '>',\n $lte: '<=',\n $lt: '<',\n $not: 'NOT',\n $in: 'IN',\n $notIn: 'NOT IN',\n $is: 'IS',\n $like: 'LIKE',\n $iLike: 'ILIKE',\n $notLike: 'NOT LIKE',\n $and: 'AND',\n $or: 'OR',\n};\n\nexport const formatOperators = (Sequelize) => {\n const { Op } = Sequelize;\n return OPERATORS.reduce((map, o) => {\n // eslint-disable-next-line no-param-reassign\n map[`${OPERATOR_PREFIX + o}`] = Op[o];\n return map;\n }, {});\n};\n","import { BadRequest } from '@autofleet/errors';\nimport { OPERATOR_PREFIX } from './operators';\n\nconst randomInt = (max: number) => Math.floor(Math.random() * Math.floor(max));\n\nexport const ORDER_PREFIX = '-';\nexport const ASSOCIATION_PREFIX = '.';\nexport const ASSOCIATION_PATH_WRAPPER = '$';\nexport const PER_PAGE_DEFAULT = 20;\nexport const PAGE_DEFAULT = 1;\nexport const PER_PAGE_MAX_LIMIT = 100;\nexport const PER_PAGE_MIN_LIMIT = 1;\nexport const PAGE_MIN = 1;\n\nexport const wrapAttributeWithOperator = (attribute: string) => `${OPERATOR_PREFIX}${attribute}${OPERATOR_PREFIX}`;\nexport const isAttributeByAssociation = (attributeName: string, associatedModels: string[]): boolean => attributeName.includes(ASSOCIATION_PREFIX)\n && associatedModels.includes(attributeName.split(ASSOCIATION_PREFIX)[0]);\n\nexport const extractAttributeNameFromOrder = (order: string, associationModels: string[]): string => {\n let formattedOrder = order;\n if (order.includes(ORDER_PREFIX)) {\n // eslint-disable-next-line prefer-destructuring\n formattedOrder = formattedOrder.split(ORDER_PREFIX)[1];\n }\n if (isAttributeByAssociation(formattedOrder, associationModels)) {\n [formattedOrder] = formattedOrder.split(ASSOCIATION_PREFIX);\n }\n return formattedOrder;\n};\n\nexport const isOrderDesc = (order: string): boolean => order.includes(ORDER_PREFIX);\n\nexport const throwBadRequestError = (message: string) => {\n throw new BadRequest([new Error(message)]);\n};\n\nexport const extractAssociatedAttributeNameFromOrder = (order: string): string => order.split(ASSOCIATION_PREFIX)[1];\n\nexport const generateRandomString = (length = 5): string => {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n return Array.from({ length }, () => characters.charAt(randomInt(characters.length))).join('');\n};\n\nexport const pick = <T extends object, K extends keyof T = keyof T>(\n obj: T,\n keys: K[],\n): Pick<T, K> => Object.fromEntries(keys.map((key) => [key, obj[key]])) as Pick<T, K>;\n","import { customFields } from '@autofleet/common-types';\nimport {\n extractAssociatedAttributeNameFromOrder,\n extractAttributeNameFromOrder, generateRandomString,\n isAttributeByAssociation,\n isOrderDesc, ORDER_PREFIX,\n PAGE_DEFAULT,\n PER_PAGE_DEFAULT, wrapAttributeWithOperator,\n} from '../utils';\nimport type { LiteralAttribute } from '../middleware';\nimport { OPERATORS_TO_SQL } from '../operators';\n\nconst DEFAULT_ORDER = 'id';\nconst DESCENDING_KEY = 'DESC';\nconst ASCENDING_KEY = 'ASC';\nconst CUSTOM_FIELDS_QUERY_PREFIX = 'customFields.';\nconst { CUSTOM_FIELDS_FILTER_SCOPE, CUSTOM_FIELDS_SORT_SCOPE } = customFields;\ntype OrderItem = string | [string, string]\ntype SequelizeOrder = string | OrderItem[];\nexport type FormatPayloadOptions = {\n includeRawPayload?: boolean;\n literalAttributes?: LiteralAttribute[];\n DBFormatter?: any;\n skipSearchTermFormat?: boolean;\n additionalAllowedAttributes?: string[];\n};\n\ntype ConditionWithOperator = {\n operator: string;\n value: string;\n};\nexport type ConditionValue = ConditionWithOperator | ConditionWithOperator[] | string | string[];\n\nconst parseCustomFieldScopeQueryValue = (value) => {\n if (['string', 'number'].includes(typeof value) || Array.isArray(value)) {\n return value;\n }\n return Object.entries(value).map(([operator, conditionValue]) => ({\n operator: OPERATORS_TO_SQL[operator],\n value: conditionValue,\n }));\n};\n\nconst getAttributeFromOrder = (order: SequelizeOrder[], options: FormatPayloadOptions = {}): [SequelizeOrder[], SequelizeOrder[]] => {\n const { literalAttributes = [], DBFormatter = undefined } = options;\n const [formattedOrder, attributes] = order.reduce((acc, o) => {\n const [item, orderStyle = 'ASC'] = Array.isArray(o) ? o : [o];\n const found = literalAttributes?.find((obj) => obj.attribute === item);\n if (found) {\n acc[1].push(found.literal);\n acc[0].push([DBFormatter ? DBFormatter(`\"${found.attribute}\" ${orderStyle}`) : `${found.attribute} ${orderStyle}`]);\n } else {\n acc[0].push(o);\n }\n return acc;\n }, [[], []]);\n\n return [formattedOrder, attributes];\n};\n\n/**\n * Generates replacements for the given conditions.\n *\n * @param conditions - The conditions to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateFilterReplacements = (conditions: Record<string, ConditionValue>): Record<string, string> => {\n const replacements: Record<string, string> = {};\n\n Object.entries(conditions).forEach(([key, condition]) => {\n const replacementKey = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacements[replacementKey] = key.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n\n if (Array.isArray(condition)) {\n condition.forEach((value) => {\n const valueKey = generateRandomString();\n replacements[valueKey] = typeof value === 'string' ? value : value.value;\n });\n } else if (typeof condition === 'string' || typeof condition === 'number') {\n const conditionKey = generateRandomString();\n replacements[conditionKey] = condition;\n } else if (condition?.operator) {\n const operatorKey = generateRandomString();\n replacements[operatorKey] = condition.value;\n }\n });\n\n return replacements;\n};\n\n/**\n * Generates replacements for the given order array.\n *\n * @param order - The order array to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateOrderReplacements = (order: string[]): Record<string, string> => {\n const replacementMap = {};\n order.forEach((o) => {\n if (o.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n } else if (o.substring(1).startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.substring(1).split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n }\n });\n return replacementMap;\n};\n\n/**\n * Creates a combined replacement map from order and query.\n *\n * @param order - The order array.\n * @param query - The query object.\n * @returns The combined replacements object.\n */\nconst createReplacementMap = (order: string[], query: Record<string, ConditionValue>): Record<string, string> => ({\n ...generateOrderReplacements(order),\n ...generateFilterReplacements(query),\n});\n\nconst formatOrder = ({\n order,\n associationModels = [],\n replacementsMap = {},\n}: { order: string[]; associationModels?: string[]; replacementsMap?: Record<string, string>; }): {\n formattedOrders: SequelizeOrder[];\n orderScopes: (string | { method: [string, { replacementsMap: Record<string, string>; scopeValue: Record<string, 'DESC' | 'ASC'>; }] })[];\n replacementsMap: Record<string, string>;\n} => {\n const formattedOrders = [];\n const orderScopesMap = new Map<string, Record<string, 'DESC' | 'ASC'>>();\n order.forEach((o: string) => {\n if ([o, o.substring(1)].some((t) => t.startsWith(CUSTOM_FIELDS_QUERY_PREFIX))) {\n if (!orderScopesMap.has(CUSTOM_FIELDS_SORT_SCOPE)) {\n orderScopesMap.set(CUSTOM_FIELDS_SORT_SCOPE, {});\n }\n const scopeKey = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n orderScopesMap.get(CUSTOM_FIELDS_SORT_SCOPE)[scopeKey] = (isOrderDesc(o) ? DESCENDING_KEY : ASCENDING_KEY);\n return;\n }\n const formattedOrder = [extractAttributeNameFromOrder(o, associationModels)];\n const isOrderDescOrder = isOrderDesc(o);\n const isOrderAssociation = isAttributeByAssociation(isOrderDescOrder\n ? o.split(ORDER_PREFIX)[1]\n : o, associationModels);\n if (isOrderAssociation) {\n formattedOrder.push(extractAssociatedAttributeNameFromOrder(o));\n }\n if (isOrderDescOrder) {\n formattedOrder.push(DESCENDING_KEY);\n }\n formattedOrders.push(formattedOrder);\n });\n return {\n formattedOrders,\n replacementsMap,\n orderScopes: Array.from(orderScopesMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n }),\n };\n};\n\nconst formatPage = (page?: number) => page || PAGE_DEFAULT;\n\nconst formatPerPage = (perPage?: number) => perPage || PER_PAGE_DEFAULT;\n\ninterface Include {\n association?: string;\n model?: string;\n required?: boolean;\n include?: Include[];\n}\n\nconst formatInclude = (include: (string | Include)[], associationsMap = {}) => {\n let formattedInclude = include.map((i) => {\n const includedAssociation = associationsMap[typeof i === 'string' ? i : (i.association || i.model)];\n return {\n ...(typeof i !== 'string' && i),\n association: includedAssociation,\n required: typeof i === 'string' || i.required !== false,\n ...(typeof i !== 'string' && i.include && {\n include: formatInclude(i.include, includedAssociation?.target?.associations),\n }),\n };\n });\n formattedInclude = formattedInclude.map(({ model: _model, ...i }) => i);\n return formattedInclude;\n};\nconst formatQuery = (query, associationModels, replacementsMap: Record<string, string>, additionalAllowedAttributes: string[] = []) => {\n const formattedQuery: Record<string, unknown> = {};\n const externalQueryValues: Record<string, unknown> = {};\n const formattedScopeMap = new Map<string, any>();\n\n Object.entries(query).forEach(([queryItemKey, queryItemValue]) => {\n if (queryItemKey.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n if (!formattedScopeMap.has(CUSTOM_FIELDS_FILTER_SCOPE)) {\n formattedScopeMap.set(CUSTOM_FIELDS_FILTER_SCOPE, {});\n }\n const scopeKey = queryItemKey.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n formattedScopeMap.get(CUSTOM_FIELDS_FILTER_SCOPE)[scopeKey] = parseCustomFieldScopeQueryValue(queryItemValue);\n return;\n }\n if (additionalAllowedAttributes.includes(queryItemKey)) {\n externalQueryValues[queryItemKey] = queryItemValue;\n return;\n }\n const key = isAttributeByAssociation(queryItemKey, associationModels)\n ? wrapAttributeWithOperator(queryItemKey)\n : queryItemKey;\n formattedQuery[key] = queryItemValue;\n });\n\n const formattedScopes = Array.from(formattedScopeMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n });\n\n return {\n formattedQuery,\n externalQueryValues,\n formattedScopes,\n };\n};\n\nconst formatSearchTerm = (searchTerm: string, attributesToSend: string[], rawAttributes) => ({\n $and: searchTerm.split(' ').map((term) => ({\n $or: attributesToSend.filter((attrKey) => rawAttributes[attrKey].type.key === 'STRING').map((attr) => ({\n [attr]: {\n $iLike: `%${term}%`,\n },\n })),\n })),\n});\n\nconst formatPayload = ({\n order = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n include = [],\n query = {},\n attributes = null,\n searchTerm = null,\n}, 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 ASSOCIATION_PATH_WRAPPER,\n} from '../utils';\nimport { OPERATORS, OPERATOR_PREFIX } from '../operators';\nimport type { MiddlewareValidationOption } from '../middleware';\n\nconst validateOperator = (operator: string): boolean => OPERATORS.includes(operator.split(OPERATOR_PREFIX)[1]);\n\nconst validateQueryAttribute = (\n rawAttribute: string,\n modelAttributes: string[] = [],\n associationModels: string[] = [],\n additionalAllowedAttributes: string[] = [],\n): boolean => {\n const attribute = (rawAttribute.startsWith(\n ASSOCIATION_PATH_WRAPPER,\n ) && rawAttribute.endsWith(\n ASSOCIATION_PATH_WRAPPER,\n )) ? rawAttribute.slice(1, -1) : rawAttribute;\n return [...modelAttributes, ...associationModels].includes(attribute.includes(ASSOCIATION_PREFIX)\n ? attribute.split(ASSOCIATION_PREFIX)[0] : attribute)\n || additionalAllowedAttributes.includes(attribute);\n};\n\nconst validateSingleOrder = (\n currentOrder: string,\n rawAttributes: string[],\n associationModels: string[],\n options: MiddlewareValidationOption = {},\n): void => {\n const isOrderDescOrder = isOrderDesc(currentOrder);\n if (isOrderDescOrder && currentOrder[0] !== ORDER_PREFIX) {\n throwBadRequestError(`${ORDER_PREFIX} must be only at the beginning of the word`);\n }\n const orderStringWithoutDesc = isOrderDescOrder ? currentOrder.split(ORDER_PREFIX)[1] : currentOrder;\n const isOrderAssociation = isAttributeByAssociation(orderStringWithoutDesc, associationModels);\n let formattedOrderString = extractAttributeNameFromOrder(currentOrder, associationModels);\n const isLiteralAttribute = options?.literalAttributes?.map((la) => la.attribute)?.includes(orderStringWithoutDesc);\n\n if (!isOrderAssociation && formattedOrderString.includes(ASSOCIATION_PREFIX)) {\n [formattedOrderString] = formattedOrderString.split(ASSOCIATION_PREFIX);\n }\n\n if (!(rawAttributes.includes(formattedOrderString) || isOrderAssociation || isLiteralAttribute)) {\n throwBadRequestError(`${currentOrder} is invalid. isLiteralAttribute: ${isLiteralAttribute}`);\n }\n};\n\nconst validateSingleAttribute = (currentAttribute: string, rawAttributes: string[]): void => {\n if (!rawAttributes.includes(currentAttribute)) {\n throwBadRequestError(`${currentAttribute} is invalid`);\n }\n};\n\nconst validateOrderAttributes = (\n order: string[],\n rawAttributes: string[],\n associationModels: string[] = [],\n options: MiddlewareValidationOption = {},\n): void => {\n order.forEach((o) => validateSingleOrder(o, rawAttributes, associationModels, options));\n};\n\nconst validateAttributes = (attributes: string[], rawAttributes: string[]): void => {\n attributes.forEach((a) => validateSingleAttribute(a, rawAttributes));\n};\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"]}
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, group, }: {
27
+ declare const formatPayload: ({ order, page, perPage, include, query, attributes, searchTerm, }: {
28
28
  order?: any[];
29
29
  page?: number;
30
30
  perPage?: number;
@@ -32,7 +32,6 @@ declare const formatPayload: ({ order, page, perPage, include, query, attributes
32
32
  query?: {};
33
33
  attributes?: any;
34
34
  searchTerm?: any;
35
- group: any;
36
35
  }, model?: any, options?: FormatPayloadOptions) => {
37
36
  externalQueryValues: Record<string, unknown>;
38
37
  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, group, }: {
27
+ declare const formatPayload: ({ order, page, perPage, include, query, attributes, searchTerm, }: {
28
28
  order?: any[];
29
29
  page?: number;
30
30
  perPage?: number;
@@ -32,7 +32,6 @@ declare const formatPayload: ({ order, page, perPage, include, query, attributes
32
32
  query?: {};
33
33
  attributes?: any;
34
34
  searchTerm?: any;
35
- group: any;
36
35
  }, model?: any, options?: FormatPayloadOptions) => {
37
36
  externalQueryValues: Record<string, unknown>;
38
37
  attributes: any[] | {
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
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
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"],P="$",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"},lt=t=>{let{Op:e}=t;return D.reduce((o,r)=>(o[`${P+r}`]=e[r],o),{})};var pt=t=>Math.floor(Math.random()*Math.floor(t)),m="-",g=".",Q="$",w=20,F=1,k=100,C=1,z=1,Y=t=>`${P}${t}${P}`,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},T=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:N}=customFields,ft=t=>["string","number"].includes(typeof t)||Array.isArray(t)?t:Object.entries(t).map(([e,o])=>({operator:B[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},At=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)=>({...At(t),...tt(e)}),Pt=({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(N)||i.set(N,{});let d=n.split(y)[1];i.get(N)[d]=T(n)?Z:yt;return}let s=[$(n,e)],c=T(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)}},Et=t=>t||F,ht=t=>t||w,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=F,perPage:o=w,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}=Pt({order:[...t,gt],associationModels:l,replacementsMap:d}),[S,A]=Ot(u,a),b=[...A,...n||[]],x=n?.length?b:{include:b},M=et(r,c?.associations),V=Et(e),_=ht(o),L=Rt(i,l,d,a?.additionalAllowedAttributes),{formattedScopes:dt,externalQueryValues:H}=L,{formattedQuery:I}=L;if(s&&!a?.skipSearchTermFormat){let ct=n?.length?n:Object.keys(c.rawAttributes),X=St(s,ct,c.rawAttributes);I=!I||Object.keys(I).length===0?X:{$and:[I,X]};}return {query:I,order:S,page:V,perPage:_,include:M,scopes:[...dt,...R],...x&&{attributes:x},...Object.keys(H).length>0&&{externalQueryValues:H}}},rt=xt;var _t=t=>D.includes(t.split(P)[1]),ot=(t,e=[],o=[],r=[])=>{let i=t.startsWith(Q)&&t.endsWith(Q)?t.slice(1,-1):t;return [...e,...o].includes(i.includes(g)?i.split(g)[0]:i)||r.includes(i)},It=(t,e,o,r={})=>{let i=T(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}`);},wt=(t,e)=>{e.includes(t)||p(`${t} is invalid`);},nt=(t,e,o=[],r={})=>{t.forEach(i=>It(i,e,o,r));},it=(t,e)=>{t.forEach(o=>wt(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)):_t(i)||ot(i,e,o,r)?n&&typeof n=="object"&&q(n,e,[],r):p(`invalid key: ${i}`);});},Tt=({page:t,perPage:e})=>{t<z&&p("Page must be greater than 0"),(e>k||e<C)&&p(`PerPage must be between ${C} to ${k}`);},Mt=(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");});},G=({query:t={},order:e=[],attributes:o=[],include:r=[],page:i=F,perPage:n=w,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),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"),Tt({page:i,perPage:n}),true};var {object:K,string:O,number:st,any:Dt,array:h,alternatives:Qt}=Vt.types(),kt=Lt(),Ct=K.keys({query:K,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),K.pattern(O,{exclude:h.items(O)}))}),W=(t,e,o={})=>{let{query:r,attributes:i,order:n,page:s,perPage:c,include:a,group:d,enrichments:l}=e,u=Ct.validate(e);if(u.error)throw new BadRequest([u.error],null);G({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{W(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}=e,{query:l,externalQueryValues:u,order:R,page:S,perPage:A,include:b,scopes:x,attributes:M}=rt({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=M,e.page=S,e.perPage=A,e.include=b,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 Gt=({model:t,logger:e,validationOptions:o,formatOptions:r,modelName:i=t.constructor?.name,additionalScopes:n=[],modifyQueryValues:s,onRowsRetrieved:c})=>async(a,d)=>{try{W(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:A,page:b,enrichments:x,externalQueryValues:M,...V}=u,_=await t.scope([...n,...R]).findAndCountAll({where:S,limit:A,offset:(b-1)*A,...V});if(!_.rows.length||!c){d.json(_);return}let L=await c(_,u);d.json(L);}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,jt as queryFormatMiddleware,Gt as queryHandler,vt as queryValidationMiddleware,G 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","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"]}
1
+ {"version":3,"sources":["../src/operators/index.ts","../src/utils.ts","../src/formatter/index.ts","../src/validations/index.ts","../src/middleware/index.ts","../src/handler/index.ts"],"names":["OPERATORS","OPERATOR_PREFIX","OPERATORS_TO_SQL","formatOperators","Sequelize","Op","map","o","randomInt","max","ORDER_PREFIX","ASSOCIATION_PREFIX","ASSOCIATION_PATH_WRAPPER","PER_PAGE_DEFAULT","PAGE_DEFAULT","PER_PAGE_MAX_LIMIT","PER_PAGE_MIN_LIMIT","PAGE_MIN","wrapAttributeWithOperator","attribute","isAttributeByAssociation","attributeName","associatedModels","extractAttributeNameFromOrder","order","associationModels","formattedOrder","isOrderDesc","throwBadRequestError","message","BadRequest","extractAssociatedAttributeNameFromOrder","generateRandomString","length","characters","pick","obj","keys","key","DEFAULT_ORDER","DESCENDING_KEY","ASCENDING_KEY","CUSTOM_FIELDS_QUERY_PREFIX","CUSTOM_FIELDS_FILTER_SCOPE","CUSTOM_FIELDS_SORT_SCOPE","customFields","parseCustomFieldScopeQueryValue","value","operator","conditionValue","getAttributeFromOrder","options","literalAttributes","DBFormatter","attributes","acc","item","orderStyle","found","generateFilterReplacements","conditions","replacements","condition","replacementKey","valueKey","conditionKey","operatorKey","generateOrderReplacements","replacementMap","rand","createReplacementMap","query","formatOrder","replacementsMap","formattedOrders","orderScopesMap","t","scopeKey","isOrderDescOrder","scopeName","scopeValue","formatPage","page","formatPerPage","perPage","formatInclude","include","associationsMap","formattedInclude","i","includedAssociation","_model","formatQuery","additionalAllowedAttributes","formattedQuery","externalQueryValues","formattedScopeMap","queryItemKey","queryItemValue","formattedScopes","formatSearchTerm","searchTerm","attributesToSend","rawAttributes","term","attrKey","attr","formatPayload","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","rawAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","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 ASSOCIATION_PATH_WRAPPER = '$';\nexport const PER_PAGE_DEFAULT = 20;\nexport const PAGE_DEFAULT = 1;\nexport const PER_PAGE_MAX_LIMIT = 100;\nexport const PER_PAGE_MIN_LIMIT = 1;\nexport const PAGE_MIN = 1;\n\nexport const wrapAttributeWithOperator = (attribute: string) => `${OPERATOR_PREFIX}${attribute}${OPERATOR_PREFIX}`;\nexport const isAttributeByAssociation = (attributeName: string, associatedModels: string[]): boolean => attributeName.includes(ASSOCIATION_PREFIX)\n && associatedModels.includes(attributeName.split(ASSOCIATION_PREFIX)[0]);\n\nexport const extractAttributeNameFromOrder = (order: string, associationModels: string[]): string => {\n let formattedOrder = order;\n if (order.includes(ORDER_PREFIX)) {\n // eslint-disable-next-line prefer-destructuring\n formattedOrder = formattedOrder.split(ORDER_PREFIX)[1];\n }\n if (isAttributeByAssociation(formattedOrder, associationModels)) {\n [formattedOrder] = formattedOrder.split(ASSOCIATION_PREFIX);\n }\n return formattedOrder;\n};\n\nexport const isOrderDesc = (order: string): boolean => order.includes(ORDER_PREFIX);\n\nexport const throwBadRequestError = (message: string) => {\n throw new BadRequest([new Error(message)]);\n};\n\nexport const extractAssociatedAttributeNameFromOrder = (order: string): string => order.split(ASSOCIATION_PREFIX)[1];\n\nexport const generateRandomString = (length = 5): string => {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n return Array.from({ length }, () => characters.charAt(randomInt(characters.length))).join('');\n};\n\nexport const pick = <T extends object, K extends keyof T = keyof T>(\n obj: T,\n keys: K[],\n): Pick<T, K> => Object.fromEntries(keys.map((key) => [key, obj[key]])) as Pick<T, K>;\n","import { customFields } from '@autofleet/common-types';\nimport {\n extractAssociatedAttributeNameFromOrder,\n extractAttributeNameFromOrder, generateRandomString,\n isAttributeByAssociation,\n isOrderDesc, ORDER_PREFIX,\n PAGE_DEFAULT,\n PER_PAGE_DEFAULT, wrapAttributeWithOperator,\n} from '../utils';\nimport type { LiteralAttribute } from '../middleware';\nimport { OPERATORS_TO_SQL } from '../operators';\n\nconst DEFAULT_ORDER = 'id';\nconst DESCENDING_KEY = 'DESC';\nconst ASCENDING_KEY = 'ASC';\nconst CUSTOM_FIELDS_QUERY_PREFIX = 'customFields.';\nconst { CUSTOM_FIELDS_FILTER_SCOPE, CUSTOM_FIELDS_SORT_SCOPE } = customFields;\ntype OrderItem = string | [string, string]\ntype SequelizeOrder = string | OrderItem[];\nexport type FormatPayloadOptions = {\n includeRawPayload?: boolean;\n literalAttributes?: LiteralAttribute[];\n DBFormatter?: any;\n skipSearchTermFormat?: boolean;\n additionalAllowedAttributes?: string[];\n};\n\ntype ConditionWithOperator = {\n operator: string;\n value: string;\n};\nexport type ConditionValue = ConditionWithOperator | ConditionWithOperator[] | string | string[];\n\nconst parseCustomFieldScopeQueryValue = (value) => {\n if (['string', 'number'].includes(typeof value) || Array.isArray(value)) {\n return value;\n }\n return Object.entries(value).map(([operator, conditionValue]) => ({\n operator: OPERATORS_TO_SQL[operator],\n value: conditionValue,\n }));\n};\n\nconst getAttributeFromOrder = (order: SequelizeOrder[], options: FormatPayloadOptions = {}): [SequelizeOrder[], SequelizeOrder[]] => {\n const { literalAttributes = [], DBFormatter = undefined } = options;\n const [formattedOrder, attributes] = order.reduce((acc, o) => {\n const [item, orderStyle = 'ASC'] = Array.isArray(o) ? o : [o];\n const found = literalAttributes?.find((obj) => obj.attribute === item);\n if (found) {\n acc[1].push(found.literal);\n acc[0].push([DBFormatter ? DBFormatter(`\"${found.attribute}\" ${orderStyle}`) : `${found.attribute} ${orderStyle}`]);\n } else {\n acc[0].push(o);\n }\n return acc;\n }, [[], []]);\n\n return [formattedOrder, attributes];\n};\n\n/**\n * Generates replacements for the given conditions.\n *\n * @param conditions - The conditions to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateFilterReplacements = (conditions: Record<string, ConditionValue>): Record<string, string> => {\n const replacements: Record<string, string> = {};\n\n Object.entries(conditions).forEach(([key, condition]) => {\n const replacementKey = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacements[replacementKey] = key.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n\n if (Array.isArray(condition)) {\n condition.forEach((value) => {\n const valueKey = generateRandomString();\n replacements[valueKey] = typeof value === 'string' ? value : value.value;\n });\n } else if (typeof condition === 'string' || typeof condition === 'number') {\n const conditionKey = generateRandomString();\n replacements[conditionKey] = condition;\n } else if (condition?.operator) {\n const operatorKey = generateRandomString();\n replacements[operatorKey] = condition.value;\n }\n });\n\n return replacements;\n};\n\n/**\n * Generates replacements for the given order array.\n *\n * @param order - The order array to generate replacements for.\n * @returns The replacements object.\n */\nexport const generateOrderReplacements = (order: string[]): Record<string, string> => {\n const replacementMap = {};\n order.forEach((o) => {\n if (o.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n } else if (o.substring(1).startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n const rand = generateRandomString();\n // eslint-disable-next-line prefer-destructuring\n replacementMap[rand] = o.substring(1).split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n }\n });\n return replacementMap;\n};\n\n/**\n * Creates a combined replacement map from order and query.\n *\n * @param order - The order array.\n * @param query - The query object.\n * @returns The combined replacements object.\n */\nconst createReplacementMap = (order: string[], query: Record<string, ConditionValue>): Record<string, string> => ({\n ...generateOrderReplacements(order),\n ...generateFilterReplacements(query),\n});\n\nconst formatOrder = ({\n order,\n associationModels = [],\n replacementsMap = {},\n}: { order: string[]; associationModels?: string[]; replacementsMap?: Record<string, string>; }): {\n formattedOrders: SequelizeOrder[];\n orderScopes: (string | { method: [string, { replacementsMap: Record<string, string>; scopeValue: Record<string, 'DESC' | 'ASC'>; }] })[];\n replacementsMap: Record<string, string>;\n} => {\n const formattedOrders = [];\n const orderScopesMap = new Map<string, Record<string, 'DESC' | 'ASC'>>();\n order.forEach((o: string) => {\n if ([o, o.substring(1)].some((t) => t.startsWith(CUSTOM_FIELDS_QUERY_PREFIX))) {\n if (!orderScopesMap.has(CUSTOM_FIELDS_SORT_SCOPE)) {\n orderScopesMap.set(CUSTOM_FIELDS_SORT_SCOPE, {});\n }\n const scopeKey = o.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n orderScopesMap.get(CUSTOM_FIELDS_SORT_SCOPE)[scopeKey] = (isOrderDesc(o) ? DESCENDING_KEY : ASCENDING_KEY);\n return;\n }\n const formattedOrder = [extractAttributeNameFromOrder(o, associationModels)];\n const isOrderDescOrder = isOrderDesc(o);\n const isOrderAssociation = isAttributeByAssociation(isOrderDescOrder\n ? o.split(ORDER_PREFIX)[1]\n : o, associationModels);\n if (isOrderAssociation) {\n formattedOrder.push(extractAssociatedAttributeNameFromOrder(o));\n }\n if (isOrderDescOrder) {\n formattedOrder.push(DESCENDING_KEY);\n }\n formattedOrders.push(formattedOrder);\n });\n return {\n formattedOrders,\n replacementsMap,\n orderScopes: Array.from(orderScopesMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n }),\n };\n};\n\nconst formatPage = (page?: number) => page || PAGE_DEFAULT;\n\nconst formatPerPage = (perPage?: number) => perPage || PER_PAGE_DEFAULT;\n\ninterface Include {\n association?: string;\n model?: string;\n required?: boolean;\n include?: Include[];\n}\n\nconst formatInclude = (include: (string | Include)[], associationsMap = {}) => {\n let formattedInclude = include.map((i) => {\n const includedAssociation = associationsMap[typeof i === 'string' ? i : (i.association || i.model)];\n return {\n ...(typeof i !== 'string' && i),\n association: includedAssociation,\n required: typeof i === 'string' || i.required !== false,\n ...(typeof i !== 'string' && i.include && {\n include: formatInclude(i.include, includedAssociation?.target?.associations),\n }),\n };\n });\n formattedInclude = formattedInclude.map(({ model: _model, ...i }) => i);\n return formattedInclude;\n};\nconst formatQuery = (query, associationModels, replacementsMap: Record<string, string>, additionalAllowedAttributes: string[] = []) => {\n const formattedQuery: Record<string, unknown> = {};\n const externalQueryValues: Record<string, unknown> = {};\n const formattedScopeMap = new Map<string, any>();\n\n Object.entries(query).forEach(([queryItemKey, queryItemValue]) => {\n if (queryItemKey.startsWith(CUSTOM_FIELDS_QUERY_PREFIX)) {\n if (!formattedScopeMap.has(CUSTOM_FIELDS_FILTER_SCOPE)) {\n formattedScopeMap.set(CUSTOM_FIELDS_FILTER_SCOPE, {});\n }\n const scopeKey = queryItemKey.split(CUSTOM_FIELDS_QUERY_PREFIX)[1];\n formattedScopeMap.get(CUSTOM_FIELDS_FILTER_SCOPE)[scopeKey] = parseCustomFieldScopeQueryValue(queryItemValue);\n return;\n }\n if (additionalAllowedAttributes.includes(queryItemKey)) {\n externalQueryValues[queryItemKey] = queryItemValue;\n return;\n }\n const key = isAttributeByAssociation(queryItemKey, associationModels)\n ? wrapAttributeWithOperator(queryItemKey)\n : queryItemKey;\n formattedQuery[key] = queryItemValue;\n });\n\n const formattedScopes = Array.from(formattedScopeMap.entries()).map(([scopeName, scopeValue]) => {\n if (!scopeValue) {\n return scopeName;\n }\n return {\n method: [scopeName, {\n replacementsMap,\n scopeValue,\n }],\n };\n });\n\n return {\n formattedQuery,\n externalQueryValues,\n formattedScopes,\n };\n};\n\nconst formatSearchTerm = (searchTerm: string, attributesToSend: string[], rawAttributes) => ({\n $and: searchTerm.split(' ').map((term) => ({\n $or: attributesToSend.filter((attrKey) => rawAttributes[attrKey].type.key === 'STRING').map((attr) => ({\n [attr]: {\n $iLike: `%${term}%`,\n },\n })),\n })),\n});\n\nconst formatPayload = ({\n order = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n include = [],\n query = {},\n attributes = null,\n searchTerm = null,\n}, 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 ASSOCIATION_PATH_WRAPPER,\n} from '../utils';\nimport { OPERATORS, OPERATOR_PREFIX } from '../operators';\nimport type { MiddlewareValidationOption } from '../middleware';\n\nconst validateOperator = (operator: string): boolean => OPERATORS.includes(operator.split(OPERATOR_PREFIX)[1]);\n\nconst validateQueryAttribute = (\n rawAttribute: string,\n modelAttributes: string[] = [],\n associationModels: string[] = [],\n additionalAllowedAttributes: string[] = [],\n): boolean => {\n const attribute = (rawAttribute.startsWith(\n ASSOCIATION_PATH_WRAPPER,\n ) && rawAttribute.endsWith(\n ASSOCIATION_PATH_WRAPPER,\n )) ? rawAttribute.slice(1, -1) : rawAttribute;\n return [...modelAttributes, ...associationModels].includes(attribute.includes(ASSOCIATION_PREFIX)\n ? attribute.split(ASSOCIATION_PREFIX)[0] : attribute)\n || additionalAllowedAttributes.includes(attribute);\n};\n\nconst validateSingleOrder = (\n currentOrder: string,\n rawAttributes: string[],\n associationModels: string[],\n options: MiddlewareValidationOption = {},\n): void => {\n const isOrderDescOrder = isOrderDesc(currentOrder);\n if (isOrderDescOrder && currentOrder[0] !== ORDER_PREFIX) {\n throwBadRequestError(`${ORDER_PREFIX} must be only at the beginning of the word`);\n }\n const orderStringWithoutDesc = isOrderDescOrder ? currentOrder.split(ORDER_PREFIX)[1] : currentOrder;\n const isOrderAssociation = isAttributeByAssociation(orderStringWithoutDesc, associationModels);\n let formattedOrderString = extractAttributeNameFromOrder(currentOrder, associationModels);\n const isLiteralAttribute = options?.literalAttributes?.map((la) => la.attribute)?.includes(orderStringWithoutDesc);\n\n if (!isOrderAssociation && formattedOrderString.includes(ASSOCIATION_PREFIX)) {\n [formattedOrderString] = formattedOrderString.split(ASSOCIATION_PREFIX);\n }\n\n if (!(rawAttributes.includes(formattedOrderString) || isOrderAssociation || isLiteralAttribute)) {\n throwBadRequestError(`${currentOrder} is invalid. isLiteralAttribute: ${isLiteralAttribute}`);\n }\n};\n\nconst validateSingleAttribute = (currentAttribute: string, rawAttributes: string[]): void => {\n if (!rawAttributes.includes(currentAttribute)) {\n throwBadRequestError(`${currentAttribute} is invalid`);\n }\n};\n\nconst validateOrderAttributes = (\n order: string[],\n rawAttributes: string[],\n associationModels: string[] = [],\n options: MiddlewareValidationOption = {},\n): void => {\n order.forEach((o) => validateSingleOrder(o, rawAttributes, associationModels, options));\n};\n\nconst validateAttributes = (attributes: string[], rawAttributes: string[]): void => {\n attributes.forEach((a) => validateSingleAttribute(a, rawAttributes));\n};\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/sheilta",
3
- "version": "2.0.3-beta-1492407c.1",
3
+ "version": "2.0.3",
4
4
  "description": "Middlewares for validation and parsing of endpoints meant for data querying.",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",