@autofleet/sadot 1.0.9 → 1.0.10

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/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports,`__esModule`,{value:!0});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`sequelize`);c=s(c);let l=require(`@autofleet/logger`);l=s(l);let u=require(`sequelize-typescript`);u=s(u);let d=require(`@autofleet/common-types`);d=s(d);let f=require(`joi`);f=s(f);let p=require(`@autofleet/events`);p=s(p);let m=require(`@autofleet/zehut`);m=s(m);let h=require(`@autofleet/errors`);h=s(h);let g=require(`node:crypto`);g=s(g);let _=require(`@autofleet/node-common`);_=s(_);let v=require(`http-status-codes`);v=s(v);let ee=require(`ajv`);ee=s(ee);let y=require(`ajv-formats`);y=s(y);let te=require(`@autofleet/common-types/lib/custom-fields`);te=s(te);let ne=require(`ajv-errors`);ne=s(ne);const re=(0,l.default)();async function ie(){try{let{outbreak:e}=await import(`@autofleet/zehut`);re.addContextMiddleware(()=>({traceId:e.getCurrentContextTraceId()}))}catch(e){re.error(`Failed to add traceId middleware`,{err:e})}}var b=re;const ae=[`businessModelId`,`fleetId`,`demandSourceId`];let x=function(e){return e.NUMBER=`number`,e.BOOLEAN=`boolean`,e.DATE=`date`,e.DATETIME=`datetime`,e.TEXT=`text`,e.IMAGE=`image`,e.SELECT=`select`,e.STATUS=`status`,e.FILE=`file`,e}({});const oe=d.customFields.CUSTOM_FIELDS_FILTER_SCOPE,se=(e,t)=>f.default.string().allow(null).valid(...t).validate(e),ce=(e,t)=>f.default.string().allow(null).valid(...t.map(e=>e.value)).validate(e),le={[x.SELECT]:x.SELECT,[x.STATUS]:x.STATUS},ue={[x.SELECT]:se,[x.STATUS]:ce,[x.TEXT]:e=>f.default.string().min(0).validate(e),[x.NUMBER]:e=>f.default.number().strict(!0).validate(e),[x.BOOLEAN]:e=>f.default.boolean().strict().validate(e),[x.DATE]:e=>f.default.date().validate(e),[x.DATETIME]:e=>f.default.date().validate(e),[x.IMAGE]:e=>f.default.array().min(1).unique().items(f.default.string().uri()).validate(e),[x.FILE]:e=>f.default.array().min(1).unique().items(f.default.object({name:f.default.string().required(),type:f.default.string(),size:f.default.string(),addedBy:f.default.string().uuid()})).validate(e)},de=new p.default({logger:b,getUserId:e=>e?.user_id??(0,m.getUser)()?.id??null}),fe=[`value`,`defaultValue`,`blockEditingFromUI`],pe=(e,t)=>{let n=new Set(Object.keys(e));return t.every(e=>!n.has(e))?e:{...e,...Object.fromEntries(t.map(t=>[t,typeof e[t]==`boolean`?e[t].toString():e[t]]))}},me={CustomFieldDefinition:{tableName:`dim_custom_field_definition`,eventVersion:`1`},CustomFieldValue:{tableName:`dim_custom_field_value`,eventVersion:`1`},CustomFieldEntries:{tableName:`dim_custom_field_entries`,eventVersion:`1`}},S=e=>{let t=me[e.constructor.name];if(!t)return;let n=e.get();try{n=pe(e.get(),fe)}catch(e){b.error(`Failed to convert booleans in dim event payload`,e)}de.sendObject(t.tableName,t.eventVersion,n).catch(()=>{})};var he=class extends h.BadRequest{constructor(e){let t=Error(`The following custom fields are required: ${e.join(`,`)}`);super([t],null,e),this.message=`MISSING_REQUIRED_CUSTOM_FIELDS`}},ge=class extends h.BadRequest{constructor(e){let t=Error(`Type "${e}" is not supported`);super([t],null,null),this.message=`UNSUPPORTED_CUSTOM_FIELD_TYPE`}},_e=class extends h.BadRequest{constructor(e){let t=Error(`Validation for "${e}" is not supported`);super([t],null,null),this.message=`UNSUPPORTED_CUSTOM_VALIDATION_TYPE`}},ve=class extends h.BadRequest{constructor(e){let t=Error(`Invalid field type ${e}`);super([t],null,null),this.message=`INVALID_FIELD_TYPE`}},C=class extends h.BadRequest{constructor(e,t,n){let r=n.message.replace(/"/g,``).replace(`value`,`'${t}'`),i=typeof e==`object`?JSON.stringify(e):e,a=`Invalid Value on field '${t}'. ${r}. received: '${i}'`;super([Error(a)],null,null),this.message=a}},ye=class extends h.BadRequest{constructor(e,t){let n=t.map(e=>new C(e.value,e.fieldDefinitionName,e.joiValidationError));super(n,null,null),this.message=`Invalid entries on ${e}\n${t.map(e=>`${e.fieldDefinitionName} - ${e.joiValidationError.message}`).join(`
2
- `)}`}},be=class extends h.BadRequest{constructor(e){let t=Error(`Missing custom field definition for field ${e.join(`,`)}`);super([t],null,null),this.message=`MISSING_DEFINITION`}};const xe=e=>Object.keys(ue).includes(e),Se=(e,t,n)=>{let r=ue[t];return r(e,n)},Ce=(e,t,n=Se)=>{let r=Object.entries(e.customFields).map(([e,r])=>{if(r===null)return null;let{validation:i,fieldType:a}=t[e],o=n(r,a,i);return o?.error?{joiValidationError:o.error,fieldDefinitionName:e,value:r}:null}).filter(e=>!!e);if(r?.length)throw new ye(e.modelId,r)};function w(e,t){if(typeof Reflect==`object`&&typeof Reflect.metadata==`function`)return Reflect.metadata(e,t)}function T(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}var we,Te,Ee,De,Oe,ke;let E=class extends u.Model{static displayNameDefaultValue(e){if(e?.displayName||(e.displayName=e.name),![null,void 0].includes(e.defaultValue)){let t=Se(e.defaultValue,e.fieldType,e.validation);if(t.error)throw new C(e.defaultValue,e.name,t.error)}}static afterSaveHandler(e,t){t.transaction?t.transaction.afterCommit(()=>S(e)):S(e)}};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,defaultValue:u.DataType.UUIDV4,allowNull:!1}),w(`design:type`,String)],E.prototype,`id`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],E.prototype,`name`,void 0),T([(0,u.Column)({type:u.DataType.STRING}),w(`design:type`,String)],E.prototype,`displayName`,void 0),T([(0,u.Is)(`SupportedType`,e=>{if(!Object.values(x).includes(e))throw new ge(`"${e}" is not a supported type.`)}),(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,typeof(we=x!==void 0&&x)==`function`?we:Object)],E.prototype,`fieldType`,void 0),T([(0,u.Column)({type:u.DataType.JSONB}),w(`design:type`,Object)],E.prototype,`validation`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],E.prototype,`entityId`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],E.prototype,`entityType`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],E.prototype,`modelType`,void 0),T([(0,u.Column)({type:u.DataType.TEXT}),w(`design:type`,String)],E.prototype,`description`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN,defaultValue:!1}),w(`design:type`,Boolean)],E.prototype,`required`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN,defaultValue:!1}),w(`design:type`,Boolean)],E.prototype,`disabled`,void 0),T([(0,u.Column)({type:u.DataType.JSONB,allowNull:!0}),w(`design:type`,Object)],E.prototype,`defaultValue`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!1}),w(`design:type`,typeof(Te=typeof Date<`u`&&Date)==`function`?Te:Object)],E.prototype,`createdAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof(Ee=typeof Date<`u`&&Date)==`function`?Ee:Object)],E.prototype,`updatedAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof(De=typeof Date<`u`&&Date)==`function`?De:Object)],E.prototype,`deletedAt`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN,defaultValue:!1,allowNull:!1}),w(`design:type`,Boolean)],E.prototype,`blockEditingFromUI`,void 0),T([(0,u.HasMany)(()=>A),w(`design:type`,Array)],E.prototype,`values`,void 0),T([u.BeforeCreate,w(`design:type`,Function),w(`design:paramtypes`,[typeof(Oe=E!==void 0&&E)==`function`?Oe:Object]),w(`design:returntype`,void 0)],E,`displayNameDefaultValue`,null),T([u.AfterSave,w(`design:type`,Function),w(`design:paramtypes`,[typeof(ke=E!==void 0&&E)==`function`?ke:Object,Object]),w(`design:returntype`,void 0)],E,`afterSaveHandler`,null),E=T([(0,u.DefaultScope)(()=>({where:{disabled:!1}})),(0,u.Table)({indexes:[{name:`unique_name_model_type`,fields:[`model_type`,`entity_id`,`name`],unique:!0}],timestamps:!0,validate:{validationByType(){if(!this.validation&&le[this.fieldType])throw b.error(`No custom validation for custom field type ${this.fieldType} found`),new _e(`Validation provided for "${this.fieldType}" is not supported`)}}})],E);var D=E;const Ae=e=>D.create(e),O=(e,t={withDisabled:!1})=>(t.withDisabled?D.unscoped():D).scope(`userScope`).findAll({where:e,transaction:t.transaction,raw:!0,include:t.include}),je=(e,t={withDisabled:!1})=>O({id:{[c.Op.in]:e}},t),Me=(e,t={withDisabled:!1})=>{let{withDisabled:n}=t;return n?D.unscoped().scope(`userScope`).findByPk(e):D.scope(`userScope`).findByPk(e)},Ne=async(e,t,n={})=>{let{include:r,useEntityIdFromInclude:i}=n.modelOptions,a={modelType:e,...!i&&{entityId:{[c.Op.in]:t}}};return D.findAll({where:a,transaction:n.transaction,include:r?.(t),raw:!0})},Pe=e=>D.scope(`userScope`).findOne({where:e}),Fe=async(e,t)=>(await D.scope(`userScope`).update(t,{where:{id:e},returning:!0,individualHooks:!0}))[1][0],Ie=async(e,{findAll:t,modelOptions:n={},withDisabled:r=!1,...i}={withDisabled:!1,modelOptions:{}})=>{let{modelType:a}=e[0]?.dataValues??{},o=new Set,s=[],l=new Set;e.forEach(e=>{let{dataValues:{modelId:t,entityId:n,customFields:r}}=e;s.push(t),l.add(n),Object.keys(r??{}).forEach(e=>{o.add(e)})});let u={modelType:a,entityId:{[c.Op.in]:Array.from(l)},name:{[c.Op.in]:Array.from(o)}},d=await(t??O)(u,{withDisabled:r,modelOptions:n,...i}),f=d.filter(e=>o.has(e.name)),p=Object.fromEntries(f.map(e=>[e.name,e]));if(!d?.length||f.length!==o.size){let e=Array.from(o).filter(e=>!p[e]);throw new be(e)}return p};var Le,Re,ze,Be,Ve,He;let k=class extends u.Model{static validateValueAgainstDefinition(e,t){let{validation:n,fieldType:r,name:i}=t;if(!xe(r))throw new ve(r);if(e.value===null)return;let a=Se(e.value,r,n);if(a.error)throw new C(e.value,i,a.error)}static async validateCustomFieldValues(e){let t=e.map(e=>e.customFieldDefinitionId),n=[...new Set(t)],r=await je(n,{withDisabled:!0});if(!r||r.length!==n.length)throw Error(`Definitions not found`);e.forEach(e=>{let t=r.find(t=>t.id===e.customFieldDefinitionId);t&&this.validateValueAgainstDefinition(e,t)})}static async validateCustomFieldValue(e){let{customFieldDefinitionId:t}=e,n=await Me(t,{withDisabled:!0});this.validateValueAgainstDefinition(e,n)}static afterSaveHandler(e,t){t.transaction?t.transaction.afterCommit(()=>S(e[0])):S(e[0])}};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],k.prototype,`modelId`,void 0),T([u.PrimaryKey,(0,u.ForeignKey)(()=>D),(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],k.prototype,`customFieldDefinitionId`,void 0),T([(0,u.Column)({type:u.DataType.JSONB,allowNull:!0}),w(`design:type`,Object)],k.prototype,`value`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!1}),w(`design:type`,typeof(Le=typeof Date<`u`&&Date)==`function`?Le:Object)],k.prototype,`createdAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof(Re=typeof Date<`u`&&Date)==`function`?Re:Object)],k.prototype,`updatedAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof(ze=typeof Date<`u`&&Date)==`function`?ze:Object)],k.prototype,`deletedAt`,void 0),T([(0,u.BelongsTo)(()=>D,{scope:{disabled:!1}}),w(`design:type`,typeof(Be=D!==void 0&&D)==`function`?Be:Object)],k.prototype,`customFieldDefinition`,void 0),T([u.BeforeBulkCreate,u.BeforeBulkUpdate,w(`design:type`,Function),w(`design:paramtypes`,[Array]),w(`design:returntype`,Promise)],k,`validateCustomFieldValues`,null),T([u.BeforeUpdate,u.BeforeCreate,u.BeforeUpsert,w(`design:type`,Function),w(`design:paramtypes`,[typeof(Ve=k!==void 0&&k)==`function`?Ve:Object]),w(`design:returntype`,Promise)],k,`validateCustomFieldValue`,null),T([u.AfterUpsert,w(`design:type`,Function),w(`design:paramtypes`,[typeof(He=k!==void 0&&k)==`function`?He:Object,Object]),w(`design:returntype`,void 0)],k,`afterSaveHandler`,null),k=T([(0,u.Table)({timestamps:!0})],k);var A=k,Ue;let j=class extends u.Model{};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,defaultValue:u.DataType.UUIDV4,allowNull:!1}),w(`design:type`,String)],j.prototype,`id`,void 0),T([(0,u.ForeignKey)(()=>N),(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],j.prototype,`testModelId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],j.prototype,`fleetId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!0}),w(`design:type`,String)],j.prototype,`businessModelId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!0}),w(`design:type`,String)],j.prototype,`demandSourceId`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN}),w(`design:type`,Boolean)],j.prototype,`anotherAttribute`,void 0),T([(0,u.BelongsTo)(()=>N),w(`design:type`,typeof(Ue=N!==void 0&&N)==`function`?Ue:Object)],j.prototype,`testModel`,void 0),j=T([(0,u.Table)({schema:`custom-fields`,tableName:`associated_test_models`,createdAt:!1,updatedAt:!1})],j);var We=j;let M=class extends u.Model{};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,defaultValue:u.DataType.UUIDV4,allowNull:!1}),w(`design:type`,String)],M.prototype,`id`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],M.prototype,`fleetId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!0}),w(`design:type`,String)],M.prototype,`businessModelId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!0}),w(`design:type`,String)],M.prototype,`demandSourceId`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN}),w(`design:type`,Boolean)],M.prototype,`coolAttribute`,void 0),T([(0,u.HasMany)(()=>We),w(`design:type`,Array)],M.prototype,`associatedModels`,void 0),T([(0,u.Column)({type:u.DataType.VIRTUAL}),w(`design:type`,Object)],M.prototype,`customFields`,void 0),M=T([(0,u.Table)({schema:`custom-fields`,tableName:`test_models`,createdAt:!1,updatedAt:!1})],M);var N=M,Ge=function(e){return e.BUSINESS_MODEL=`businessModel`,e.CONTEXT=`context`,e.DEMAND_SOURCE=`demandSource`,e.FLEET=`fleet`,e}(Ge||{});let P=class extends u.Model{};T([u.PrimaryKey,(0,u.Column)({defaultValue:u.DataType.UUIDV4,type:u.DataType.UUID}),w(`design:type`,String)],P.prototype,`id`,void 0),T([(0,u.Column)({type:u.DataType.UUID}),w(`design:type`,String)],P.prototype,`entityId`,void 0),T([(0,u.Column)({type:u.DataType.ENUM(...Object.values(Ge))}),w(`design:type`,String)],P.prototype,`entityType`,void 0),P=T([(0,u.Table)({createdAt:!1,updatedAt:!1})],P);var F=P,Ke;let I=class extends u.Model{};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,defaultValue:u.DataType.UUIDV4,allowNull:!1}),w(`design:type`,String)],I.prototype,`id`,void 0),T([(0,u.ForeignKey)(()=>F),(0,u.Column)({type:u.DataType.UUID}),w(`design:type`,String)],I.prototype,`contextId`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN}),w(`design:type`,Boolean)],I.prototype,`coolAttribute`,void 0),T([(0,u.Column)({type:u.DataType.VIRTUAL}),w(`design:type`,Object)],I.prototype,`customFields`,void 0),T([(0,u.BelongsTo)(()=>F),w(`design:type`,typeof(Ke=F!==void 0&&F)==`function`?Ke:Object)],I.prototype,`context`,void 0),I=T([(0,u.Table)({createdAt:!1,updatedAt:!1})],I);var qe=I,Je,Ye,Xe,Ze;let L=class extends u.Model{static afterSaveHandler(e,t){t.transaction?t.transaction.afterCommit(()=>S(e[0])):S(e[0])}};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],L.prototype,`modelId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],L.prototype,`entityId`,void 0),T([(0,u.Column)({type:u.DataType.JSONB,allowNull:!1,defaultValue:{}}),w(`design:type`,typeof(Je=typeof Record<`u`&&Record)==`function`?Je:Object)],L.prototype,`customFields`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],L.prototype,`modelType`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!1}),w(`design:type`,typeof(Ye=typeof Date<`u`&&Date)==`function`?Ye:Object)],L.prototype,`createdAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof(Xe=typeof Date<`u`&&Date)==`function`?Xe:Object)],L.prototype,`updatedAt`,void 0),T([u.AfterUpsert,w(`design:type`,Function),w(`design:paramtypes`,[typeof(Ze=L!==void 0&&L)==`function`?Ze:Object,Object]),w(`design:returntype`,void 0)],L,`afterSaveHandler`,null),L=T([(0,u.Table)({timestamps:!0,indexes:[{name:`idx_cfe_custom_fields`,using:`gin`,operator:`jsonb_path_ops`,fields:[`custom_fields`]}],validate:{async validationByType(){if(!Object.keys(this.customFields??{}).length)return;let e=await Ie([this]);Ce(this,e)}}})],L);var R=L,Qe,$e,et;let z=class extends u.Model{static afterSaveHandler(e,t){t.transaction?t.transaction.afterCommit(()=>S(e)):S(e)}};T([u.PrimaryKey,(0,u.Default)(()=>(0,g.randomUUID)()),(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],z.prototype,`id`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],z.prototype,`entityId`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],z.prototype,`entityType`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],z.prototype,`modelType`,void 0),T([(0,u.Column)({type:u.DataType.JSONB,allowNull:!1}),w(`design:type`,Object)],z.prototype,`schema`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN,allowNull:!1,defaultValue:!1}),w(`design:type`,Boolean)],z.prototype,`disabled`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!1}),w(`design:type`,typeof(Qe=typeof Date<`u`&&Date)==`function`?Qe:Object)],z.prototype,`createdAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof($e=typeof Date<`u`&&Date)==`function`?$e:Object)],z.prototype,`updatedAt`,void 0),T([u.AfterUpsert,w(`design:type`,Function),w(`design:paramtypes`,[typeof(et=z!==void 0&&z)==`function`?et:Object,Object]),w(`design:returntype`,void 0)],z,`afterSaveHandler`,null),z=T([(0,u.DefaultScope)(()=>({where:{disabled:!1}})),(0,u.Table)({timestamps:!0})],z);var B=z;const tt=[D,A,B],nt=[N,We,qe,F],rt=`sadot-migration`,it=`49c9dd1d-b1cc-445b-a911-fd349d783110`,at=async(e,t,{schemaPrefix:n=`sadot-migration`,schemaVersion:r=`49c9dd1d-b1cc-445b-a911-fd349d783110`,useCustomFieldsEntries:i=!1}={})=>{let a=`${n}_${r}${i?`_withEntries`:``}`;if(b.info(`custom-fields: initialize custom-fields tables`),!e.addModels)throw Error(`sequelize instance must have addModels function`);i&&tt.push(R),e.addModels(tt),D.addScope(`userScope`,()=>{let e=t();return e?.permissions?{where:{entityId:[...Object.keys(e.permissions.fleets),...Object.keys(e.permissions.businessModels),...Object.keys(e.permissions.demandSources)]}}:{}}),B.addScope(`userScope`,()=>{let e=t();return e?.permissions?{where:{entityId:[...Object.keys(e.permissions.fleets),...Object.keys(e.permissions.businessModels),...Object.keys(e.permissions.demandSources)]}}:{}}),b.info(`custom-fields: models added`);let o=e.define(`SequelizeMeta`,{name:{type:c.DataTypes.STRING,allowNull:!1,unique:!0,primaryKey:!0,autoIncrement:!1}},{tableName:`SequelizeMeta`,timestamps:!1,schema:`public`});b.info(`custom-fields: starting migrations`);let s=await o.findAll({where:{name:{[c.Op.like]:`${n}%`}},raw:!0}),l=s.at(-1),u=s.findIndex(e=>e.name===a);if(b.info(`custom-fields: migrations`,{migrations:s,currentSadotSchemaVersion:l,expectedSchemaVersionIndex:u}),(!l||l.name!==a)&&(b.info(`custom-fields: syncing models`),await D.sync({alter:!0}),await A.sync({alter:!0}),i&&await R.sync({alter:!0}),await B.sync({alter:!0}),u===-1&&await o.create({name:a}),b.info(`custom-fields: models synced`),s.length&&u!==-1&&u<s.length-1)){let e=s.slice(u+1);await o.destroy({where:{name:{[c.Op.in]:e.map(e=>e.name)}}})}},ot=async e=>{if(b.info(`custom-fields: initialize custom-fields test models`),!e.addModels)throw Error(`sequelize instance must have addModels function`);e.addModels(nt),await e.dropSchema(`custom-fields`,{logging:!1}),await e.createSchema(`custom-fields`,{logging:!1}),b.info(`custom-fields: test models added`),await N.sync({alter:!0}),await We.sync({alter:!0}),await F.sync({alter:!0}),await qe.sync({alter:!0}),b.info(`custom-fields: test models synced`)};var V=(e,t,n=void 0)=>{let r=e;return[f.ValidationError,c.ValidationError].some(t=>e instanceof t)&&(r=new h.BadRequest([e],null)),(0,h.handleError)(r,t,n)};const st=f.default.object({name:f.default.string().required(),type:f.default.string(),size:f.default.string(),addedBy:f.default.string().uuid()}),ct=f.default.object({value:f.default.string().required(),color:f.default.string().required()}),lt=f.default.when(`fieldType`,{is:x.SELECT,then:f.default.array().required().items(f.default.string()).min(1).unique(),otherwise:f.default.when(`fieldType`,{is:x.STATUS,then:f.default.array().required().items(ct).min(1).unique(`value`),otherwise:f.default.forbidden()})}),ut=f.default.when(`fieldType`,{switch:[{is:x.BOOLEAN,then:f.default.boolean().allow(null)},{is:x.DATE,then:f.default.date().allow(null)},{is:x.DATETIME,then:f.default.date().allow(null)},{is:x.FILE,then:f.default.array().items(st).allow(null)},{is:x.IMAGE,then:f.default.array().items(f.default.string().uri()).allow(null)},{is:x.NUMBER,then:f.default.number().allow(null)},{is:x.SELECT,then:f.default.string().allow(null)},{is:x.STATUS,then:f.default.string().allow(null)},{is:x.TEXT,then:f.default.string().allow(null)}]}),dt=f.default.object({name:f.default.string().required(),displayName:f.default.string().required(),validation:lt,defaultValue:ut,fieldType:f.default.string().valid(...Object.values(x)).required(),entityId:f.default.string().guid().required(),entityType:f.default.string().required(),description:f.default.string(),required:f.default.boolean(),disabled:f.default.boolean(),blockEditingFromUI:f.default.boolean()}).oxor(`required`,`blockEditingFromUI`,{isPresent:e=>e===!0}),ft=f.default.object({displayName:f.default.string(),validation:lt,defaultValue:ut,fieldType:f.default.string().valid(...Object.values(x)),description:f.default.string().allow(null),required:f.default.boolean(),disabled:f.default.boolean(),blockEditingFromUI:f.default.boolean()}).oxor(`required`,`blockEditingFromUI`,{isPresent:e=>e===!0}),pt=e=>dt.validateAsync(e,{abortEarly:!1}),mt=e=>ft.validateAsync(e,{abortEarly:!1}),H=(0,_.Router)({logger:b}),U=`CustomFieldDefinition`,ht=e=>e.replace(/(^\w|-\w)/g,e=>e.replace(/-/,``).toUpperCase());H.post(`/`,async(e,t)=>{let{modelName:n}=e.params,r=ht(n);try{let n=await pt(e.body),i=await Ae({...n,modelType:r});return t.status(201).json(i)}catch(e){return b.error(`Failed to create custom field definition`,e),V(e,t,{logger:b,message:`Error in create ${U} request`})}}),H.get(`/:customFieldDefinitionId`,async(e,t)=>{let{customFieldDefinitionId:n}=e.params;try{let e=await Me(n);if(!e)throw new h.ResourceNotFoundError;return t.json(e)}catch(e){return b.error(`Failed to fetch custom field definition`,e),V(e,t,{logger:b,message:`Error in get ${U} request`})}}),H.get(`/`,async(e,t)=>{let{params:{modelName:n},query:{entityIds:r}}=e,i=ht(n);try{let e={modelType:i,...r?.length>0&&{entityId:r}},n=await O(e,{withDisabled:!0});return t.json(n)}catch(e){return b.error(`Failed to fetch custom field definitions`,e),V(e,t,{logger:b,message:`Error in get all ${U} request`})}}),H.patch(`/:customFieldDefinitionId`,async(e,t)=>{let{customFieldDefinitionId:n,modelName:r}=e.params,i=ht(r);try{let r=await mt(e.body);if(!await Pe({id:n,modelType:i}))throw new h.ResourceNotFoundError;let a=await Fe(n,{...r,modelType:i});return t.status(200).json(a)}catch(e){return b.error(`Failed to patch custom field definition`,e),V(e,t,{logger:b,message:`Error in update ${U} request`})}});var gt=H;const _t=async(e,t={})=>(b.debug(`custom-validator - create validator`),await B.create(e,t)),W=async(e={},t={})=>{b.debug(`custom-validator - find all validators`);let{transaction:n,withDisabled:r,include:i,attributes:a,raw:o}=t,s;return s=r?await B.unscoped().scope(`userScope`).findAll({where:e,transaction:n,include:i,attributes:a,raw:o}):await B.scope([`defaultScope`,`userScope`]).findAll({where:e,transaction:n,include:i,attributes:a,raw:o}),s},vt=async(e,t,n={})=>(b.debug(`custom-validator - find all validators by model type`),W({modelType:e,...!n?.modelOptions?.useEntityIdFromInclude&&{entityId:t}},{...n,include:n?.modelOptions?.include?.(t)})),yt=async(e,t,n)=>(b.debug(`custom-validator - update validator`),B.update(t,{where:{id:e},returning:!0,...n})),bt=async(e,t)=>(b.debug(`custom-validator - disable validator`),yt(e,{disabled:!0},t)),xt=f.default.object().unknown(!0),St=f.default.object({type:f.default.string().valid(`object`),properties:f.default.object({before:xt,after:xt}).required(),required:f.default.array().items(f.default.string()),allOf:f.default.array().items(f.default.object()),anyOf:f.default.array().items(f.default.object()),oneOf:f.default.array().items(f.default.object()),additionalProperties:f.default.alternatives().try(f.default.boolean(),f.default.object()),$id:f.default.string(),$schema:f.default.string(),if:f.default.object(),then:f.default.object(),else:f.default.object()}),Ct={create:f.default.object({entityId:f.default.string().uuid().required(),entityType:f.default.string().required(),schema:St.required()}),update:f.default.object({entityId:f.default.string().uuid(),entityType:f.default.string(),schema:St,disabled:f.default.boolean()}).min(1)};var wt=Ct;const Tt=new ee.default({allErrors:!0,strict:!1,strictTypes:!1,$data:!0});(0,y.default)(Tt);const Et={type:`object`,properties:{type:{type:`string`,enum:[`object`]},properties:{type:`object`,properties:{before:{type:`object`,properties:{type:{type:`string`,enum:[`object`]},properties:{type:`object`}}},after:{type:`object`,properties:{type:{type:`string`,enum:[`object`]},properties:{type:`object`}}}}},required:{type:`array`,items:{type:`string`}},if:{type:`object`},then:{type:`object`},else:{type:`object`}},required:[`type`,`properties`]},Dt=e=>{try{let t=Tt.compile(Et);if(!t(e)){let n=t.errors?.map(e=>`${e.instancePath||``} ${e.message||`Invalid schema structure`}`).join(`, `);throw b.error(`Invalid validator schema structure`,{errors:t.errors,schema:e}),new h.BadRequest([Error(`Invalid validator schema structure: ${n}`)],[`Invalid validator schema structure`])}try{return Tt.compile(e),!0}catch(t){throw b.error(`Failed to compile validator schema`,{error:t,schema:e}),new h.BadRequest([Error(`Failed to compile validator schema: ${t.message}`)],[`Invalid validator schema`])}}catch(t){throw t instanceof h.BadRequest?t:(b.error(`Error validating validator schema`,{error:t,schema:e}),new h.BadRequest([Error(`Error validating validator schema: ${t.message}`)],[`Invalid validator schema`]))}},G=(0,_.Router)({logger:b}),K=`CustomValidator`;G.post(`/`,async(e,t)=>{let{modelName:n}=e.params;try{let r=await wt.create.validateAsync(e.body);Dt(r.schema);let i=await _t({...r,modelType:n});return t.status(v.StatusCodes.CREATED).json(i)}catch(e){return V(e,t,{logger:b,message:`Error in create ${K} request`})}}),G.get(`/`,async(e,t)=>{try{let{modelName:n}=e.params,{entityId:r,entityType:i}=e.query,a={modelType:n,...r&&{entityId:r},...i&&{entityType:i}},o=await W(a);return t.status(v.StatusCodes.OK).json({validators:o})}catch(e){return V(e,t,{logger:b,message:`Error in get all ${K} request`})}}),G.get(`/:validatorId`,async(e,t)=>{try{let{validatorId:n,modelName:r}=e.params,i=await W({id:n,modelType:r},{withDisabled:!0});if(!i.length)throw new h.ResourceNotFoundError(`Validator not found`);return t.status(v.StatusCodes.OK).json(i[0])}catch(e){return V(e,t,{logger:b,message:`Error in get ${K} request`})}}),G.patch(`/:validatorId`,async(e,t)=>{try{let{validatorId:n}=e.params,r=await wt.update.validateAsync(e.body);if(r.schema&&Dt(r.schema),!(await W({id:n},{withDisabled:!0})).length)throw new h.ResourceNotFoundError(`Validator not found`);let[i,a]=await yt(n,r);if(!i)throw new h.ResourceNotFoundError(`Validator not found`);return t.status(v.StatusCodes.OK).json(a[0])}catch(e){return V(e,t,{logger:b,message:`Error in update ${K} request`})}}),G.delete(`/:validatorId`,async(e,t)=>{try{let{validatorId:n}=e.params;if(!(await W({id:n},{withDisabled:!0})).length)throw new h.ResourceNotFoundError(`Validator not found`);let[r]=await bt(n);if(!r)throw new h.ResourceNotFoundError(`Validator failed to be disabled`);return t.status(v.StatusCodes.NO_CONTENT).send()}catch(e){return V(e,t,{logger:b,message:`Error in delete ${K} request`})}});var Ot=G;const kt=(0,_.Router)({logger:b});kt.use(`/custom-field-definitions/:modelName`,gt),kt.use(`/custom-validators/:modelName`,Ot);var At=kt;const jt=(0,_.Router)({logger:b});jt.use(`/v1`,At);var Mt=jt,Nt=e=>{let t=process.env.NODE_ENV||`test`,n=e[t],r;return r=n.use_env_variable?new u.Sequelize(process.env[n.use_env_variable],n):new u.Sequelize(n.database,n.username,n.password,n),r};const Pt={[x.DATE]:e=>{if(e){let t=new Date(e);if(t.toString()===`Invalid Date`)throw Error(`Invalid date value: ${e}`);return t.toISOString()}return null}},Ft=async(e,t)=>{let{transaction:n}=t;return A.findAll({where:{modelId:e},transaction:n,raw:!0,nest:!0})},It=async(e,t,n,r,i={})=>{let a=Object.keys(r);b.debug(`custom-fields: updating values for ${e} ${t}`,{names:a,optionsKeys:i?Object.keys(i):null,valuesToUpdate:r,identifiers:n});let{modelOptions:o,transaction:s}=i,c={modelType:e,name:a,...!i.modelOptions?.useEntityIdFromInclude&&{entityId:n}},l=await O(c,{withDisabled:!0,transaction:s,include:o.include?.(n)})??[],u=l.filter(e=>e.disabled);if(l.length!==a.length){b.warn(`custom-fields: missing definitions for ${e} ${t}`,{names:a,fieldDefinitions:l});let n=a.filter(e=>!l.some(t=>t.name===e));throw new be(n)}let d=u?.map(e=>e.name)||[],f=a.filter(e=>d.includes(e));f?.length>0&&b.warn(`custom-fields: trying to update disabled values: ${f.join(`, `)}`);let p=a.map(e=>{let n=l.find(t=>t.name===e),i=Pt[n.fieldType],a=i?i(r[e]):r[e];return{modelId:t,updatedAt:new Date,customFieldDefinitionId:n.id,value:a===void 0?n.defaultValue:a}});return Promise.all(p.map(async e=>{let[t]=await A.upsert(e,{transaction:i.transaction});return t}))},Lt=async(e,t={})=>{let{transaction:n}=t;return R.findOne({where:{modelId:e},transaction:n})},Rt=async(e,t={})=>{let{transaction:n}=t;return R.findAll({where:{modelId:e},transaction:n})},zt=async(e,t,n,r,i={})=>{let a=Object.keys(n);b.debug(`custom-fields: updating entries for ${t} ${e}`,{customFieldsNames:a,optionsKeys:i?Object.keys(i):null,customFields:n,identifiers:r});let{modelOptions:o,transaction:s}=i,c={modelType:t,name:a,...!i.modelOptions?.useEntityIdFromInclude&&{entityId:r}},l=await O(c,{withDisabled:!0,transaction:s,include:o.include?.(r)})??[],u=l.filter(e=>e.disabled);if(l.length!==a.length){b.warn(`custom-fields: missing definitions for ${t} ${e}`,{names:a,fieldDefinitions:l});let n=a.filter(e=>!l.some(t=>t.name===e));throw new be(n)}let d=u?.map(e=>e.name)||[],f=a.filter(e=>d.includes(e));f?.length>0&&b.warn(`custom-fields: trying to update disabled values: ${f.join(`, `)}`);let p=Object.fromEntries(l.map(e=>[e.name,e]));return Object.entries(n).filter(([e])=>Pt[p[e].fieldType]).forEach(([e,t])=>{let{fieldType:r}=p[e];n[e]=Pt[r](t)}),R.upsert({modelId:e,entityId:l[0].entityId,modelType:t,customFields:n},i)},Bt=(e,t)=>e.map(e=>t[e]),Vt=(e,t)=>{let n=Array.from(new Set(t));return Array.isArray(e)?e.flatMap(e=>Bt(n,e)):Bt(n,e)};var q=Vt;const Ht=[`id`,`name`,`entityId`,`fieldType`,`displayName`,`validation`,`entityType`,`modelType`,`required`,`disabled`,`defaultValue`],Ut=async({instancesIds:e,options:t,sadotOptions:n})=>{if(!n.useCustomFieldsEntries)return{};let r=await Rt(e,t??{}),i=Object.fromEntries(r.map(e=>{let{modelId:t,customFields:n}=e?.dataValues??{};if(t)return[t,n]}).filter(Boolean));return e.forEach(e=>{i[e]??={}}),i},Wt=async({instancesIds:e,options:t,sadotOptions:n})=>n.useCustomFieldsEntries?{}:(await Ft(e,t??{})).reduce((e,t)=>{let{modelId:n}=t;return e[n]??=[],e[n].push(t),e},{}),Gt=(e,t)=>e.reduce((e,n)=>({...e,...t[n.customFieldDefinitionId]&&{[t[n.customFieldDefinitionId].name]:n.value}}),{}),Kt=(e,t,n,r={},i={useCustomFieldsEntries:!1})=>async(a,o)=>{if(o.originalAttributes?.length>0&&!o.originalAttributes?.includes?.(`customFields`))return;let s=Array.isArray(a)?a:[a];s=s.filter(Boolean);let c=q(s,t),l=[...new Set(c)].filter(Boolean),u=l.reduce((e,t)=>({...e,[t]:[]}),{}),d,f;o.transaction&&(o.transaction.definitionCache||=new Map,f=`${e}:${l.slice().sort().join(`,`)}`,d=o.transaction.definitionCache.get(f)),d||(d=Ne(e,l,{transaction:o.transaction,modelOptions:r,attributes:Ht}),o.transaction?.definitionCache?.set(f,d));let p=await d;if(p.length===0){s.forEach(e=>{e.customFields={}});return}r?.include&&r.useEntityIdFromInclude&&r.include(c).forEach(({model:e})=>{p.forEach(t=>{let n=t[`${e.name}.entityId`];u[n]=[]})});let m=p.reduce((e,t)=>({...e,[t.id]:t}),{});p.forEach(e=>{u[e.entityId].push(e)});let h=s.map(e=>e.id),[g,_]=await Promise.all([Wt({instancesIds:h,options:o,sadotOptions:i}),Ut({instancesIds:h,options:o,sadotOptions:i})]);s.forEach(e=>{let{id:r}=e,a=g[r],s=a?Gt(a,m):{},c=i.useCustomFieldsEntries?_[r]:s;t.forEach(t=>{let n=e[t],r=u[n];r?.length>0&&r.forEach(e=>{c[e.name]===void 0&&(c[e.name]=null)})}),e.customFields=c,o.attributesToRemove?.forEach?.(t=>{delete e.dataValues?.[t],delete e?.[t]}),n===`afterFind`&&e?.changed?.(`customFields`,!1)})};var qt=Kt;const Jt=(e,t)=>{let n=e.filter(e=>!t.includes(e));return t.includes?.(`id`)||n.push(`id`),n},Yt=e=>t=>{let{attributes:n}=t;if(n?.includes?.(`customFields`)){let r=Jt(e,n);b.debug(`sadot - before find hook`),r?.length>0&&(n.push(...r),t.attributesToRemove=r)}},Xt=async({modelId:e,modelType:t,identifiers:n,customFields:r,options:i={modelOptions:{},useCustomFieldsEntries:!1}})=>{if(await It(t,e,n,r,{...i,modelOptions:i.modelOptions??{}}),!i?.useCustomFieldsEntries)return;let{dataValues:{customFields:a}}=await Lt(e,i)??{dataValues:{}},o={...a,...r};await zt(e,t,o,n,{...i,modelOptions:i.modelOptions??{}})};var Zt=Xt;const Qt=[`id`,`schema`,`modelType`,`entityId`,`disabled`],J=new ee.default({allErrors:!0,strict:!1,strictTypes:!1,$data:!0});(0,y.default)(J),(0,ne.default)(J);const $t=(e,t)=>({__proto__:null,...e,...t}),en=async(e,t)=>{if(!e.id||!e.customFields||Object.keys(e.customFields).length===0)return e.customFields||{};try{let n=await e.constructor.findOne({where:{id:e.id},attributes:[`customFields`],transaction:t.transaction,raw:!0});if(n?.customFields){let t=$t(n.customFields,e.customFields);return b.debug(`sadot - fetched complete custom fields for validation`,{fieldsCount:Object.keys(t).length,updateFieldsCount:Object.keys(e.customFields).length}),t}}catch(e){b.error(`sadot - error fetching complete model for validation`,{error:e})}return e.customFields||{}},tn=e=>{let t={...e.dataValues};(e.changed?.()||[]).forEach(n=>{let r=e.previous?.(n);r!==void 0&&(t[n]=r)});let n=e.previous?.(`customFields`);return n!==void 0&&(t.customFields=n),t},nn=e=>e.reduce((e,t)=>{let n=(t.instancePath||``).split(`/`).filter(Boolean).join(`.`).replace(/^after\./,``),r=t.keyword===`required`?`.${t.params?.missingProperty}`:``,i=(n+r).replace(/^\./,``)||`root`;return e[i]=t.message||`Invalid value`,e},{}),rn=async(e,t,n,r={},i=!1)=>{let a=e.constructor.name;b.debug(`sadot - validating model`,{isCreate:i,modelType:a});let o=q(e,n);if(b.debug(`sadot - identifiers`,{identifiers:o}),!o||Object.keys(o).length===0){b.debug(`sadot - skipping validation: no identifiers`);return}let s=Object.values(o)[0];if(b.debug(`sadot - entityId`,{entityId:s}),!s){b.debug(`sadot - skipping validation: no entityId`);return}let c,l;t.transaction&&(t.transaction.validationsCache||=new Map,l=`${a}-${s}`,c=t.transaction.validationsCache.get(l)),c||(c=vt(a,s,{transaction:t.transaction,attributes:Qt,modelOptions:r}),t.transaction&&t?.transaction?.validationsCache.set(l,c));let u=await c;if(b.debug(`sadot - validators found`,{count:u.length}),!u.length){b.debug(`sadot - skipping validation: no validators found`);return}let d=null;i||(d=tn(e));let f=i?e.customFields||{}:await en(e,t);for(let t of u){let{schema:n}=t,r=n;if(b.debug(`sadot - validating with schema`,{schema:n,hasAfterProps:!!r.properties?.after,hasBeforeProps:!!r.properties?.before}),i){if(r.properties?.after){let t=J.compile({...n,properties:{after:r.properties.after}});if(!t(JSON.parse(JSON.stringify({after:{...e.dataValues,customFields:f}})))){let e=t.errors?.map(e=>`${e.instancePath||``} ${e.message||`Invalid value`}`).join(`, `),n=nn(t.errors);throw new h.BadRequest([Error(`Validation failed for ${a}: ${e}`)],void 0,{customError:n})}}}else{let t=J.compile(r),n=$t(e.dataValues);n.customFields=f;let i={before:d,after:n},o=t(JSON.parse(JSON.stringify(i)));if(b.debug(`sadot - validation result`,{isValid:o,test:{before:d,after:n}}),!o){let e=t.errors?.map(e=>`${e.instancePath||``} ${e.message||`Invalid value`}`).join(`, `),n=nn(t.errors);throw new h.BadRequest([Error(`Validation failed for ${a}: ${e}`)],void 0,{customError:n})}}}},an=async({modelType:e,modelOptions:t,identifiers:n,options:r})=>{let{include:i,useEntityIdFromInclude:a}=t,o={modelType:e,disabled:!1,...!a&&{entityId:n}};return await O(o,{withDisabled:!1,transaction:r.transaction,include:i?.(n)})},on=(e,t)=>{(e||[]).forEach(e=>{let{fieldType:n,name:r}=e;if([x.DATE,x.DATETIME].includes(n)){let e=t.customFields?.[r];if(e){let{value:n,error:i}=f.default.date().validate(e);if(i)throw new C(e,r,i);t.customFields[r]=n.toISOString()}}})},sn=(e,t={},n={useCustomFieldsEntries:!1})=>async(r,i)=>{b.debug(`sadot - before create hook`);let{fields:a}=i,o=r.constructor.name,s=q(r,e),c=await an({modelType:o,modelOptions:t,identifiers:s,options:i}),l=c.filter(e=>![null,void 0].includes(e.defaultValue));l.length&&(r.customFields||={},l.filter(e=>r.customFields?.[e.name]===void 0).forEach(({name:e,defaultValue:t})=>{r.customFields[e]=t}));let u=Array.from(new Set(c.filter(({required:e})=>e).map(({name:e})=>e))),{customFields:d}=r,f=Object.keys(d??{}),p=u.filter(e=>!f.includes(e));if(p?.length)throw new he(p);await rn(r,i,e,t,!0),on(c,r);let m=a.indexOf(`customFields`);m===-1||!d||!Object.keys(d).length||(await Zt({modelId:r.id,modelType:o,identifiers:s,customFields:d,options:{useCustomFieldsEntries:n.useCustomFieldsEntries,transaction:i.transaction,modelOptions:t}}),a.splice(m,1))},cn=(e,t={},n={useCustomFieldsEntries:!1})=>async(r,i)=>{b.debug(`sadot - before update hook`);let{fields:a}=i,o=r.constructor.name,s=q(r,e),c=await an({modelType:o,modelOptions:t,identifiers:s,options:i});await rn(r,i,e,t,!1),on(c,r);let l=a.indexOf(`customFields`);if(l>-1){let{customFields:e}=r;if(!Object.keys(e).length)return;await Zt({modelId:r.id,modelType:o,identifiers:s,customFields:e,options:{useCustomFieldsEntries:n.useCustomFieldsEntries,transaction:i.transaction,modelOptions:t}}),a.splice(l,1)}},ln=e=>{e.individualHooks=!0},un=e=>{e.individualHooks=!0},dn=(e=5)=>Array.from({length:e},()=>`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`.charAt((0,g.randomInt)(52))).join(``),fn=(e,t,n,r=[x.DATETIME,x.DATE])=>{let i=r.map(e=>`'${e}'`).join(`,`),a=`EXISTS ( SELECT 1 FROM "custom_field_values" AS "cv" INNER JOIN custom_field_definitions AS cd ON cd.entity_id = '${n}' AND cv.custom_field_definition_id = cd.id AND cd.model_type = '${t.name}' ${i?`AND cd.field_type NOT IN (${i})`:``} WHERE "cv"."deleted_at" IS NULL AND "cv"."model_id" = "${t.name}"."id" AND CAST("cv"."value" AS TEXT) ILIKE :searchTerm)`;return{where:{[c.Op.or]:[u.Sequelize.where(u.Sequelize.literal(a),!0)]},replacements:{searchTerm:`%${e}%`}}};let Y=function(e){return e.VALUES=`values`,e.ENTRIES=`entries`,e}({});const pn=e=>Array.isArray(e)&&typeof e[0]==`string`,X=e=>[`true`,`false`].includes(e.toString()),mn=e=>e instanceof Date||Object.prototype.toString.call(e)===`[object Date]`,hn=(e,t)=>`to_jsonb(${e}::${t})`,Z=e=>hn(e,`text`),gn=e=>hn(e,`boolean`),_n=e=>hn(e,`numeric`),vn=(e,t)=>mn(t)?hn(e,`timestamp`):e,Q=` AND `,yn=` OR `,bn=`cd`,xn=`cd.name`,Sn=`cv`,$=`cv.value`,Cn=`ce`,wn=(e,t,n,r)=>{let i=`text`;mn(e)?i=`date`:Number.isNaN(Number(e))?X(e)&&(i=`boolean`):i=`numeric`;let a=r.get(e);return`(jsonb_extract_path_text(ce.custom_fields, :${n})::${i}) ${t} :${a}`},Tn=e=>{let t=e;return X(e)?t=e===`true`:Number.isNaN(Number(e))||(t=Number(e)),t},En=(e,t)=>{let n=Tn(e),r=JSON.stringify({[t]:n}),i;return X(e)&&(i=`ce.custom_fields @> '${JSON.stringify({[t]:e})}'`),`
2
+ `)}`}},be=class extends h.BadRequest{constructor(e){let t=Error(`Missing custom field definition for field ${e.join(`,`)}`);super([t],null,null),this.message=`MISSING_DEFINITION`}};const xe=e=>Object.keys(ue).includes(e),Se=(e,t,n)=>{let r=ue[t];return r(e,n)},Ce=(e,t,n=Se)=>{let r=Object.entries(e.customFields).map(([e,r])=>{if(r===null)return null;let{validation:i,fieldType:a}=t[e],o=n(r,a,i);return o?.error?{joiValidationError:o.error,fieldDefinitionName:e,value:r}:null}).filter(e=>!!e);if(r?.length)throw new ye(e.modelId,r)};function w(e,t){if(typeof Reflect==`object`&&typeof Reflect.metadata==`function`)return Reflect.metadata(e,t)}function T(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}var we,Te,Ee,De,Oe,ke;let E=class extends u.Model{static displayNameDefaultValue(e){if(e?.displayName||(e.displayName=e.name),![null,void 0].includes(e.defaultValue)){let t=Se(e.defaultValue,e.fieldType,e.validation);if(t.error)throw new C(e.defaultValue,e.name,t.error)}}static afterSaveHandler(e,t){t.transaction?t.transaction.afterCommit(()=>S(e)):S(e)}};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,defaultValue:u.DataType.UUIDV4,allowNull:!1}),w(`design:type`,String)],E.prototype,`id`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],E.prototype,`name`,void 0),T([(0,u.Column)({type:u.DataType.STRING}),w(`design:type`,String)],E.prototype,`displayName`,void 0),T([(0,u.Is)(`SupportedType`,e=>{if(!Object.values(x).includes(e))throw new ge(`"${e}" is not a supported type.`)}),(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,typeof(we=x!==void 0&&x)==`function`?we:Object)],E.prototype,`fieldType`,void 0),T([(0,u.Column)({type:u.DataType.JSONB}),w(`design:type`,Object)],E.prototype,`validation`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],E.prototype,`entityId`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],E.prototype,`entityType`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],E.prototype,`modelType`,void 0),T([(0,u.Column)({type:u.DataType.TEXT}),w(`design:type`,String)],E.prototype,`description`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN,defaultValue:!1}),w(`design:type`,Boolean)],E.prototype,`required`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN,defaultValue:!1}),w(`design:type`,Boolean)],E.prototype,`disabled`,void 0),T([(0,u.Column)({type:u.DataType.JSONB,allowNull:!0}),w(`design:type`,Object)],E.prototype,`defaultValue`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!1}),w(`design:type`,typeof(Te=typeof Date<`u`&&Date)==`function`?Te:Object)],E.prototype,`createdAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof(Ee=typeof Date<`u`&&Date)==`function`?Ee:Object)],E.prototype,`updatedAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof(De=typeof Date<`u`&&Date)==`function`?De:Object)],E.prototype,`deletedAt`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN,defaultValue:!1,allowNull:!1}),w(`design:type`,Boolean)],E.prototype,`blockEditingFromUI`,void 0),T([(0,u.HasMany)(()=>A),w(`design:type`,Array)],E.prototype,`values`,void 0),T([u.BeforeCreate,w(`design:type`,Function),w(`design:paramtypes`,[typeof(Oe=E!==void 0&&E)==`function`?Oe:Object]),w(`design:returntype`,void 0)],E,`displayNameDefaultValue`,null),T([u.AfterSave,w(`design:type`,Function),w(`design:paramtypes`,[typeof(ke=E!==void 0&&E)==`function`?ke:Object,Object]),w(`design:returntype`,void 0)],E,`afterSaveHandler`,null),E=T([(0,u.DefaultScope)(()=>({where:{disabled:!1}})),(0,u.Table)({tableName:`custom_field_definitions`,indexes:[{name:`unique_name_model_type`,fields:[`model_type`,`entity_id`,`name`],unique:!0}],timestamps:!0,validate:{validationByType(){if(!this.validation&&le[this.fieldType])throw b.error(`No custom validation for custom field type ${this.fieldType} found`),new _e(`Validation provided for "${this.fieldType}" is not supported`)}}})],E);var D=E;const Ae=e=>D.create(e),O=(e,t={withDisabled:!1})=>(t.withDisabled?D.unscoped():D).scope(`userScope`).findAll({where:e,transaction:t.transaction,raw:!0,include:t.include}),je=(e,t={withDisabled:!1})=>O({id:{[c.Op.in]:e}},t),Me=(e,t={withDisabled:!1})=>{let{withDisabled:n}=t;return n?D.unscoped().scope(`userScope`).findByPk(e):D.scope(`userScope`).findByPk(e)},Ne=async(e,t,n={})=>{let{include:r,useEntityIdFromInclude:i}=n.modelOptions,a={modelType:e,...!i&&{entityId:{[c.Op.in]:t}}};return D.findAll({where:a,transaction:n.transaction,include:r?.(t),raw:!0})},Pe=e=>D.scope(`userScope`).findOne({where:e}),Fe=async(e,t)=>(await D.scope(`userScope`).update(t,{where:{id:e},returning:!0,individualHooks:!0}))[1][0],Ie=async(e,{findAll:t,modelOptions:n={},withDisabled:r=!1,...i}={withDisabled:!1,modelOptions:{}})=>{let{modelType:a}=e[0]?.dataValues??{},o=new Set,s=[],l=new Set;e.forEach(e=>{let{dataValues:{modelId:t,entityId:n,customFields:r}}=e;s.push(t),l.add(n),Object.keys(r??{}).forEach(e=>{o.add(e)})});let u={modelType:a,entityId:{[c.Op.in]:Array.from(l)},name:{[c.Op.in]:Array.from(o)}},d=await(t??O)(u,{withDisabled:r,modelOptions:n,...i}),f=d.filter(e=>o.has(e.name)),p=Object.fromEntries(f.map(e=>[e.name,e]));if(!d?.length||f.length!==o.size){let e=Array.from(o).filter(e=>!p[e]);throw new be(e)}return p};var Le,Re,ze,Be,Ve,He;let k=class extends u.Model{static validateValueAgainstDefinition(e,t){let{validation:n,fieldType:r,name:i}=t;if(!xe(r))throw new ve(r);if(e.value===null)return;let a=Se(e.value,r,n);if(a.error)throw new C(e.value,i,a.error)}static async validateCustomFieldValues(e){let t=e.map(e=>e.customFieldDefinitionId),n=[...new Set(t)],r=await je(n,{withDisabled:!0});if(!r||r.length!==n.length)throw Error(`Definitions not found`);e.forEach(e=>{let t=r.find(t=>t.id===e.customFieldDefinitionId);t&&this.validateValueAgainstDefinition(e,t)})}static async validateCustomFieldValue(e){let{customFieldDefinitionId:t}=e,n=await Me(t,{withDisabled:!0});this.validateValueAgainstDefinition(e,n)}static afterSaveHandler(e,t){t.transaction?t.transaction.afterCommit(()=>S(e[0])):S(e[0])}};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],k.prototype,`modelId`,void 0),T([u.PrimaryKey,(0,u.ForeignKey)(()=>D),(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],k.prototype,`customFieldDefinitionId`,void 0),T([(0,u.Column)({type:u.DataType.JSONB,allowNull:!0}),w(`design:type`,Object)],k.prototype,`value`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!1}),w(`design:type`,typeof(Le=typeof Date<`u`&&Date)==`function`?Le:Object)],k.prototype,`createdAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof(Re=typeof Date<`u`&&Date)==`function`?Re:Object)],k.prototype,`updatedAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof(ze=typeof Date<`u`&&Date)==`function`?ze:Object)],k.prototype,`deletedAt`,void 0),T([(0,u.BelongsTo)(()=>D,{scope:{disabled:!1}}),w(`design:type`,typeof(Be=D!==void 0&&D)==`function`?Be:Object)],k.prototype,`customFieldDefinition`,void 0),T([u.BeforeBulkCreate,u.BeforeBulkUpdate,w(`design:type`,Function),w(`design:paramtypes`,[Array]),w(`design:returntype`,Promise)],k,`validateCustomFieldValues`,null),T([u.BeforeUpdate,u.BeforeCreate,u.BeforeUpsert,w(`design:type`,Function),w(`design:paramtypes`,[typeof(Ve=k!==void 0&&k)==`function`?Ve:Object]),w(`design:returntype`,Promise)],k,`validateCustomFieldValue`,null),T([u.AfterUpsert,w(`design:type`,Function),w(`design:paramtypes`,[typeof(He=k!==void 0&&k)==`function`?He:Object,Object]),w(`design:returntype`,void 0)],k,`afterSaveHandler`,null),k=T([(0,u.Table)({tableName:`custom_field_values`,timestamps:!0})],k);var A=k,Ue;let j=class extends u.Model{};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,defaultValue:u.DataType.UUIDV4,allowNull:!1}),w(`design:type`,String)],j.prototype,`id`,void 0),T([(0,u.ForeignKey)(()=>N),(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],j.prototype,`testModelId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],j.prototype,`fleetId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!0}),w(`design:type`,String)],j.prototype,`businessModelId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!0}),w(`design:type`,String)],j.prototype,`demandSourceId`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN}),w(`design:type`,Boolean)],j.prototype,`anotherAttribute`,void 0),T([(0,u.BelongsTo)(()=>N),w(`design:type`,typeof(Ue=N!==void 0&&N)==`function`?Ue:Object)],j.prototype,`testModel`,void 0),j=T([(0,u.Table)({schema:`custom-fields`,tableName:`associated_test_models`,createdAt:!1,updatedAt:!1})],j);var We=j;let M=class extends u.Model{};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,defaultValue:u.DataType.UUIDV4,allowNull:!1}),w(`design:type`,String)],M.prototype,`id`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],M.prototype,`fleetId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!0}),w(`design:type`,String)],M.prototype,`businessModelId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!0}),w(`design:type`,String)],M.prototype,`demandSourceId`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN}),w(`design:type`,Boolean)],M.prototype,`coolAttribute`,void 0),T([(0,u.HasMany)(()=>We),w(`design:type`,Array)],M.prototype,`associatedModels`,void 0),T([(0,u.Column)({type:u.DataType.VIRTUAL}),w(`design:type`,Object)],M.prototype,`customFields`,void 0),M=T([(0,u.Table)({schema:`custom-fields`,tableName:`test_models`,createdAt:!1,updatedAt:!1})],M);var N=M,Ge=function(e){return e.BUSINESS_MODEL=`businessModel`,e.CONTEXT=`context`,e.DEMAND_SOURCE=`demandSource`,e.FLEET=`fleet`,e}(Ge||{});let P=class extends u.Model{};T([u.PrimaryKey,(0,u.Column)({defaultValue:u.DataType.UUIDV4,type:u.DataType.UUID}),w(`design:type`,String)],P.prototype,`id`,void 0),T([(0,u.Column)({type:u.DataType.UUID}),w(`design:type`,String)],P.prototype,`entityId`,void 0),T([(0,u.Column)({type:u.DataType.ENUM(...Object.values(Ge))}),w(`design:type`,String)],P.prototype,`entityType`,void 0),P=T([(0,u.Table)({createdAt:!1,updatedAt:!1})],P);var F=P,Ke;let I=class extends u.Model{};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,defaultValue:u.DataType.UUIDV4,allowNull:!1}),w(`design:type`,String)],I.prototype,`id`,void 0),T([(0,u.ForeignKey)(()=>F),(0,u.Column)({type:u.DataType.UUID}),w(`design:type`,String)],I.prototype,`contextId`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN}),w(`design:type`,Boolean)],I.prototype,`coolAttribute`,void 0),T([(0,u.Column)({type:u.DataType.VIRTUAL}),w(`design:type`,Object)],I.prototype,`customFields`,void 0),T([(0,u.BelongsTo)(()=>F),w(`design:type`,typeof(Ke=F!==void 0&&F)==`function`?Ke:Object)],I.prototype,`context`,void 0),I=T([(0,u.Table)({createdAt:!1,updatedAt:!1})],I);var qe=I,Je,Ye,Xe,Ze;let L=class extends u.Model{static afterSaveHandler(e,t){t.transaction?t.transaction.afterCommit(()=>S(e[0])):S(e[0])}};T([u.PrimaryKey,(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],L.prototype,`modelId`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],L.prototype,`entityId`,void 0),T([(0,u.Column)({type:u.DataType.JSONB,allowNull:!1,defaultValue:{}}),w(`design:type`,typeof(Je=typeof Record<`u`&&Record)==`function`?Je:Object)],L.prototype,`customFields`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],L.prototype,`modelType`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!1}),w(`design:type`,typeof(Ye=typeof Date<`u`&&Date)==`function`?Ye:Object)],L.prototype,`createdAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof(Xe=typeof Date<`u`&&Date)==`function`?Xe:Object)],L.prototype,`updatedAt`,void 0),T([u.AfterUpsert,w(`design:type`,Function),w(`design:paramtypes`,[typeof(Ze=L!==void 0&&L)==`function`?Ze:Object,Object]),w(`design:returntype`,void 0)],L,`afterSaveHandler`,null),L=T([(0,u.Table)({tableName:`custom_field_entries`,timestamps:!0,indexes:[{name:`idx_cfe_custom_fields`,using:`gin`,operator:`jsonb_path_ops`,fields:[`custom_fields`]}],validate:{async validationByType(){if(!Object.keys(this.customFields??{}).length)return;let e=await Ie([this]);Ce(this,e)}}})],L);var R=L,Qe,$e,et;let z=class extends u.Model{static afterSaveHandler(e,t){t.transaction?t.transaction.afterCommit(()=>S(e)):S(e)}};T([u.PrimaryKey,(0,u.Default)(()=>(0,g.randomUUID)()),(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],z.prototype,`id`,void 0),T([(0,u.Column)({type:u.DataType.UUID,allowNull:!1}),w(`design:type`,String)],z.prototype,`entityId`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],z.prototype,`entityType`,void 0),T([(0,u.Column)({type:u.DataType.STRING,allowNull:!1}),w(`design:type`,String)],z.prototype,`modelType`,void 0),T([(0,u.Column)({type:u.DataType.JSONB,allowNull:!1}),w(`design:type`,Object)],z.prototype,`schema`,void 0),T([(0,u.Column)({type:u.DataType.BOOLEAN,allowNull:!1,defaultValue:!1}),w(`design:type`,Boolean)],z.prototype,`disabled`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!1}),w(`design:type`,typeof(Qe=typeof Date<`u`&&Date)==`function`?Qe:Object)],z.prototype,`createdAt`,void 0),T([(0,u.Column)({type:u.DataType.DATE,allowNull:!0}),w(`design:type`,typeof($e=typeof Date<`u`&&Date)==`function`?$e:Object)],z.prototype,`updatedAt`,void 0),T([u.AfterUpsert,w(`design:type`,Function),w(`design:paramtypes`,[typeof(et=z!==void 0&&z)==`function`?et:Object,Object]),w(`design:returntype`,void 0)],z,`afterSaveHandler`,null),z=T([(0,u.DefaultScope)(()=>({where:{disabled:!1}})),(0,u.Table)({tableName:`custom_validators`,timestamps:!0})],z);var B=z;const tt=[D,A,B],nt=[N,We,qe,F],rt=`sadot-migration`,it=`49c9dd1d-b1cc-445b-a911-fd349d783110`,at=async(e,t,{schemaPrefix:n=`sadot-migration`,schemaVersion:r=`49c9dd1d-b1cc-445b-a911-fd349d783110`,useCustomFieldsEntries:i=!1}={})=>{let a=`${n}_${r}${i?`_withEntries`:``}`;if(b.info(`custom-fields: initialize custom-fields tables`),!e.addModels)throw Error(`sequelize instance must have addModels function`);i&&tt.push(R),e.addModels(tt),D.addScope(`userScope`,()=>{let e=t();return e?.permissions?{where:{entityId:[...Object.keys(e.permissions.fleets),...Object.keys(e.permissions.businessModels),...Object.keys(e.permissions.demandSources)]}}:{}}),B.addScope(`userScope`,()=>{let e=t();return e?.permissions?{where:{entityId:[...Object.keys(e.permissions.fleets),...Object.keys(e.permissions.businessModels),...Object.keys(e.permissions.demandSources)]}}:{}}),b.info(`custom-fields: models added`);let o=e.define(`SequelizeMeta`,{name:{type:c.DataTypes.STRING,allowNull:!1,unique:!0,primaryKey:!0,autoIncrement:!1}},{tableName:`SequelizeMeta`,timestamps:!1,schema:`public`});b.info(`custom-fields: starting migrations`);let s=await o.findAll({where:{name:{[c.Op.like]:`${n}%`}},raw:!0}),l=s.at(-1),u=s.findIndex(e=>e.name===a);if(b.info(`custom-fields: migrations`,{migrations:s,currentSadotSchemaVersion:l,expectedSchemaVersionIndex:u}),(!l||l.name!==a)&&(b.info(`custom-fields: syncing models`),await D.sync({alter:!0}),await A.sync({alter:!0}),i&&await R.sync({alter:!0}),await B.sync({alter:!0}),u===-1&&await o.create({name:a}),b.info(`custom-fields: models synced`),s.length&&u!==-1&&u<s.length-1)){let e=s.slice(u+1);await o.destroy({where:{name:{[c.Op.in]:e.map(e=>e.name)}}})}},ot=async e=>{if(b.info(`custom-fields: initialize custom-fields test models`),!e.addModels)throw Error(`sequelize instance must have addModels function`);e.addModels(nt),await e.dropSchema(`custom-fields`,{logging:!1}),await e.createSchema(`custom-fields`,{logging:!1}),b.info(`custom-fields: test models added`),await N.sync({alter:!0}),await We.sync({alter:!0}),await F.sync({alter:!0}),await qe.sync({alter:!0}),b.info(`custom-fields: test models synced`)};var V=(e,t,n=void 0)=>{let r=e;return[f.ValidationError,c.ValidationError].some(t=>e instanceof t)&&(r=new h.BadRequest([e],null)),(0,h.handleError)(r,t,n)};const st=f.default.object({name:f.default.string().required(),type:f.default.string(),size:f.default.string(),addedBy:f.default.string().uuid()}),ct=f.default.object({value:f.default.string().required(),color:f.default.string().required()}),lt=f.default.when(`fieldType`,{is:x.SELECT,then:f.default.array().required().items(f.default.string()).min(1).unique(),otherwise:f.default.when(`fieldType`,{is:x.STATUS,then:f.default.array().required().items(ct).min(1).unique(`value`),otherwise:f.default.forbidden()})}),ut=f.default.when(`fieldType`,{switch:[{is:x.BOOLEAN,then:f.default.boolean().allow(null)},{is:x.DATE,then:f.default.date().allow(null)},{is:x.DATETIME,then:f.default.date().allow(null)},{is:x.FILE,then:f.default.array().items(st).allow(null)},{is:x.IMAGE,then:f.default.array().items(f.default.string().uri()).allow(null)},{is:x.NUMBER,then:f.default.number().allow(null)},{is:x.SELECT,then:f.default.string().allow(null)},{is:x.STATUS,then:f.default.string().allow(null)},{is:x.TEXT,then:f.default.string().allow(null)}]}),dt=f.default.object({name:f.default.string().required(),displayName:f.default.string().required(),validation:lt,defaultValue:ut,fieldType:f.default.string().valid(...Object.values(x)).required(),entityId:f.default.string().guid().required(),entityType:f.default.string().required(),description:f.default.string(),required:f.default.boolean(),disabled:f.default.boolean(),blockEditingFromUI:f.default.boolean()}).oxor(`required`,`blockEditingFromUI`,{isPresent:e=>e===!0}),ft=f.default.object({displayName:f.default.string(),validation:lt,defaultValue:ut,fieldType:f.default.string().valid(...Object.values(x)),description:f.default.string().allow(null),required:f.default.boolean(),disabled:f.default.boolean(),blockEditingFromUI:f.default.boolean()}).oxor(`required`,`blockEditingFromUI`,{isPresent:e=>e===!0}),pt=e=>dt.validateAsync(e,{abortEarly:!1}),mt=e=>ft.validateAsync(e,{abortEarly:!1}),H=(0,_.Router)({logger:b}),U=`CustomFieldDefinition`,ht=e=>e.replace(/(^\w|-\w)/g,e=>e.replace(/-/,``).toUpperCase());H.post(`/`,async(e,t)=>{let{modelName:n}=e.params,r=ht(n);try{let n=await pt(e.body),i=await Ae({...n,modelType:r});return t.status(201).json(i)}catch(e){return b.error(`Failed to create custom field definition`,e),V(e,t,{logger:b,message:`Error in create ${U} request`})}}),H.get(`/:customFieldDefinitionId`,async(e,t)=>{let{customFieldDefinitionId:n}=e.params;try{let e=await Me(n);if(!e)throw new h.ResourceNotFoundError;return t.json(e)}catch(e){return b.error(`Failed to fetch custom field definition`,e),V(e,t,{logger:b,message:`Error in get ${U} request`})}}),H.get(`/`,async(e,t)=>{let{params:{modelName:n},query:{entityIds:r}}=e,i=ht(n);try{let e={modelType:i,...r?.length>0&&{entityId:r}},n=await O(e,{withDisabled:!0});return t.json(n)}catch(e){return b.error(`Failed to fetch custom field definitions`,e),V(e,t,{logger:b,message:`Error in get all ${U} request`})}}),H.patch(`/:customFieldDefinitionId`,async(e,t)=>{let{customFieldDefinitionId:n,modelName:r}=e.params,i=ht(r);try{let r=await mt(e.body);if(!await Pe({id:n,modelType:i}))throw new h.ResourceNotFoundError;let a=await Fe(n,{...r,modelType:i});return t.status(200).json(a)}catch(e){return b.error(`Failed to patch custom field definition`,e),V(e,t,{logger:b,message:`Error in update ${U} request`})}});var gt=H;const _t=async(e,t={})=>(b.debug(`custom-validator - create validator`),await B.create(e,t)),W=async(e={},t={})=>{b.debug(`custom-validator - find all validators`);let{transaction:n,withDisabled:r,include:i,attributes:a,raw:o}=t,s;return s=r?await B.unscoped().scope(`userScope`).findAll({where:e,transaction:n,include:i,attributes:a,raw:o}):await B.scope([`defaultScope`,`userScope`]).findAll({where:e,transaction:n,include:i,attributes:a,raw:o}),s},vt=async(e,t,n={})=>(b.debug(`custom-validator - find all validators by model type`),W({modelType:e,...!n?.modelOptions?.useEntityIdFromInclude&&{entityId:t}},{...n,include:n?.modelOptions?.include?.(t)})),yt=async(e,t,n)=>(b.debug(`custom-validator - update validator`),B.update(t,{where:{id:e},returning:!0,...n})),bt=async(e,t)=>(b.debug(`custom-validator - disable validator`),yt(e,{disabled:!0},t)),xt=f.default.object().unknown(!0),St=f.default.object({type:f.default.string().valid(`object`),properties:f.default.object({before:xt,after:xt}).required(),required:f.default.array().items(f.default.string()),allOf:f.default.array().items(f.default.object()),anyOf:f.default.array().items(f.default.object()),oneOf:f.default.array().items(f.default.object()),additionalProperties:f.default.alternatives().try(f.default.boolean(),f.default.object()),$id:f.default.string(),$schema:f.default.string(),if:f.default.object(),then:f.default.object(),else:f.default.object()}),Ct={create:f.default.object({entityId:f.default.string().uuid().required(),entityType:f.default.string().required(),schema:St.required()}),update:f.default.object({entityId:f.default.string().uuid(),entityType:f.default.string(),schema:St,disabled:f.default.boolean()}).min(1)};var wt=Ct;const Tt=new ee.default({allErrors:!0,strict:!1,strictTypes:!1,$data:!0});(0,y.default)(Tt);const Et={type:`object`,properties:{type:{type:`string`,enum:[`object`]},properties:{type:`object`,properties:{before:{type:`object`,properties:{type:{type:`string`,enum:[`object`]},properties:{type:`object`}}},after:{type:`object`,properties:{type:{type:`string`,enum:[`object`]},properties:{type:`object`}}}}},required:{type:`array`,items:{type:`string`}},if:{type:`object`},then:{type:`object`},else:{type:`object`}},required:[`type`,`properties`]},Dt=e=>{try{let t=Tt.compile(Et);if(!t(e)){let n=t.errors?.map(e=>`${e.instancePath||``} ${e.message||`Invalid schema structure`}`).join(`, `);throw b.error(`Invalid validator schema structure`,{errors:t.errors,schema:e}),new h.BadRequest([Error(`Invalid validator schema structure: ${n}`)],[`Invalid validator schema structure`])}try{return Tt.compile(e),!0}catch(t){throw b.error(`Failed to compile validator schema`,{error:t,schema:e}),new h.BadRequest([Error(`Failed to compile validator schema: ${t.message}`)],[`Invalid validator schema`])}}catch(t){throw t instanceof h.BadRequest?t:(b.error(`Error validating validator schema`,{error:t,schema:e}),new h.BadRequest([Error(`Error validating validator schema: ${t.message}`)],[`Invalid validator schema`]))}},G=(0,_.Router)({logger:b}),K=`CustomValidator`;G.post(`/`,async(e,t)=>{let{modelName:n}=e.params;try{let r=await wt.create.validateAsync(e.body);Dt(r.schema);let i=await _t({...r,modelType:n});return t.status(v.StatusCodes.CREATED).json(i)}catch(e){return V(e,t,{logger:b,message:`Error in create ${K} request`})}}),G.get(`/`,async(e,t)=>{try{let{modelName:n}=e.params,{entityId:r,entityType:i}=e.query,a={modelType:n,...r&&{entityId:r},...i&&{entityType:i}},o=await W(a);return t.status(v.StatusCodes.OK).json({validators:o})}catch(e){return V(e,t,{logger:b,message:`Error in get all ${K} request`})}}),G.get(`/:validatorId`,async(e,t)=>{try{let{validatorId:n,modelName:r}=e.params,i=await W({id:n,modelType:r},{withDisabled:!0});if(!i.length)throw new h.ResourceNotFoundError(`Validator not found`);return t.status(v.StatusCodes.OK).json(i[0])}catch(e){return V(e,t,{logger:b,message:`Error in get ${K} request`})}}),G.patch(`/:validatorId`,async(e,t)=>{try{let{validatorId:n}=e.params,r=await wt.update.validateAsync(e.body);if(r.schema&&Dt(r.schema),!(await W({id:n},{withDisabled:!0})).length)throw new h.ResourceNotFoundError(`Validator not found`);let[i,a]=await yt(n,r);if(!i)throw new h.ResourceNotFoundError(`Validator not found`);return t.status(v.StatusCodes.OK).json(a[0])}catch(e){return V(e,t,{logger:b,message:`Error in update ${K} request`})}}),G.delete(`/:validatorId`,async(e,t)=>{try{let{validatorId:n}=e.params;if(!(await W({id:n},{withDisabled:!0})).length)throw new h.ResourceNotFoundError(`Validator not found`);let[r]=await bt(n);if(!r)throw new h.ResourceNotFoundError(`Validator failed to be disabled`);return t.status(v.StatusCodes.NO_CONTENT).send()}catch(e){return V(e,t,{logger:b,message:`Error in delete ${K} request`})}});var Ot=G;const kt=(0,_.Router)({logger:b});kt.use(`/custom-field-definitions/:modelName`,gt),kt.use(`/custom-validators/:modelName`,Ot);var At=kt;const jt=(0,_.Router)({logger:b});jt.use(`/v1`,At);var Mt=jt,Nt=e=>{let t=process.env.NODE_ENV||`test`,n=e[t],r;return r=n.use_env_variable?new u.Sequelize(process.env[n.use_env_variable],n):new u.Sequelize(n.database,n.username,n.password,n),r};const Pt={[x.DATE]:e=>{if(e){let t=new Date(e);if(t.toString()===`Invalid Date`)throw Error(`Invalid date value: ${e}`);return t.toISOString()}return null}},Ft=async(e,t)=>{let{transaction:n}=t;return A.findAll({where:{modelId:e},transaction:n,raw:!0,nest:!0})},It=async(e,t,n,r,i={})=>{let a=Object.keys(r);b.debug(`custom-fields: updating values for ${e} ${t}`,{names:a,optionsKeys:i?Object.keys(i):null,valuesToUpdate:r,identifiers:n});let{modelOptions:o,transaction:s}=i,c={modelType:e,name:a,...!i.modelOptions?.useEntityIdFromInclude&&{entityId:n}},l=await O(c,{withDisabled:!0,transaction:s,include:o.include?.(n)})??[],u=l.filter(e=>e.disabled);if(l.length!==a.length){b.warn(`custom-fields: missing definitions for ${e} ${t}`,{names:a,fieldDefinitions:l});let n=a.filter(e=>!l.some(t=>t.name===e));throw new be(n)}let d=u?.map(e=>e.name)||[],f=a.filter(e=>d.includes(e));f?.length>0&&b.warn(`custom-fields: trying to update disabled values: ${f.join(`, `)}`);let p=a.map(e=>{let n=l.find(t=>t.name===e),i=Pt[n.fieldType],a=i?i(r[e]):r[e];return{modelId:t,updatedAt:new Date,customFieldDefinitionId:n.id,value:a===void 0?n.defaultValue:a}});return Promise.all(p.map(async e=>{let[t]=await A.upsert(e,{transaction:i.transaction});return t}))},Lt=async(e,t={})=>{let{transaction:n}=t;return R.findOne({where:{modelId:e},transaction:n})},Rt=async(e,t={})=>{let{transaction:n}=t;return R.findAll({where:{modelId:e},transaction:n})},zt=async(e,t,n,r,i={})=>{let a=Object.keys(n);b.debug(`custom-fields: updating entries for ${t} ${e}`,{customFieldsNames:a,optionsKeys:i?Object.keys(i):null,customFields:n,identifiers:r});let{modelOptions:o,transaction:s}=i,c={modelType:t,name:a,...!i.modelOptions?.useEntityIdFromInclude&&{entityId:r}},l=await O(c,{withDisabled:!0,transaction:s,include:o.include?.(r)})??[],u=l.filter(e=>e.disabled);if(l.length!==a.length){b.warn(`custom-fields: missing definitions for ${t} ${e}`,{names:a,fieldDefinitions:l});let n=a.filter(e=>!l.some(t=>t.name===e));throw new be(n)}let d=u?.map(e=>e.name)||[],f=a.filter(e=>d.includes(e));f?.length>0&&b.warn(`custom-fields: trying to update disabled values: ${f.join(`, `)}`);let p=Object.fromEntries(l.map(e=>[e.name,e]));return Object.entries(n).filter(([e])=>Pt[p[e].fieldType]).forEach(([e,t])=>{let{fieldType:r}=p[e];n[e]=Pt[r](t)}),R.upsert({modelId:e,entityId:l[0].entityId,modelType:t,customFields:n},i)},Bt=(e,t)=>e.map(e=>t[e]),Vt=(e,t)=>{let n=Array.from(new Set(t));return Array.isArray(e)?e.flatMap(e=>Bt(n,e)):Bt(n,e)};var q=Vt;const Ht=[`id`,`name`,`entityId`,`fieldType`,`displayName`,`validation`,`entityType`,`modelType`,`required`,`disabled`,`defaultValue`],Ut=async({instancesIds:e,options:t,sadotOptions:n})=>{if(!n.useCustomFieldsEntries)return{};let r=await Rt(e,t??{}),i=Object.fromEntries(r.map(e=>{let{modelId:t,customFields:n}=e?.dataValues??{};if(t)return[t,n]}).filter(Boolean));return e.forEach(e=>{i[e]??={}}),i},Wt=async({instancesIds:e,options:t,sadotOptions:n})=>n.useCustomFieldsEntries?{}:(await Ft(e,t??{})).reduce((e,t)=>{let{modelId:n}=t;return e[n]??=[],e[n].push(t),e},{}),Gt=(e,t)=>e.reduce((e,n)=>({...e,...t[n.customFieldDefinitionId]&&{[t[n.customFieldDefinitionId].name]:n.value}}),{}),Kt=(e,t,n,r={},i={useCustomFieldsEntries:!1})=>async(a,o)=>{if(o.originalAttributes?.length>0&&!o.originalAttributes?.includes?.(`customFields`))return;let s=Array.isArray(a)?a:[a];s=s.filter(Boolean);let c=q(s,t),l=[...new Set(c)].filter(Boolean),u=l.reduce((e,t)=>({...e,[t]:[]}),{}),d,f;o.transaction&&(o.transaction.definitionCache||=new Map,f=`${e}:${l.slice().sort().join(`,`)}`,d=o.transaction.definitionCache.get(f)),d||(d=Ne(e,l,{transaction:o.transaction,modelOptions:r,attributes:Ht}),o.transaction?.definitionCache?.set(f,d));let p=await d;if(p.length===0){s.forEach(e=>{e.customFields={}});return}r?.include&&r.useEntityIdFromInclude&&r.include(c).forEach(({model:e})=>{p.forEach(t=>{let n=t[`${e.name}.entityId`];u[n]=[]})});let m=p.reduce((e,t)=>({...e,[t.id]:t}),{});p.forEach(e=>{u[e.entityId].push(e)});let h=s.map(e=>e.id),[g,_]=await Promise.all([Wt({instancesIds:h,options:o,sadotOptions:i}),Ut({instancesIds:h,options:o,sadotOptions:i})]);s.forEach(e=>{let{id:r}=e,a=g[r],s=a?Gt(a,m):{},c=i.useCustomFieldsEntries?_[r]:s;t.forEach(t=>{let n=e[t],r=u[n];r?.length>0&&r.forEach(e=>{c[e.name]===void 0&&(c[e.name]=null)})}),e.customFields=c,o.attributesToRemove?.forEach?.(t=>{delete e.dataValues?.[t],delete e?.[t]}),n===`afterFind`&&e?.changed?.(`customFields`,!1)})};var qt=Kt;const Jt=(e,t)=>{let n=e.filter(e=>!t.includes(e));return t.includes?.(`id`)||n.push(`id`),n},Yt=e=>t=>{let{attributes:n}=t;if(n?.includes?.(`customFields`)){let r=Jt(e,n);b.debug(`sadot - before find hook`),r?.length>0&&(n.push(...r),t.attributesToRemove=r)}},Xt=async({modelId:e,modelType:t,identifiers:n,customFields:r,options:i={modelOptions:{},useCustomFieldsEntries:!1}})=>{if(await It(t,e,n,r,{...i,modelOptions:i.modelOptions??{}}),!i?.useCustomFieldsEntries)return;let{dataValues:{customFields:a}}=await Lt(e,i)??{dataValues:{}},o={...a,...r};await zt(e,t,o,n,{...i,modelOptions:i.modelOptions??{}})};var Zt=Xt;const Qt=[`id`,`schema`,`modelType`,`entityId`,`disabled`],J=new ee.default({allErrors:!0,strict:!1,strictTypes:!1,$data:!0});(0,y.default)(J),(0,ne.default)(J);const $t=(e,t)=>({__proto__:null,...e,...t}),en=async(e,t)=>{if(!e.id||!e.customFields||Object.keys(e.customFields).length===0)return e.customFields||{};try{let n=await e.constructor.findOne({where:{id:e.id},attributes:[`customFields`],transaction:t.transaction,raw:!0});if(n?.customFields){let t=$t(n.customFields,e.customFields);return b.debug(`sadot - fetched complete custom fields for validation`,{fieldsCount:Object.keys(t).length,updateFieldsCount:Object.keys(e.customFields).length}),t}}catch(e){b.error(`sadot - error fetching complete model for validation`,{error:e})}return e.customFields||{}},tn=e=>{let t={...e.dataValues};(e.changed?.()||[]).forEach(n=>{let r=e.previous?.(n);r!==void 0&&(t[n]=r)});let n=e.previous?.(`customFields`);return n!==void 0&&(t.customFields=n),t},nn=e=>e.reduce((e,t)=>{let n=(t.instancePath||``).split(`/`).filter(Boolean).join(`.`).replace(/^after\./,``),r=t.keyword===`required`?`.${t.params?.missingProperty}`:``,i=(n+r).replace(/^\./,``)||`root`;return e[i]=t.message||`Invalid value`,e},{}),rn=async(e,t,n,r={},i=!1)=>{let a=e.constructor.name;b.debug(`sadot - validating model`,{isCreate:i,modelType:a});let o=q(e,n);if(b.debug(`sadot - identifiers`,{identifiers:o}),!o||Object.keys(o).length===0){b.debug(`sadot - skipping validation: no identifiers`);return}let s=Object.values(o)[0];if(b.debug(`sadot - entityId`,{entityId:s}),!s){b.debug(`sadot - skipping validation: no entityId`);return}let c,l;t.transaction&&(t.transaction.validationsCache||=new Map,l=`${a}-${s}`,c=t.transaction.validationsCache.get(l)),c||(c=vt(a,s,{transaction:t.transaction,attributes:Qt,modelOptions:r}),t.transaction&&t?.transaction?.validationsCache.set(l,c));let u=await c;if(b.debug(`sadot - validators found`,{count:u.length}),!u.length){b.debug(`sadot - skipping validation: no validators found`);return}let d=null;i||(d=tn(e));let f=i?e.customFields||{}:await en(e,t);for(let t of u){let{schema:n}=t,r=n;if(b.debug(`sadot - validating with schema`,{schema:n,hasAfterProps:!!r.properties?.after,hasBeforeProps:!!r.properties?.before}),i){if(r.properties?.after){let t=J.compile({...n,properties:{after:r.properties.after}});if(!t(JSON.parse(JSON.stringify({after:{...e.dataValues,customFields:f}})))){let e=t.errors?.map(e=>`${e.instancePath||``} ${e.message||`Invalid value`}`).join(`, `),n=nn(t.errors);throw new h.BadRequest([Error(`Validation failed for ${a}: ${e}`)],void 0,{customError:n})}}}else{let t=J.compile(r),n=$t(e.dataValues);n.customFields=f;let i={before:d,after:n},o=t(JSON.parse(JSON.stringify(i)));if(b.debug(`sadot - validation result`,{isValid:o,test:{before:d,after:n}}),!o){let e=t.errors?.map(e=>`${e.instancePath||``} ${e.message||`Invalid value`}`).join(`, `),n=nn(t.errors);throw new h.BadRequest([Error(`Validation failed for ${a}: ${e}`)],void 0,{customError:n})}}}},an=async({modelType:e,modelOptions:t,identifiers:n,options:r})=>{let{include:i,useEntityIdFromInclude:a}=t,o={modelType:e,disabled:!1,...!a&&{entityId:n}};return await O(o,{withDisabled:!1,transaction:r.transaction,include:i?.(n)})},on=(e,t)=>{(e||[]).forEach(e=>{let{fieldType:n,name:r}=e;if([x.DATE,x.DATETIME].includes(n)){let e=t.customFields?.[r];if(e){let{value:n,error:i}=f.default.date().validate(e);if(i)throw new C(e,r,i);t.customFields[r]=n.toISOString()}}})},sn=(e,t={},n={useCustomFieldsEntries:!1})=>async(r,i)=>{b.debug(`sadot - before create hook`);let{fields:a}=i,o=r.constructor.name,s=q(r,e),c=await an({modelType:o,modelOptions:t,identifiers:s,options:i}),l=c.filter(e=>![null,void 0].includes(e.defaultValue));l.length&&(r.customFields||={},l.filter(e=>r.customFields?.[e.name]===void 0).forEach(({name:e,defaultValue:t})=>{r.customFields[e]=t}));let u=Array.from(new Set(c.filter(({required:e})=>e).map(({name:e})=>e))),{customFields:d}=r,f=Object.keys(d??{}),p=u.filter(e=>!f.includes(e));if(p?.length)throw new he(p);await rn(r,i,e,t,!0),on(c,r);let m=a.indexOf(`customFields`);m===-1||!d||!Object.keys(d).length||(await Zt({modelId:r.id,modelType:o,identifiers:s,customFields:d,options:{useCustomFieldsEntries:n.useCustomFieldsEntries,transaction:i.transaction,modelOptions:t}}),a.splice(m,1))},cn=(e,t={},n={useCustomFieldsEntries:!1})=>async(r,i)=>{b.debug(`sadot - before update hook`);let{fields:a}=i,o=r.constructor.name,s=q(r,e),c=await an({modelType:o,modelOptions:t,identifiers:s,options:i});await rn(r,i,e,t,!1),on(c,r);let l=a.indexOf(`customFields`);if(l>-1){let{customFields:e}=r;if(!Object.keys(e).length)return;await Zt({modelId:r.id,modelType:o,identifiers:s,customFields:e,options:{useCustomFieldsEntries:n.useCustomFieldsEntries,transaction:i.transaction,modelOptions:t}}),a.splice(l,1)}},ln=e=>{e.individualHooks=!0},un=e=>{e.individualHooks=!0},dn=(e=5)=>Array.from({length:e},()=>`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`.charAt((0,g.randomInt)(52))).join(``),fn=(e,t,n,r=[x.DATETIME,x.DATE])=>{let i=r.map(e=>`'${e}'`).join(`,`),a=`EXISTS ( SELECT 1 FROM "custom_field_values" AS "cv" INNER JOIN custom_field_definitions AS cd ON cd.entity_id = '${n}' AND cv.custom_field_definition_id = cd.id AND cd.model_type = '${t.name}' ${i?`AND cd.field_type NOT IN (${i})`:``} WHERE "cv"."deleted_at" IS NULL AND "cv"."model_id" = "${t.name}"."id" AND CAST("cv"."value" AS TEXT) ILIKE :searchTerm)`;return{where:{[c.Op.or]:[u.Sequelize.where(u.Sequelize.literal(a),!0)]},replacements:{searchTerm:`%${e}%`}}};let Y=function(e){return e.VALUES=`values`,e.ENTRIES=`entries`,e}({});const pn=e=>Array.isArray(e)&&typeof e[0]==`string`,X=e=>[`true`,`false`].includes(e.toString()),mn=e=>e instanceof Date||Object.prototype.toString.call(e)===`[object Date]`,hn=(e,t)=>`to_jsonb(${e}::${t})`,Z=e=>hn(e,`text`),gn=e=>hn(e,`boolean`),_n=e=>hn(e,`numeric`),vn=(e,t)=>mn(t)?hn(e,`timestamp`):e,Q=` AND `,yn=` OR `,bn=`cd`,xn=`cd.name`,Sn=`cv`,$=`cv.value`,Cn=`ce`,wn=(e,t,n,r)=>{let i=`text`;mn(e)?i=`date`:Number.isNaN(Number(e))?X(e)&&(i=`boolean`):i=`numeric`;let a=r.get(e);return`(jsonb_extract_path_text(ce.custom_fields, :${n})::${i}) ${t} :${a}`},Tn=e=>{let t=e;return X(e)?t=e===`true`:Number.isNaN(Number(e))||(t=Number(e)),t},En=(e,t)=>{let n=Tn(e),r=JSON.stringify({[t]:n}),i;return X(e)&&(i=`ce.custom_fields @> '${JSON.stringify({[t]:e})}'`),`
3
3
  (
4
4
  ${i?`${i} OR`:``}
5
5
  ce.custom_fields @> '${r}'