UNPKG

tspace-mysql

Version:

Tspace MySQL is a promise-based ORM for Node.js, designed with modern TypeScript and providing type safety for schema databases.

150 lines (141 loc) 4.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.StoredProcedure = void 0; const DB_1 = require("./DB"); /** * * 'StoredProcedure' is a predefined set of SQL statements stored in the database that you can call (execute) by name. * @generic {Type} TS * @generic {Type} TR * @example import { StoredProcedure } from 'tspace-mysql' type T = { AddUser: { params: { name : string; email: string; } | [string,string]; result: { fieldCount: number; affectedRows: number; insertId: number; info: string; serverStatus: number; warningStatus: number; changedRows: number; } }; GetUser: { params: [number]; result: any[] }, GetUsers: { params: []; result: any[] } }; class MyStore extends StoredProcedure<T> { protected boot(): void { this.createProcedure({ name: 'AddUser', expression: ` CREATE PROCEDURE AddUser(IN name VARCHAR(255), IN email VARCHAR(255)) BEGIN INSERT INTO users (name, email) VALUES (name, email); END; `, synchronize: true }); this.createProcedure({ name: 'GetUsers', expression: ` CREATE PROCEDURE GetUsers() BEGIN SELECT * FROM users LIMIT 5; END; `, synchronize: true }); this.createProcedure({ name: 'GetUser', expression: ` CREATE PROCEDURE GetUser(IN userId INT) BEGIN SELECT * FROM users WHERE id = userId LIMIT 1; END; `, synchronize: true }) } } const storeProcedure = new MyStoredProcedure() storeProcedure.call('AddUser', { name : 'tspace-mysql' , email : 'tspace-mysql@example.com'}) .then(r => console.log(r)) .catch(e => console.log(e)) storeProcedure.call('GetUser',[1]) .then(r => console.log(r)) .catch(e => console.log(e)) storeProcedure.call('GetUsers',[]) .then(r => console.log(r)) .catch(e => console.log(e)) */ class StoredProcedure { APPLY_STORED = new Map(); constructor() { this.boot(); } /** * The 'boot' method is a special method that you can define within a store procedure. * @returns {void} void */ boot() { } /** * The 'createProcedure' method is used create store procedure. * * @param {object} object { name, expression, synchronize } * @property {string?} object.name * @property {string} object.expression * @property {boolean} object.synchronize * @returns {void} */ createProcedure({ name, expression, synchronize }) { const fn = async () => { if (synchronize) { await DB_1.DB.query(`DROP PROCEDURE IF EXISTS ${name}`); } await DB_1.DB.query(expression) .catch(err => { const message = err.message; const exists = String(message).includes(`PROCEDURE ${name} already exists`); if (exists) return; console.log(`\n\x1b[31mFAIL QUERY:\x1b[0m \x1b[33m${expression.trim()};\x1b[0m`); throw err; }); }; this.APPLY_STORED.set(name, fn); } /** * The 'call' method is used create store procedure. * * @param {string} name * @param {object|array} params * @returns {Promise<any>} */ async call(name, params) { const storeProcedure = this.APPLY_STORED.get(name); if (!storeProcedure) throw new Error(`Stored procedure "${String(name)}" not registered.`); await storeProcedure(); const placeholders = Object.keys(params).map(key => `:${key}`); const sql = `CALL ${String(name)}(${placeholders.join(', ')})`; const result = await DB_1.DB.query(sql, params); if (Array.isArray(result) && Array.isArray(result[0])) { return result[0]; } return result; } } exports.StoredProcedure = StoredProcedure; exports.default = StoredProcedure; //# sourceMappingURL=StoredProcedure.js.map