@odyssoft/tsorm
Version:
TypeScript ORM for MySQL
105 lines (104 loc) • 6.29 kB
JavaScript
;
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;