UNPKG

@odyssoft/tsorm

Version:
105 lines (104 loc) 6.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sql = exports.createModel = void 0; const aliasModel_1 = require("./aliasModel"); const utils_1 = require("./utils"); function createModel(name, keys, connection, schema) { var _a; const table = `\`${schema}\`.\`${name}\``; const SQL = sql(table, keys); return _a = class Model { constructor(data) { this.save = (options) => connection.query(SQL.insert(this.data, options)).then(([{ insertId }]) => { // @ts-ignore this.data[(0, utils_1.getIdKey)(keys)] = insertId; return this.data; }); this.data = data; } }, _a.delete = (query, limit) => connection.query(SQL.delete(query, limit)), _a.insert = (data, options) => connection.query(SQL.insert(data, options)), _a.select = (query) => connection.query(SQL.select(query)), _a.truncate = () => connection.query(SQL.truncate()), _a.update = (data, query) => connection.query(SQL.update(data, query)), _a.upsert = (data) => connection.query(SQL.upsert(data)), _a.SQL = () => SQL, _a.as = (alias) => (0, aliasModel_1.aliasModel)(alias, table, keys, connection), _a.create = (data, options) => _a.insert(data, options).then(([{ insertId }]) => (Object.assign(Object.assign({}, data), { [(0, utils_1.getIdKey)(keys)]: insertId }))), _a.createOne = _a.create, _a.createMany = (data, options) => _a.insert(data, options).then(([{ insertId }]) => data.map((item, index) => (Object.assign(Object.assign({}, item), { [(0, utils_1.getIdKey)(keys)]: insertId + index })))), _a.deleteBy = (key, query) => // @ts-ignore _a.delete({ [key]: query }).then(([{ affectedRows }]) => affectedRows), _a.deleteById = (id) => // @ts-ignore _a.delete({ [(0, utils_1.getIdKey)(keys)]: id }).then(([{ affectedRows }]) => affectedRows === 1), _a.deleteOne = (query) => _a.delete(query, 1).then(([{ affectedRows }]) => affectedRows === 1), _a.deleteOneBy = (key, query) => // @ts-ignore _a.delete({ [key]: query }, 1).then(([{ affectedRows }]) => affectedRows === 1), _a.find = (query) => _a.select({ $where: query }).then(([rows]) => rows), _a.findBy = (key, query) => // @ts-ignore _a.select({ $where: { [key]: query } }).then(([rows]) => rows), _a.findById = (id) => // @ts-ignore _a.select({ $where: { [(0, utils_1.getIdKey)(keys)]: id } }).then(([rows]) => rows.length ? rows[0] : null), _a.findOne = (query) => _a.select({ $where: query, $limit: 1 }).then(([rows]) => rows.length ? rows[0] : null), _a.findOneBy = (key, query) => // @ts-ignore _a.select({ $where: { [key]: query }, $limit: 1 }).then(([rows]) => rows.length ? rows[0] : null), _a.insertIgnore = (data) => _a.insert(data, { ignore: true }).then(([{ insertId }]) => Array.isArray(data) ? data.map((item, index) => (Object.assign(Object.assign({}, item), { [(0, utils_1.getIdKey)(keys)]: insertId + index }))) : Object.assign(Object.assign({}, data), { [(0, utils_1.getIdKey)(keys)]: insertId })), _a.upsertOne = (data) => _a.upsert(data).then(([{ affectedRows }]) => affectedRows === 1), _a.upsertMany = (data) => _a.upsert(data).then(([{ affectedRows }]) => affectedRows > 0), _a; } exports.createModel = createModel; function sql(name, keys) { const Keys = Object.keys(keys); return { delete: (query, limit) => `DELETE FROM ${name} WHERE ${(0, utils_1.parseOptions)(query, Keys)}${limit ? ` LIMIT ${limit}` : ''}`, insert(data, options) { const insertKeys = (0, utils_1.getInsertKeys)(data); const insertValues = (0, utils_1.getInsertValues)(data, insertKeys); return `INSERT${(options === null || options === void 0 ? void 0 : options.ignore) ? ' IGNORE' : ''} INTO ${name} (${insertKeys .map((k) => `\`${k}\``) .join(', ')}) ${insertValues}`; }, select(query) { var _a; const sql = [`SELECT ${((_a = query === null || query === void 0 ? void 0 : query.$columns) === null || _a === void 0 ? void 0 : _a.join(', ')) || '*'} FROM ${name}`]; (query === null || query === void 0 ? void 0 : query.$where) && sql.push(`WHERE ${(0, utils_1.parseOptions)(query.$where, Keys)}`); (query === null || query === void 0 ? void 0 : query.$groupBy) && sql.push(`GROUP BY ${Array.isArray(query.$groupBy) ? query.$groupBy.join(', ') : query.$groupBy}`); (query === null || query === void 0 ? void 0 : query.$orderBy) && sql.push(`ORDER BY ${Array.isArray(query.$orderBy) ? query.$orderBy.join(', ') : query.$orderBy}`); (query === null || query === void 0 ? void 0 : query.$limit) && sql.push(`LIMIT ${Array.isArray(query.$limit) ? query.$limit.join(', ') : query.$limit}`); return sql.join(' '); }, truncate: () => `TRUNCATE TABLE ${name}`, update: (data, query) => `UPDATE ${name} SET ${(0, utils_1.parseOptions)(data, Keys).replace(/ AND /g, ', ')} WHERE ${(0, utils_1.parseOptions)(query, Keys)}`, upsert(data) { const insertKeys = (0, utils_1.getInsertKeys)(data); const insertValues = (0, utils_1.getInsertValues)(data, insertKeys); const sql = [ `INSERT INTO ${name} (${insertKeys.map((k) => `\`${k}\``).join(', ')}) ${insertValues}`, ]; Array.isArray(data) && sql.push('AS MANY'); sql.push(`ON DUPLICATE KEY UPDATE`); const rows = []; insertKeys .filter((key) => { var _a; return !((_a = keys[key]) === null || _a === void 0 ? void 0 : _a.primaryKey); }) .forEach((key) => // @ts-ignore rows.push(`\`${key}\` = ${Array.isArray(data) ? `MANY.${key}` : (0, utils_1.formatValue)(data[key])}`)); sql.push(rows.join(', ')); return sql.join(' '); }, }; } exports.sql = sql;