@autofleet/sadot 1.0.10 → 1.0.11
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/_virtual/_@oxc-project_runtime@0.89.0/helpers/decorate.cjs +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.89.0/helpers/decorate.js +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.89.0/helpers/decorateMetadata.cjs +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.89.0/helpers/decorateMetadata.js +1 -0
- package/dist/_virtual/rolldown_runtime.cjs +1 -0
- package/dist/api/index.cjs +2 -0
- package/dist/api/index.cjs.map +1 -0
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/v1/definition/index.cjs +2 -0
- package/dist/api/v1/definition/index.cjs.map +1 -0
- package/dist/api/v1/definition/index.js +2 -0
- package/dist/api/v1/definition/index.js.map +1 -0
- package/dist/api/v1/definition/validations.cjs +2 -0
- package/dist/api/v1/definition/validations.cjs.map +1 -0
- package/dist/api/v1/definition/validations.js +2 -0
- package/dist/api/v1/definition/validations.js.map +1 -0
- package/dist/api/v1/errors.cjs +2 -0
- package/dist/api/v1/errors.cjs.map +1 -0
- package/dist/api/v1/errors.js +2 -0
- package/dist/api/v1/errors.js.map +1 -0
- package/dist/api/v1/index.cjs +2 -0
- package/dist/api/v1/index.cjs.map +1 -0
- package/dist/api/v1/index.js +2 -0
- package/dist/api/v1/index.js.map +1 -0
- package/dist/api/v1/validator/index.cjs +2 -0
- package/dist/api/v1/validator/index.cjs.map +1 -0
- package/dist/api/v1/validator/index.js +2 -0
- package/dist/api/v1/validator/index.js.map +1 -0
- package/dist/api/v1/validator/validations.cjs +2 -0
- package/dist/api/v1/validator/validations.cjs.map +1 -0
- package/dist/api/v1/validator/validations.js +2 -0
- package/dist/api/v1/validator/validations.js.map +1 -0
- package/dist/errors/index.cjs +3 -0
- package/dist/errors/index.cjs.map +1 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/events/index.cjs +2 -0
- package/dist/events/index.cjs.map +1 -0
- package/dist/events/index.js +2 -0
- package/dist/events/index.js.map +1 -0
- package/dist/hooks/enrich.cjs +2 -0
- package/dist/hooks/enrich.cjs.map +1 -0
- package/dist/hooks/enrich.js +2 -0
- package/dist/hooks/enrich.js.map +1 -0
- package/dist/hooks/find.cjs +2 -0
- package/dist/hooks/find.cjs.map +1 -0
- package/dist/hooks/find.js +2 -0
- package/dist/hooks/find.js.map +1 -0
- package/dist/hooks/hooks.cjs +2 -0
- package/dist/hooks/hooks.cjs.map +1 -0
- package/dist/hooks/hooks.js +2 -0
- package/dist/hooks/hooks.js.map +1 -0
- package/dist/hooks/index.cjs +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/utils/updateInstanceValues.cjs +2 -0
- package/dist/hooks/utils/updateInstanceValues.cjs.map +1 -0
- package/dist/hooks/utils/updateInstanceValues.js +2 -0
- package/dist/hooks/utils/updateInstanceValues.js.map +1 -0
- package/dist/index.cjs +1 -46
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -255
- package/dist/index.d.ts +8 -255
- package/dist/index.js +1 -46
- package/dist/index.js.map +1 -1
- package/dist/models/CustomFieldDefinition.cjs +2 -0
- package/dist/models/CustomFieldDefinition.cjs.map +1 -0
- package/dist/models/CustomFieldDefinition.js +2 -0
- package/dist/models/CustomFieldDefinition.js.map +1 -0
- package/dist/models/CustomFieldEntries.cjs +2 -0
- package/dist/models/CustomFieldEntries.cjs.map +1 -0
- package/dist/models/CustomFieldEntries.js +2 -0
- package/dist/models/CustomFieldEntries.js.map +1 -0
- package/dist/models/CustomFieldValue.cjs +2 -0
- package/dist/models/CustomFieldValue.cjs.map +1 -0
- package/dist/models/CustomFieldValue.js +2 -0
- package/dist/models/CustomFieldValue.js.map +1 -0
- package/dist/models/CustomValidator.cjs +2 -0
- package/dist/models/CustomValidator.cjs.map +1 -0
- package/dist/models/CustomValidator.js +2 -0
- package/dist/models/CustomValidator.js.map +1 -0
- package/dist/models/index.cjs +2 -0
- package/dist/models/index.cjs.map +1 -0
- package/dist/models/index.js +2 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/tests/AssociatedTestModel.cjs +2 -0
- package/dist/models/tests/AssociatedTestModel.cjs.map +1 -0
- package/dist/models/tests/AssociatedTestModel.js +2 -0
- package/dist/models/tests/AssociatedTestModel.js.map +1 -0
- package/dist/models/tests/TestModel.cjs +2 -0
- package/dist/models/tests/TestModel.cjs.map +1 -0
- package/dist/models/tests/TestModel.js +2 -0
- package/dist/models/tests/TestModel.js.map +1 -0
- package/dist/models/tests/contextAwareModels/ContextAwareTestModel.cjs +2 -0
- package/dist/models/tests/contextAwareModels/ContextAwareTestModel.cjs.map +1 -0
- package/dist/models/tests/contextAwareModels/ContextAwareTestModel.js +2 -0
- package/dist/models/tests/contextAwareModels/ContextAwareTestModel.js.map +1 -0
- package/dist/models/tests/contextAwareModels/ContextTestModel.cjs +2 -0
- package/dist/models/tests/contextAwareModels/ContextTestModel.cjs.map +1 -0
- package/dist/models/tests/contextAwareModels/ContextTestModel.js +2 -0
- package/dist/models/tests/contextAwareModels/ContextTestModel.js.map +1 -0
- package/dist/repository/definition.cjs +2 -0
- package/dist/repository/definition.cjs.map +1 -0
- package/dist/repository/definition.js +2 -0
- package/dist/repository/definition.js.map +1 -0
- package/dist/repository/entries.cjs +2 -0
- package/dist/repository/entries.cjs.map +1 -0
- package/dist/repository/entries.js +2 -0
- package/dist/repository/entries.js.map +1 -0
- package/dist/repository/utils/formatValues.cjs +2 -0
- package/dist/repository/utils/formatValues.cjs.map +1 -0
- package/dist/repository/utils/formatValues.js +2 -0
- package/dist/repository/utils/formatValues.js.map +1 -0
- package/dist/repository/validator.cjs +2 -0
- package/dist/repository/validator.cjs.map +1 -0
- package/dist/repository/validator.js +2 -0
- package/dist/repository/validator.js.map +1 -0
- package/dist/repository/value.cjs +2 -0
- package/dist/repository/value.cjs.map +1 -0
- package/dist/repository/value.js +2 -0
- package/dist/repository/value.js.map +1 -0
- package/dist/scopes/filter.cjs +2 -0
- package/dist/scopes/filter.cjs.map +1 -0
- package/dist/scopes/filter.d.cts +23 -0
- package/dist/scopes/filter.d.ts +23 -0
- package/dist/scopes/filter.js +2 -0
- package/dist/scopes/filter.js.map +1 -0
- package/dist/scopes/helpers/filter.helpers.cjs +46 -0
- package/dist/scopes/helpers/filter.helpers.cjs.map +1 -0
- package/dist/scopes/helpers/filter.helpers.d.cts +17 -0
- package/dist/scopes/helpers/filter.helpers.d.ts +17 -0
- package/dist/scopes/helpers/filter.helpers.js +46 -0
- package/dist/scopes/helpers/filter.helpers.js.map +1 -0
- package/dist/scopes/index.cjs +1 -0
- package/dist/scopes/index.js +1 -0
- package/dist/types/index.d.cts +44 -0
- package/dist/types/index.d.ts +44 -0
- package/dist/utils/constants/index.cjs +2 -0
- package/dist/utils/constants/index.cjs.map +1 -0
- package/dist/utils/constants/index.d.cts +22 -0
- package/dist/utils/constants/index.d.ts +22 -0
- package/dist/utils/constants/index.js +2 -0
- package/dist/utils/constants/index.js.map +1 -0
- package/dist/utils/db/index.cjs +2 -0
- package/dist/utils/db/index.cjs.map +1 -0
- package/dist/utils/db/index.js +2 -0
- package/dist/utils/db/index.js.map +1 -0
- package/dist/utils/helpers/index.cjs +2 -0
- package/dist/utils/helpers/index.cjs.map +1 -0
- package/dist/utils/helpers/index.d.cts +31 -0
- package/dist/utils/helpers/index.d.ts +31 -0
- package/dist/utils/helpers/index.js +2 -0
- package/dist/utils/helpers/index.js.map +1 -0
- package/dist/utils/init.cjs +2 -0
- package/dist/utils/init.cjs.map +1 -0
- package/dist/utils/init.js +2 -0
- package/dist/utils/init.js.map +1 -0
- package/dist/utils/logger/index.cjs +2 -0
- package/dist/utils/logger/index.cjs.map +1 -0
- package/dist/utils/logger/index.js +2 -0
- package/dist/utils/logger/index.js.map +1 -0
- package/dist/utils/scopeAttributes.cjs +2 -0
- package/dist/utils/scopeAttributes.cjs.map +1 -0
- package/dist/utils/scopeAttributes.js +2 -0
- package/dist/utils/scopeAttributes.js.map +1 -0
- package/dist/utils/validations/index.cjs +2 -0
- package/dist/utils/validations/index.cjs.map +1 -0
- package/dist/utils/validations/index.js +2 -0
- package/dist/utils/validations/index.js.map +1 -0
- package/dist/utils/validations/schema/custom-fields.cjs +2 -0
- package/dist/utils/validations/schema/custom-fields.cjs.map +1 -0
- package/dist/utils/validations/schema/custom-fields.d.cts +7 -0
- package/dist/utils/validations/schema/custom-fields.d.ts +7 -0
- package/dist/utils/validations/schema/custom-fields.js +2 -0
- package/dist/utils/validations/schema/custom-fields.js.map +1 -0
- package/dist/utils/validations/schema/validator-schema.cjs +2 -0
- package/dist/utils/validations/schema/validator-schema.cjs.map +1 -0
- package/dist/utils/validations/schema/validator-schema.js +2 -0
- package/dist/utils/validations/schema/validator-schema.js.map +1 -0
- package/dist/utils/validations/validators/index.cjs +2 -0
- package/dist/utils/validations/validators/index.cjs.map +1 -0
- package/dist/utils/validations/validators/index.js +2 -0
- package/dist/utils/validations/validators/index.js.map +1 -0
- package/dist/utils/validations/validators/select.validator.cjs +2 -0
- package/dist/utils/validations/validators/select.validator.cjs.map +1 -0
- package/dist/utils/validations/validators/select.validator.js +2 -0
- package/dist/utils/validations/validators/select.validator.js.map +1 -0
- package/dist/utils/validations/validators/status.validator.cjs +2 -0
- package/dist/utils/validations/validators/status.validator.cjs.map +1 -0
- package/dist/utils/validations/validators/status.validator.js +2 -0
- package/dist/utils/validations/validators/status.validator.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","names":["beforeFull: any","applyScopeToInstance","ValidatorRepo.findAllByModelType","where: WhereOptions","DefinitionRepo.findAll","updateInstanceValues"],"sources":["../../src/hooks/hooks.ts"],"sourcesContent":["import type {\n BulkCreateOptions, CreateOptions, UpdateOptions, WhereOptions,\n} from 'sequelize';\nimport Ajv from 'ajv';\nimport Joi from 'joi';\nimport addFormats from 'ajv-formats';\nimport { BadRequest } from '@autofleet/errors';\nimport ajvErrors from 'ajv-errors';\nimport logger from '../utils/logger';\nimport * as ValidatorRepo from '../repository/validator';\nimport * as DefinitionRepo from '../repository/definition';\nimport { InvalidValueError, MissingRequiredCustomFieldError } from '../errors';\nimport type { CustomFieldOptions, ModelOptions } from '../types';\nimport applyScopeToInstance from '../utils/scopeAttributes';\nimport updateInstanceValues from './utils/updateInstanceValues';\nimport { CustomFieldDefinitionType } from '../utils/constants';\nimport type { CustomFieldDefinition } from '../models';\n\n// Include all required fields for proper validation\nconst CUSTOM_VALIDATOR_ATTRIBUTES_TO_PULL = ['id', 'schema', 'modelType', 'entityId', 'disabled'];\n\n// Initialize Ajv with relaxed settings to avoid warnings\nconst ajv = new Ajv({\n allErrors: true,\n strict: false, // Disable strict mode to avoid warnings\n strictTypes: false, // Disable strict type checking\n $data: true, // Enable $data references\n});\n\naddFormats(ajv);\najvErrors(ajv);\n\n/**\n * Helper function to manually copy object properties\n * This is more efficient for large objects and avoids excessive object creation\n */\n// eslint-disable-next-line prefer-object-spread\nconst manualObjectCopy = (sourceObj: Record<string, any>, additionalProps?: Record<string, any>): Record<string, any> =>\n ({ __proto__: null, ...sourceObj, ...additionalProps });\n\n/**\n * Fetches complete custom fields for an instance by merging DB values with update values\n * This is needed for partial updates to ensure all related fields are available for validation\n */\nconst getCompleteCustomFields = async (instance, options): Promise<Record<string, any>> => {\n // If we don't have an instance id or no custom fields being updated, return original fields\n if (!instance.id || !instance.customFields || Object.keys(instance.customFields).length === 0) {\n return instance.customFields || {};\n }\n\n try {\n const ModelClass = instance.constructor;\n // Only select the customFields column to minimize data transfer\n const currentCustomFields = await ModelClass.findOne({\n where: { id: instance.id },\n attributes: ['customFields'],\n transaction: options.transaction,\n raw: true, // Get plain object instead of model instance for better performance\n });\n\n if (currentCustomFields?.customFields) {\n // Merge existing fields with update fields using our helper function\n const completeFields = manualObjectCopy(\n currentCustomFields.customFields,\n instance.customFields,\n );\n\n logger.debug('sadot - fetched complete custom fields for validation', {\n fieldsCount: Object.keys(completeFields).length,\n updateFieldsCount: Object.keys(instance.customFields).length,\n });\n\n return completeFields;\n }\n } catch (error) {\n logger.error('sadot - error fetching complete model for validation', { error });\n // Continue with partial data if we can't fetch the complete model\n }\n\n return instance.customFields || {};\n};\n\nconst buildPreChangeState = (instance: any) => {\n const beforeFull: any = { ...instance.dataValues };\n\n const changedKeys: string[] = instance.changed?.() || [];\n changedKeys.forEach((key) => {\n const prevVal = instance.previous?.(key);\n if (prevVal !== undefined) {\n beforeFull[key] = prevVal;\n }\n });\n\n const prevCF = instance.previous?.('customFields');\n if (prevCF !== undefined) {\n beforeFull.customFields = prevCF;\n }\n\n return beforeFull;\n};\n\nconst formatAjvErrors = (\n errors: {\n instancePath?: string;\n keyword: string;\n message?: string;\n params?: Record<string, any>;\n}[],\n): Record<string, string> => errors.reduce((acc, err) => {\n const basePath = (err.instancePath || '')\n .split('/')\n .filter(Boolean)\n .join('.')\n .replace(/^after\\./, '');\n\n const missingProp = err.keyword === 'required' ? `.${err.params?.missingProperty}` : '';\n const key = (basePath + missingProp).replace(/^\\./, '') || 'root';\n\n const message = err.message || 'Invalid value';\n acc[key] = message;\n\n return acc;\n}, {} as Record<string, string>);\n\n/**\n * Validates the model using custom validators\n */\nconst validateModel = async (\n instance,\n options,\n scopeAttributes: string[],\n modelOptions: ModelOptions = {},\n isCreate = false,\n): Promise<void> => {\n const modelType = instance.constructor.name;\n\n logger.debug('sadot - validating model', { isCreate, modelType });\n const identifiers = applyScopeToInstance(instance, scopeAttributes);\n\n logger.debug('sadot - identifiers', { identifiers });\n\n // Skip if no identifiers\n if (!identifiers || Object.keys(identifiers).length === 0) {\n logger.debug('sadot - skipping validation: no identifiers');\n return;\n }\n\n // Find the entityId from identifiers (fleetId, businessModelId, etc.)\n const entityId = Object.values(identifiers)[0]; // Get the first value as entityId\n\n logger.debug('sadot - entityId', { entityId });\n\n if (!entityId) {\n logger.debug('sadot - skipping validation: no entityId');\n return;\n }\n\n let validatorsPromise;\n let cacheKey;\n if (options.transaction) {\n // eslint-disable-next-line no-param-reassign\n options.transaction.validationsCache ||= new Map();\n cacheKey = `${modelType}-${entityId}`;\n validatorsPromise = options.transaction.validationsCache.get(cacheKey);\n }\n\n if (!validatorsPromise) {\n validatorsPromise = ValidatorRepo.findAllByModelType(\n modelType,\n entityId,\n {\n transaction: options.transaction,\n attributes: CUSTOM_VALIDATOR_ATTRIBUTES_TO_PULL,\n modelOptions,\n },\n );\n if (options.transaction) {\n options?.transaction?.validationsCache.set(cacheKey, validatorsPromise);\n }\n }\n const validators = await validatorsPromise;\n\n logger.debug('sadot - validators found', { count: validators.length });\n\n if (!validators.length) {\n logger.debug('sadot - skipping validation: no validators found');\n return;\n }\n\n // For updates, get the previous values\n let originalValues = null;\n if (!isCreate) {\n originalValues = buildPreChangeState(instance);\n }\n\n // Get complete custom fields by merging DB values with update values\n // This is especially important for partial updates to ensure all related fields are available\n const completeCustomFields = !isCreate\n ? await getCompleteCustomFields(instance, options)\n : instance.customFields || {};\n\n // eslint-disable-next-line no-restricted-syntax\n for (const validator of validators) {\n const { schema } = validator;\n const typedSchema = schema as Record<string, any>;\n\n logger.debug('sadot - validating with schema', {\n schema,\n hasAfterProps: !!typedSchema.properties?.after,\n hasBeforeProps: !!typedSchema.properties?.before,\n });\n\n if (isCreate) {\n // For create operations, we only need the 'after' state\n if (typedSchema.properties?.after) {\n const validateSchema = ajv.compile({\n ...schema,\n // Focus only on the 'after' validation part for create\n properties: {\n after: typedSchema.properties.after,\n },\n });\n\n const isValid = validateSchema(JSON.parse(JSON.stringify({\n after: {\n ...instance.dataValues,\n customFields: completeCustomFields,\n },\n })));\n\n if (!isValid) {\n const errorDetails = validateSchema.errors?.map((err) =>\n `${(err as any).instancePath || ''} ${(err as any).message || 'Invalid value'}`).join(', ');\n\n const formattedErrors = formatAjvErrors(validateSchema.errors);\n throw new BadRequest(\n [new Error(`Validation failed for ${modelType}: ${errorDetails}`)],\n undefined,\n {\n customError: formattedErrors,\n },\n );\n }\n }\n } else {\n // For update operations, we need both before and after\n const validateSchema = ajv.compile(typedSchema);\n\n // Create after object with our helper function\n const afterObj = manualObjectCopy(instance.dataValues);\n\n // Add complete custom fields\n afterObj.customFields = completeCustomFields;\n\n // Create validation payload\n const payload = {\n before: originalValues,\n after: afterObj,\n };\n\n // Validate\n const isValid = validateSchema(JSON.parse(JSON.stringify(payload)));\n\n logger.debug('sadot - validation result', {\n isValid,\n test: {\n before: originalValues,\n after: afterObj,\n },\n });\n\n if (!isValid) {\n const errorDetails = validateSchema\n .errors\n ?.map((err) => `${(err as any).instancePath || ''} ${(err as any).message || 'Invalid value'}`).join(', ');\n\n const formattedErrors = formatAjvErrors(validateSchema.errors);\n throw new BadRequest(\n [new Error(`Validation failed for ${modelType}: ${errorDetails}`)],\n undefined,\n {\n customError: formattedErrors,\n },\n );\n }\n }\n }\n};\n\nconst getFieldDefinitions = async ({\n modelType,\n modelOptions,\n identifiers,\n options,\n}: {\n modelType: any,\n modelOptions: ModelOptions,\n identifiers: any[],\n options: any\n}) => {\n const { include, useEntityIdFromInclude } = modelOptions;\n const where: WhereOptions = {\n modelType,\n disabled: false,\n ...(!useEntityIdFromInclude && { entityId: identifiers }),\n };\n\n const fieldDefinitions = await DefinitionRepo.findAll(where, {\n withDisabled: false,\n transaction: options.transaction,\n include: include?.(identifiers),\n });\n return fieldDefinitions;\n};\n\nconst formatDates = (fieldDefinitions: CustomFieldDefinition[], instance: any) => {\n (fieldDefinitions || []).forEach((fieldDefinition) => {\n const { fieldType, name } = fieldDefinition;\n if ([CustomFieldDefinitionType.DATE, CustomFieldDefinitionType.DATETIME].includes(fieldType)) {\n const value = instance.customFields?.[name];\n if (value) {\n const { value: joiValue, error: validationError } = Joi.date().validate(value);\n if (validationError) {\n throw new InvalidValueError(value, name, validationError);\n }\n // eslint-disable-next-line no-param-reassign\n instance.customFields[name] = joiValue.toISOString();\n }\n }\n });\n};\n\n/**\n * Hook to handle validation and custom fields during creation\n */\nexport const beforeCreate = (\n scopeAttributes: string[],\n modelOptions: ModelOptions = {},\n sadotOptions: Pick<CustomFieldOptions, 'useCustomFieldsEntries'> = { useCustomFieldsEntries: false },\n) => async (\n instance: any,\n options: CreateOptions,\n): Promise<void> => {\n logger.debug('sadot - before create hook');\n const { fields } = options;\n const modelType = instance.constructor.name;\n\n const identifiers = applyScopeToInstance(instance, scopeAttributes);\n\n // Step 1: Handle custom fields default values and required fields\n\n const fieldDefinitions = await getFieldDefinitions({\n modelType, modelOptions, identifiers, options,\n });\n\n // Apply default values\n const fieldsWithDefaultValue = fieldDefinitions.filter((def) => ![null, undefined].includes(def.defaultValue));\n if (fieldsWithDefaultValue.length) {\n // eslint-disable-next-line no-param-reassign\n instance.customFields ||= {};\n fieldsWithDefaultValue\n .filter((def) => (instance.customFields?.[def.name] === undefined))\n .forEach(({ name, defaultValue }) => {\n // eslint-disable-next-line no-param-reassign\n instance.customFields[name] = defaultValue;\n });\n }\n\n // Check for required fields\n const requiredFieldsNames = Array.from(\n new Set(fieldDefinitions.filter(({ required }) => required).map(({ name }) => name)),\n );\n const { customFields } = instance;\n const fieldsNames = Object.keys(customFields ?? {});\n const missingFields = requiredFieldsNames.filter((name) => !fieldsNames.includes(name));\n if (missingFields?.length) {\n throw new MissingRequiredCustomFieldError(missingFields);\n }\n\n // Step 2: Validate the model data (including custom fields)\n await validateModel(instance, options, scopeAttributes, modelOptions, true);\n\n // format date and datetime fields\n formatDates(fieldDefinitions, instance);\n\n // Step 3: Save custom field values if they exist\n const customFieldsIdx = fields.indexOf('customFields');\n if (customFieldsIdx === -1 || !customFields || !Object.keys(customFields).length) {\n // No custom fields to update\n return;\n }\n\n // Save custom field values\n await updateInstanceValues({\n modelId: instance.id,\n modelType,\n identifiers,\n customFields,\n options: {\n useCustomFieldsEntries: sadotOptions.useCustomFieldsEntries,\n transaction: options.transaction,\n modelOptions,\n },\n });\n\n // Remove customFields from fields array after handling\n // eslint-disable-next-line no-param-reassign\n fields.splice(customFieldsIdx, 1);\n};\n\n/**\n * Hook to handle validation and custom fields during update\n */\nexport const beforeUpdate = (\n scopeAttributes: string[],\n modelOptions: ModelOptions = {},\n sadotOptions: Pick<CustomFieldOptions, 'useCustomFieldsEntries'> = { useCustomFieldsEntries: false },\n) => async (\n instance: any,\n options: UpdateOptions,\n): Promise<void> => {\n logger.debug('sadot - before update hook');\n const { fields } = options;\n const modelType = instance.constructor.name;\n const identifiers = applyScopeToInstance(instance, scopeAttributes);\n\n const fieldDefinitions = await getFieldDefinitions({\n modelType, modelOptions, identifiers, options,\n });\n\n // Step 1: Validate the model data (including custom fields)\n await validateModel(instance, options, scopeAttributes, modelOptions, false);\n\n // format date and datetime fields\n formatDates(fieldDefinitions, instance);\n\n // Step 2: Update custom field values if they exist\n const customFieldsIdx = fields.indexOf('customFields');\n if (customFieldsIdx > -1) {\n const { customFields } = instance;\n\n if (!Object.keys(customFields).length) {\n return;\n }\n\n // Save custom field values\n await updateInstanceValues({\n modelId: instance.id,\n modelType,\n identifiers,\n customFields,\n options: {\n useCustomFieldsEntries: sadotOptions.useCustomFieldsEntries,\n transaction: options.transaction,\n modelOptions,\n },\n });\n\n // Remove customFields from fields array after handling\n // eslint-disable-next-line no-param-reassign\n fields.splice(customFieldsIdx, 1);\n }\n};\n\n/**\n * Hook to enable individual hooks for bulk create operations\n */\nexport const beforeBulkCreate = (options: BulkCreateOptions): void => {\n // This will activate the beforeCreate hook on each instance\n // eslint-disable-next-line no-param-reassign\n options.individualHooks = true;\n};\n\n/**\n * Hook to enable individual hooks for bulk update operations\n */\nexport const beforeBulkUpdate = (options: UpdateOptions): void => {\n // This will activate the beforeUpdate hook on each instance\n // eslint-disable-next-line no-param-reassign\n options.individualHooks = true;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./enrich.cjs`),t=require(`./find.cjs`),n=require(`./hooks.cjs`);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e from"./enrich.js";import{beforeFind as t}from"./find.js";import{beforeBulkCreate as n,beforeBulkUpdate as r,beforeCreate as i,beforeUpdate as a}from"./hooks.js";export{};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../../repository/value.cjs`),t=require(`../../repository/entries.cjs`),n=async({modelId:n,modelType:r,identifiers:i,customFields:a,options:o={modelOptions:{},useCustomFieldsEntries:!1}})=>{if(await e.updateValues(r,n,i,a,{...o,modelOptions:o.modelOptions??{}}),!o?.useCustomFieldsEntries)return;let{dataValues:{customFields:s}}=await t.findEntriesByModelId(n,o)??{dataValues:{}},c={...s,...a};await t.updateEntries(n,r,c,i,{...o,modelOptions:o.modelOptions??{}})};var r=n;exports.default=r;
|
|
2
|
+
//# sourceMappingURL=updateInstanceValues.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateInstanceValues.cjs","names":[],"sources":["../../../src/hooks/utils/updateInstanceValues.ts"],"sourcesContent":["import type { Transaction } from 'sequelize';\nimport * as ValueRepo from '../../repository/value';\nimport * as EntriesRepo from '../../repository/entries';\nimport type { ModelOptions } from '../../types';\n\ninterface UpdateInstanceValuesParams {\n modelId: string;\n modelType: string;\n identifiers: string[];\n customFields: Record<string, any>;\n options?: {\n transaction?: Transaction;\n modelOptions?: ModelOptions;\n useCustomFieldsEntries?: boolean;\n };\n}\n\nconst updateInstanceValues = async ({\n modelId,\n modelType,\n identifiers,\n customFields,\n options = {\n modelOptions: {},\n useCustomFieldsEntries: false,\n },\n}: UpdateInstanceValuesParams): Promise<void> => {\n await ValueRepo.updateValues(\n modelType,\n modelId,\n identifiers,\n customFields,\n {\n ...options,\n modelOptions: options.modelOptions ?? {},\n },\n );\n\n /*\n T.Y TODO - Once we're ready to switch from custom_field_values to custom_field_entries, we should remove the ValueRepo.updateValues call.\n Currently, We're updating both tables to keep the data in sync, but not all microservices are using the new table yet.\n */\n\n if (!options?.useCustomFieldsEntries) {\n return;\n }\n\n const { dataValues: { customFields: oldCustomFields } } = await EntriesRepo.findEntriesByModelId(modelId, options) ?? { dataValues: {} };\n const newCustomFields = { ...oldCustomFields, ...customFields };\n\n await EntriesRepo.updateEntries(\n modelId,\n modelType,\n newCustomFields,\n identifiers,\n {\n ...options,\n modelOptions: options.modelOptions ?? {},\n },\n );\n};\n\nexport default updateInstanceValues;\n"],"mappings":"wFAiBM,EAAuB,MAAO,CAClC,UACA,YACA,cACA,eACA,UAAU,CACR,aAAc,EAAE,CAChB,uBAAwB,GACzB,IAC8C,CAiB/C,GAhBA,MAAA,EAAA,aACE,EACA,EACA,EACA,EACA,CACE,GAAG,EACH,aAAc,EAAQ,cAAgB,EAAE,CACzC,CACF,CAOG,CAAC,GAAS,uBACZ,OAGF,GAAM,CAAE,WAAY,CAAE,aAAc,IAAsB,MAAA,EAAA,qBAAuC,EAAS,EAAQ,EAAI,CAAE,WAAY,EAAE,CAAE,CAClI,EAAkB,CAAE,GAAG,EAAiB,GAAG,EAAc,CAE/D,MAAA,EAAA,cACE,EACA,EACA,EACA,EACA,CACE,GAAG,EACH,aAAc,EAAQ,cAAgB,EAAE,CACzC,CACF,EAGH,IAAA,EAAe"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{updateValues as e}from"../../repository/value.js";import{findEntriesByModelId as t,updateEntries as n}from"../../repository/entries.js";var r=async({modelId:r,modelType:i,identifiers:a,customFields:o,options:s={modelOptions:{},useCustomFieldsEntries:!1}})=>{if(await e(i,r,a,o,{...s,modelOptions:s.modelOptions??{}}),!s?.useCustomFieldsEntries)return;let{dataValues:{customFields:c}}=await t(r,s)??{dataValues:{}},l={...c,...o};await n(r,i,l,a,{...s,modelOptions:s.modelOptions??{}})};export{r as default};
|
|
2
|
+
//# sourceMappingURL=updateInstanceValues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateInstanceValues.js","names":["ValueRepo.updateValues","EntriesRepo.findEntriesByModelId","EntriesRepo.updateEntries"],"sources":["../../../src/hooks/utils/updateInstanceValues.ts"],"sourcesContent":["import type { Transaction } from 'sequelize';\nimport * as ValueRepo from '../../repository/value';\nimport * as EntriesRepo from '../../repository/entries';\nimport type { ModelOptions } from '../../types';\n\ninterface UpdateInstanceValuesParams {\n modelId: string;\n modelType: string;\n identifiers: string[];\n customFields: Record<string, any>;\n options?: {\n transaction?: Transaction;\n modelOptions?: ModelOptions;\n useCustomFieldsEntries?: boolean;\n };\n}\n\nconst updateInstanceValues = async ({\n modelId,\n modelType,\n identifiers,\n customFields,\n options = {\n modelOptions: {},\n useCustomFieldsEntries: false,\n },\n}: UpdateInstanceValuesParams): Promise<void> => {\n await ValueRepo.updateValues(\n modelType,\n modelId,\n identifiers,\n customFields,\n {\n ...options,\n modelOptions: options.modelOptions ?? {},\n },\n );\n\n /*\n T.Y TODO - Once we're ready to switch from custom_field_values to custom_field_entries, we should remove the ValueRepo.updateValues call.\n Currently, We're updating both tables to keep the data in sync, but not all microservices are using the new table yet.\n */\n\n if (!options?.useCustomFieldsEntries) {\n return;\n }\n\n const { dataValues: { customFields: oldCustomFields } } = await EntriesRepo.findEntriesByModelId(modelId, options) ?? { dataValues: {} };\n const newCustomFields = { ...oldCustomFields, ...customFields };\n\n await EntriesRepo.updateEntries(\n modelId,\n modelType,\n newCustomFields,\n identifiers,\n {\n ...options,\n modelOptions: options.modelOptions ?? {},\n },\n );\n};\n\nexport default updateInstanceValues;\n"],"mappings":"+IA8DA,IAAA,EA7C6B,MAAO,CAClC,UACA,YACA,cACA,eACA,UAAU,CACR,aAAc,EAAE,CAChB,uBAAwB,GACzB,IAC8C,CAiB/C,GAhBA,MAAMA,EACJ,EACA,EACA,EACA,EACA,CACE,GAAG,EACH,aAAc,EAAQ,cAAgB,EAAE,CACzC,CACF,CAOG,CAAC,GAAS,uBACZ,OAGF,GAAM,CAAE,WAAY,CAAE,aAAc,IAAsB,MAAMC,EAAiC,EAAS,EAAQ,EAAI,CAAE,WAAY,EAAE,CAAE,CAClI,EAAkB,CAAE,GAAG,EAAiB,GAAG,EAAc,CAE/D,MAAMC,EACJ,EACA,EACA,EACA,EACA,CACE,GAAG,EACH,aAAc,EAAQ,cAAgB,EAAE,CACzC,CACF"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,47 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,`__esModule`,{value:!0});
|
|
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
|
-
(
|
|
4
|
-
${i?`${i} OR`:``}
|
|
5
|
-
ce.custom_fields @> '${r}'
|
|
6
|
-
)
|
|
7
|
-
`},Dn=(e,t,n)=>{switch(e){case Y.VALUES:return`
|
|
8
|
-
SELECT cv.model_id
|
|
9
|
-
FROM custom_field_values AS cv
|
|
10
|
-
INNER JOIN custom_field_definitions AS cd ON cv.custom_field_definition_id = cd.id
|
|
11
|
-
${Q}cd.model_type = '${t}'
|
|
12
|
-
WHERE ${n.join(yn)}
|
|
13
|
-
${Q}cv.deleted_at IS NULL${Q}cd.deleted_at IS NULL
|
|
14
|
-
GROUP BY cv.model_id
|
|
15
|
-
HAVING COUNT(DISTINCT cv.custom_field_definition_id) = ${n.length}
|
|
16
|
-
`.replace(/\n/g,``);case Y.ENTRIES:return`
|
|
17
|
-
SELECT ce.model_id
|
|
18
|
-
FROM custom_field_entries ce
|
|
19
|
-
JOIN custom_field_definitions cfd
|
|
20
|
-
ON ce.model_type = cfd.model_type
|
|
21
|
-
AND ce.entity_id = cfd.entity_id
|
|
22
|
-
WHERE
|
|
23
|
-
cfd.deleted_at IS NULL AND
|
|
24
|
-
${n.join(Q)}
|
|
25
|
-
`;default:throw Error(`Invalid query type`)}},On=(e,t,n)=>{switch(e){case Y.VALUES:return`(
|
|
26
|
-
SELECT value
|
|
27
|
-
FROM (SELECT cv.model_id, cv.value
|
|
28
|
-
FROM custom_field_values AS cv INNER JOIN custom_field_definitions AS cd
|
|
29
|
-
ON cv.custom_field_definition_id = cd.id
|
|
30
|
-
${Q}cd.model_type = '${t}'
|
|
31
|
-
WHERE cv.model_id = "${t}"."id"
|
|
32
|
-
${Q}cd.name = :${n}
|
|
33
|
-
) AS CustomFieldAggregation
|
|
34
|
-
)
|
|
35
|
-
`;case Y.ENTRIES:return`(
|
|
36
|
-
SELECT
|
|
37
|
-
customFields.value
|
|
38
|
-
FROM
|
|
39
|
-
custom_field_entries AS ce,
|
|
40
|
-
jsonb_each_text(custom_fields) AS customFields
|
|
41
|
-
WHERE
|
|
42
|
-
customFields.key = :${n}${Q}
|
|
43
|
-
ce.model_type = '${t}'${Q}
|
|
44
|
-
ce.model_id = "${t}"."id"
|
|
45
|
-
)
|
|
46
|
-
`;default:throw Error(`Invalid query type`)}},kn=(e,t,n)=>{let r=n.get(e);if(!r)return!1;let i=`(cd.name = :${r})`;if(Array.isArray(t)){if(t.length===0)return!1;if(pn(t)){let e=t.flatMap(e=>{let t=n.get(e);return X(e)?[Z(`:${t}`),gn(`:${t}`)]:Number.isNaN(Number(e))?Z(`:${t}`):_n(`:${t}`)}).join(`,`);return`(${i}${Q}${$} IN (${e}))`}return t.map(e=>{let t=n.get(e.value),r=Z(`:${t}`);return`(${i}${Q}${vn($,e.value)} ${e.operator} ${r})`}).join(Q)}if(typeof t==`string`||typeof t==`number`){let e=n.get(t),r=Number.isNaN(Number(t))?Z(`:${e}`):_n(`:${e}`),a=X(t)?`${yn}${$} = ${gn(`:${e}`)}`:``;return`(${i}${Q}(${vn($,t)} = ${r}${a}))`}if(t?.operator){let e=n.get(t.value),r=Z(`:${e}`);return`( ${i}${Q}${vn($,t.value)} ${t.operator} ${r})`}return!1},An=(e,t,n)=>{let r=n.get(e);return r?Array.isArray(t)?t.length===0?!1:pn(t)?`( ${t.map(t=>En(t,e)).join(`${yn}\n`)})`:t.map(e=>wn(e.value,e.operator,r,n)).join(Q):typeof t==`string`||typeof t==`number`?En(t,e):t?.operator?wn(t.value,t.operator,r,n):!1:!1},jn=(e,t)=>({replacementsMap:n,scopeValue:r})=>{if(!r||Object.keys(r).length===0)return{};let i=t?.useCustomFieldsEntries?Y.ENTRIES:Y.VALUES,a=new Map(Object.entries(n).map(([e,t])=>[t,e])),o=Object.entries(r).map(([e,t])=>{switch(i){case Y.ENTRIES:return An(e,t,a);case Y.VALUES:return kn(e,t,a);default:return!1}}).filter(Boolean);if(o.length===0)return{};let s=Dn(i,e,o);return{where:{id:{[c.Op.in]:u.Sequelize.literal(`(${s})`)}},replacements:n}},Mn=d.customFields.CUSTOM_FIELDS_FILTER_SCOPE,Nn=(e,t)=>({replacementsMap:n,scopeValue:r})=>{if(!r||r.length===0)return{};let i=t?.useCustomFieldsEntries?Y.ENTRIES:Y.VALUES,a=dn(),o=Object.entries(r).map(([t])=>{let r=Object.keys(n).find(e=>n[e]===t);return[u.Sequelize.literal(On(i,e,r)),a]}),s=Object.entries(r).map(([,e])=>{let t=typeof e==`string`?e:Object.values(e)[0];return u.Sequelize.literal(`"${a}" ${t||`ASC`}`)});return{attributes:{include:o},order:s,replacements:n}},{CUSTOM_FIELDS_FILTER_SCOPE:Pn}=d.customFields,Fn=(e,t,n={useCustomFieldsEntries:!1})=>{e.forEach(async({name:e,scopeAttributes:r,modelOptions:i})=>{try{let a=t(e);if(!a){b.warn(`sadot - tried to addHooks to a model that does not exist yet`,{name:e,scopeAttributes:r});return}a.rawAttributes.customFields={type:c.DataTypes.VIRTUAL},a.refreshAttributes(),a.addHook(`beforeFind`,`sadot-beforeFind`,Yt(r)),a.addHook(`beforeBulkCreate`,`sadot-beforeBulkCreate`,ln),a.addHook(`beforeBulkUpdate`,`sadot-beforeBulkUpdate`,un),a.addHook(`beforeCreate`,`sadot-beforeCreate`,sn(r,i,n)),a.addHook(`beforeUpdate`,`sadot-beforeUpdate`,cn(r,i,n)),a.addHook(`afterFind`,`sadot-afterFind`,qt(e,r,`afterFind`,i,n)),a.addHook(`afterUpdate`,`sadot-afterUpdate`,qt(e,r,null,i,n)),a.addHook(`afterCreate`,`sadot-afterCreate`,qt(e,r,null,i,n))}catch(t){b.error(`Could not add custom fields hook to model ${e}. `,t)}})},In=(e,t)=>{e.forEach(async({name:e})=>{try{let n=t(e);if(!n)return;n.rawAttributes.customFields&&(delete n.rawAttributes.customFields,n.refreshAttributes()),n.removeHook(`beforeFind`,`sadot-beforeFind`),n.removeHook(`beforeBulkCreate`,`sadot-beforeBulkCreate`),n.removeHook(`beforeBulkUpdate`,`sadot-beforeBulkUpdate`),n.removeHook(`beforeCreate`,`sadot-beforeCreate`),n.removeHook(`beforeUpdate`,`sadot-beforeUpdate`),n.removeHook(`afterFind`,`sadot-afterFind`),n.removeHook(`afterUpdate`,`sadot-afterUpdate`)}catch(t){b.error(`Could not add custom fields hook to model ${e}. `,t)}})},Ln=(e,t,n)=>{n?.useCustomFieldsEntries||(e.hasMany(A,{foreignKey:`modelId`,as:`customFieldValue`}),A.belongsTo(e,{foreignKey:`modelId`,as:t}))},Rn=(e,t,n={useCustomFieldsEntries:!1})=>{e.forEach(async({name:e,scopeAttributes:r})=>{try{let i=t(e);if(!i){b.warn(`sadot - tried to addScopes to a model that does not exist yet`,{name:e,scopeAttributes:r});return}Ln(i,e,n),i.addScope(Pn,jn(e,n)),i.addScope(te.CUSTOM_FIELDS_SORT_SCOPE,Nn(e,n))}catch(t){b.error(`Could not add custom fields scopes to model ${e}. `,t)}})},zn=e=>{e.forEach(({modelOptions:e})=>{e?.customAssociation?.(D),e?.customAssociation?.(B)})},Bn=f.default.object().pattern(f.default.string(),f.default.any()),Vn=async(e,t,n)=>{ie().catch(()=>null);let{models:r,useCustomFieldsEntries:i}=n;e&&e.use(`/api`,Mt);let a=n.sequelize??Nt(n.databaseConfig);return process.env.NODE_ENV===`test`&&await ot(a),Fn(r,t,{useCustomFieldsEntries:i}),await at(a,n.getUser,{useCustomFieldsEntries:i}),Rn(r,t,{useCustomFieldsEntries:i}),zn(r),b.debug(`sadot - custom fields finished initializing with models`,r),a};var Hn=Vn;const Un=(e,t)=>{In(e,t)};exports.AssociatedTestModel=We,exports.CUSTOM_FIELDS_FILTER_SCOPE=oe,exports.ContextAwareTestModel=qe,exports.ContextTestModel=F,exports.CustomFieldDefinition=D,exports.CustomFieldDefinitionType=x,exports.CustomFieldEntries=R,exports.CustomFieldValue=A,exports.CustomFieldsSchema=Bn,exports.CustomValidator=B,exports.TestModel=N,exports.customFieldsSortScope=Nn,exports.default=Hn,exports.disableCustomFields=Un,exports.generateCustomFieldSearchQueryPayload=fn,exports.generateRandomString=dn,exports.initTables=at,exports.initTestModels=ot,exports.supportedEntities=ae;
|
|
1
|
+
Object.defineProperty(exports,`__esModule`,{value:!0});const e=require(`./utils/logger/index.cjs`),t=require(`./utils/constants/index.cjs`),n=require(`./models/index.cjs`),r=require(`./api/index.cjs`),i=require(`./utils/db/index.cjs`),a=require(`./utils/helpers/index.cjs`),o=require(`./scopes/filter.cjs`),s=require(`./utils/init.cjs`),c=require(`./utils/validations/schema/custom-fields.cjs`),l=async(t,a,o)=>{e.tryAddingTraceIdMiddleware().catch(()=>null);let{models:c,useCustomFieldsEntries:l}=o;t&&t.use(`/api`,r.default);let u=o.sequelize??i.default(o.databaseConfig);return process.env.NODE_ENV===`test`&&await n.initTestModels(u),s.addHooks(c,a,{useCustomFieldsEntries:l}),await n.initTables(u,o.getUser,{useCustomFieldsEntries:l}),s.addScopes(c,a,{useCustomFieldsEntries:l}),s.applyCustomAssociation(c),e.default.debug(`sadot - custom fields finished initializing with models`,c),u};var u=l;const d=(e,t)=>{s.removeHooks(e,t)};exports.CUSTOM_FIELDS_FILTER_SCOPE=t.CUSTOM_FIELDS_FILTER_SCOPE,exports.CustomFieldDefinitionType=t.CustomFieldDefinitionType,exports.CustomFieldsSchema=c.CustomFieldsSchema,exports.customFieldsSortScope=o.customFieldsSortScope,exports.default=u,exports.disableCustomFields=d,exports.generateCustomFieldSearchQueryPayload=a.generateCustomFieldSearchQueryPayload,exports.generateRandomString=a.generateRandomString,exports.supportedEntities=t.supportedEntities;
|
|
47
2
|
//# sourceMappingURL=index.cjs.map
|