orange-dragonfly-model 0.12.0 → 0.12.1

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
@@ -276,7 +276,7 @@ var Model = class extends import_orange_dragonfly_orm2.ActiveRecord {
276
276
  }
277
277
  }
278
278
  }
279
- (0, import_orange_dragonfly_validator.parse)(rules, this.data, { strictMode: false });
279
+ this.data = (0, import_orange_dragonfly_validator.parse)(rules, this.data, { strictMode: false });
280
280
  const custom_validation_errors = await this.custom_validation();
281
281
  if (custom_validation_errors && Object.keys(custom_validation_errors).length) {
282
282
  const ex = new OrangeDatabaseInputValidationError("Validation failed");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/model.ts","../src/errors.ts"],"sourcesContent":["export { default } from './model'\nexport { default as Model } from './model'\nexport {\n OrangeDatabaseInputValidationError,\n OrangeDatabaseModelAccessError,\n OrangeDatabaseModelError,\n OrangeDatabaseModelRuntimeError,\n} from './errors'\n","import { ActiveRecord, Relation, SelectQuery } from 'orange-dragonfly-orm'\nimport { parse, type ODValidatorRuleSchema, type ODValidatorRulesSchema } from 'orange-dragonfly-validator'\nimport {\n OrangeDatabaseInputValidationError,\n OrangeDatabaseModelAccessError,\n OrangeDatabaseModelError,\n OrangeDatabaseModelRuntimeError,\n} from './errors'\n\nexport default class Model extends ActiveRecord {\n private get _mCls(): typeof Model {\n return this.constructor as typeof Model\n }\n\n static get ignore_extra_fields(): boolean {\n return false\n }\n\n /**\n * Returns list of unique keys\n * @returns List of unique keys\n */\n static get unique_keys(): string[][] {\n return []\n }\n\n /**\n * Returns list of fulltext indexes\n * @returns List of fulltext indexes\n */\n static get fulltext_indexes(): string[][] {\n return []\n }\n\n /** @deprecated Use `ignore_extra_fields` instead */\n static get IGNORE_EXTRA_FIELDS(): boolean {\n return this.ignore_extra_fields\n }\n\n /** @deprecated Use `unique_keys` instead */\n static get UNIQUE_KEYS(): string[][] {\n return this.unique_keys\n }\n\n /** @deprecated Use `fulltext_indexes` instead */\n static get FULLTEXT_INDEXES(): string[][] {\n return this.fulltext_indexes\n }\n\n /**\n * Returns schema for the model (Orange Dragonfly Validator format)\n */\n static get validation_rules(): ODValidatorRulesSchema {\n return {\n id: {\n required: false,\n type: 'integer',\n min: 1,\n },\n }\n }\n\n /**\n * Overridden method of ActiveRecord. Returns special fields list based on validation rules\n */\n static override get special_fields(): string[] {\n const rules = this.validation_rules\n const fields: string[] = []\n for (const field of ['created_at', 'updated_at', 'deleted_at']) {\n if (Object.hasOwn(rules, field)) fields.push(field)\n }\n return fields\n }\n\n /**\n * Returns list of relations restricted for extended output\n */\n static get restricted_for_output(): string[] {\n return []\n }\n\n /**\n * Returns list of fields restricted for lookup\n */\n static get restricted_for_lookup(): string[] {\n return []\n }\n\n /**\n * Returns list of fields restricted for create method\n */\n static get restricted_for_create(): string[] {\n return ['id'].concat(this.special_fields)\n }\n\n /**\n * Returns list of fields restricted for update method\n */\n static get restricted_for_update(): string[] {\n return ['id'].concat(this.special_fields)\n }\n\n /**\n * Lookup method\n * @param data\n * @param basicQuery Query to be used for adding conditions. By default a new SelectQuery is created.\n */\n static lookupQuery(data: Record<string, unknown>, basicQuery: SelectQuery | null = null): SelectQuery {\n const rules = this.validation_rules\n const q = basicQuery ?? this.selectQuery()\n const filtered_rules: ODValidatorRulesSchema = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (this.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${this.name}`\n throw ex\n }\n if (this.restricted_for_lookup.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for searching model ${this.name}`\n throw ex\n }\n q.where(field, data[field])\n const rule = rules[field] as ODValidatorRuleSchema\n filtered_rules[field] = Array.isArray(data[field]) ? { type: 'array', children: { '*': rule } } : rule\n }\n parse(filtered_rules, data, { strictMode: false })\n return q\n }\n\n /**\n * Creates object\n * @param data\n */\n static async create(data: Record<string, unknown>): Promise<Model> {\n const rules = this.validation_rules\n const new_data: Record<string, unknown> = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (this.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${this.name}`\n throw ex\n }\n if (this.restricted_for_create.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for creating model ${this.name}`\n throw ex\n }\n new_data[field] = data[field]\n }\n const Cls = this as unknown as new (data?: Record<string, unknown>) => Model\n return (new Cls(new_data)).save()\n }\n\n /**\n * Updates object\n * @param data\n */\n async update(data: Record<string, unknown>): Promise<this> {\n if (!this.id) {\n throw new OrangeDatabaseModelRuntimeError('You can update saved object only')\n }\n const cls = this._mCls\n const rules = cls.validation_rules\n const new_data: Record<string, unknown> = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (cls.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${cls.name}`\n throw ex\n }\n if (cls.restricted_for_update.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for updating model ${cls.name}`\n throw ex\n }\n new_data[field] = data[field]\n }\n return this.save(new_data)\n }\n\n /**\n * Checks uniqueness of the object based on unique_keys\n */\n async checkUniqueness(exception_mode = false, ignore_null = false): Promise<boolean> {\n const cls = this._mCls\n for (const fields of cls.unique_keys) {\n if (!await this.isUnique(fields, ignore_null)) {\n if (exception_mode) {\n const ex = new OrangeDatabaseInputValidationError('Object is not unique')\n for (const field of fields) {\n ex.info[field] = 'Part of the unique key'\n }\n throw ex\n }\n return false\n }\n }\n return true\n }\n\n protected override async _preSave(_is_new?: boolean): Promise<void> {\n const cls = this._mCls\n if (cls.ignore_extra_fields) {\n const rules = cls.validation_rules\n for (const key of Object.keys(this.data).filter(v => !Object.hasOwn(rules, v))) {\n delete this.data[key]\n }\n }\n await super._preSave(_is_new)\n await this.checkUniqueness(true, true)\n await this.validate()\n }\n\n /**\n * Performs custom validation - returns null in case of success or an object of validation issues\n */\n async custom_validation(): Promise<Record<string, string> | null> {\n return null\n }\n\n /**\n * Validate object's data\n */\n async validate(): Promise<void> {\n const cls = this._mCls\n const rules = cls.validation_rules\n if (!rules) {\n throw new OrangeDatabaseModelError(`Validation rules are not defined for model ${cls.name}`)\n }\n for (const rule_name of Object.keys(rules)) {\n if (Object.hasOwn(this.data, rule_name)) {\n const rule = rules[rule_name] as ODValidatorRuleSchema\n if (rule?.type) {\n const types = Array.isArray(rule.type) ? (rule.type as string[]) : [rule.type as string]\n if (types.includes('boolean')) {\n if ((this.data[rule_name] === 1) || (this.data[rule_name] === 0)) {\n this.data[rule_name] = this.data[rule_name] === 1\n }\n }\n }\n }\n }\n parse(rules, this.data, { strictMode: false })\n const custom_validation_errors = await this.custom_validation()\n if (custom_validation_errors && Object.keys(custom_validation_errors).length) {\n const ex = new OrangeDatabaseInputValidationError('Validation failed')\n for (const [param, message] of Object.entries(custom_validation_errors)) ex.info[param] = message\n throw ex\n }\n const relation_errors: string[] = []\n for (const rel_name of Object.keys(cls.available_relations)) {\n const rel: Relation = cls.available_relations[rel_name]\n if (rel.mode === 'parent') {\n const aKey = (rel as unknown as { _a_key_by_mode: string })._a_key_by_mode\n if (Object.hasOwn(this.data, aKey) && (this.data[aKey] !== null) && (this.data[aKey] !== 0)) {\n if ((await this.rel(rel_name, true) as Model | null) === null) {\n relation_errors.push(aKey)\n }\n }\n }\n if (relation_errors.length) {\n const ex = new OrangeDatabaseInputValidationError(`Some relations of the ${cls.name} are not found`)\n for (const param of relation_errors) ex.info[param] = 'Parent object not found'\n throw ex\n }\n }\n }\n\n /**\n * Returns object by ID if it exists and accessible by user\n * @param id\n * @param user\n * @param mode\n */\n static async findAndCheckAccessOrDie(id: unknown, user: unknown, mode: string | null = null): Promise<Model> {\n const obj = await this.find(id) as Model | null\n if (!obj) {\n throw new OrangeDatabaseModelRuntimeError(`${this.name} #${id} not found`)\n }\n if (!(await obj.accessible(user, mode))) {\n throw new OrangeDatabaseModelAccessError(`${this.name} #${id} is not accessible${mode ? ` for ${mode}` : ''}`)\n }\n return obj\n }\n\n /**\n * Returns whether the object is accessible by user\n * @param user\n * @param mode\n */\n \n async accessible(user: unknown, mode: string | null = null): Promise<boolean> {\n return mode === null\n }\n\n /**\n * Returns public data of the object\n */\n get output(): Record<string, unknown> {\n return {\n id: this.id,\n }\n }\n\n /**\n * Format output\n * @param mode\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n formatOutput(mode: string | null = null): Record<string, unknown> {\n return this.output\n }\n\n /**\n * Returns public data of the object with relations\n * @param required_relations\n * @param mode\n */\n async getExtendedOutput(required_relations: string[] = [], mode: string | null = null): Promise<Record<string, unknown>> {\n const output = this.formatOutput(mode)\n const cls = this._mCls\n for (const name of required_relations) {\n if (name.split(':').length > 1) continue\n if (cls.restricted_for_output.includes(name)) {\n throw new OrangeDatabaseModelError(`Relation \"${name}\" is not allowed for extended output of model ${cls.name}`)\n }\n const rel_data = await this.rel(name) as Model | Model[] | null\n const rel_mode = `relation:${cls.name}.${name}`\n const rel_relations = required_relations.filter(v => v.startsWith(`${name}:`)).map(v => v.slice(name.length + 1))\n output[`:${name}`] = Array.isArray(rel_data)\n ? await Promise.all(rel_data.map(v => v.getExtendedOutput(rel_relations, rel_mode)))\n : (rel_data ? await rel_data.getExtendedOutput(rel_relations, rel_mode) : null)\n }\n return output\n }\n}\n","import { OrangeDatabaseError, OrangeDatabaseInputError } from 'orange-dragonfly-orm'\n\nexport class OrangeDatabaseInputValidationError extends OrangeDatabaseInputError {\n private _info: Record<string, string> = {}\n\n get info(): Record<string, string> {\n return this._info\n }\n\n set info(v: Record<string, string>) {\n this._info = v\n }\n}\n\nexport class OrangeDatabaseModelError extends OrangeDatabaseError {}\n\nexport class OrangeDatabaseModelRuntimeError extends OrangeDatabaseModelError {}\n\nexport class OrangeDatabaseModelAccessError extends OrangeDatabaseModelRuntimeError {}\n"],"mappings":"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","names":["import_orange_dragonfly_orm"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/model.ts","../src/errors.ts"],"sourcesContent":["export { default } from './model'\nexport { default as Model } from './model'\nexport {\n OrangeDatabaseInputValidationError,\n OrangeDatabaseModelAccessError,\n OrangeDatabaseModelError,\n OrangeDatabaseModelRuntimeError,\n} from './errors'\n","import { ActiveRecord, Relation, SelectQuery } from 'orange-dragonfly-orm'\nimport { parse, type ODValidatorRuleSchema, type ODValidatorRulesSchema } from 'orange-dragonfly-validator'\nimport {\n OrangeDatabaseInputValidationError,\n OrangeDatabaseModelAccessError,\n OrangeDatabaseModelError,\n OrangeDatabaseModelRuntimeError,\n} from './errors'\n\nexport default class Model extends ActiveRecord {\n private get _mCls(): typeof Model {\n return this.constructor as typeof Model\n }\n\n static get ignore_extra_fields(): boolean {\n return false\n }\n\n /**\n * Returns list of unique keys\n * @returns List of unique keys\n */\n static get unique_keys(): string[][] {\n return []\n }\n\n /**\n * Returns list of fulltext indexes\n * @returns List of fulltext indexes\n */\n static get fulltext_indexes(): string[][] {\n return []\n }\n\n /** @deprecated Use `ignore_extra_fields` instead */\n static get IGNORE_EXTRA_FIELDS(): boolean {\n return this.ignore_extra_fields\n }\n\n /** @deprecated Use `unique_keys` instead */\n static get UNIQUE_KEYS(): string[][] {\n return this.unique_keys\n }\n\n /** @deprecated Use `fulltext_indexes` instead */\n static get FULLTEXT_INDEXES(): string[][] {\n return this.fulltext_indexes\n }\n\n /**\n * Returns schema for the model (Orange Dragonfly Validator format)\n */\n static get validation_rules(): ODValidatorRulesSchema {\n return {\n id: {\n required: false,\n type: 'integer',\n min: 1,\n },\n }\n }\n\n /**\n * Overridden method of ActiveRecord. Returns special fields list based on validation rules\n */\n static override get special_fields(): string[] {\n const rules = this.validation_rules\n const fields: string[] = []\n for (const field of ['created_at', 'updated_at', 'deleted_at']) {\n if (Object.hasOwn(rules, field)) fields.push(field)\n }\n return fields\n }\n\n /**\n * Returns list of relations restricted for extended output\n */\n static get restricted_for_output(): string[] {\n return []\n }\n\n /**\n * Returns list of fields restricted for lookup\n */\n static get restricted_for_lookup(): string[] {\n return []\n }\n\n /**\n * Returns list of fields restricted for create method\n */\n static get restricted_for_create(): string[] {\n return ['id'].concat(this.special_fields)\n }\n\n /**\n * Returns list of fields restricted for update method\n */\n static get restricted_for_update(): string[] {\n return ['id'].concat(this.special_fields)\n }\n\n /**\n * Lookup method\n * @param data\n * @param basicQuery Query to be used for adding conditions. By default a new SelectQuery is created.\n */\n static lookupQuery(data: Record<string, unknown>, basicQuery: SelectQuery | null = null): SelectQuery {\n const rules = this.validation_rules\n const q = basicQuery ?? this.selectQuery()\n const filtered_rules: ODValidatorRulesSchema = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (this.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${this.name}`\n throw ex\n }\n if (this.restricted_for_lookup.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for searching model ${this.name}`\n throw ex\n }\n q.where(field, data[field])\n const rule = rules[field] as ODValidatorRuleSchema\n filtered_rules[field] = Array.isArray(data[field]) ? { type: 'array', children: { '*': rule } } : rule\n }\n parse(filtered_rules, data, { strictMode: false })\n return q\n }\n\n /**\n * Creates object\n * @param data\n */\n static async create(data: Record<string, unknown>): Promise<Model> {\n const rules = this.validation_rules\n const new_data: Record<string, unknown> = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (this.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${this.name}`\n throw ex\n }\n if (this.restricted_for_create.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for creating model ${this.name}`\n throw ex\n }\n new_data[field] = data[field]\n }\n const Cls = this as unknown as new (data?: Record<string, unknown>) => Model\n return (new Cls(new_data)).save()\n }\n\n /**\n * Updates object\n * @param data\n */\n async update(data: Record<string, unknown>): Promise<this> {\n if (!this.id) {\n throw new OrangeDatabaseModelRuntimeError('You can update saved object only')\n }\n const cls = this._mCls\n const rules = cls.validation_rules\n const new_data: Record<string, unknown> = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (cls.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${cls.name}`\n throw ex\n }\n if (cls.restricted_for_update.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for updating model ${cls.name}`\n throw ex\n }\n new_data[field] = data[field]\n }\n return this.save(new_data)\n }\n\n /**\n * Checks uniqueness of the object based on unique_keys\n */\n async checkUniqueness(exception_mode = false, ignore_null = false): Promise<boolean> {\n const cls = this._mCls\n for (const fields of cls.unique_keys) {\n if (!await this.isUnique(fields, ignore_null)) {\n if (exception_mode) {\n const ex = new OrangeDatabaseInputValidationError('Object is not unique')\n for (const field of fields) {\n ex.info[field] = 'Part of the unique key'\n }\n throw ex\n }\n return false\n }\n }\n return true\n }\n\n protected override async _preSave(_is_new?: boolean): Promise<void> {\n const cls = this._mCls\n if (cls.ignore_extra_fields) {\n const rules = cls.validation_rules\n for (const key of Object.keys(this.data).filter(v => !Object.hasOwn(rules, v))) {\n delete this.data[key]\n }\n }\n await super._preSave(_is_new)\n await this.checkUniqueness(true, true)\n await this.validate()\n }\n\n /**\n * Performs custom validation - returns null in case of success or an object of validation issues\n */\n async custom_validation(): Promise<Record<string, string> | null> {\n return null\n }\n\n /**\n * Validate object's data\n */\n async validate(): Promise<void> {\n const cls = this._mCls\n const rules = cls.validation_rules\n if (!rules) {\n throw new OrangeDatabaseModelError(`Validation rules are not defined for model ${cls.name}`)\n }\n for (const rule_name of Object.keys(rules)) {\n if (Object.hasOwn(this.data, rule_name)) {\n const rule = rules[rule_name] as ODValidatorRuleSchema\n if (rule?.type) {\n const types = Array.isArray(rule.type) ? (rule.type as string[]) : [rule.type as string]\n if (types.includes('boolean')) {\n if ((this.data[rule_name] === 1) || (this.data[rule_name] === 0)) {\n this.data[rule_name] = this.data[rule_name] === 1\n }\n }\n }\n }\n }\n this.data = parse(rules, this.data, { strictMode: false })\n const custom_validation_errors = await this.custom_validation()\n if (custom_validation_errors && Object.keys(custom_validation_errors).length) {\n const ex = new OrangeDatabaseInputValidationError('Validation failed')\n for (const [param, message] of Object.entries(custom_validation_errors)) ex.info[param] = message\n throw ex\n }\n const relation_errors: string[] = []\n for (const rel_name of Object.keys(cls.available_relations)) {\n const rel: Relation = cls.available_relations[rel_name]\n if (rel.mode === 'parent') {\n const aKey = (rel as unknown as { _a_key_by_mode: string })._a_key_by_mode\n if (Object.hasOwn(this.data, aKey) && (this.data[aKey] !== null) && (this.data[aKey] !== 0)) {\n if ((await this.rel(rel_name, true) as Model | null) === null) {\n relation_errors.push(aKey)\n }\n }\n }\n if (relation_errors.length) {\n const ex = new OrangeDatabaseInputValidationError(`Some relations of the ${cls.name} are not found`)\n for (const param of relation_errors) ex.info[param] = 'Parent object not found'\n throw ex\n }\n }\n }\n\n /**\n * Returns object by ID if it exists and accessible by user\n * @param id\n * @param user\n * @param mode\n */\n static async findAndCheckAccessOrDie(id: unknown, user: unknown, mode: string | null = null): Promise<Model> {\n const obj = await this.find(id) as Model | null\n if (!obj) {\n throw new OrangeDatabaseModelRuntimeError(`${this.name} #${id} not found`)\n }\n if (!(await obj.accessible(user, mode))) {\n throw new OrangeDatabaseModelAccessError(`${this.name} #${id} is not accessible${mode ? ` for ${mode}` : ''}`)\n }\n return obj\n }\n\n /**\n * Returns whether the object is accessible by user\n * @param user\n * @param mode\n */\n \n async accessible(user: unknown, mode: string | null = null): Promise<boolean> {\n return mode === null\n }\n\n /**\n * Returns public data of the object\n */\n get output(): Record<string, unknown> {\n return {\n id: this.id,\n }\n }\n\n /**\n * Format output\n * @param mode\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n formatOutput(mode: string | null = null): Record<string, unknown> {\n return this.output\n }\n\n /**\n * Returns public data of the object with relations\n * @param required_relations\n * @param mode\n */\n async getExtendedOutput(required_relations: string[] = [], mode: string | null = null): Promise<Record<string, unknown>> {\n const output = this.formatOutput(mode)\n const cls = this._mCls\n for (const name of required_relations) {\n if (name.split(':').length > 1) continue\n if (cls.restricted_for_output.includes(name)) {\n throw new OrangeDatabaseModelError(`Relation \"${name}\" is not allowed for extended output of model ${cls.name}`)\n }\n const rel_data = await this.rel(name) as Model | Model[] | null\n const rel_mode = `relation:${cls.name}.${name}`\n const rel_relations = required_relations.filter(v => v.startsWith(`${name}:`)).map(v => v.slice(name.length + 1))\n output[`:${name}`] = Array.isArray(rel_data)\n ? await Promise.all(rel_data.map(v => v.getExtendedOutput(rel_relations, rel_mode)))\n : (rel_data ? await rel_data.getExtendedOutput(rel_relations, rel_mode) : null)\n }\n return output\n }\n}\n","import { OrangeDatabaseError, OrangeDatabaseInputError } from 'orange-dragonfly-orm'\n\nexport class OrangeDatabaseInputValidationError extends OrangeDatabaseInputError {\n private _info: Record<string, string> = {}\n\n get info(): Record<string, string> {\n return this._info\n }\n\n set info(v: Record<string, string>) {\n this._info = v\n }\n}\n\nexport class OrangeDatabaseModelError extends OrangeDatabaseError {}\n\nexport class OrangeDatabaseModelRuntimeError extends OrangeDatabaseModelError {}\n\nexport class OrangeDatabaseModelAccessError extends OrangeDatabaseModelRuntimeError {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,+BAAoD;AACpD,wCAA+E;;;ACD/E,kCAA8D;AAEvD,IAAM,qCAAN,cAAiD,qDAAyB;AAAA,EACvE,QAAgC,CAAC;AAAA,EAEzC,IAAI,OAA+B;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,KAAK,GAA2B;AAClC,SAAK,QAAQ;AAAA,EACf;AACF;AAEO,IAAM,2BAAN,cAAuC,gDAAoB;AAAC;AAE5D,IAAM,kCAAN,cAA8C,yBAAyB;AAAC;AAExE,IAAM,iCAAN,cAA6C,gCAAgC;AAAC;;;ADTrF,IAAqB,QAArB,cAAmC,0CAAa;AAAA,EAC9C,IAAY,QAAsB;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAW,sBAA+B;AACxC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAA0B;AACnC,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,mBAA+B;AACxC,WAAO,CAAC;AAAA,EACV;AAAA;AAAA,EAGA,WAAW,sBAA+B;AACxC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,WAAW,cAA0B;AACnC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,WAAW,mBAA+B;AACxC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,mBAA2C;AACpD,WAAO;AAAA,MACL,IAAI;AAAA,QACF,UAAU;AAAA,QACV,MAAM;AAAA,QACN,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAoB,iBAA2B;AAC7C,UAAM,QAAQ,KAAK;AACnB,UAAM,SAAmB,CAAC;AAC1B,eAAW,SAAS,CAAC,cAAc,cAAc,YAAY,GAAG;AAC9D,UAAI,OAAO,OAAO,OAAO,KAAK,EAAG,QAAO,KAAK,KAAK;AAAA,IACpD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,wBAAkC;AAC3C,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,wBAAkC;AAC3C,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,wBAAkC;AAC3C,WAAO,CAAC,IAAI,EAAE,OAAO,KAAK,cAAc;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,wBAAkC;AAC3C,WAAO,CAAC,IAAI,EAAE,OAAO,KAAK,cAAc;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,YAAY,MAA+B,aAAiC,MAAmB;AACpG,UAAM,QAAQ,KAAK;AACnB,UAAM,IAAI,cAAc,KAAK,YAAY;AACzC,UAAM,iBAAyC,CAAC;AAChD,eAAW,SAAS,OAAO,KAAK,IAAI,GAAG;AACrC,UAAI,CAAC,OAAO,OAAO,OAAO,KAAK,GAAG;AAChC,YAAI,KAAK,qBAAqB;AAC5B;AAAA,QACF;AACA,cAAM,KAAK,IAAI,mCAAmC,kBAAkB;AACpE,WAAG,KAAK,KAAK,IAAI,UAAU,KAAK,gCAAgC,KAAK,IAAI;AACzE,cAAM;AAAA,MACR;AACA,UAAI,KAAK,sBAAsB,SAAS,KAAK,GAAG;AAC9C,cAAM,KAAK,IAAI,mCAAmC,kBAAkB;AACpE,WAAG,KAAK,KAAK,IAAI,UAAU,KAAK,uCAAuC,KAAK,IAAI;AAChF,cAAM;AAAA,MACR;AACA,QAAE,MAAM,OAAO,KAAK,KAAK,CAAC;AAC1B,YAAM,OAAO,MAAM,KAAK;AACxB,qBAAe,KAAK,IAAI,MAAM,QAAQ,KAAK,KAAK,CAAC,IAAI,EAAE,MAAM,SAAS,UAAU,EAAE,KAAK,KAAK,EAAE,IAAI;AAAA,IACpG;AACA,iDAAM,gBAAgB,MAAM,EAAE,YAAY,MAAM,CAAC;AACjD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,OAAO,MAA+C;AACjE,UAAM,QAAQ,KAAK;AACnB,UAAM,WAAoC,CAAC;AAC3C,eAAW,SAAS,OAAO,KAAK,IAAI,GAAG;AACrC,UAAI,CAAC,OAAO,OAAO,OAAO,KAAK,GAAG;AAChC,YAAI,KAAK,qBAAqB;AAC5B;AAAA,QACF;AACA,cAAM,KAAK,IAAI,mCAAmC,kBAAkB;AACpE,WAAG,KAAK,KAAK,IAAI,UAAU,KAAK,gCAAgC,KAAK,IAAI;AACzE,cAAM;AAAA,MACR;AACA,UAAI,KAAK,sBAAsB,SAAS,KAAK,GAAG;AAC9C,cAAM,KAAK,IAAI,mCAAmC,kBAAkB;AACpE,WAAG,KAAK,KAAK,IAAI,UAAU,KAAK,sCAAsC,KAAK,IAAI;AAC/E,cAAM;AAAA,MACR;AACA,eAAS,KAAK,IAAI,KAAK,KAAK;AAAA,IAC9B;AACA,UAAM,MAAM;AACZ,WAAQ,IAAI,IAAI,QAAQ,EAAG,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,MAA8C;AACzD,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,gCAAgC,kCAAkC;AAAA,IAC9E;AACA,UAAM,MAAM,KAAK;AACjB,UAAM,QAAQ,IAAI;AAClB,UAAM,WAAoC,CAAC;AAC3C,eAAW,SAAS,OAAO,KAAK,IAAI,GAAG;AACrC,UAAI,CAAC,OAAO,OAAO,OAAO,KAAK,GAAG;AAChC,YAAI,IAAI,qBAAqB;AAC3B;AAAA,QACF;AACA,cAAM,KAAK,IAAI,mCAAmC,kBAAkB;AACpE,WAAG,KAAK,KAAK,IAAI,UAAU,KAAK,gCAAgC,IAAI,IAAI;AACxE,cAAM;AAAA,MACR;AACA,UAAI,IAAI,sBAAsB,SAAS,KAAK,GAAG;AAC7C,cAAM,KAAK,IAAI,mCAAmC,kBAAkB;AACpE,WAAG,KAAK,KAAK,IAAI,UAAU,KAAK,sCAAsC,IAAI,IAAI;AAC9E,cAAM;AAAA,MACR;AACA,eAAS,KAAK,IAAI,KAAK,KAAK;AAAA,IAC9B;AACA,WAAO,KAAK,KAAK,QAAQ;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,iBAAiB,OAAO,cAAc,OAAyB;AACnF,UAAM,MAAM,KAAK;AACjB,eAAW,UAAU,IAAI,aAAa;AACpC,UAAI,CAAC,MAAM,KAAK,SAAS,QAAQ,WAAW,GAAG;AAC7C,YAAI,gBAAgB;AAClB,gBAAM,KAAK,IAAI,mCAAmC,sBAAsB;AACxE,qBAAW,SAAS,QAAQ;AAC1B,eAAG,KAAK,KAAK,IAAI;AAAA,UACnB;AACA,gBAAM;AAAA,QACR;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAyB,SAAS,SAAkC;AAClE,UAAM,MAAM,KAAK;AACjB,QAAI,IAAI,qBAAqB;AAC3B,YAAM,QAAQ,IAAI;AAClB,iBAAW,OAAO,OAAO,KAAK,KAAK,IAAI,EAAE,OAAO,OAAK,CAAC,OAAO,OAAO,OAAO,CAAC,CAAC,GAAG;AAC9E,eAAO,KAAK,KAAK,GAAG;AAAA,MACtB;AAAA,IACF;AACA,UAAM,MAAM,SAAS,OAAO;AAC5B,UAAM,KAAK,gBAAgB,MAAM,IAAI;AACrC,UAAM,KAAK,SAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAA4D;AAChE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA0B;AAC9B,UAAM,MAAM,KAAK;AACjB,UAAM,QAAQ,IAAI;AAClB,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,yBAAyB,8CAA8C,IAAI,IAAI,EAAE;AAAA,IAC7F;AACA,eAAW,aAAa,OAAO,KAAK,KAAK,GAAG;AAC1C,UAAI,OAAO,OAAO,KAAK,MAAM,SAAS,GAAG;AACvC,cAAM,OAAO,MAAM,SAAS;AAC5B,YAAI,MAAM,MAAM;AACd,gBAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,IAAK,KAAK,OAAoB,CAAC,KAAK,IAAc;AACvF,cAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,gBAAK,KAAK,KAAK,SAAS,MAAM,KAAO,KAAK,KAAK,SAAS,MAAM,GAAI;AAChE,mBAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,MAAM;AAAA,YAClD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,SAAK,WAAO,yCAAM,OAAO,KAAK,MAAM,EAAE,YAAY,MAAM,CAAC;AACzD,UAAM,2BAA2B,MAAM,KAAK,kBAAkB;AAC9D,QAAI,4BAA4B,OAAO,KAAK,wBAAwB,EAAE,QAAQ;AAC5E,YAAM,KAAK,IAAI,mCAAmC,mBAAmB;AACrE,iBAAW,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,wBAAwB,EAAG,IAAG,KAAK,KAAK,IAAI;AAC1F,YAAM;AAAA,IACR;AACA,UAAM,kBAA4B,CAAC;AACnC,eAAW,YAAY,OAAO,KAAK,IAAI,mBAAmB,GAAG;AAC3D,YAAM,MAAgB,IAAI,oBAAoB,QAAQ;AACtD,UAAI,IAAI,SAAS,UAAU;AACzB,cAAM,OAAQ,IAA8C;AAC5D,YAAI,OAAO,OAAO,KAAK,MAAM,IAAI,KAAM,KAAK,KAAK,IAAI,MAAM,QAAU,KAAK,KAAK,IAAI,MAAM,GAAI;AAC3F,cAAK,MAAM,KAAK,IAAI,UAAU,IAAI,MAAuB,MAAM;AAC7D,4BAAgB,KAAK,IAAI;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AACA,UAAI,gBAAgB,QAAQ;AAC1B,cAAM,KAAK,IAAI,mCAAmC,yBAAyB,IAAI,IAAI,gBAAgB;AACnG,mBAAW,SAAS,gBAAiB,IAAG,KAAK,KAAK,IAAI;AACtD,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,wBAAwB,IAAa,MAAe,OAAsB,MAAsB;AAC3G,UAAM,MAAM,MAAM,KAAK,KAAK,EAAE;AAC9B,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,gCAAgC,GAAG,KAAK,IAAI,KAAK,EAAE,YAAY;AAAA,IAC3E;AACA,QAAI,CAAE,MAAM,IAAI,WAAW,MAAM,IAAI,GAAI;AACvC,YAAM,IAAI,+BAA+B,GAAG,KAAK,IAAI,KAAK,EAAE,qBAAqB,OAAO,QAAQ,IAAI,KAAK,EAAE,EAAE;AAAA,IAC/G;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,MAAe,OAAsB,MAAwB;AAC5E,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAkC;AACpC,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,OAAsB,MAA+B;AAChE,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,qBAA+B,CAAC,GAAG,OAAsB,MAAwC;AACvH,UAAM,SAAS,KAAK,aAAa,IAAI;AACrC,UAAM,MAAM,KAAK;AACjB,eAAW,QAAQ,oBAAoB;AACrC,UAAI,KAAK,MAAM,GAAG,EAAE,SAAS,EAAG;AAChC,UAAI,IAAI,sBAAsB,SAAS,IAAI,GAAG;AAC5C,cAAM,IAAI,yBAAyB,aAAa,IAAI,iDAAiD,IAAI,IAAI,EAAE;AAAA,MACjH;AACA,YAAM,WAAW,MAAM,KAAK,IAAI,IAAI;AACpC,YAAM,WAAW,YAAY,IAAI,IAAI,IAAI,IAAI;AAC7C,YAAM,gBAAgB,mBAAmB,OAAO,OAAK,EAAE,WAAW,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,OAAK,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC;AAChH,aAAO,IAAI,IAAI,EAAE,IAAI,MAAM,QAAQ,QAAQ,IACvC,MAAM,QAAQ,IAAI,SAAS,IAAI,OAAK,EAAE,kBAAkB,eAAe,QAAQ,CAAC,CAAC,IAChF,WAAW,MAAM,SAAS,kBAAkB,eAAe,QAAQ,IAAI;AAAA,IAC9E;AACA,WAAO;AAAA,EACT;AACF;","names":["import_orange_dragonfly_orm"]}
package/dist/index.js CHANGED
@@ -245,7 +245,7 @@ var Model = class extends ActiveRecord {
245
245
  }
246
246
  }
247
247
  }
248
- parse(rules, this.data, { strictMode: false });
248
+ this.data = parse(rules, this.data, { strictMode: false });
249
249
  const custom_validation_errors = await this.custom_validation();
250
250
  if (custom_validation_errors && Object.keys(custom_validation_errors).length) {
251
251
  const ex = new OrangeDatabaseInputValidationError("Validation failed");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/model.ts","../src/errors.ts"],"sourcesContent":["import { ActiveRecord, Relation, SelectQuery } from 'orange-dragonfly-orm'\nimport { parse, type ODValidatorRuleSchema, type ODValidatorRulesSchema } from 'orange-dragonfly-validator'\nimport {\n OrangeDatabaseInputValidationError,\n OrangeDatabaseModelAccessError,\n OrangeDatabaseModelError,\n OrangeDatabaseModelRuntimeError,\n} from './errors'\n\nexport default class Model extends ActiveRecord {\n private get _mCls(): typeof Model {\n return this.constructor as typeof Model\n }\n\n static get ignore_extra_fields(): boolean {\n return false\n }\n\n /**\n * Returns list of unique keys\n * @returns List of unique keys\n */\n static get unique_keys(): string[][] {\n return []\n }\n\n /**\n * Returns list of fulltext indexes\n * @returns List of fulltext indexes\n */\n static get fulltext_indexes(): string[][] {\n return []\n }\n\n /** @deprecated Use `ignore_extra_fields` instead */\n static get IGNORE_EXTRA_FIELDS(): boolean {\n return this.ignore_extra_fields\n }\n\n /** @deprecated Use `unique_keys` instead */\n static get UNIQUE_KEYS(): string[][] {\n return this.unique_keys\n }\n\n /** @deprecated Use `fulltext_indexes` instead */\n static get FULLTEXT_INDEXES(): string[][] {\n return this.fulltext_indexes\n }\n\n /**\n * Returns schema for the model (Orange Dragonfly Validator format)\n */\n static get validation_rules(): ODValidatorRulesSchema {\n return {\n id: {\n required: false,\n type: 'integer',\n min: 1,\n },\n }\n }\n\n /**\n * Overridden method of ActiveRecord. Returns special fields list based on validation rules\n */\n static override get special_fields(): string[] {\n const rules = this.validation_rules\n const fields: string[] = []\n for (const field of ['created_at', 'updated_at', 'deleted_at']) {\n if (Object.hasOwn(rules, field)) fields.push(field)\n }\n return fields\n }\n\n /**\n * Returns list of relations restricted for extended output\n */\n static get restricted_for_output(): string[] {\n return []\n }\n\n /**\n * Returns list of fields restricted for lookup\n */\n static get restricted_for_lookup(): string[] {\n return []\n }\n\n /**\n * Returns list of fields restricted for create method\n */\n static get restricted_for_create(): string[] {\n return ['id'].concat(this.special_fields)\n }\n\n /**\n * Returns list of fields restricted for update method\n */\n static get restricted_for_update(): string[] {\n return ['id'].concat(this.special_fields)\n }\n\n /**\n * Lookup method\n * @param data\n * @param basicQuery Query to be used for adding conditions. By default a new SelectQuery is created.\n */\n static lookupQuery(data: Record<string, unknown>, basicQuery: SelectQuery | null = null): SelectQuery {\n const rules = this.validation_rules\n const q = basicQuery ?? this.selectQuery()\n const filtered_rules: ODValidatorRulesSchema = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (this.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${this.name}`\n throw ex\n }\n if (this.restricted_for_lookup.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for searching model ${this.name}`\n throw ex\n }\n q.where(field, data[field])\n const rule = rules[field] as ODValidatorRuleSchema\n filtered_rules[field] = Array.isArray(data[field]) ? { type: 'array', children: { '*': rule } } : rule\n }\n parse(filtered_rules, data, { strictMode: false })\n return q\n }\n\n /**\n * Creates object\n * @param data\n */\n static async create(data: Record<string, unknown>): Promise<Model> {\n const rules = this.validation_rules\n const new_data: Record<string, unknown> = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (this.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${this.name}`\n throw ex\n }\n if (this.restricted_for_create.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for creating model ${this.name}`\n throw ex\n }\n new_data[field] = data[field]\n }\n const Cls = this as unknown as new (data?: Record<string, unknown>) => Model\n return (new Cls(new_data)).save()\n }\n\n /**\n * Updates object\n * @param data\n */\n async update(data: Record<string, unknown>): Promise<this> {\n if (!this.id) {\n throw new OrangeDatabaseModelRuntimeError('You can update saved object only')\n }\n const cls = this._mCls\n const rules = cls.validation_rules\n const new_data: Record<string, unknown> = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (cls.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${cls.name}`\n throw ex\n }\n if (cls.restricted_for_update.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for updating model ${cls.name}`\n throw ex\n }\n new_data[field] = data[field]\n }\n return this.save(new_data)\n }\n\n /**\n * Checks uniqueness of the object based on unique_keys\n */\n async checkUniqueness(exception_mode = false, ignore_null = false): Promise<boolean> {\n const cls = this._mCls\n for (const fields of cls.unique_keys) {\n if (!await this.isUnique(fields, ignore_null)) {\n if (exception_mode) {\n const ex = new OrangeDatabaseInputValidationError('Object is not unique')\n for (const field of fields) {\n ex.info[field] = 'Part of the unique key'\n }\n throw ex\n }\n return false\n }\n }\n return true\n }\n\n protected override async _preSave(_is_new?: boolean): Promise<void> {\n const cls = this._mCls\n if (cls.ignore_extra_fields) {\n const rules = cls.validation_rules\n for (const key of Object.keys(this.data).filter(v => !Object.hasOwn(rules, v))) {\n delete this.data[key]\n }\n }\n await super._preSave(_is_new)\n await this.checkUniqueness(true, true)\n await this.validate()\n }\n\n /**\n * Performs custom validation - returns null in case of success or an object of validation issues\n */\n async custom_validation(): Promise<Record<string, string> | null> {\n return null\n }\n\n /**\n * Validate object's data\n */\n async validate(): Promise<void> {\n const cls = this._mCls\n const rules = cls.validation_rules\n if (!rules) {\n throw new OrangeDatabaseModelError(`Validation rules are not defined for model ${cls.name}`)\n }\n for (const rule_name of Object.keys(rules)) {\n if (Object.hasOwn(this.data, rule_name)) {\n const rule = rules[rule_name] as ODValidatorRuleSchema\n if (rule?.type) {\n const types = Array.isArray(rule.type) ? (rule.type as string[]) : [rule.type as string]\n if (types.includes('boolean')) {\n if ((this.data[rule_name] === 1) || (this.data[rule_name] === 0)) {\n this.data[rule_name] = this.data[rule_name] === 1\n }\n }\n }\n }\n }\n parse(rules, this.data, { strictMode: false })\n const custom_validation_errors = await this.custom_validation()\n if (custom_validation_errors && Object.keys(custom_validation_errors).length) {\n const ex = new OrangeDatabaseInputValidationError('Validation failed')\n for (const [param, message] of Object.entries(custom_validation_errors)) ex.info[param] = message\n throw ex\n }\n const relation_errors: string[] = []\n for (const rel_name of Object.keys(cls.available_relations)) {\n const rel: Relation = cls.available_relations[rel_name]\n if (rel.mode === 'parent') {\n const aKey = (rel as unknown as { _a_key_by_mode: string })._a_key_by_mode\n if (Object.hasOwn(this.data, aKey) && (this.data[aKey] !== null) && (this.data[aKey] !== 0)) {\n if ((await this.rel(rel_name, true) as Model | null) === null) {\n relation_errors.push(aKey)\n }\n }\n }\n if (relation_errors.length) {\n const ex = new OrangeDatabaseInputValidationError(`Some relations of the ${cls.name} are not found`)\n for (const param of relation_errors) ex.info[param] = 'Parent object not found'\n throw ex\n }\n }\n }\n\n /**\n * Returns object by ID if it exists and accessible by user\n * @param id\n * @param user\n * @param mode\n */\n static async findAndCheckAccessOrDie(id: unknown, user: unknown, mode: string | null = null): Promise<Model> {\n const obj = await this.find(id) as Model | null\n if (!obj) {\n throw new OrangeDatabaseModelRuntimeError(`${this.name} #${id} not found`)\n }\n if (!(await obj.accessible(user, mode))) {\n throw new OrangeDatabaseModelAccessError(`${this.name} #${id} is not accessible${mode ? ` for ${mode}` : ''}`)\n }\n return obj\n }\n\n /**\n * Returns whether the object is accessible by user\n * @param user\n * @param mode\n */\n \n async accessible(user: unknown, mode: string | null = null): Promise<boolean> {\n return mode === null\n }\n\n /**\n * Returns public data of the object\n */\n get output(): Record<string, unknown> {\n return {\n id: this.id,\n }\n }\n\n /**\n * Format output\n * @param mode\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n formatOutput(mode: string | null = null): Record<string, unknown> {\n return this.output\n }\n\n /**\n * Returns public data of the object with relations\n * @param required_relations\n * @param mode\n */\n async getExtendedOutput(required_relations: string[] = [], mode: string | null = null): Promise<Record<string, unknown>> {\n const output = this.formatOutput(mode)\n const cls = this._mCls\n for (const name of required_relations) {\n if (name.split(':').length > 1) continue\n if (cls.restricted_for_output.includes(name)) {\n throw new OrangeDatabaseModelError(`Relation \"${name}\" is not allowed for extended output of model ${cls.name}`)\n }\n const rel_data = await this.rel(name) as Model | Model[] | null\n const rel_mode = `relation:${cls.name}.${name}`\n const rel_relations = required_relations.filter(v => v.startsWith(`${name}:`)).map(v => v.slice(name.length + 1))\n output[`:${name}`] = Array.isArray(rel_data)\n ? await Promise.all(rel_data.map(v => v.getExtendedOutput(rel_relations, rel_mode)))\n : (rel_data ? await rel_data.getExtendedOutput(rel_relations, rel_mode) : null)\n }\n return output\n }\n}\n","import { OrangeDatabaseError, OrangeDatabaseInputError } from 'orange-dragonfly-orm'\n\nexport class OrangeDatabaseInputValidationError extends OrangeDatabaseInputError {\n private _info: Record<string, string> = {}\n\n get info(): Record<string, string> {\n return this._info\n }\n\n set info(v: Record<string, string>) {\n this._info = v\n }\n}\n\nexport class OrangeDatabaseModelError extends OrangeDatabaseError {}\n\nexport class OrangeDatabaseModelRuntimeError extends OrangeDatabaseModelError {}\n\nexport class OrangeDatabaseModelAccessError extends OrangeDatabaseModelRuntimeError {}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/model.ts","../src/errors.ts"],"sourcesContent":["import { ActiveRecord, Relation, SelectQuery } from 'orange-dragonfly-orm'\nimport { parse, type ODValidatorRuleSchema, type ODValidatorRulesSchema } from 'orange-dragonfly-validator'\nimport {\n OrangeDatabaseInputValidationError,\n OrangeDatabaseModelAccessError,\n OrangeDatabaseModelError,\n OrangeDatabaseModelRuntimeError,\n} from './errors'\n\nexport default class Model extends ActiveRecord {\n private get _mCls(): typeof Model {\n return this.constructor as typeof Model\n }\n\n static get ignore_extra_fields(): boolean {\n return false\n }\n\n /**\n * Returns list of unique keys\n * @returns List of unique keys\n */\n static get unique_keys(): string[][] {\n return []\n }\n\n /**\n * Returns list of fulltext indexes\n * @returns List of fulltext indexes\n */\n static get fulltext_indexes(): string[][] {\n return []\n }\n\n /** @deprecated Use `ignore_extra_fields` instead */\n static get IGNORE_EXTRA_FIELDS(): boolean {\n return this.ignore_extra_fields\n }\n\n /** @deprecated Use `unique_keys` instead */\n static get UNIQUE_KEYS(): string[][] {\n return this.unique_keys\n }\n\n /** @deprecated Use `fulltext_indexes` instead */\n static get FULLTEXT_INDEXES(): string[][] {\n return this.fulltext_indexes\n }\n\n /**\n * Returns schema for the model (Orange Dragonfly Validator format)\n */\n static get validation_rules(): ODValidatorRulesSchema {\n return {\n id: {\n required: false,\n type: 'integer',\n min: 1,\n },\n }\n }\n\n /**\n * Overridden method of ActiveRecord. Returns special fields list based on validation rules\n */\n static override get special_fields(): string[] {\n const rules = this.validation_rules\n const fields: string[] = []\n for (const field of ['created_at', 'updated_at', 'deleted_at']) {\n if (Object.hasOwn(rules, field)) fields.push(field)\n }\n return fields\n }\n\n /**\n * Returns list of relations restricted for extended output\n */\n static get restricted_for_output(): string[] {\n return []\n }\n\n /**\n * Returns list of fields restricted for lookup\n */\n static get restricted_for_lookup(): string[] {\n return []\n }\n\n /**\n * Returns list of fields restricted for create method\n */\n static get restricted_for_create(): string[] {\n return ['id'].concat(this.special_fields)\n }\n\n /**\n * Returns list of fields restricted for update method\n */\n static get restricted_for_update(): string[] {\n return ['id'].concat(this.special_fields)\n }\n\n /**\n * Lookup method\n * @param data\n * @param basicQuery Query to be used for adding conditions. By default a new SelectQuery is created.\n */\n static lookupQuery(data: Record<string, unknown>, basicQuery: SelectQuery | null = null): SelectQuery {\n const rules = this.validation_rules\n const q = basicQuery ?? this.selectQuery()\n const filtered_rules: ODValidatorRulesSchema = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (this.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${this.name}`\n throw ex\n }\n if (this.restricted_for_lookup.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for searching model ${this.name}`\n throw ex\n }\n q.where(field, data[field])\n const rule = rules[field] as ODValidatorRuleSchema\n filtered_rules[field] = Array.isArray(data[field]) ? { type: 'array', children: { '*': rule } } : rule\n }\n parse(filtered_rules, data, { strictMode: false })\n return q\n }\n\n /**\n * Creates object\n * @param data\n */\n static async create(data: Record<string, unknown>): Promise<Model> {\n const rules = this.validation_rules\n const new_data: Record<string, unknown> = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (this.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${this.name}`\n throw ex\n }\n if (this.restricted_for_create.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for creating model ${this.name}`\n throw ex\n }\n new_data[field] = data[field]\n }\n const Cls = this as unknown as new (data?: Record<string, unknown>) => Model\n return (new Cls(new_data)).save()\n }\n\n /**\n * Updates object\n * @param data\n */\n async update(data: Record<string, unknown>): Promise<this> {\n if (!this.id) {\n throw new OrangeDatabaseModelRuntimeError('You can update saved object only')\n }\n const cls = this._mCls\n const rules = cls.validation_rules\n const new_data: Record<string, unknown> = {}\n for (const field of Object.keys(data)) {\n if (!Object.hasOwn(rules, field)) {\n if (cls.ignore_extra_fields) {\n continue\n }\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is not described for model ${cls.name}`\n throw ex\n }\n if (cls.restricted_for_update.includes(field)) {\n const ex = new OrangeDatabaseInputValidationError('Parameters error')\n ex.info[field] = `Field \"${field}\" is restricted for updating model ${cls.name}`\n throw ex\n }\n new_data[field] = data[field]\n }\n return this.save(new_data)\n }\n\n /**\n * Checks uniqueness of the object based on unique_keys\n */\n async checkUniqueness(exception_mode = false, ignore_null = false): Promise<boolean> {\n const cls = this._mCls\n for (const fields of cls.unique_keys) {\n if (!await this.isUnique(fields, ignore_null)) {\n if (exception_mode) {\n const ex = new OrangeDatabaseInputValidationError('Object is not unique')\n for (const field of fields) {\n ex.info[field] = 'Part of the unique key'\n }\n throw ex\n }\n return false\n }\n }\n return true\n }\n\n protected override async _preSave(_is_new?: boolean): Promise<void> {\n const cls = this._mCls\n if (cls.ignore_extra_fields) {\n const rules = cls.validation_rules\n for (const key of Object.keys(this.data).filter(v => !Object.hasOwn(rules, v))) {\n delete this.data[key]\n }\n }\n await super._preSave(_is_new)\n await this.checkUniqueness(true, true)\n await this.validate()\n }\n\n /**\n * Performs custom validation - returns null in case of success or an object of validation issues\n */\n async custom_validation(): Promise<Record<string, string> | null> {\n return null\n }\n\n /**\n * Validate object's data\n */\n async validate(): Promise<void> {\n const cls = this._mCls\n const rules = cls.validation_rules\n if (!rules) {\n throw new OrangeDatabaseModelError(`Validation rules are not defined for model ${cls.name}`)\n }\n for (const rule_name of Object.keys(rules)) {\n if (Object.hasOwn(this.data, rule_name)) {\n const rule = rules[rule_name] as ODValidatorRuleSchema\n if (rule?.type) {\n const types = Array.isArray(rule.type) ? (rule.type as string[]) : [rule.type as string]\n if (types.includes('boolean')) {\n if ((this.data[rule_name] === 1) || (this.data[rule_name] === 0)) {\n this.data[rule_name] = this.data[rule_name] === 1\n }\n }\n }\n }\n }\n this.data = parse(rules, this.data, { strictMode: false })\n const custom_validation_errors = await this.custom_validation()\n if (custom_validation_errors && Object.keys(custom_validation_errors).length) {\n const ex = new OrangeDatabaseInputValidationError('Validation failed')\n for (const [param, message] of Object.entries(custom_validation_errors)) ex.info[param] = message\n throw ex\n }\n const relation_errors: string[] = []\n for (const rel_name of Object.keys(cls.available_relations)) {\n const rel: Relation = cls.available_relations[rel_name]\n if (rel.mode === 'parent') {\n const aKey = (rel as unknown as { _a_key_by_mode: string })._a_key_by_mode\n if (Object.hasOwn(this.data, aKey) && (this.data[aKey] !== null) && (this.data[aKey] !== 0)) {\n if ((await this.rel(rel_name, true) as Model | null) === null) {\n relation_errors.push(aKey)\n }\n }\n }\n if (relation_errors.length) {\n const ex = new OrangeDatabaseInputValidationError(`Some relations of the ${cls.name} are not found`)\n for (const param of relation_errors) ex.info[param] = 'Parent object not found'\n throw ex\n }\n }\n }\n\n /**\n * Returns object by ID if it exists and accessible by user\n * @param id\n * @param user\n * @param mode\n */\n static async findAndCheckAccessOrDie(id: unknown, user: unknown, mode: string | null = null): Promise<Model> {\n const obj = await this.find(id) as Model | null\n if (!obj) {\n throw new OrangeDatabaseModelRuntimeError(`${this.name} #${id} not found`)\n }\n if (!(await obj.accessible(user, mode))) {\n throw new OrangeDatabaseModelAccessError(`${this.name} #${id} is not accessible${mode ? ` for ${mode}` : ''}`)\n }\n return obj\n }\n\n /**\n * Returns whether the object is accessible by user\n * @param user\n * @param mode\n */\n \n async accessible(user: unknown, mode: string | null = null): Promise<boolean> {\n return mode === null\n }\n\n /**\n * Returns public data of the object\n */\n get output(): Record<string, unknown> {\n return {\n id: this.id,\n }\n }\n\n /**\n * Format output\n * @param mode\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n formatOutput(mode: string | null = null): Record<string, unknown> {\n return this.output\n }\n\n /**\n * Returns public data of the object with relations\n * @param required_relations\n * @param mode\n */\n async getExtendedOutput(required_relations: string[] = [], mode: string | null = null): Promise<Record<string, unknown>> {\n const output = this.formatOutput(mode)\n const cls = this._mCls\n for (const name of required_relations) {\n if (name.split(':').length > 1) continue\n if (cls.restricted_for_output.includes(name)) {\n throw new OrangeDatabaseModelError(`Relation \"${name}\" is not allowed for extended output of model ${cls.name}`)\n }\n const rel_data = await this.rel(name) as Model | Model[] | null\n const rel_mode = `relation:${cls.name}.${name}`\n const rel_relations = required_relations.filter(v => v.startsWith(`${name}:`)).map(v => v.slice(name.length + 1))\n output[`:${name}`] = Array.isArray(rel_data)\n ? await Promise.all(rel_data.map(v => v.getExtendedOutput(rel_relations, rel_mode)))\n : (rel_data ? await rel_data.getExtendedOutput(rel_relations, rel_mode) : null)\n }\n return output\n }\n}\n","import { OrangeDatabaseError, OrangeDatabaseInputError } from 'orange-dragonfly-orm'\n\nexport class OrangeDatabaseInputValidationError extends OrangeDatabaseInputError {\n private _info: Record<string, string> = {}\n\n get info(): Record<string, string> {\n return this._info\n }\n\n set info(v: Record<string, string>) {\n this._info = v\n }\n}\n\nexport class OrangeDatabaseModelError extends OrangeDatabaseError {}\n\nexport class OrangeDatabaseModelRuntimeError extends OrangeDatabaseModelError {}\n\nexport class OrangeDatabaseModelAccessError extends OrangeDatabaseModelRuntimeError {}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orange-dragonfly-model",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "description": "Orange Dragonfly Model - advanced active record ORM model class for Orange Dragonfly framework",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",