@autofleet/sheilta 2.1.2-beta-2 → 2.1.3-beta--beta-2.0

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