xansql 1.0.8 → 1.0.9
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/core/Xansql.cjs +7 -8
- package/core/Xansql.cjs.map +1 -1
- package/core/Xansql.d.ts +2 -3
- package/core/Xansql.mjs +7 -8
- package/core/Xansql.mjs.map +1 -1
- package/core/classes/ForeignInfo.cjs +3 -2
- package/core/classes/ForeignInfo.cjs.map +1 -1
- package/core/classes/ForeignInfo.d.ts +1 -2
- package/core/classes/ForeignInfo.mjs +3 -2
- package/core/classes/ForeignInfo.mjs.map +1 -1
- package/core/classes/Migration/TableMigration.cjs +24 -15
- package/core/classes/Migration/TableMigration.cjs.map +1 -1
- package/core/classes/Migration/TableMigration.mjs +25 -16
- package/core/classes/Migration/TableMigration.mjs.map +1 -1
- package/core/classes/Migration/index.cjs +13 -10
- package/core/classes/Migration/index.cjs.map +1 -1
- package/core/classes/Migration/index.mjs +14 -11
- package/core/classes/Migration/index.mjs.map +1 -1
- package/core/classes/{ModelFormatter.cjs → ModelFactory.cjs} +82 -56
- package/core/classes/ModelFactory.cjs.map +1 -0
- package/core/classes/{ModelFormatter.d.ts → ModelFactory.d.ts} +7 -2
- package/core/classes/{ModelFormatter.mjs → ModelFactory.mjs} +82 -56
- package/core/classes/ModelFactory.mjs.map +1 -0
- package/core/types.d.ts +1 -1
- package/dialect/MysqlDialect.cjs +7 -4
- package/dialect/MysqlDialect.cjs.map +1 -1
- package/dialect/MysqlDialect.d.ts +7 -4
- package/dialect/MysqlDialect.mjs +7 -4
- package/dialect/MysqlDialect.mjs.map +1 -1
- package/dialect/PostgresDialect.cjs +5 -2
- package/dialect/PostgresDialect.cjs.map +1 -1
- package/dialect/PostgresDialect.d.ts +5 -2
- package/dialect/PostgresDialect.mjs +5 -2
- package/dialect/PostgresDialect.mjs.map +1 -1
- package/dialect/SqliteDialect.cjs +3 -2
- package/dialect/SqliteDialect.cjs.map +1 -1
- package/dialect/SqliteDialect.d.ts +3 -2
- package/dialect/SqliteDialect.mjs +3 -2
- package/dialect/SqliteDialect.mjs.map +1 -1
- package/dialect/XansqlBridge/XansqlBridgeServer.cjs.map +1 -1
- package/dialect/XansqlBridge/XansqlBridgeServer.mjs.map +1 -1
- package/dialect/XansqlBridge/base.cjs +10 -5
- package/dialect/XansqlBridge/base.cjs.map +1 -1
- package/dialect/XansqlBridge/base.mjs +10 -5
- package/dialect/XansqlBridge/base.mjs.map +1 -1
- package/model/Args/WhereArgs.cjs +5 -8
- package/model/Args/WhereArgs.cjs.map +1 -1
- package/model/Args/WhereArgs.mjs +6 -9
- package/model/Args/WhereArgs.mjs.map +1 -1
- package/model/Base.cjs +2 -1
- package/model/Base.cjs.map +1 -1
- package/model/Base.mjs +2 -1
- package/model/Base.mjs.map +1 -1
- package/model/Executer/Aggregate/SelectArgs.cjs +2 -1
- package/model/Executer/Aggregate/SelectArgs.cjs.map +1 -1
- package/model/Executer/Aggregate/SelectArgs.mjs +2 -1
- package/model/Executer/Aggregate/SelectArgs.mjs.map +1 -1
- package/model/Executer/Aggregate/index.cjs +4 -4
- package/model/Executer/Aggregate/index.cjs.map +1 -1
- package/model/Executer/Aggregate/index.mjs +4 -4
- package/model/Executer/Aggregate/index.mjs.map +1 -1
- package/model/Executer/Create/CreateDataArgs.cjs +9 -5
- package/model/Executer/Create/CreateDataArgs.cjs.map +1 -1
- package/model/Executer/Create/CreateDataArgs.mjs +10 -6
- package/model/Executer/Create/CreateDataArgs.mjs.map +1 -1
- package/model/Executer/Create/index.cjs +1 -1
- package/model/Executer/Create/index.cjs.map +1 -1
- package/model/Executer/Create/index.mjs +1 -1
- package/model/Executer/Create/index.mjs.map +1 -1
- package/model/Executer/Delete/index.cjs +2 -1
- package/model/Executer/Delete/index.cjs.map +1 -1
- package/model/Executer/Delete/index.mjs +2 -1
- package/model/Executer/Delete/index.mjs.map +1 -1
- package/model/Executer/Find/SelectArgs.cjs +3 -3
- package/model/Executer/Find/SelectArgs.cjs.map +1 -1
- package/model/Executer/Find/SelectArgs.mjs +3 -3
- package/model/Executer/Find/SelectArgs.mjs.map +1 -1
- package/model/Executer/Update/UpdateDataArgs.cjs +4 -4
- package/model/Executer/Update/UpdateDataArgs.cjs.map +1 -1
- package/model/Executer/Update/UpdateDataArgs.mjs +5 -5
- package/model/Executer/Update/UpdateDataArgs.mjs.map +1 -1
- package/model/Executer/Update/index.cjs +1 -1
- package/model/Executer/Update/index.cjs.map +1 -1
- package/model/Executer/Update/index.mjs +1 -1
- package/model/Executer/Update/index.mjs.map +1 -1
- package/model/include/ValueFormatter.cjs +72 -17
- package/model/include/ValueFormatter.cjs.map +1 -1
- package/model/include/ValueFormatter.d.ts +1 -1
- package/model/include/ValueFormatter.mjs +72 -17
- package/model/include/ValueFormatter.mjs.map +1 -1
- package/model/index.cjs +8 -7
- package/model/index.cjs.map +1 -1
- package/model/index.mjs +8 -7
- package/model/index.mjs.map +1 -1
- package/package.json +12 -7
- package/utils/index.cjs +5 -2
- package/utils/index.cjs.map +1 -1
- package/utils/index.d.ts +2 -1
- package/utils/index.mjs +5 -3
- package/utils/index.mjs.map +1 -1
- package/xt/additional/IP.cjs +22 -0
- package/xt/additional/IP.cjs.map +1 -0
- package/xt/additional/IP.d.ts +6 -0
- package/xt/additional/IP.mjs +20 -0
- package/xt/additional/IP.mjs.map +1 -0
- package/xt/additional/Name.cjs +21 -0
- package/xt/additional/Name.cjs.map +1 -0
- package/xt/additional/Name.d.ts +6 -0
- package/xt/additional/Name.mjs +19 -0
- package/xt/additional/Name.mjs.map +1 -0
- package/xt/additional/Password.cjs +25 -0
- package/xt/additional/Password.cjs.map +1 -0
- package/xt/additional/Password.d.ts +6 -0
- package/xt/additional/Password.mjs +23 -0
- package/xt/additional/Password.mjs.map +1 -0
- package/xt/additional/Phone.cjs +21 -0
- package/xt/additional/Phone.cjs.map +1 -0
- package/xt/additional/Phone.d.ts +6 -0
- package/xt/additional/Phone.mjs +19 -0
- package/xt/additional/Phone.mjs.map +1 -0
- package/xt/additional/Photo.cjs +21 -0
- package/xt/additional/Photo.cjs.map +1 -0
- package/xt/additional/Photo.d.ts +6 -0
- package/xt/additional/Photo.mjs +19 -0
- package/xt/additional/Photo.mjs.map +1 -0
- package/xt/additional/Slug.cjs +21 -0
- package/xt/additional/Slug.cjs.map +1 -0
- package/xt/additional/Slug.d.ts +6 -0
- package/xt/additional/Slug.mjs +19 -0
- package/xt/additional/Slug.mjs.map +1 -0
- package/xt/additional/Url.cjs +26 -0
- package/xt/additional/Url.cjs.map +1 -0
- package/xt/additional/Url.d.ts +6 -0
- package/xt/additional/Url.mjs +24 -0
- package/xt/additional/Url.mjs.map +1 -0
- package/xt/additional/Username.cjs +21 -0
- package/xt/additional/Username.cjs.map +1 -0
- package/xt/additional/Username.d.ts +6 -0
- package/xt/additional/Username.mjs +19 -0
- package/xt/additional/Username.mjs.map +1 -0
- package/xt/fields/Array.cjs +9 -2
- package/xt/fields/Array.cjs.map +1 -1
- package/xt/fields/Array.d.ts +2 -0
- package/xt/fields/Array.mjs +9 -2
- package/xt/fields/Array.mjs.map +1 -1
- package/xt/fields/Boolean.cjs +10 -5
- package/xt/fields/Boolean.cjs.map +1 -1
- package/xt/fields/Boolean.d.ts +2 -0
- package/xt/fields/Boolean.mjs +10 -5
- package/xt/fields/Boolean.mjs.map +1 -1
- package/xt/fields/Date.cjs +12 -12
- package/xt/fields/Date.cjs.map +1 -1
- package/xt/fields/Date.d.ts +2 -0
- package/xt/fields/Date.mjs +12 -12
- package/xt/fields/Date.mjs.map +1 -1
- package/xt/fields/Enum.cjs +10 -4
- package/xt/fields/Enum.cjs.map +1 -1
- package/xt/fields/Enum.d.ts +2 -0
- package/xt/fields/Enum.mjs +10 -4
- package/xt/fields/Enum.mjs.map +1 -1
- package/xt/fields/File.cjs +9 -2
- package/xt/fields/File.cjs.map +1 -1
- package/xt/fields/File.d.ts +2 -0
- package/xt/fields/File.mjs +9 -2
- package/xt/fields/File.mjs.map +1 -1
- package/xt/fields/IDField.cjs +8 -0
- package/xt/fields/IDField.cjs.map +1 -1
- package/xt/fields/IDField.d.ts +2 -0
- package/xt/fields/IDField.mjs +8 -0
- package/xt/fields/IDField.mjs.map +1 -1
- package/xt/fields/Number.cjs +10 -5
- package/xt/fields/Number.cjs.map +1 -1
- package/xt/fields/Number.d.ts +2 -0
- package/xt/fields/Number.mjs +10 -5
- package/xt/fields/Number.mjs.map +1 -1
- package/xt/fields/Object.cjs +10 -5
- package/xt/fields/Object.cjs.map +1 -1
- package/xt/fields/Object.d.ts +2 -0
- package/xt/fields/Object.mjs +10 -5
- package/xt/fields/Object.mjs.map +1 -1
- package/xt/fields/Record.cjs +10 -5
- package/xt/fields/Record.cjs.map +1 -1
- package/xt/fields/Record.d.ts +2 -0
- package/xt/fields/Record.mjs +10 -5
- package/xt/fields/Record.mjs.map +1 -1
- package/xt/fields/Schema.cjs +12 -1
- package/xt/fields/Schema.cjs.map +1 -1
- package/xt/fields/Schema.d.ts +4 -1
- package/xt/fields/Schema.mjs +12 -1
- package/xt/fields/Schema.mjs.map +1 -1
- package/xt/fields/String.cjs +12 -9
- package/xt/fields/String.cjs.map +1 -1
- package/xt/fields/String.d.ts +2 -0
- package/xt/fields/String.mjs +12 -9
- package/xt/fields/String.mjs.map +1 -1
- package/xt/fields/Tuple.cjs +10 -5
- package/xt/fields/Tuple.cjs.map +1 -1
- package/xt/fields/Tuple.d.ts +2 -0
- package/xt/fields/Tuple.mjs +10 -5
- package/xt/fields/Tuple.mjs.map +1 -1
- package/xt/fields/Union.cjs +10 -5
- package/xt/fields/Union.cjs.map +1 -1
- package/xt/fields/Union.d.ts +2 -0
- package/xt/fields/Union.mjs +10 -5
- package/xt/fields/Union.mjs.map +1 -1
- package/xt/index.cjs +16 -100
- package/xt/index.cjs.map +1 -1
- package/xt/index.d.ts +16 -9
- package/xt/index.mjs +16 -100
- package/xt/index.mjs.map +1 -1
- package/core/classes/ModelFormatter.cjs.map +0 -1
- package/core/classes/ModelFormatter.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateDataArgs.cjs","sources":["../../../../src/model/Executer/Create/CreateDataArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport XqlDate from \"../../../xt/fields/Date\"\nimport { isArray, isNumber, isObject } from \"../../../utils\"\nimport ValueFormatter from \"../../include/ValueFormatter\"\nimport { DataArgsType } from \"../../types\"\n\n\ntype DataObject = { [column: string]: any }\ntype RelationObject = {\n [column: string]: {\n data: DataArgsType[],\n foreign: ForeignInfoType\n }\n}\n\ntype Files = {\n [column: string]: File\n}\ntype DataValue = {\n relations: RelationObject\n data: DataObject,\n files: Files\n}\n\nclass CreateDataArgs {\n\n /**\n * Generate SQL for data\n * For create mode: (col1, col2, col3) VALUES (val1, val2, val3)\n * For update mode: col1 = val1, col2 = val2, col3 = val3\n */\n private data: DataObject = {}\n\n private files: Files = {}\n\n /**\n * Get data object\n * format: { col1: val1, col2: val2, col3: val3 }\n */\n private relations: RelationObject = {}\n\n /**\n * Get stack of data and relations for nested create or update\n * format: [{ data: { col1: val1, col2: val2 }, relations: { relation1: data1 }, sql: '(col1, col2) VALUES (val1, val2)' }, ...]\n */\n readonly values: DataValue[] = []\n\n private errors: XansqlError[] = []\n\n\n constructor(model: Model, data: DataArgsType | DataArgsType[]) {\n\n if (Array.isArray(data)) {\n for (let item of data) {\n if (!isObject(item)) {\n throw new XansqlError({\n message: `Invalid data item for model ${model.table}. Expected object, got ${typeof item}`,\n model: model.table\n });\n }\n const dataArgs = new CreateDataArgs(model, item)\n this.values.push(...dataArgs.values)\n }\n } else {\n for (let column in data) {\n const field = model.schema[column]\n let value: any = data[column]\n\n try {\n\n if (Foreign.is(field)) {\n if (Foreign.isSchema(field)) {\n if (isNumber(value)) {\n this.data[column] = value\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key column ${model.table}.${column}. Expected number, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n } else {\n // array of foreign keys\n if (isObject(value) || isArray(value)) {\n const foreign = Foreign.get(model, column)\n let rdatas = isObject(value) ? [value] : value\n\n if (rdatas.length === 0) {\n throw new XansqlError({\n message: `Relation data array for column ${model.table}.${column} cannot be empty.`,\n model: model.table,\n column: column\n });\n }\n\n this.relations[column] = {\n data: rdatas,\n foreign\n }\n } else {\n throw new XansqlError({\n message: `Invalid value for relation column ${model.table}.${column}. Expected object or array, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n }\n } else {\n // check is the field is IDField or created_at or updated_at\n if (model.IDColumn === column || field instanceof XqlDate && (field.meta.update || field.meta.create)) {\n throw new XansqlError({\n message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,\n model: model.table,\n column: column\n });\n }\n if (value instanceof File) {\n this.files[column] = value\n this.data[column] = ''\n ValueFormatter.toSql(model, column, value) // for validation\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, value)\n }\n }\n } catch (error) {\n if (error instanceof XansqlError) {\n this.errors.push(error);\n } else {\n throw error\n }\n }\n }\n\n if (this.errors.length > 0) {\n throw this.errors\n }\n\n /**\n * Auto add missing columns with null value for create mode\n * Auto add updated_at column with current timestamp for update mode\n * Skip foreign key columns which are not optional or nullable in create mode\n * Skip ID column in create mode\n * Skip created_at column in update mode\n * Skip updated_at column in create mode\n * Skip columns which are already set in data\n */\n for (let column in model.schema) {\n if (column in this.data || column === model.IDColumn) continue\n\n const field = model.schema[column]\n if (Foreign.is(field)) {\n // if foreign key is not optional or nullable, throw error\n if (Foreign.isSchema(field) && !(field.meta.optional || field.meta.nullable)) {\n this.errors.push(new XansqlError({\n message: `Foreign key column ${model.table}.${column} is required. Cannot create record without it.`,\n model: model.table,\n column: column\n }))\n }\n continue\n }\n this.data[column] = ValueFormatter.toSql(model, column, null)\n }\n\n // generate sql\n // const keys = Object.keys(this.data)\n // let sql = `(${keys.join(\", \")}) VALUES (${keys.map(k => this.data[k]).join(\", \")})`\n\n this.values.push({\n // sql,\n relations: this.relations,\n data: this.data,\n files: this.files\n })\n }\n }\n}\n\nexport default CreateDataArgs"],"names":["isObject","XansqlError","Foreign","isNumber","isArray","XqlDate","ValueFormatter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CreateDataArgs.cjs","sources":["../../../../src/model/Executer/Create/CreateDataArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport XqlDate from \"../../../xt/fields/Date\"\nimport { iof, isArray, isNumber, isObject } from \"../../../utils\"\nimport ValueFormatter from \"../../include/ValueFormatter\"\nimport { DataArgsType } from \"../../types\"\n\n\ntype DataObject = { [column: string]: any }\ntype RelationObject = {\n [column: string]: {\n data: DataArgsType[],\n foreign: ForeignInfoType\n }\n}\n\ntype Files = {\n [column: string]: File\n}\ntype DataValue = {\n relations: RelationObject\n data: DataObject,\n files: Files\n}\n\nclass CreateDataArgs {\n\n /**\n * Generate SQL for data\n * For create mode: (col1, col2, col3) VALUES (val1, val2, val3)\n * For update mode: col1 = val1, col2 = val2, col3 = val3\n */\n private data: DataObject = {}\n\n private files: Files = {}\n\n /**\n * Get data object\n * format: { col1: val1, col2: val2, col3: val3 }\n */\n private relations: RelationObject = {}\n\n /**\n * Get stack of data and relations for nested create or update\n * format: [{ data: { col1: val1, col2: val2 }, relations: { relation1: data1 }, sql: '(col1, col2) VALUES (val1, val2)' }, ...]\n */\n readonly values: DataValue[] = []\n\n private errors: XansqlError[] = []\n\n\n constructor(model: Model, data: DataArgsType | DataArgsType[]) {\n\n if (Array.isArray(data)) {\n for (let item of data) {\n if (!isObject(item)) {\n throw new XansqlError({\n message: `Invalid data item for model ${model.table}. Expected object, got ${typeof item}`,\n model: model.table\n });\n }\n const dataArgs = new CreateDataArgs(model, item)\n this.values.push(...dataArgs.values)\n }\n } else {\n for (let column in data) {\n const field = model.schema[column]\n let value: any = data[column]\n\n try {\n\n if (Foreign.is(field)) {\n if (Foreign.isSchema(field)) {\n if (isNumber(value)) {\n this.data[column] = value\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key column ${model.table}.${column}. Expected number, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n } else {\n // array of foreign keys\n if (isObject(value) || isArray(value)) {\n const foreign = Foreign.get(model, column)\n let rdatas = isObject(value) ? [value] : value\n\n if (rdatas.length === 0) {\n throw new XansqlError({\n message: `Relation data array for column ${model.table}.${column} cannot be empty.`,\n model: model.table,\n column: column\n });\n }\n\n this.relations[column] = {\n data: rdatas,\n foreign\n }\n } else {\n throw new XansqlError({\n message: `Invalid value for relation column ${model.table}.${column}. Expected object or array, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n }\n } else {\n // check is the field is IDField or created_at or updated_at\n if (model.IDColumn === column || iof(field, XqlDate) && (field.meta.update || (field.meta.create || field.meta.update))) {\n throw new XansqlError({\n message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,\n model: model.table,\n column: column\n });\n }\n if (iof(value, File)) {\n this.files[column] = value\n this.data[column] = ''\n ValueFormatter.toSql(model, column, value) // for validation\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, value)\n }\n }\n } catch (error: any) {\n if (iof(error, XansqlError)) {\n this.errors.push(error);\n } else {\n throw error\n }\n }\n }\n\n if (this.errors.length > 0) {\n throw this.errors\n }\n\n /**\n * Auto add missing columns with null value for create mode\n * Auto add updated_at column with current timestamp for update mode\n * Skip foreign key columns which are not optional or nullable in create mode\n * Skip ID column in create mode\n * Skip created_at column in update mode\n * Skip updated_at column in create mode\n * Skip columns which are already set in data\n */\n for (let column in model.schema) {\n if (column in this.data || column === model.IDColumn) continue\n\n const field = model.schema[column]\n if (Foreign.is(field)) {\n // if foreign key is not optional or nullable, throw error\n if (Foreign.isSchema(field) && !(field.meta.optional || field.meta.nullable)) {\n this.errors.push(new XansqlError({\n message: `Foreign key column ${model.table}.${column} is required. Cannot create record without it.`,\n model: model.table,\n column: column\n }))\n }\n } else if (iof(field, XqlDate) && (field.meta.create || field.meta.update)) {\n this.data[column] = ValueFormatter.toSql(model, column, new Date())\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, null)\n }\n }\n\n // generate sql\n // const keys = Object.keys(this.data)\n // let sql = `(${keys.join(\", \")}) VALUES (${keys.map(k => this.data[k]).join(\", \")})`\n\n this.values.push({\n // sql,\n relations: this.relations,\n data: this.data,\n files: this.files\n })\n }\n }\n}\n\nexport default CreateDataArgs"],"names":["isObject","XansqlError","Foreign","isNumber","isArray","iof","XqlDate","ValueFormatter"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import Foreign from '../../../core/classes/ForeignInfo.mjs';
|
|
2
2
|
import XansqlError from '../../../core/XansqlError.mjs';
|
|
3
3
|
import XqlDate from '../../../xt/fields/Date.mjs';
|
|
4
|
-
import { isObject, isNumber, isArray } from '../../../utils/index.mjs';
|
|
4
|
+
import { isObject, isNumber, isArray, iof } from '../../../utils/index.mjs';
|
|
5
5
|
import ValueFormatter from '../../include/ValueFormatter.mjs';
|
|
6
6
|
|
|
7
7
|
class CreateDataArgs {
|
|
@@ -82,14 +82,14 @@ class CreateDataArgs {
|
|
|
82
82
|
}
|
|
83
83
|
else {
|
|
84
84
|
// check is the field is IDField or created_at or updated_at
|
|
85
|
-
if (model.IDColumn === column || field
|
|
85
|
+
if (model.IDColumn === column || iof(field, XqlDate) && (field.meta.update || (field.meta.create || field.meta.update))) {
|
|
86
86
|
throw new XansqlError({
|
|
87
87
|
message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,
|
|
88
88
|
model: model.table,
|
|
89
89
|
column: column
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
|
-
if (value
|
|
92
|
+
if (iof(value, File)) {
|
|
93
93
|
this.files[column] = value;
|
|
94
94
|
this.data[column] = '';
|
|
95
95
|
ValueFormatter.toSql(model, column, value); // for validation
|
|
@@ -100,7 +100,7 @@ class CreateDataArgs {
|
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
catch (error) {
|
|
103
|
-
if (error
|
|
103
|
+
if (iof(error, XansqlError)) {
|
|
104
104
|
this.errors.push(error);
|
|
105
105
|
}
|
|
106
106
|
else {
|
|
@@ -133,9 +133,13 @@ class CreateDataArgs {
|
|
|
133
133
|
column: column
|
|
134
134
|
}));
|
|
135
135
|
}
|
|
136
|
-
continue;
|
|
137
136
|
}
|
|
138
|
-
|
|
137
|
+
else if (iof(field, XqlDate) && (field.meta.create || field.meta.update)) {
|
|
138
|
+
this.data[column] = ValueFormatter.toSql(model, column, new Date());
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this.data[column] = ValueFormatter.toSql(model, column, null);
|
|
142
|
+
}
|
|
139
143
|
}
|
|
140
144
|
// generate sql
|
|
141
145
|
// const keys = Object.keys(this.data)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateDataArgs.mjs","sources":["../../../../src/model/Executer/Create/CreateDataArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport XqlDate from \"../../../xt/fields/Date\"\nimport { isArray, isNumber, isObject } from \"../../../utils\"\nimport ValueFormatter from \"../../include/ValueFormatter\"\nimport { DataArgsType } from \"../../types\"\n\n\ntype DataObject = { [column: string]: any }\ntype RelationObject = {\n [column: string]: {\n data: DataArgsType[],\n foreign: ForeignInfoType\n }\n}\n\ntype Files = {\n [column: string]: File\n}\ntype DataValue = {\n relations: RelationObject\n data: DataObject,\n files: Files\n}\n\nclass CreateDataArgs {\n\n /**\n * Generate SQL for data\n * For create mode: (col1, col2, col3) VALUES (val1, val2, val3)\n * For update mode: col1 = val1, col2 = val2, col3 = val3\n */\n private data: DataObject = {}\n\n private files: Files = {}\n\n /**\n * Get data object\n * format: { col1: val1, col2: val2, col3: val3 }\n */\n private relations: RelationObject = {}\n\n /**\n * Get stack of data and relations for nested create or update\n * format: [{ data: { col1: val1, col2: val2 }, relations: { relation1: data1 }, sql: '(col1, col2) VALUES (val1, val2)' }, ...]\n */\n readonly values: DataValue[] = []\n\n private errors: XansqlError[] = []\n\n\n constructor(model: Model, data: DataArgsType | DataArgsType[]) {\n\n if (Array.isArray(data)) {\n for (let item of data) {\n if (!isObject(item)) {\n throw new XansqlError({\n message: `Invalid data item for model ${model.table}. Expected object, got ${typeof item}`,\n model: model.table\n });\n }\n const dataArgs = new CreateDataArgs(model, item)\n this.values.push(...dataArgs.values)\n }\n } else {\n for (let column in data) {\n const field = model.schema[column]\n let value: any = data[column]\n\n try {\n\n if (Foreign.is(field)) {\n if (Foreign.isSchema(field)) {\n if (isNumber(value)) {\n this.data[column] = value\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key column ${model.table}.${column}. Expected number, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n } else {\n // array of foreign keys\n if (isObject(value) || isArray(value)) {\n const foreign = Foreign.get(model, column)\n let rdatas = isObject(value) ? [value] : value\n\n if (rdatas.length === 0) {\n throw new XansqlError({\n message: `Relation data array for column ${model.table}.${column} cannot be empty.`,\n model: model.table,\n column: column\n });\n }\n\n this.relations[column] = {\n data: rdatas,\n foreign\n }\n } else {\n throw new XansqlError({\n message: `Invalid value for relation column ${model.table}.${column}. Expected object or array, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n }\n } else {\n // check is the field is IDField or created_at or updated_at\n if (model.IDColumn === column || field instanceof XqlDate && (field.meta.update || field.meta.create)) {\n throw new XansqlError({\n message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,\n model: model.table,\n column: column\n });\n }\n if (value instanceof File) {\n this.files[column] = value\n this.data[column] = ''\n ValueFormatter.toSql(model, column, value) // for validation\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, value)\n }\n }\n } catch (error) {\n if (error instanceof XansqlError) {\n this.errors.push(error);\n } else {\n throw error\n }\n }\n }\n\n if (this.errors.length > 0) {\n throw this.errors\n }\n\n /**\n * Auto add missing columns with null value for create mode\n * Auto add updated_at column with current timestamp for update mode\n * Skip foreign key columns which are not optional or nullable in create mode\n * Skip ID column in create mode\n * Skip created_at column in update mode\n * Skip updated_at column in create mode\n * Skip columns which are already set in data\n */\n for (let column in model.schema) {\n if (column in this.data || column === model.IDColumn) continue\n\n const field = model.schema[column]\n if (Foreign.is(field)) {\n // if foreign key is not optional or nullable, throw error\n if (Foreign.isSchema(field) && !(field.meta.optional || field.meta.nullable)) {\n this.errors.push(new XansqlError({\n message: `Foreign key column ${model.table}.${column} is required. Cannot create record without it.`,\n model: model.table,\n column: column\n }))\n }\n continue\n }\n this.data[column] = ValueFormatter.toSql(model, column, null)\n }\n\n // generate sql\n // const keys = Object.keys(this.data)\n // let sql = `(${keys.join(\", \")}) VALUES (${keys.map(k => this.data[k]).join(\", \")})`\n\n this.values.push({\n // sql,\n relations: this.relations,\n data: this.data,\n files: this.files\n })\n }\n }\n}\n\nexport default CreateDataArgs"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CreateDataArgs.mjs","sources":["../../../../src/model/Executer/Create/CreateDataArgs.ts"],"sourcesContent":["import Model from \"../..\"\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport XqlDate from \"../../../xt/fields/Date\"\nimport { iof, isArray, isNumber, isObject } from \"../../../utils\"\nimport ValueFormatter from \"../../include/ValueFormatter\"\nimport { DataArgsType } from \"../../types\"\n\n\ntype DataObject = { [column: string]: any }\ntype RelationObject = {\n [column: string]: {\n data: DataArgsType[],\n foreign: ForeignInfoType\n }\n}\n\ntype Files = {\n [column: string]: File\n}\ntype DataValue = {\n relations: RelationObject\n data: DataObject,\n files: Files\n}\n\nclass CreateDataArgs {\n\n /**\n * Generate SQL for data\n * For create mode: (col1, col2, col3) VALUES (val1, val2, val3)\n * For update mode: col1 = val1, col2 = val2, col3 = val3\n */\n private data: DataObject = {}\n\n private files: Files = {}\n\n /**\n * Get data object\n * format: { col1: val1, col2: val2, col3: val3 }\n */\n private relations: RelationObject = {}\n\n /**\n * Get stack of data and relations for nested create or update\n * format: [{ data: { col1: val1, col2: val2 }, relations: { relation1: data1 }, sql: '(col1, col2) VALUES (val1, val2)' }, ...]\n */\n readonly values: DataValue[] = []\n\n private errors: XansqlError[] = []\n\n\n constructor(model: Model, data: DataArgsType | DataArgsType[]) {\n\n if (Array.isArray(data)) {\n for (let item of data) {\n if (!isObject(item)) {\n throw new XansqlError({\n message: `Invalid data item for model ${model.table}. Expected object, got ${typeof item}`,\n model: model.table\n });\n }\n const dataArgs = new CreateDataArgs(model, item)\n this.values.push(...dataArgs.values)\n }\n } else {\n for (let column in data) {\n const field = model.schema[column]\n let value: any = data[column]\n\n try {\n\n if (Foreign.is(field)) {\n if (Foreign.isSchema(field)) {\n if (isNumber(value)) {\n this.data[column] = value\n } else {\n throw new XansqlError({\n message: `Invalid value for foreign key column ${model.table}.${column}. Expected number, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n } else {\n // array of foreign keys\n if (isObject(value) || isArray(value)) {\n const foreign = Foreign.get(model, column)\n let rdatas = isObject(value) ? [value] : value\n\n if (rdatas.length === 0) {\n throw new XansqlError({\n message: `Relation data array for column ${model.table}.${column} cannot be empty.`,\n model: model.table,\n column: column\n });\n }\n\n this.relations[column] = {\n data: rdatas,\n foreign\n }\n } else {\n throw new XansqlError({\n message: `Invalid value for relation column ${model.table}.${column}. Expected object or array, got ${typeof value}`,\n model: model.table,\n column: column\n });\n }\n }\n } else {\n // check is the field is IDField or created_at or updated_at\n if (model.IDColumn === column || iof(field, XqlDate) && (field.meta.update || (field.meta.create || field.meta.update))) {\n throw new XansqlError({\n message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,\n model: model.table,\n column: column\n });\n }\n if (iof(value, File)) {\n this.files[column] = value\n this.data[column] = ''\n ValueFormatter.toSql(model, column, value) // for validation\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, value)\n }\n }\n } catch (error: any) {\n if (iof(error, XansqlError)) {\n this.errors.push(error);\n } else {\n throw error\n }\n }\n }\n\n if (this.errors.length > 0) {\n throw this.errors\n }\n\n /**\n * Auto add missing columns with null value for create mode\n * Auto add updated_at column with current timestamp for update mode\n * Skip foreign key columns which are not optional or nullable in create mode\n * Skip ID column in create mode\n * Skip created_at column in update mode\n * Skip updated_at column in create mode\n * Skip columns which are already set in data\n */\n for (let column in model.schema) {\n if (column in this.data || column === model.IDColumn) continue\n\n const field = model.schema[column]\n if (Foreign.is(field)) {\n // if foreign key is not optional or nullable, throw error\n if (Foreign.isSchema(field) && !(field.meta.optional || field.meta.nullable)) {\n this.errors.push(new XansqlError({\n message: `Foreign key column ${model.table}.${column} is required. Cannot create record without it.`,\n model: model.table,\n column: column\n }))\n }\n } else if (iof(field, XqlDate) && (field.meta.create || field.meta.update)) {\n this.data[column] = ValueFormatter.toSql(model, column, new Date())\n } else {\n this.data[column] = ValueFormatter.toSql(model, column, null)\n }\n }\n\n // generate sql\n // const keys = Object.keys(this.data)\n // let sql = `(${keys.join(\", \")}) VALUES (${keys.map(k => this.data[k]).join(\", \")})`\n\n this.values.push({\n // sql,\n relations: this.relations,\n data: this.data,\n files: this.files\n })\n }\n }\n}\n\nexport default CreateDataArgs"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,7 @@ class CreateExecuter {
|
|
|
34
34
|
const keys = Object.keys(arg.data);
|
|
35
35
|
const sql = `INSERT INTO ${model.table} (${keys.join(", ")}) VALUES (${keys.map(k => arg.data[k]).join(", ")})`;
|
|
36
36
|
const created = await model.execute(sql);
|
|
37
|
-
insertId = created.insertId;
|
|
37
|
+
insertId = created === null || created === void 0 ? void 0 : created.insertId;
|
|
38
38
|
}
|
|
39
39
|
catch (error) {
|
|
40
40
|
if (fileColumns.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/model/Executer/Create/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport CreateDataArgs from \"./CreateDataArgs\"\nimport { CreateArgsType } from \"../../types\"\nimport SelectArgs from \"../Find/SelectArgs\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\n\nclass CreateExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n async execute(args: CreateArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const createArgs = new CreateDataArgs(model, args.data)\n
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/model/Executer/Create/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport CreateDataArgs from \"./CreateDataArgs\"\nimport { CreateArgsType } from \"../../types\"\nimport SelectArgs from \"../Find/SelectArgs\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\n\nclass CreateExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n async execute(args: CreateArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const createArgs = new CreateDataArgs(model, args.data)\n\n // only for validation\n if (args.select) new SelectArgs(model, args.select || {})\n\n const insertIds = []\n let results = []\n\n for (let { chunk } of chunkArray(createArgs.values)) {\n for (let arg of chunk) {\n let insertId\n const fileColumns = Object.keys(arg.files)\n const uploadedFileIds: string[] = []\n try {\n\n if (fileColumns.length > 0) {\n for (let file_col of fileColumns) {\n const filemeta = await xansql.uploadFile(arg.files[file_col])\n uploadedFileIds.push(filemeta.fileId)\n arg.data[file_col] = `'${JSON.stringify(filemeta)}'`\n }\n }\n const keys = Object.keys(arg.data)\n const sql = `INSERT INTO ${model.table} (${keys.join(\", \")}) VALUES (${keys.map(k => arg.data[k]).join(\", \")})`\n const created = await model.execute(sql)\n insertId = created?.insertId\n } catch (error: any) {\n if (fileColumns.length > 0) {\n for (let fileId of uploadedFileIds) {\n try {\n await xansql.deleteFile(fileId)\n } catch (error) { }\n }\n throw error\n }\n }\n if (insertId) {\n insertIds.push(insertId)\n results.push({ [model.IDColumn]: insertId })\n\n // execute relations\n for (let rel_column in arg.relations) {\n const relInfo = arg.relations[rel_column]\n const foreign = relInfo.foreign\n const FModel = xansql.getModel(foreign.table)\n for (let relData of relInfo.data) {\n const fdata = {\n ...relData,\n [foreign.column]: insertId\n }\n const rargs = new RelationExecuteArgs({\n data: fdata\n })\n await FModel.create(rargs as any)\n }\n }\n }\n }\n }\n\n if (args.select) {\n results = await model.find({\n where: {\n [model.IDColumn]: insertIds.length === 1 ? insertIds[0] : { in: insertIds }\n },\n limit: \"all\",\n select: args.select\n })\n }\n\n return results\n }\n\n}\n\nexport default CreateExecuter"],"names":["CreateDataArgs","SelectArgs","chunkArray","RelationExecuteArgs"],"mappings":"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"}
|
|
@@ -32,7 +32,7 @@ class CreateExecuter {
|
|
|
32
32
|
const keys = Object.keys(arg.data);
|
|
33
33
|
const sql = `INSERT INTO ${model.table} (${keys.join(", ")}) VALUES (${keys.map(k => arg.data[k]).join(", ")})`;
|
|
34
34
|
const created = await model.execute(sql);
|
|
35
|
-
insertId = created.insertId;
|
|
35
|
+
insertId = created === null || created === void 0 ? void 0 : created.insertId;
|
|
36
36
|
}
|
|
37
37
|
catch (error) {
|
|
38
38
|
if (fileColumns.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Create/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport CreateDataArgs from \"./CreateDataArgs\"\nimport { CreateArgsType } from \"../../types\"\nimport SelectArgs from \"../Find/SelectArgs\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\n\nclass CreateExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n async execute(args: CreateArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const createArgs = new CreateDataArgs(model, args.data)\n
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Create/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport CreateDataArgs from \"./CreateDataArgs\"\nimport { CreateArgsType } from \"../../types\"\nimport SelectArgs from \"../Find/SelectArgs\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\n\nclass CreateExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n async execute(args: CreateArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n const createArgs = new CreateDataArgs(model, args.data)\n\n // only for validation\n if (args.select) new SelectArgs(model, args.select || {})\n\n const insertIds = []\n let results = []\n\n for (let { chunk } of chunkArray(createArgs.values)) {\n for (let arg of chunk) {\n let insertId\n const fileColumns = Object.keys(arg.files)\n const uploadedFileIds: string[] = []\n try {\n\n if (fileColumns.length > 0) {\n for (let file_col of fileColumns) {\n const filemeta = await xansql.uploadFile(arg.files[file_col])\n uploadedFileIds.push(filemeta.fileId)\n arg.data[file_col] = `'${JSON.stringify(filemeta)}'`\n }\n }\n const keys = Object.keys(arg.data)\n const sql = `INSERT INTO ${model.table} (${keys.join(\", \")}) VALUES (${keys.map(k => arg.data[k]).join(\", \")})`\n const created = await model.execute(sql)\n insertId = created?.insertId\n } catch (error: any) {\n if (fileColumns.length > 0) {\n for (let fileId of uploadedFileIds) {\n try {\n await xansql.deleteFile(fileId)\n } catch (error) { }\n }\n throw error\n }\n }\n if (insertId) {\n insertIds.push(insertId)\n results.push({ [model.IDColumn]: insertId })\n\n // execute relations\n for (let rel_column in arg.relations) {\n const relInfo = arg.relations[rel_column]\n const foreign = relInfo.foreign\n const FModel = xansql.getModel(foreign.table)\n for (let relData of relInfo.data) {\n const fdata = {\n ...relData,\n [foreign.column]: insertId\n }\n const rargs = new RelationExecuteArgs({\n data: fdata\n })\n await FModel.create(rargs as any)\n }\n }\n }\n }\n }\n\n if (args.select) {\n results = await model.find({\n where: {\n [model.IDColumn]: insertIds.length === 1 ? insertIds[0] : { in: insertIds }\n },\n limit: \"all\",\n select: args.select\n })\n }\n\n return results\n }\n\n}\n\nexport default CreateExecuter"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ var core_classes_ForeignInfo = require('../../../core/classes/ForeignInfo.cjs');
|
|
|
6
6
|
var xt_fields_File = require('../../../xt/fields/File.cjs');
|
|
7
7
|
var utils_chunker = require('../../../utils/chunker.cjs');
|
|
8
8
|
var core_XansqlError = require('../../../core/XansqlError.cjs');
|
|
9
|
+
var utils_index = require('../../../utils/index.cjs');
|
|
9
10
|
|
|
10
11
|
class DeleteExecuter {
|
|
11
12
|
constructor(model) {
|
|
@@ -24,7 +25,7 @@ class DeleteExecuter {
|
|
|
24
25
|
let foreignFields = {};
|
|
25
26
|
for (let column in model.schema) {
|
|
26
27
|
const field = model.schema[column];
|
|
27
|
-
if (field
|
|
28
|
+
if (utils_index.iof(field, xt_fields_File)) {
|
|
28
29
|
fileColumns.push(column);
|
|
29
30
|
}
|
|
30
31
|
if (core_classes_ForeignInfo.isArray(field)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/model/Executer/Delete/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { DeleteArgsType, WhereArgsType } from \"../../types\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport Foreign from \"../../../core/classes/ForeignInfo\"\nimport XqlFile from \"../../../xt/fields/File\"\nimport { XqlFields } from \"../../../xt/types\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport XansqlError from \"../../../core/XansqlError\"\n\n\nclass DeleteExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n\n async execute(args: DeleteArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/model/Executer/Delete/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { DeleteArgsType, WhereArgsType } from \"../../types\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport Foreign from \"../../../core/classes/ForeignInfo\"\nimport XqlFile from \"../../../xt/fields/File\"\nimport { XqlFields } from \"../../../xt/types\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport { iof } from \"../../../utils\"\n\n\nclass DeleteExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n\n async execute(args: DeleteArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n if (!args.where || Object.keys(args.where).length === 0) {\n throw new XansqlError({\n message: `Delete operation on model ${model.table} requires a WHERE clause to prevent accidental deletion of all records.`,\n model: model.table\n })\n }\n\n let fileColumns: string[] = []\n let foreignFields: { [col: string]: XqlFields } = {}\n\n for (let column in model.schema) {\n const field = model.schema[column]\n if (iof(field, XqlFile)) {\n fileColumns.push(column)\n }\n\n if (Foreign.isArray(field)) {\n foreignFields[column] = field\n }\n }\n\n const results = await model.find({\n where: args.where,\n limit: \"all\",\n select: {\n [model.IDColumn]: true,\n ...(args.select || {})\n }\n })\n\n if (results.length === 0) {\n return []\n }\n\n for (let column in foreignFields) {\n const field = foreignFields[column]\n const meta = field.meta || {}\n const foreign = Foreign.get(model, column)\n const FModel = model.xansql.getModel(foreign.table)\n if (meta.optional || meta.nullable) {\n // update foreign column to null\n await FModel.update(new RelationExecuteArgs({\n data: { [foreign.column]: null },\n where: { [foreign.column]: args.where }\n }) as any)\n } else {\n // delete all foreign rows\n await FModel.delete(new RelationExecuteArgs({\n where: { [foreign.column]: args.where }\n }) as any)\n }\n }\n\n let fileRows: any[] = []\n if (fileColumns.length) {\n let fileWhere: WhereArgsType = [\n ...fileColumns.map(col => ({ [col]: { isNotNull: true } }))\n ]\n if (Array.isArray(args.where)) {\n fileWhere = [...args.where, ...fileWhere]\n } else {\n fileWhere = [args.where, ...fileWhere]\n }\n\n fileRows = await model.find({\n where: fileWhere,\n limit: \"all\",\n select: fileColumns.reduce((acc, col) => {\n acc[col] = true\n return acc\n }, {} as any)\n })\n }\n\n const Where = new WhereArgs(model, args.where)\n const sql = `DELETE FROM ${model.table} ${Where.sql}`.trim()\n const { affectedRows } = await model.execute(sql)\n if (!affectedRows || affectedRows === 0) {\n return []\n }\n\n // delete files\n if (fileColumns.length && fileRows.length) {\n for (let { chunk } of chunkArray(fileRows)) {\n for (let row of chunk) {\n for (let file_col of fileColumns) {\n const filemeta = row[file_col]\n if (filemeta) {\n await xansql.deleteFile(filemeta.fileId)\n }\n }\n }\n }\n }\n\n return results\n }\n}\n\nexport default DeleteExecuter"],"names":["XansqlError","iof","XqlFile","Foreign","RelationExecuteArgs","WhereArgs","chunkArray"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import Foreign from '../../../core/classes/ForeignInfo.mjs';
|
|
|
4
4
|
import XqlFile from '../../../xt/fields/File.mjs';
|
|
5
5
|
import { chunkArray } from '../../../utils/chunker.mjs';
|
|
6
6
|
import XansqlError from '../../../core/XansqlError.mjs';
|
|
7
|
+
import { iof } from '../../../utils/index.mjs';
|
|
7
8
|
|
|
8
9
|
class DeleteExecuter {
|
|
9
10
|
constructor(model) {
|
|
@@ -22,7 +23,7 @@ class DeleteExecuter {
|
|
|
22
23
|
let foreignFields = {};
|
|
23
24
|
for (let column in model.schema) {
|
|
24
25
|
const field = model.schema[column];
|
|
25
|
-
if (field
|
|
26
|
+
if (iof(field, XqlFile)) {
|
|
26
27
|
fileColumns.push(column);
|
|
27
28
|
}
|
|
28
29
|
if (Foreign.isArray(field)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Delete/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { DeleteArgsType, WhereArgsType } from \"../../types\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport Foreign from \"../../../core/classes/ForeignInfo\"\nimport XqlFile from \"../../../xt/fields/File\"\nimport { XqlFields } from \"../../../xt/types\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport XansqlError from \"../../../core/XansqlError\"\n\n\nclass DeleteExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n\n async execute(args: DeleteArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/model/Executer/Delete/index.ts"],"sourcesContent":["import Model from \"../..\"\nimport WhereArgs from \"../../Args/WhereArgs\"\nimport { DeleteArgsType, WhereArgsType } from \"../../types\"\nimport RelationExecuteArgs from \"../../Args/RelationExcuteArgs\"\nimport Foreign from \"../../../core/classes/ForeignInfo\"\nimport XqlFile from \"../../../xt/fields/File\"\nimport { XqlFields } from \"../../../xt/types\"\nimport { chunkArray } from \"../../../utils/chunker\"\nimport XansqlError from \"../../../core/XansqlError\"\nimport { iof } from \"../../../utils\"\n\n\nclass DeleteExecuter {\n model: Model\n constructor(model: Model) {\n this.model = model\n }\n\n async execute(args: DeleteArgsType) {\n const xansql = this.model.xansql\n const model = this.model\n if (!args.where || Object.keys(args.where).length === 0) {\n throw new XansqlError({\n message: `Delete operation on model ${model.table} requires a WHERE clause to prevent accidental deletion of all records.`,\n model: model.table\n })\n }\n\n let fileColumns: string[] = []\n let foreignFields: { [col: string]: XqlFields } = {}\n\n for (let column in model.schema) {\n const field = model.schema[column]\n if (iof(field, XqlFile)) {\n fileColumns.push(column)\n }\n\n if (Foreign.isArray(field)) {\n foreignFields[column] = field\n }\n }\n\n const results = await model.find({\n where: args.where,\n limit: \"all\",\n select: {\n [model.IDColumn]: true,\n ...(args.select || {})\n }\n })\n\n if (results.length === 0) {\n return []\n }\n\n for (let column in foreignFields) {\n const field = foreignFields[column]\n const meta = field.meta || {}\n const foreign = Foreign.get(model, column)\n const FModel = model.xansql.getModel(foreign.table)\n if (meta.optional || meta.nullable) {\n // update foreign column to null\n await FModel.update(new RelationExecuteArgs({\n data: { [foreign.column]: null },\n where: { [foreign.column]: args.where }\n }) as any)\n } else {\n // delete all foreign rows\n await FModel.delete(new RelationExecuteArgs({\n where: { [foreign.column]: args.where }\n }) as any)\n }\n }\n\n let fileRows: any[] = []\n if (fileColumns.length) {\n let fileWhere: WhereArgsType = [\n ...fileColumns.map(col => ({ [col]: { isNotNull: true } }))\n ]\n if (Array.isArray(args.where)) {\n fileWhere = [...args.where, ...fileWhere]\n } else {\n fileWhere = [args.where, ...fileWhere]\n }\n\n fileRows = await model.find({\n where: fileWhere,\n limit: \"all\",\n select: fileColumns.reduce((acc, col) => {\n acc[col] = true\n return acc\n }, {} as any)\n })\n }\n\n const Where = new WhereArgs(model, args.where)\n const sql = `DELETE FROM ${model.table} ${Where.sql}`.trim()\n const { affectedRows } = await model.execute(sql)\n if (!affectedRows || affectedRows === 0) {\n return []\n }\n\n // delete files\n if (fileColumns.length && fileRows.length) {\n for (let { chunk } of chunkArray(fileRows)) {\n for (let row of chunk) {\n for (let file_col of fileColumns) {\n const filemeta = row[file_col]\n if (filemeta) {\n await xansql.deleteFile(filemeta.fileId)\n }\n }\n }\n }\n }\n\n return results\n }\n}\n\nexport default DeleteExecuter"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ var model_Executer_Find_DistinctArgs = require('./DistinctArgs.cjs');
|
|
|
4
4
|
var model_Executer_Find_LimitArgs = require('./LimitArgs.cjs');
|
|
5
5
|
var model_Executer_Find_OrderByArgs = require('./OrderByArgs.cjs');
|
|
6
6
|
var model_Args_WhereArgs = require('../../Args/WhereArgs.cjs');
|
|
7
|
-
var model_include_ValueFormatter = require('../../include/ValueFormatter.cjs');
|
|
8
7
|
var xt_fields_Enum = require('../../../xt/fields/Enum.cjs');
|
|
9
8
|
var xt_fields_Array = require('../../../xt/fields/Array.cjs');
|
|
10
9
|
var xt_fields_Object = require('../../../xt/fields/Object.cjs');
|
|
@@ -14,6 +13,7 @@ var xt_fields_Union = require('../../../xt/fields/Union.cjs');
|
|
|
14
13
|
var core_classes_ForeignInfo = require('../../../core/classes/ForeignInfo.cjs');
|
|
15
14
|
var xt_fields_File = require('../../../xt/fields/File.cjs');
|
|
16
15
|
var core_XansqlError = require('../../../core/XansqlError.cjs');
|
|
16
|
+
var utils_index = require('../../../utils/index.cjs');
|
|
17
17
|
|
|
18
18
|
class SelectArgs {
|
|
19
19
|
constructor(model, args) {
|
|
@@ -52,7 +52,7 @@ class SelectArgs {
|
|
|
52
52
|
column: column
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
const field = model.schema[column];
|
|
56
56
|
let value = args[column];
|
|
57
57
|
if (core_classes_ForeignInfo.is(field)) {
|
|
58
58
|
const relArgs = value === true ? { select: {} } : value;
|
|
@@ -112,7 +112,7 @@ class SelectArgs {
|
|
|
112
112
|
};
|
|
113
113
|
}
|
|
114
114
|
else {
|
|
115
|
-
if (
|
|
115
|
+
if (utils_index.iof(field, xt_fields_File, xt_fields_Enum, xt_fields_Array, xt_fields_Object, xt_fields_Record, xt_fields_Tuple, xt_fields_Union)) {
|
|
116
116
|
this.formatable_columns.push(column);
|
|
117
117
|
}
|
|
118
118
|
this.columns.push(column);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectArgs.cjs","sources":["../../../../src/model/Executer/Find/SelectArgs.ts"],"sourcesContent":["import Model from \"../..\";\nimport { FindArgsAggregate, FindArgsType, SelectArgsType } from \"../../types\";\nimport DistinctArgs from \"./DistinctArgs\";\nimport LimitArgs from \"./LimitArgs\";\nimport OrderByArgs from \"./OrderByArgs\";\nimport WhereArgs from \"../../Args/WhereArgs\";\nimport ValueFormatter from \"../../include/ValueFormatter\";\nimport XqlEnum from \"../../../xt/fields/Enum\";\nimport XqlArray from \"../../../xt/fields/Array\";\nimport XqlObject from \"../../../xt/fields/Object\";\nimport XqlRecord from \"../../../xt/fields/Record\";\nimport XqlTuple from \"../../../xt/fields/Tuple\";\nimport XqlUnion from \"../../../xt/fields/Union\";\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\";\nimport XqlFile from \"../../../xt/fields/File\";\nimport XansqlError from \"../../../core/XansqlError\";\n\nexport type SelectArgsRelationInfo = {\n args: {\n select: {\n sql: string,\n columns: string[],\n formatable_columns: string[],\n relations?: SelectArgsRelations,\n },\n where: string,\n limit: Required<LimitArgs>,\n orderBy: string\n aggregate: FindArgsAggregate,\n },\n foreign: ForeignInfoType\n}\n\ntype SelectArgsRelations = {\n [column: string]: SelectArgsRelationInfo\n}\n\nclass SelectArgs {\n private model: Model\n\n /**\n * Get Columns\n * @description Returns the columns to be selected\n * @returns {string[]} Array of column names\n */\n readonly columns: string[] = []\n\n\n /**\n * Get Formatable Columns\n */\n readonly formatable_columns: string[] = []\n\n /**\n * Get SQL\n * @description Returns the SQL string for the selected columns\n * @returns {string} SQL string for selected columns\n * @example\n * const sql = selectArgs.sql; // returns \"table.column1, table.column2, ...\"\n */\n readonly relations: SelectArgsRelations = {}\n\n\n /**\n * Get Relations\n * @description Returns the relations to be selected\n * @returns {SelectArgsRelations} Object containing relation information\n * @example\n * const relations = selectArgs.relations; // returns { column: { args: FindArgsType, foreign: ForeignInfoType }, ... }\n */\n readonly sql: string = ''\n\n\n constructor(model: Model, args: SelectArgsType) {\n this.model = model\n\n for (let column in args) {\n if (!(column in this.model.schema)) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for select`,\n model: model.table,\n column: column\n });\n }\n\n let field = model.schema[column]\n let value: boolean | FindArgsType = args[column]\n\n if (Foreign.is(field)) {\n\n const relArgs = value === true ? { select: {} } : value as FindArgsType\n\n if (Foreign.isSchema(field)) {\n this.columns.push(column)\n }\n\n const foreign = Foreign.get(model, column)\n const FModel = model.xansql.getModel(foreign.table)\n\n\n // ====== Prepare select args for relation ======\n let fargs: any = {}\n const Select = new SelectArgs(FModel, relArgs.select || {})\n\n // ====== Prevent circular reference ======\n for (let rcol in Select.relations) {\n if (Select.relations[rcol].foreign.table === model.table) {\n throw new XansqlError({\n message: `Circular reference detected in relation ${column} of model ${model.table}`,\n model: model.table,\n column: column\n });\n }\n }\n\n // ====== Make sure main column of relation is selected ======\n\n let columns = Select.columns\n if (!columns.includes(foreign.relation.main)) {\n columns.unshift(foreign.relation.main)\n }\n let sql = Select.sql\n let relcol = `${foreign.table}.${foreign.relation.main}`\n sql = sql.includes(relcol) ? sql : `${sql}, ${relcol}`\n\n fargs.select = {\n sql,\n columns,\n formatable_columns: Select.formatable_columns,\n relations: Select.relations,\n }\n\n // ==== Where =====\n const Where = new WhereArgs(FModel, relArgs.where || {})\n fargs.where = Where.wheres.join(\" AND \")\n\n // ===== OrderBy =====\n fargs.orderBy = (new OrderByArgs(FModel, relArgs.orderBy || {})).sql\n\n // ===== Limit =====\n fargs.limit = new LimitArgs(FModel, relArgs.limit || {})\n\n // ===== Distinct =====\n if (relArgs.distinct) {\n const distinct = new DistinctArgs(FModel, relArgs.distinct || [], Where, relArgs.orderBy)\n if (distinct.sql) {\n fargs.where += fargs.where ? ` AND ${distinct.sql}` : `WHERE ${distinct.sql}`\n }\n }\n\n // ===== Aggregate =====\n if (relArgs.aggregate && Object.keys(relArgs.aggregate).length) {\n fargs.aggregate = relArgs.aggregate\n }\n\n this.relations[column] = {\n args: fargs,\n foreign\n }\n\n } else {\n if (ValueFormatter.iof(model, column, XqlFile, XqlEnum, XqlArray, XqlObject, XqlRecord, XqlTuple, XqlUnion)) {\n this.formatable_columns.push(column)\n }\n this.columns.push(column)\n }\n }\n\n // if no columns are selected, select all columns\n if (this.columns.length === 0) {\n for (let column in model.schema) {\n let field = model.schema[column]\n if (!Foreign.is(field)) {\n this.columns.push(column)\n }\n }\n }\n\n // always include ID column\n if (!this.columns.includes(model.IDColumn)) {\n this.columns.unshift(model.IDColumn)\n }\n\n this.sql = this.columns.map(col => `${this.model.table}.${col}`).join(', ')\n }\n\n\n}\n\nexport default SelectArgs"],"names":["XansqlError","Foreign","WhereArgs","OrderByArgs","LimitArgs","DistinctArgs","ValueFormatter","XqlFile","XqlEnum","XqlArray","XqlObject","XqlRecord","XqlTuple","XqlUnion"],"mappings":";;;;;;;;;;;;;;;;;AAqCA,MAAM,UAAU,CAAA;IAoCb,WAAA,CAAY,KAAY,EAAE,IAAoB,EAAA;AAjC9C;;;;AAIG;QACM,IAAA,CAAA,OAAO,GAAa,EAAE;AAG/B;;AAEG;QACM,IAAA,CAAA,kBAAkB,GAAa,EAAE;AAE1C;;;;;;AAMG;QACM,IAAA,CAAA,SAAS,GAAwB,EAAE;AAG5C;;;;;;AAMG;QACM,IAAA,CAAA,GAAG,GAAW,EAAE;AAItB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAElB,QAAA,KAAK,IAAI,MAAM,IAAI,IAAI,EAAE;YACtB,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;gBACjC,MAAM,IAAIA,gBAAW,CAAC;AACnB,oBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,MAAM,uBAAuB,KAAK,CAAC,KAAK,CAAA,WAAA,CAAa;oBACxE,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,MAAM,EAAE;AACV,iBAAA,CAAC;YACL;YAEA,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;AAChC,YAAA,IAAI,KAAK,GAA2B,IAAI,CAAC,MAAM,CAAC;AAEhD,YAAA,IAAIC,wBAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;AAEpB,gBAAA,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,KAAqB;AAEvE,gBAAA,IAAIA,wBAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC1B,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC5B;gBAEA,MAAM,OAAO,GAAGA,wBAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AAC1C,gBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;;gBAInD,IAAI,KAAK,GAAQ,EAAE;AACnB,gBAAA,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;;AAG3D,gBAAA,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE;AAChC,oBAAA,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;wBACvD,MAAM,IAAID,gBAAW,CAAC;AACnB,4BAAA,OAAO,EAAE,CAAA,wCAAA,EAA2C,MAAM,aAAa,KAAK,CAAC,KAAK,CAAA,CAAE;4BACpF,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,4BAAA,MAAM,EAAE;AACV,yBAAA,CAAC;oBACL;gBACH;;AAIA,gBAAA,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO;AAC5B,gBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;oBAC3C,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACzC;AACA,gBAAA,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG;AACpB,gBAAA,IAAI,MAAM,GAAG,CAAA,EAAG,OAAO,CAAC,KAAK,CAAA,CAAA,EAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;AACxD,gBAAA,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,MAAM,EAAE;gBAEtD,KAAK,CAAC,MAAM,GAAG;oBACZ,GAAG;oBACH,OAAO;oBACP,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;oBAC7C,SAAS,EAAE,MAAM,CAAC,SAAS;iBAC7B;;AAGD,gBAAA,MAAM,KAAK,GAAG,IAAIE,oBAAS,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;gBACxD,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;;AAGxC,gBAAA,KAAK,CAAC,OAAO,GAAG,CAAC,IAAIC,+BAAW,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG;;AAGpE,gBAAA,KAAK,CAAC,KAAK,GAAG,IAAIC,6BAAS,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;;AAGxD,gBAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACnB,oBAAA,MAAM,QAAQ,GAAG,IAAIC,gCAAY,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;AACzF,oBAAA,IAAI,QAAQ,CAAC,GAAG,EAAE;wBACf,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,CAAA,KAAA,EAAQ,QAAQ,CAAC,GAAG,CAAA,CAAE,GAAG,SAAS,QAAQ,CAAC,GAAG,CAAA,CAAE;oBAChF;gBACH;;AAGA,gBAAA,IAAI,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;AAC7D,oBAAA,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS;gBACtC;AAEA,gBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG;AACtB,oBAAA,IAAI,EAAE,KAAK;oBACX;iBACF;YAEJ;iBAAO;gBACJ,IAAIC,4BAAc,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAEC,cAAO,EAAEC,cAAO,EAAEC,eAAQ,EAAEC,gBAAS,EAAEC,gBAAS,EAAEC,eAAQ,EAAEC,eAAQ,CAAC,EAAE;AAC1G,oBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;gBACvC;AACA,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5B;QACH;;QAGA,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5B,YAAA,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;gBAC9B,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;gBAChC,IAAI,CAACZ,wBAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;AACrB,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC5B;YACH;QACH;;AAGA,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9E;AAGF;;;;"}
|
|
1
|
+
{"version":3,"file":"SelectArgs.cjs","sources":["../../../../src/model/Executer/Find/SelectArgs.ts"],"sourcesContent":["import Model from \"../..\";\nimport { FindArgsAggregate, FindArgsType, SelectArgsType } from \"../../types\";\nimport DistinctArgs from \"./DistinctArgs\";\nimport LimitArgs from \"./LimitArgs\";\nimport OrderByArgs from \"./OrderByArgs\";\nimport WhereArgs from \"../../Args/WhereArgs\";\nimport ValueFormatter from \"../../include/ValueFormatter\";\nimport XqlEnum from \"../../../xt/fields/Enum\";\nimport XqlArray from \"../../../xt/fields/Array\";\nimport XqlObject from \"../../../xt/fields/Object\";\nimport XqlRecord from \"../../../xt/fields/Record\";\nimport XqlTuple from \"../../../xt/fields/Tuple\";\nimport XqlUnion from \"../../../xt/fields/Union\";\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\";\nimport XqlFile from \"../../../xt/fields/File\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { iof } from \"../../../utils\";\n\nexport type SelectArgsRelationInfo = {\n args: {\n select: {\n sql: string,\n columns: string[],\n formatable_columns: string[],\n relations?: SelectArgsRelations,\n },\n where: string,\n limit: Required<LimitArgs>,\n orderBy: string\n aggregate: FindArgsAggregate,\n },\n foreign: ForeignInfoType\n}\n\ntype SelectArgsRelations = {\n [column: string]: SelectArgsRelationInfo\n}\n\nclass SelectArgs {\n private model: Model\n\n /**\n * Get Columns\n * @description Returns the columns to be selected\n * @returns {string[]} Array of column names\n */\n readonly columns: string[] = []\n\n\n /**\n * Get Formatable Columns\n */\n readonly formatable_columns: string[] = []\n\n /**\n * Get SQL\n * @description Returns the SQL string for the selected columns\n * @returns {string} SQL string for selected columns\n * @example\n * const sql = selectArgs.sql; // returns \"table.column1, table.column2, ...\"\n */\n readonly relations: SelectArgsRelations = {}\n\n\n /**\n * Get Relations\n * @description Returns the relations to be selected\n * @returns {SelectArgsRelations} Object containing relation information\n * @example\n * const relations = selectArgs.relations; // returns { column: { args: FindArgsType, foreign: ForeignInfoType }, ... }\n */\n readonly sql: string = ''\n\n\n constructor(model: Model, args: SelectArgsType) {\n this.model = model\n\n for (let column in args) {\n if (!(column in this.model.schema)) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for select`,\n model: model.table,\n column: column\n });\n }\n\n const field = model.schema[column]\n let value: boolean | FindArgsType = args[column]\n\n if (Foreign.is(field)) {\n\n const relArgs = value === true ? { select: {} } : value as FindArgsType\n\n if (Foreign.isSchema(field)) {\n this.columns.push(column)\n }\n\n const foreign = Foreign.get(model, column)\n const FModel = model.xansql.getModel(foreign.table)\n\n\n // ====== Prepare select args for relation ======\n let fargs: any = {}\n const Select = new SelectArgs(FModel, relArgs.select || {})\n\n // ====== Prevent circular reference ======\n for (let rcol in Select.relations) {\n if (Select.relations[rcol].foreign.table === model.table) {\n throw new XansqlError({\n message: `Circular reference detected in relation ${column} of model ${model.table}`,\n model: model.table,\n column: column\n });\n }\n }\n\n // ====== Make sure main column of relation is selected ======\n\n let columns = Select.columns\n if (!columns.includes(foreign.relation.main)) {\n columns.unshift(foreign.relation.main)\n }\n let sql = Select.sql\n let relcol = `${foreign.table}.${foreign.relation.main}`\n sql = sql.includes(relcol) ? sql : `${sql}, ${relcol}`\n\n fargs.select = {\n sql,\n columns,\n formatable_columns: Select.formatable_columns,\n relations: Select.relations,\n }\n\n // ==== Where =====\n const Where = new WhereArgs(FModel, relArgs.where || {})\n fargs.where = Where.wheres.join(\" AND \")\n\n // ===== OrderBy =====\n fargs.orderBy = (new OrderByArgs(FModel, relArgs.orderBy || {})).sql\n\n // ===== Limit =====\n fargs.limit = new LimitArgs(FModel, relArgs.limit || {})\n\n // ===== Distinct =====\n if (relArgs.distinct) {\n const distinct = new DistinctArgs(FModel, relArgs.distinct || [], Where, relArgs.orderBy)\n if (distinct.sql) {\n fargs.where += fargs.where ? ` AND ${distinct.sql}` : `WHERE ${distinct.sql}`\n }\n }\n\n // ===== Aggregate =====\n if (relArgs.aggregate && Object.keys(relArgs.aggregate).length) {\n fargs.aggregate = relArgs.aggregate\n }\n\n this.relations[column] = {\n args: fargs,\n foreign\n }\n\n } else {\n if (iof(field, XqlFile, XqlEnum, XqlArray, XqlObject, XqlRecord, XqlTuple, XqlUnion)) {\n this.formatable_columns.push(column)\n }\n this.columns.push(column)\n }\n }\n\n // if no columns are selected, select all columns\n if (this.columns.length === 0) {\n for (let column in model.schema) {\n let field = model.schema[column]\n if (!Foreign.is(field)) {\n this.columns.push(column)\n }\n }\n }\n\n // always include ID column\n if (!this.columns.includes(model.IDColumn)) {\n this.columns.unshift(model.IDColumn)\n }\n\n this.sql = this.columns.map(col => `${this.model.table}.${col}`).join(', ')\n }\n\n\n}\n\nexport default SelectArgs"],"names":["XansqlError","Foreign","WhereArgs","OrderByArgs","LimitArgs","DistinctArgs","iof","XqlFile","XqlEnum","XqlArray","XqlObject","XqlRecord","XqlTuple","XqlUnion"],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@ import DistinctArgs from './DistinctArgs.mjs';
|
|
|
2
2
|
import LimitArgs from './LimitArgs.mjs';
|
|
3
3
|
import OrderByArgs from './OrderByArgs.mjs';
|
|
4
4
|
import WhereArgs from '../../Args/WhereArgs.mjs';
|
|
5
|
-
import ValueFormatter from '../../include/ValueFormatter.mjs';
|
|
6
5
|
import XqlEnum from '../../../xt/fields/Enum.mjs';
|
|
7
6
|
import XqlArray from '../../../xt/fields/Array.mjs';
|
|
8
7
|
import XqlObject from '../../../xt/fields/Object.mjs';
|
|
@@ -12,6 +11,7 @@ import XqlUnion from '../../../xt/fields/Union.mjs';
|
|
|
12
11
|
import Foreign from '../../../core/classes/ForeignInfo.mjs';
|
|
13
12
|
import XqlFile from '../../../xt/fields/File.mjs';
|
|
14
13
|
import XansqlError from '../../../core/XansqlError.mjs';
|
|
14
|
+
import { iof } from '../../../utils/index.mjs';
|
|
15
15
|
|
|
16
16
|
class SelectArgs {
|
|
17
17
|
constructor(model, args) {
|
|
@@ -50,7 +50,7 @@ class SelectArgs {
|
|
|
50
50
|
column: column
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
|
-
|
|
53
|
+
const field = model.schema[column];
|
|
54
54
|
let value = args[column];
|
|
55
55
|
if (Foreign.is(field)) {
|
|
56
56
|
const relArgs = value === true ? { select: {} } : value;
|
|
@@ -110,7 +110,7 @@ class SelectArgs {
|
|
|
110
110
|
};
|
|
111
111
|
}
|
|
112
112
|
else {
|
|
113
|
-
if (
|
|
113
|
+
if (iof(field, XqlFile, XqlEnum, XqlArray, XqlObject, XqlRecord, XqlTuple, XqlUnion)) {
|
|
114
114
|
this.formatable_columns.push(column);
|
|
115
115
|
}
|
|
116
116
|
this.columns.push(column);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectArgs.mjs","sources":["../../../../src/model/Executer/Find/SelectArgs.ts"],"sourcesContent":["import Model from \"../..\";\nimport { FindArgsAggregate, FindArgsType, SelectArgsType } from \"../../types\";\nimport DistinctArgs from \"./DistinctArgs\";\nimport LimitArgs from \"./LimitArgs\";\nimport OrderByArgs from \"./OrderByArgs\";\nimport WhereArgs from \"../../Args/WhereArgs\";\nimport ValueFormatter from \"../../include/ValueFormatter\";\nimport XqlEnum from \"../../../xt/fields/Enum\";\nimport XqlArray from \"../../../xt/fields/Array\";\nimport XqlObject from \"../../../xt/fields/Object\";\nimport XqlRecord from \"../../../xt/fields/Record\";\nimport XqlTuple from \"../../../xt/fields/Tuple\";\nimport XqlUnion from \"../../../xt/fields/Union\";\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\";\nimport XqlFile from \"../../../xt/fields/File\";\nimport XansqlError from \"../../../core/XansqlError\";\n\nexport type SelectArgsRelationInfo = {\n args: {\n select: {\n sql: string,\n columns: string[],\n formatable_columns: string[],\n relations?: SelectArgsRelations,\n },\n where: string,\n limit: Required<LimitArgs>,\n orderBy: string\n aggregate: FindArgsAggregate,\n },\n foreign: ForeignInfoType\n}\n\ntype SelectArgsRelations = {\n [column: string]: SelectArgsRelationInfo\n}\n\nclass SelectArgs {\n private model: Model\n\n /**\n * Get Columns\n * @description Returns the columns to be selected\n * @returns {string[]} Array of column names\n */\n readonly columns: string[] = []\n\n\n /**\n * Get Formatable Columns\n */\n readonly formatable_columns: string[] = []\n\n /**\n * Get SQL\n * @description Returns the SQL string for the selected columns\n * @returns {string} SQL string for selected columns\n * @example\n * const sql = selectArgs.sql; // returns \"table.column1, table.column2, ...\"\n */\n readonly relations: SelectArgsRelations = {}\n\n\n /**\n * Get Relations\n * @description Returns the relations to be selected\n * @returns {SelectArgsRelations} Object containing relation information\n * @example\n * const relations = selectArgs.relations; // returns { column: { args: FindArgsType, foreign: ForeignInfoType }, ... }\n */\n readonly sql: string = ''\n\n\n constructor(model: Model, args: SelectArgsType) {\n this.model = model\n\n for (let column in args) {\n if (!(column in this.model.schema)) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for select`,\n model: model.table,\n column: column\n });\n }\n\n let field = model.schema[column]\n let value: boolean | FindArgsType = args[column]\n\n if (Foreign.is(field)) {\n\n const relArgs = value === true ? { select: {} } : value as FindArgsType\n\n if (Foreign.isSchema(field)) {\n this.columns.push(column)\n }\n\n const foreign = Foreign.get(model, column)\n const FModel = model.xansql.getModel(foreign.table)\n\n\n // ====== Prepare select args for relation ======\n let fargs: any = {}\n const Select = new SelectArgs(FModel, relArgs.select || {})\n\n // ====== Prevent circular reference ======\n for (let rcol in Select.relations) {\n if (Select.relations[rcol].foreign.table === model.table) {\n throw new XansqlError({\n message: `Circular reference detected in relation ${column} of model ${model.table}`,\n model: model.table,\n column: column\n });\n }\n }\n\n // ====== Make sure main column of relation is selected ======\n\n let columns = Select.columns\n if (!columns.includes(foreign.relation.main)) {\n columns.unshift(foreign.relation.main)\n }\n let sql = Select.sql\n let relcol = `${foreign.table}.${foreign.relation.main}`\n sql = sql.includes(relcol) ? sql : `${sql}, ${relcol}`\n\n fargs.select = {\n sql,\n columns,\n formatable_columns: Select.formatable_columns,\n relations: Select.relations,\n }\n\n // ==== Where =====\n const Where = new WhereArgs(FModel, relArgs.where || {})\n fargs.where = Where.wheres.join(\" AND \")\n\n // ===== OrderBy =====\n fargs.orderBy = (new OrderByArgs(FModel, relArgs.orderBy || {})).sql\n\n // ===== Limit =====\n fargs.limit = new LimitArgs(FModel, relArgs.limit || {})\n\n // ===== Distinct =====\n if (relArgs.distinct) {\n const distinct = new DistinctArgs(FModel, relArgs.distinct || [], Where, relArgs.orderBy)\n if (distinct.sql) {\n fargs.where += fargs.where ? ` AND ${distinct.sql}` : `WHERE ${distinct.sql}`\n }\n }\n\n // ===== Aggregate =====\n if (relArgs.aggregate && Object.keys(relArgs.aggregate).length) {\n fargs.aggregate = relArgs.aggregate\n }\n\n this.relations[column] = {\n args: fargs,\n foreign\n }\n\n } else {\n if (ValueFormatter.iof(model, column, XqlFile, XqlEnum, XqlArray, XqlObject, XqlRecord, XqlTuple, XqlUnion)) {\n this.formatable_columns.push(column)\n }\n this.columns.push(column)\n }\n }\n\n // if no columns are selected, select all columns\n if (this.columns.length === 0) {\n for (let column in model.schema) {\n let field = model.schema[column]\n if (!Foreign.is(field)) {\n this.columns.push(column)\n }\n }\n }\n\n // always include ID column\n if (!this.columns.includes(model.IDColumn)) {\n this.columns.unshift(model.IDColumn)\n }\n\n this.sql = this.columns.map(col => `${this.model.table}.${col}`).join(', ')\n }\n\n\n}\n\nexport default SelectArgs"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectArgs.mjs","sources":["../../../../src/model/Executer/Find/SelectArgs.ts"],"sourcesContent":["import Model from \"../..\";\nimport { FindArgsAggregate, FindArgsType, SelectArgsType } from \"../../types\";\nimport DistinctArgs from \"./DistinctArgs\";\nimport LimitArgs from \"./LimitArgs\";\nimport OrderByArgs from \"./OrderByArgs\";\nimport WhereArgs from \"../../Args/WhereArgs\";\nimport ValueFormatter from \"../../include/ValueFormatter\";\nimport XqlEnum from \"../../../xt/fields/Enum\";\nimport XqlArray from \"../../../xt/fields/Array\";\nimport XqlObject from \"../../../xt/fields/Object\";\nimport XqlRecord from \"../../../xt/fields/Record\";\nimport XqlTuple from \"../../../xt/fields/Tuple\";\nimport XqlUnion from \"../../../xt/fields/Union\";\nimport Foreign, { ForeignInfoType } from \"../../../core/classes/ForeignInfo\";\nimport XqlFile from \"../../../xt/fields/File\";\nimport XansqlError from \"../../../core/XansqlError\";\nimport { iof } from \"../../../utils\";\n\nexport type SelectArgsRelationInfo = {\n args: {\n select: {\n sql: string,\n columns: string[],\n formatable_columns: string[],\n relations?: SelectArgsRelations,\n },\n where: string,\n limit: Required<LimitArgs>,\n orderBy: string\n aggregate: FindArgsAggregate,\n },\n foreign: ForeignInfoType\n}\n\ntype SelectArgsRelations = {\n [column: string]: SelectArgsRelationInfo\n}\n\nclass SelectArgs {\n private model: Model\n\n /**\n * Get Columns\n * @description Returns the columns to be selected\n * @returns {string[]} Array of column names\n */\n readonly columns: string[] = []\n\n\n /**\n * Get Formatable Columns\n */\n readonly formatable_columns: string[] = []\n\n /**\n * Get SQL\n * @description Returns the SQL string for the selected columns\n * @returns {string} SQL string for selected columns\n * @example\n * const sql = selectArgs.sql; // returns \"table.column1, table.column2, ...\"\n */\n readonly relations: SelectArgsRelations = {}\n\n\n /**\n * Get Relations\n * @description Returns the relations to be selected\n * @returns {SelectArgsRelations} Object containing relation information\n * @example\n * const relations = selectArgs.relations; // returns { column: { args: FindArgsType, foreign: ForeignInfoType }, ... }\n */\n readonly sql: string = ''\n\n\n constructor(model: Model, args: SelectArgsType) {\n this.model = model\n\n for (let column in args) {\n if (!(column in this.model.schema)) {\n throw new XansqlError({\n message: `Column ${column} not found in model ${model.table} for select`,\n model: model.table,\n column: column\n });\n }\n\n const field = model.schema[column]\n let value: boolean | FindArgsType = args[column]\n\n if (Foreign.is(field)) {\n\n const relArgs = value === true ? { select: {} } : value as FindArgsType\n\n if (Foreign.isSchema(field)) {\n this.columns.push(column)\n }\n\n const foreign = Foreign.get(model, column)\n const FModel = model.xansql.getModel(foreign.table)\n\n\n // ====== Prepare select args for relation ======\n let fargs: any = {}\n const Select = new SelectArgs(FModel, relArgs.select || {})\n\n // ====== Prevent circular reference ======\n for (let rcol in Select.relations) {\n if (Select.relations[rcol].foreign.table === model.table) {\n throw new XansqlError({\n message: `Circular reference detected in relation ${column} of model ${model.table}`,\n model: model.table,\n column: column\n });\n }\n }\n\n // ====== Make sure main column of relation is selected ======\n\n let columns = Select.columns\n if (!columns.includes(foreign.relation.main)) {\n columns.unshift(foreign.relation.main)\n }\n let sql = Select.sql\n let relcol = `${foreign.table}.${foreign.relation.main}`\n sql = sql.includes(relcol) ? sql : `${sql}, ${relcol}`\n\n fargs.select = {\n sql,\n columns,\n formatable_columns: Select.formatable_columns,\n relations: Select.relations,\n }\n\n // ==== Where =====\n const Where = new WhereArgs(FModel, relArgs.where || {})\n fargs.where = Where.wheres.join(\" AND \")\n\n // ===== OrderBy =====\n fargs.orderBy = (new OrderByArgs(FModel, relArgs.orderBy || {})).sql\n\n // ===== Limit =====\n fargs.limit = new LimitArgs(FModel, relArgs.limit || {})\n\n // ===== Distinct =====\n if (relArgs.distinct) {\n const distinct = new DistinctArgs(FModel, relArgs.distinct || [], Where, relArgs.orderBy)\n if (distinct.sql) {\n fargs.where += fargs.where ? ` AND ${distinct.sql}` : `WHERE ${distinct.sql}`\n }\n }\n\n // ===== Aggregate =====\n if (relArgs.aggregate && Object.keys(relArgs.aggregate).length) {\n fargs.aggregate = relArgs.aggregate\n }\n\n this.relations[column] = {\n args: fargs,\n foreign\n }\n\n } else {\n if (iof(field, XqlFile, XqlEnum, XqlArray, XqlObject, XqlRecord, XqlTuple, XqlUnion)) {\n this.formatable_columns.push(column)\n }\n this.columns.push(column)\n }\n }\n\n // if no columns are selected, select all columns\n if (this.columns.length === 0) {\n for (let column in model.schema) {\n let field = model.schema[column]\n if (!Foreign.is(field)) {\n this.columns.push(column)\n }\n }\n }\n\n // always include ID column\n if (!this.columns.includes(model.IDColumn)) {\n this.columns.unshift(model.IDColumn)\n }\n\n this.sql = this.columns.map(col => `${this.model.table}.${col}`).join(', ')\n }\n\n\n}\n\nexport default SelectArgs"],"names":[],"mappings":"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"}
|
|
@@ -84,14 +84,14 @@ class UpdateDataArgs {
|
|
|
84
84
|
}
|
|
85
85
|
else {
|
|
86
86
|
// check is the field is IDField or created_at or updated_at
|
|
87
|
-
if (model.IDColumn === column || field
|
|
87
|
+
if (model.IDColumn === column || utils_index.iof(field, xt_fields_Date) && (field.meta.update || field.meta.create)) {
|
|
88
88
|
throw new core_XansqlError({
|
|
89
89
|
message: `Cannot set value for ${model.table}.${column}. It is automatically managed.`,
|
|
90
90
|
model: model.table,
|
|
91
91
|
column: column
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
|
-
if (value
|
|
94
|
+
if (utils_index.iof(value, File)) {
|
|
95
95
|
this.files[column] = value;
|
|
96
96
|
this.data[column] = "";
|
|
97
97
|
model_include_ValueFormatter.toSql(model, column, value); // for validation
|
|
@@ -102,7 +102,7 @@ class UpdateDataArgs {
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
catch (error) {
|
|
105
|
-
if (error
|
|
105
|
+
if (utils_index.iof(error, core_XansqlError)) {
|
|
106
106
|
this.errors.push(error);
|
|
107
107
|
}
|
|
108
108
|
else {
|
|
@@ -124,7 +124,7 @@ class UpdateDataArgs {
|
|
|
124
124
|
*/
|
|
125
125
|
for (let column in model.schema) {
|
|
126
126
|
const field = model.schema[column];
|
|
127
|
-
if (field
|
|
127
|
+
if (utils_index.iof(field, xt_fields_Date) && field.meta.update) {
|
|
128
128
|
this.data[column] = model_include_ValueFormatter.toSql(model, column, new Date());
|
|
129
129
|
}
|
|
130
130
|
}
|