@autofleet/sheilta 2.1.1-beta-9ba6a1aa.7 → 2.1.2-beta-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.cjs +1 -1
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +2 -3
- package/lib/index.d.ts +2 -3
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +2 -3
package/lib/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var ht=require('@autofleet/logger'),errors=require('@autofleet/errors'),p=require('joi'),commonTypes=require('@autofleet/common-types'),sequelize=require('sequelize');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ht__default=/*#__PURE__*/_interopDefault(ht);var p__default=/*#__PURE__*/_interopDefault(p);var k=["eq","ne","gte","gt","lte","lt","not","in","notIn","is","like","iLike","notLike","between","and","or","overlap","contains"],E="$",tt={$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"},At=t=>{let{Op:e}=t;return k.reduce((o,r)=>(o[`${E+r}`]=e[r],o),{})};var Pt=t=>Math.floor(Math.random()*Math.floor(t)),y="-",f=".",V="$",$=20,q=1,N=100,v=1,et=1,rt=t=>`${E}${t}${E}`,R=(t,e)=>t.includes(f)&&e.includes(t.split(f)[0]),L=(t,e)=>{let o=t;return t.includes(y)&&(o=o.split(y)[1]),R(o,e)&&([o]=o.split(f)),o},M=t=>t.includes(y),m=t=>{throw new errors.BadRequest([new Error(t)])},ot=t=>t.split(f)[1],O=(t=5)=>{let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";return Array.from({length:t},()=>e.charAt(Pt(e.length))).join("")},D=(t,e)=>Object.fromEntries(e.map(o=>[o,t[o]]));var Et=ht__default.default(),nt=Et;var Q={length:"length"};function it(t){return t.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function Rt(t){switch(t.action){case Q.length:{let e=`jsonb_array_length(${it(t.columnName)})`;return [sequelize.literal(e),t.alias]}default:nt.error(`Unsupported computed action: ${t.action}`);break}return []}function St(t){return t.map(e=>Rt(e))}function xt(t){return t.map(e=>{let o=it(e.columnName),r=`json_build_object(${e.keys.map(s=>`'${s}', ${o} -> '${s}'`).join(", ")})`,n=e.alias||e.columnName;return [sequelize.literal(r),n]})}function J(t={}){let{select:e=[],computed:o=[]}=t,r=xt(e),n=St(o);return [...r,...n]}var It="id",at="DESC",wt="ASC",b="customFields.",{CUSTOM_FIELDS_FILTER_SCOPE:G,CUSTOM_FIELDS_SORT_SCOPE:K}=commonTypes.customFields,Ft=t=>["string","number"].includes(typeof t)||Array.isArray(t)?t:Object.entries(t).map(([e,o])=>({operator:tt[e],value:o})),Tt=(t,e={})=>{let{literalAttributes:o=[],DBFormatter:r=void 0}=e,[n,s]=t.reduce((i,l)=>{let[a,c="ASC"]=Array.isArray(l)?l:[l],d=o?.find(u=>u.attribute===a);return d?(i[1].push(d.literal),i[0].push([r?r(`"${d.attribute}" ${c}`):`${d.attribute} ${c}`])):i[0].push(l),i},[[],[]]);return [n,s]},ct=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(s=>{let i=O();e[i]=typeof s=="string"?s:s.value;});else if(typeof r=="string"||typeof r=="number"){let s=O();e[s]=r;}else if(r?.operator){let s=O();e[s]=r.value;}}),e},$t=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},qt=(t,e)=>({...$t(t),...ct(e)}),Mt=({order:t,associationModels:e=[],replacementsMap:o={}})=>{let r=[],n=new Map;return t.forEach(s=>{if([s,s.substring(1)].some(c=>c.startsWith(b))){n.has(K)||n.set(K,{});let c=s.split(b)[1];n.get(K)[c]=M(s)?at:wt;return}let i=[L(s,e)],l=M(s);R(l?s.split(y)[1]:s,e)&&i.push(ot(s)),l&&i.push(at),r.push(i);}),{formattedOrders:r,replacementsMap:o,orderScopes:Array.from(n.entries()).map(([s,i])=>i?{method:[s,{replacementsMap:o,scopeValue:i}]}:s)}},Lt=t=>t||q,jt=t=>t||$,lt=(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:lt(r.include,n?.target?.associations)}}});return o=o.map(({model:r,...n})=>n),o},Ct=(t,e,o,r=[])=>{let n={},s={},i=new Map;Object.entries(t).forEach(([a,c])=>{if(a.startsWith(b)){i.has(G)||i.set(G,{});let u=a.split(b)[1];i.get(G)[u]=Ft(c);return}if(r.includes(a)){s[a]=c;return}let d=R(a,e)?rt(a):a;n[d]=c;});let l=Array.from(i.entries()).map(([a,c])=>c?{method:[a,{replacementsMap:o,scopeValue:c}]}:a);return {formattedQuery:n,externalQueryValues:s,formattedScopes:l}},kt=(t,e,o)=>({$and:t.split(" ").map(r=>({$or:e.filter(n=>o[n].type.key==="STRING").map(n=>({[n]:{$iLike:`%${r}%`}}))}))}),Vt=({order:t=[],page:e=q,perPage:o=$,include:r=[],query:n={},attributes:s=null,searchTerm:i=null,jsonAttributes:l={}},a,c)=>{let d=qt(t,n),u=Object.keys(a?.associations||{}),{formattedOrders:g,orderScopes:x}=Mt({order:[...t,It],associationModels:u,replacementsMap:d}),[h,_]=Tt(g,c),I=[..._,...s||[]],w=s?.length?I:{include:I},F=J(l),A=lt(r,a?.associations),C=Lt(e),yt=jt(o),z=Ct(n,u,d,c?.additionalAllowedAttributes),{formattedScopes:ft,externalQueryValues:Y}=z,{formattedQuery:T}=z;if(i&&!c?.skipSearchTermFormat){let bt=s?.length?s:Object.keys(a.rawAttributes),Z=kt(i,bt,a.rawAttributes);T=!T||Object.keys(T).length===0?Z:{$and:[T,Z]};}return {jsonAttributes:F,query:T,order:h,page:C,perPage:yt,include:A,scopes:[...ft,...x],...w&&{attributes:w},...Object.keys(Y).length>0&&{externalQueryValues:Y}}},dt=Vt;var Nt=t=>k.includes(t.split(E)[1]),ut=(t,e=[],o=[],r=[])=>{let n=t.startsWith(V)&&t.endsWith(V)?t.slice(1,-1):t;return [...e,...o].includes(n.includes(f)?n.split(f)[0]:n)||r.includes(n)},vt=(t,e,o,r={})=>{let n=M(t);n&&t[0]!==y&&m(`${y} must be only at the beginning of the word`);let s=n?t.split(y)[1]:t,i=R(s,o),l=L(t,o),a=r?.literalAttributes?.map(c=>c.attribute)?.includes(s);!i&&l.includes(f)&&([l]=l.split(f)),e.includes(l)||i||a||m(`${t} is invalid. isLiteralAttribute: ${a}`);},Dt=(t,e)=>{e.includes(t)||m(`${t} is invalid`);},pt=(t,e,o=[],r={})=>{t.forEach(n=>vt(n,e,o,r));},W=(t,e)=>{t.forEach(o=>Dt(o,e));},Qt=(t,e)=>{let o=[...t.select?.map(r=>r.columnName)||[],...t.computed?.map(r=>r.columnName)||[]];W(o,e);},Jt=(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&&m(`enrichment attribute ${r} is invalid`);},j=(t,e,o=[],r=[])=>{Object.entries(t).forEach(([n,s])=>{Array.isArray(s)?s[0]&&typeof s[0]=="object"&&s.map(i=>j(i,e,o,r)):Nt(n)||ut(n,e,o,r)?s&&typeof s=="object"&&j(s,e,[],r):m(`invalid key: ${n}`);});},Gt=({page:t,perPage:e})=>{t<et&&m("Page must be greater than 0"),(e>N||e<v)&&m(`PerPage must be between ${v} to ${N}`);},Kt=(t,e)=>{let o=Object.keys(e);t.forEach(r=>{ut(r.model,o);let n=e[r.model]?.target;n||m("model not found in associations");let{rawAttributes:s}=n,i=Object.keys(s);r.where&&j(r.where,i),r.order&&pt(r.order,i),r.attributes&&W(r.attributes,i),[null,void 0,true,false].includes(r.required)||m("include.required must be a boolean");});},U=({query:t={},order:e=[],attributes:o=[],include:r=[],page:n=q,perPage:s=$,enrichments:i=[],group:l=[],jsonAttributes:a={}},c,d={})=>{let u=Object.keys(c.rawAttributes),g=Object.keys(c?.associations||{});return !o||o.length===0?o=u:W(o,u),pt(e,u,g,d),j(t,u,g,d.additionalAllowedAttributes),Jt(i,d),Qt(a,u),Array.isArray(l)||m("group must be an array"),r.length&&typeof r=="object"?Kt(r,c?.associations):r&&typeof r!="object"&&m("include must be an array"),Gt({page:n,perPage:s}),true};var {object:H,string:P,number:mt,any:Xt,array:S,alternatives:Bt}=p__default.default.types(),zt=ht__default.default(),Yt=H.keys({query:H,attributes:S.items(P),order:S.items(P),page:mt,perPage:mt,include:S.items(Xt),searchTerm:P,group:S.items(P),enrichments:Bt.try(S.items(P),H.pattern(P,{exclude:S.items(P)})),jsonAttributes:p__default.default.object({select:p__default.default.array().items(p__default.default.object({columnName:p__default.default.string().required(),keys:p__default.default.array().items(p__default.default.string().required()).required(),alias:p__default.default.string().optional()})).default([]),computed:p__default.default.array().items(p__default.default.object({columnName:p__default.default.string().required(),action:p__default.default.string().valid(...Object.values(Q)).required(),alias:p__default.default.string().required()})).default([])}).default({})}),X=(t,e,o={})=>{let{query:r,attributes:n,order:s,page:i,perPage:l,include:a,group:c,enrichments:d,jsonAttributes:u}=e,g=Yt.validate(e);if(g.error)throw new errors.BadRequest([g.error],null);U({query:r,attributes:n,order:s,page:i,perPage:l,include:a,enrichments:d,group:c,jsonAttributes:u},t,o);},Zt=(t,e={},o="body")=>async(r,n,s)=>{try{X(t,r[o],e),s();}catch(i){let{query:l,attributes:a,order:c}=r[o];errors.handleError(i,n,{logger:e.logger||zt,message:"error in query middleware",payload:{error:i,query:l,attributes:a,order:c}});}},B=(t,e,o={})=>{let{order:r,page:n,perPage:s,include:i,query:l,attributes:a,searchTerm:c,jsonAttributes:d}=e,{query:u,externalQueryValues:g,order:x,page:h,perPage:_,include:I,scopes:w,attributes:F,jsonAttributes:A}=dt({query:l,order:r,page:n,perPage:s,include:i,attributes:a,searchTerm:c,jsonAttributes:d},t,o);e.query=u,e.externalQueryValues=g,e.order=x,e.jsonAttributes=A,e.attributes=F,e.page=h,e.perPage=_,e.include=I,e.scopes=w,o.includeRawPayload&&(e.rawPayload={order:r,page:n,perPage:s,include:i,query:l,attributes:a,searchTerm:c});},te=(t,e={},o="body")=>async(r,n,s)=>{B(t,r[o],e),s();};var re=({model:t,logger:e,validationOptions:o,formatOptions:r,modelName:n=t.constructor?.name,additionalScopes:s=[],modifyQueryValues:i,onRowsRetrieved:l})=>async(a,c)=>{try{X(t,a.body,{...o,logger:e});}catch(d){let u=D(a.body,["query","order","attributes"]);errors.handleError(d,c,{logger:e,message:"error in query endpoint",payload:u});return}try{B(t,a.body,r);let d=Object.assign(D(a.body,["query","externalQueryValues","order","attributes","page","perPage","include","scopes","enrichments","jsonAttributes"]),{distinct:!0});e.info(`querying ${n}`,{queryValues:d});let u=i?.(d)??d,{scopes:g=[],query:x,perPage:h,page:_,enrichments:I,externalQueryValues:w,...F}=u,A=await t.scope([...s,...g]).findAndCountAll({where:x,limit:h,offset:(_-1)*h,...F});if(!A.rows.length||!l){c.json(A);return}let C=await l(A,u);c.json(C);}catch(d){errors.handleError(new errors.UnexpectedError(d),c,{logger:e,message:`Error while querying ${n}`,payload:{query:a.body}});}};exports.formatOperators=At;exports.generateFilterReplacements=ct;exports.queryFormatMiddleware=te;exports.queryHandler=re;exports.queryValidationMiddleware=Zt;exports.validatePayload=U;//# sourceMappingURL=index.cjs.map
|
|
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
|
|
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/jsonAttributesFormater.ts","../src/logger.js","../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","logger","Logger","logger_default","JsonAttributeAction","toSnakeCase","str","letter","buildComputedAttribute","computedAttribute","sql","literal","buildComputedAttributes","computed","attr","buildSelectAttributes","select","columnNameSnake","k","alias","buildJsonAttributes","jsonAttributes","selectAttributes","computedAttributes","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","formatPayload","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedJsonAttributes","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","rawAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","validateJsonAttributes","s","c","validateEnrichments","enrichments","enrichmentKeys","invalidEnrichment","enrichment","validateQueryPayload","v","validatePagination","validateIncludePayload","associations","associationsKeys","target","attributeKeys","validatePayload","group","object","string","number","any","array","alternatives","Joi","fallbackLogger","querySchema","queryValidation","data","queryValidationMiddleware","inner","req","res","next","error","handleError","queryFormat","queryFormatMiddleware","queryHandler","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 { literal } from 'sequelize';\nimport logger from '../logger';\n\ntype JsonSelectAttribute = {\n columnName: string;\n keys: string[];\n alias?: string;\n};\n\ntype JsonComputedAttribute = {\n columnName: string;\n action: string;\n alias: string;\n};\n\nexport type JsonAttributes = {\n select?: JsonSelectAttribute[];\n computed?: JsonComputedAttribute[];\n};\n\nexport const JsonAttributeAction = {\n length: 'length',\n} as const;\n\nfunction toSnakeCase(str) {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Builds a computed attribute based on the action specified.\n * Currently, supports 'length' action which calculates the length of a JSON array.\n *\n * @param {JsonComputedAttribute} computedAttribute - The computed attribute definition.\n * @returns {Array} An array containing the SQL literal and the alias for the computed attribute.\n */\nfunction buildComputedAttribute(computedAttribute: JsonComputedAttribute) {\n switch (computedAttribute.action) {\n case JsonAttributeAction.length: {\n // Generates: jsonb_array_length(column)\n // Returns the length of the JSON array (e.g., [\"a\", \"b\"] -> 2)\n // Note: Expects the column to be a JSON array\n const sql = `jsonb_array_length(${toSnakeCase(computedAttribute.columnName)})`;\n return [literal(sql), computedAttribute.alias];\n }\n default:\n logger.error(`Unsupported computed action: ${computedAttribute.action}`); // TODO: fix\n // TODO: After moving this logic to Sheilta, use the same options array as in the validation schema\n break;\n }\n return [];\n}\n\nfunction buildComputedAttributes(computed: JsonComputedAttribute[]) {\n return computed.map((attr) => buildComputedAttribute(attr));\n}\n\n/**\n * Builds a list of SQL select attributes using json_build_object\n * to extract specific keys from a JSONB column.\n *\n * Example output:\n * SELECT json_build_object('a', column -> 'a', 'b', column -> 'b') AS alias\n */\nfunction buildSelectAttributes(select) {\n return select.map((attr) => {\n const columnNameSnake = toSnakeCase(attr.columnName);\n const sql = `json_build_object(${attr.keys\n .map((k) => `'${k}', ${columnNameSnake} -> '${k}'`)\n .join(', ')})`;\n const alias = attr.alias || attr.columnName;\n return [literal(sql), alias];\n });\n}\n\nexport default function buildJsonAttributes(jsonAttributes: JsonAttributes = {}) {\n const { select = [], computed = [] } = jsonAttributes;\n const selectAttributes = buildSelectAttributes(select);\n const computedAttributes = buildComputedAttributes(computed);\n\n // Return a flat array: [[literal, alias], [literal, alias], ...]\n return [...selectAttributes, ...computedAttributes];\n}\n","import Logger from '@autofleet/logger';\n\nconst logger = Logger();\n\nexport default logger;\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 buildJsonAttributes from './jsonAttributesFormater';\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 formattedJsonAttributes = buildJsonAttributes(jsonAttributes);\n\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: formattedJsonAttributes,\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';\nimport { JsonAttributes } from '../formatter/jsonAttributesFormater';\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\nconst validateJsonAttributes = (jsonAttributes: JsonAttributes, rawAttributes: string[]):\n void => {\n const allAttributes = [\n ...(jsonAttributes.select?.map((s) => s.columnName) || []),\n ...(jsonAttributes.computed?.map((c) => c.columnName) || []),\n ];\n\n validateAttributes(allAttributes, rawAttributes);\n};\n\nconst validateEnrichments = (enrichments: string[] | { [enrichmentName: string]: { exclude?: string[]; } }, options?: MiddlewareValidationOption): void => {\n const enrichmentKeys = Array.isArray(enrichments) ? enrichments : Object.keys(enrichments);\n if (!enrichmentKeys?.length) { return; }\n const invalidEnrichment = enrichmentKeys.find((enrichment) => !options?.enrichmentAttributes?.includes(enrichment));\n if (invalidEnrichment) {\n throwBadRequestError(`enrichment attribute ${invalidEnrichment} is invalid`);\n }\n};\n\nconst validateQueryPayload = (query, rawAttributes: string[], associationModels: string[] = [], additionalAllowedAttributes: string[] = []): void => {\n Object.entries(query).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n if (value[0] && typeof value[0] === 'object') {\n value.map((v) => validateQueryPayload(v, rawAttributes, associationModels, additionalAllowedAttributes));\n }\n } else if (validateOperator(key) || validateQueryAttribute(key, rawAttributes, associationModels, additionalAllowedAttributes)) {\n if (value && typeof value === 'object') {\n validateQueryPayload(value, rawAttributes, [], additionalAllowedAttributes);\n }\n } else {\n throwBadRequestError(`invalid key: ${key}`);\n }\n });\n};\n\nconst validatePagination = ({\n page,\n perPage,\n}) => {\n if (page < PAGE_MIN) {\n throwBadRequestError('Page must be greater than 0');\n }\n\n if (perPage > PER_PAGE_MAX_LIMIT || perPage < PER_PAGE_MIN_LIMIT) {\n throwBadRequestError(`PerPage must be between ${PER_PAGE_MIN_LIMIT} to ${PER_PAGE_MAX_LIMIT}`);\n }\n};\n\nconst validateIncludePayload = (include, associations): void => {\n const associationsKeys = Object.keys(associations);\n include.forEach((i) => {\n validateQueryAttribute(i.model, associationsKeys);\n const target = associations[i.model]?.target;\n if (!target) {\n throwBadRequestError('model not found in associations');\n }\n\n const { rawAttributes } = target;\n const attributeKeys = Object.keys(rawAttributes);\n if (i.where) {\n validateQueryPayload(i.where, attributeKeys);\n }\n if (i.order) {\n validateOrderAttributes(i.order, attributeKeys);\n }\n if (i.attributes) {\n validateAttributes(i.attributes, attributeKeys);\n }\n if (![null, undefined, true, false].includes(i.required)) {\n throwBadRequestError('include.required must be a boolean');\n }\n });\n};\n\nexport const validatePayload = (\n {\n query = {},\n order = [],\n attributes = [],\n include = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n enrichments = [],\n group = [],\n jsonAttributes = {},\n },\n model?,\n options: MiddlewareValidationOption = {},\n): boolean => {\n const rawAttributes = Object.keys(model.rawAttributes);\n const associationModels = Object.keys(model?.associations || {});\n if (!attributes || attributes.length === 0) {\n // eslint-disable-next-line no-param-reassign\n attributes = rawAttributes;\n } else {\n validateAttributes(attributes, rawAttributes);\n }\n\n validateOrderAttributes(order, rawAttributes, associationModels, options);\n validateQueryPayload(query, rawAttributes, associationModels, options.additionalAllowedAttributes);\n validateEnrichments(enrichments, options);\n validateJsonAttributes(jsonAttributes, rawAttributes);\n\n if (!Array.isArray(group)) {\n throwBadRequestError('group must be an array');\n }\n if (include.length && typeof include === 'object') {\n validateIncludePayload(include, model?.associations);\n } else if (include && typeof include !== 'object') {\n throwBadRequestError('include must be an array');\n }\n\n validatePagination({\n page,\n perPage,\n });\n return true;\n};\n","import type { Handler } from 'express';\nimport Logger, { type LoggerInstanceManager } from '@autofleet/logger';\nimport { BadRequest, handleError } from '@autofleet/errors';\nimport Joi from 'joi';\nimport formatPayload, { type FormatPayloadOptions } from '../formatter';\nimport { validatePayload } from '../validations';\nimport { JsonAttributeAction } from '../formatter/jsonAttributesFormater';\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 alias: Joi.string().optional(),\n }),\n ).default([]),\n computed: Joi.array().items(\n Joi.object({\n columnName: Joi.string().required(),\n action: Joi.string().valid(...Object.values(JsonAttributeAction)).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, page, perPage, include, query, attributes, searchTerm, 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, order, page, perPage, include, attributes, searchTerm, 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","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"]}
|
package/lib/index.d.cts
CHANGED
|
@@ -38,7 +38,7 @@ declare const formatPayload: ({ order, page, perPage, include, query, attributes
|
|
|
38
38
|
attributes: any[] | {
|
|
39
39
|
include: any[];
|
|
40
40
|
};
|
|
41
|
-
jsonAttributes:
|
|
41
|
+
jsonAttributes: {};
|
|
42
42
|
query: Record<string, unknown>;
|
|
43
43
|
order: SequelizeOrder[];
|
|
44
44
|
page: number;
|
|
@@ -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, }: {
|
|
74
74
|
query?: {};
|
|
75
75
|
order?: any[];
|
|
76
76
|
attributes?: any[];
|
|
@@ -79,7 +79,6 @@ declare const validatePayload: ({ query, order, attributes, include, page, perPa
|
|
|
79
79
|
perPage?: number;
|
|
80
80
|
enrichments?: any[];
|
|
81
81
|
group?: any[];
|
|
82
|
-
jsonAttributes?: {};
|
|
83
82
|
}, model?: any, options?: MiddlewareValidationOption) => boolean;
|
|
84
83
|
|
|
85
84
|
interface QueryValues extends ReturnType<typeof formatPayload> {
|
package/lib/index.d.ts
CHANGED
|
@@ -38,7 +38,7 @@ declare const formatPayload: ({ order, page, perPage, include, query, attributes
|
|
|
38
38
|
attributes: any[] | {
|
|
39
39
|
include: any[];
|
|
40
40
|
};
|
|
41
|
-
jsonAttributes:
|
|
41
|
+
jsonAttributes: {};
|
|
42
42
|
query: Record<string, unknown>;
|
|
43
43
|
order: SequelizeOrder[];
|
|
44
44
|
page: number;
|
|
@@ -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, }: {
|
|
74
74
|
query?: {};
|
|
75
75
|
order?: any[];
|
|
76
76
|
attributes?: any[];
|
|
@@ -79,7 +79,6 @@ declare const validatePayload: ({ query, order, attributes, include, page, perPa
|
|
|
79
79
|
perPage?: number;
|
|
80
80
|
enrichments?: any[];
|
|
81
81
|
group?: any[];
|
|
82
|
-
jsonAttributes?: {};
|
|
83
82
|
}, model?: any, options?: MiddlewareValidationOption) => boolean;
|
|
84
83
|
|
|
85
84
|
interface QueryValues extends ReturnType<typeof formatPayload> {
|
package/lib/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
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
|
|
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/jsonAttributesFormater.ts","../src/logger.js","../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","logger","Logger","logger_default","JsonAttributeAction","toSnakeCase","str","letter","buildComputedAttribute","computedAttribute","sql","literal","buildComputedAttributes","computed","attr","buildSelectAttributes","select","columnNameSnake","k","alias","buildJsonAttributes","jsonAttributes","selectAttributes","computedAttributes","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","formatPayload","model","orderScopes","filteredFormattedOrder","filteredLiteralAttributes","allAttributes","formattedAttribute","formattedJsonAttributes","formattedPage","formattedPerPage","result","queryScopes","queryWithSearchTerm","formatter_default","validateOperator","validateQueryAttribute","rawAttribute","modelAttributes","validateSingleOrder","currentOrder","orderStringWithoutDesc","isOrderAssociation","formattedOrderString","isLiteralAttribute","la","validateSingleAttribute","currentAttribute","validateOrderAttributes","validateAttributes","a","validateJsonAttributes","s","c","validateEnrichments","enrichments","enrichmentKeys","invalidEnrichment","enrichment","validateQueryPayload","v","validatePagination","validateIncludePayload","associations","associationsKeys","target","attributeKeys","validatePayload","group","object","string","number","any","array","alternatives","Joi","fallbackLogger","querySchema","queryValidation","data","queryValidationMiddleware","inner","req","res","next","error","handleError","queryFormat","queryFormatMiddleware","queryHandler","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 { literal } from 'sequelize';\nimport logger from '../logger';\n\ntype JsonSelectAttribute = {\n columnName: string;\n keys: string[];\n alias?: string;\n};\n\ntype JsonComputedAttribute = {\n columnName: string;\n action: string;\n alias: string;\n};\n\nexport type JsonAttributes = {\n select?: JsonSelectAttribute[];\n computed?: JsonComputedAttribute[];\n};\n\nexport const JsonAttributeAction = {\n length: 'length',\n} as const;\n\nfunction toSnakeCase(str) {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Builds a computed attribute based on the action specified.\n * Currently, supports 'length' action which calculates the length of a JSON array.\n *\n * @param {JsonComputedAttribute} computedAttribute - The computed attribute definition.\n * @returns {Array} An array containing the SQL literal and the alias for the computed attribute.\n */\nfunction buildComputedAttribute(computedAttribute: JsonComputedAttribute) {\n switch (computedAttribute.action) {\n case JsonAttributeAction.length: {\n // Generates: jsonb_array_length(column)\n // Returns the length of the JSON array (e.g., [\"a\", \"b\"] -> 2)\n // Note: Expects the column to be a JSON array\n const sql = `jsonb_array_length(${toSnakeCase(computedAttribute.columnName)})`;\n return [literal(sql), computedAttribute.alias];\n }\n default:\n logger.error(`Unsupported computed action: ${computedAttribute.action}`); // TODO: fix\n // TODO: After moving this logic to Sheilta, use the same options array as in the validation schema\n break;\n }\n return [];\n}\n\nfunction buildComputedAttributes(computed: JsonComputedAttribute[]) {\n return computed.map((attr) => buildComputedAttribute(attr));\n}\n\n/**\n * Builds a list of SQL select attributes using json_build_object\n * to extract specific keys from a JSONB column.\n *\n * Example output:\n * SELECT json_build_object('a', column -> 'a', 'b', column -> 'b') AS alias\n */\nfunction buildSelectAttributes(select) {\n return select.map((attr) => {\n const columnNameSnake = toSnakeCase(attr.columnName);\n const sql = `json_build_object(${attr.keys\n .map((k) => `'${k}', ${columnNameSnake} -> '${k}'`)\n .join(', ')})`;\n const alias = attr.alias || attr.columnName;\n return [literal(sql), alias];\n });\n}\n\nexport default function buildJsonAttributes(jsonAttributes: JsonAttributes = {}) {\n const { select = [], computed = [] } = jsonAttributes;\n const selectAttributes = buildSelectAttributes(select);\n const computedAttributes = buildComputedAttributes(computed);\n\n // Return a flat array: [[literal, alias], [literal, alias], ...]\n return [...selectAttributes, ...computedAttributes];\n}\n","import Logger from '@autofleet/logger';\n\nconst logger = Logger();\n\nexport default logger;\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 buildJsonAttributes from './jsonAttributesFormater';\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 formattedJsonAttributes = buildJsonAttributes(jsonAttributes);\n\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: formattedJsonAttributes,\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';\nimport { JsonAttributes } from '../formatter/jsonAttributesFormater';\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\nconst validateJsonAttributes = (jsonAttributes: JsonAttributes, rawAttributes: string[]):\n void => {\n const allAttributes = [\n ...(jsonAttributes.select?.map((s) => s.columnName) || []),\n ...(jsonAttributes.computed?.map((c) => c.columnName) || []),\n ];\n\n validateAttributes(allAttributes, rawAttributes);\n};\n\nconst validateEnrichments = (enrichments: string[] | { [enrichmentName: string]: { exclude?: string[]; } }, options?: MiddlewareValidationOption): void => {\n const enrichmentKeys = Array.isArray(enrichments) ? enrichments : Object.keys(enrichments);\n if (!enrichmentKeys?.length) { return; }\n const invalidEnrichment = enrichmentKeys.find((enrichment) => !options?.enrichmentAttributes?.includes(enrichment));\n if (invalidEnrichment) {\n throwBadRequestError(`enrichment attribute ${invalidEnrichment} is invalid`);\n }\n};\n\nconst validateQueryPayload = (query, rawAttributes: string[], associationModels: string[] = [], additionalAllowedAttributes: string[] = []): void => {\n Object.entries(query).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n if (value[0] && typeof value[0] === 'object') {\n value.map((v) => validateQueryPayload(v, rawAttributes, associationModels, additionalAllowedAttributes));\n }\n } else if (validateOperator(key) || validateQueryAttribute(key, rawAttributes, associationModels, additionalAllowedAttributes)) {\n if (value && typeof value === 'object') {\n validateQueryPayload(value, rawAttributes, [], additionalAllowedAttributes);\n }\n } else {\n throwBadRequestError(`invalid key: ${key}`);\n }\n });\n};\n\nconst validatePagination = ({\n page,\n perPage,\n}) => {\n if (page < PAGE_MIN) {\n throwBadRequestError('Page must be greater than 0');\n }\n\n if (perPage > PER_PAGE_MAX_LIMIT || perPage < PER_PAGE_MIN_LIMIT) {\n throwBadRequestError(`PerPage must be between ${PER_PAGE_MIN_LIMIT} to ${PER_PAGE_MAX_LIMIT}`);\n }\n};\n\nconst validateIncludePayload = (include, associations): void => {\n const associationsKeys = Object.keys(associations);\n include.forEach((i) => {\n validateQueryAttribute(i.model, associationsKeys);\n const target = associations[i.model]?.target;\n if (!target) {\n throwBadRequestError('model not found in associations');\n }\n\n const { rawAttributes } = target;\n const attributeKeys = Object.keys(rawAttributes);\n if (i.where) {\n validateQueryPayload(i.where, attributeKeys);\n }\n if (i.order) {\n validateOrderAttributes(i.order, attributeKeys);\n }\n if (i.attributes) {\n validateAttributes(i.attributes, attributeKeys);\n }\n if (![null, undefined, true, false].includes(i.required)) {\n throwBadRequestError('include.required must be a boolean');\n }\n });\n};\n\nexport const validatePayload = (\n {\n query = {},\n order = [],\n attributes = [],\n include = [],\n page = PAGE_DEFAULT,\n perPage = PER_PAGE_DEFAULT,\n enrichments = [],\n group = [],\n jsonAttributes = {},\n },\n model?,\n options: MiddlewareValidationOption = {},\n): boolean => {\n const rawAttributes = Object.keys(model.rawAttributes);\n const associationModels = Object.keys(model?.associations || {});\n if (!attributes || attributes.length === 0) {\n // eslint-disable-next-line no-param-reassign\n attributes = rawAttributes;\n } else {\n validateAttributes(attributes, rawAttributes);\n }\n\n validateOrderAttributes(order, rawAttributes, associationModels, options);\n validateQueryPayload(query, rawAttributes, associationModels, options.additionalAllowedAttributes);\n validateEnrichments(enrichments, options);\n validateJsonAttributes(jsonAttributes, rawAttributes);\n\n if (!Array.isArray(group)) {\n throwBadRequestError('group must be an array');\n }\n if (include.length && typeof include === 'object') {\n validateIncludePayload(include, model?.associations);\n } else if (include && typeof include !== 'object') {\n throwBadRequestError('include must be an array');\n }\n\n validatePagination({\n page,\n perPage,\n });\n return true;\n};\n","import type { Handler } from 'express';\nimport Logger, { type LoggerInstanceManager } from '@autofleet/logger';\nimport { BadRequest, handleError } from '@autofleet/errors';\nimport Joi from 'joi';\nimport formatPayload, { type FormatPayloadOptions } from '../formatter';\nimport { validatePayload } from '../validations';\nimport { JsonAttributeAction } from '../formatter/jsonAttributesFormater';\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 alias: Joi.string().optional(),\n }),\n ).default([]),\n computed: Joi.array().items(\n Joi.object({\n columnName: Joi.string().required(),\n action: Joi.string().valid(...Object.values(JsonAttributeAction)).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, page, perPage, include, query, attributes, searchTerm, 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, order, page, perPage, include, attributes, searchTerm, 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","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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autofleet/sheilta",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.2-beta-2",
|
|
4
4
|
"description": "Middlewares for validation and parsing of endpoints meant for data querying.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -61,8 +61,7 @@
|
|
|
61
61
|
},
|
|
62
62
|
"peerDependencies": {
|
|
63
63
|
"@autofleet/errors": "^3",
|
|
64
|
-
"@autofleet/logger": "*"
|
|
65
|
-
"sequelize": "^6.0.0"
|
|
64
|
+
"@autofleet/logger": "*"
|
|
66
65
|
},
|
|
67
66
|
"devDependencies": {
|
|
68
67
|
"@autofleet/errors": "^3.0.1",
|