diff --git a/src/services/mysql.service.ts b/src/services/mysql.service.ts index ffefb4c..8c6c7d3 100644 --- a/src/services/mysql.service.ts +++ b/src/services/mysql.service.ts @@ -7,6 +7,8 @@ import type { IDbUser } from "@interfaces/database/IDbUser"; import type { IDbVehicle } from "@interfaces/database/IDbVehicle"; import mysql, { type Connection, type ConnectionOptions } from "mysql2"; import { Logger } from "tslog"; +import {IUserUpdate} from "@interfaces/services/IUserUpdate"; +import {IDbFactorizeInput, IDbFactorizeOutput} from "@interfaces/database/IDbFactorize"; const access: ConnectionOptions = { host: `${process.env["MYSQL_HOST"]}`, @@ -52,6 +54,40 @@ class MysqlHandler { }); } + /** + * Factorize the input data values into a database query. + * + * @param {IDbFactorizeInput} data - The input data containing values to factorize. + * @return {Promise} - A promise resolving to the factorized output. + */ + factorize(data: IDbFactorizeInput): Promise { + return new Promise((resolve, reject)=>{ + try { + const _sqlQueryKeys = Object.keys(data.values).map((key: string) => `\'${key}\' = ?`) + const values = Object.values(data.values).map((val)=>val) + this.Logger.debug(`\n\n>-> Factorized ${_sqlQueryKeys.length} keys for a prepare Query.\n>-> Action: ${data.actionName}\n`) + const sqlQueryKeys = _sqlQueryKeys.join(', ') + + const factorizedOutput: IDbFactorizeOutput = { + _keysTemplate: sqlQueryKeys, + totalFields: _sqlQueryKeys.length, + _valuesArray: values + } + resolve(factorizedOutput); + } catch (err) { + if (data.throwOnError) throw new Error(`${err}`) + this.Logger.error(`\n|\n${err}\n|`) + reject(`${err}`) + } + }) + } + + /** + * Executes a query using the provided queryString and values. + * @param {string} queryString - The SQL query string to execute. + * @param {Array} values - The values to be inserted into the query. + * @returns {Promise} - A promise that resolves with the query results or rejects with an error. + */ execute( queryString: string, values: Array, @@ -138,38 +174,25 @@ const MySqlService = { /** * Updates a user in the database. * @param {MysqlHandler} handler - The MySQL handler object. - * @param {IDbUser} data - The updated user data. + * @param {IUserUpdate} data - The updated user data. * @returns {Promise} - A promise that resolves to the result of the update operation. * @throws {Error} If an error occurs during the update operation. */ - update(handler: MysqlHandler, data: IDbUser): Promise { + update(handler: MysqlHandler, data: IUserUpdate): Promise { return new Promise((resolve, reject) => { if (!data.id) return reject("Id is undefined"); if (data.id.length !== 36) return reject("Id invalid"); - + if (data.gdpr && typeof data.gdpr !== typeof Date) { + return reject("Invalid gdpr date.") + } try { + const _values = []; const _template = ` - ${data.username ? "`username` = ?," : null} + ${data.username ? "`username` = ?," && _values.push(data.username) as unknown as void : null} ${data.firstname ? "`firstname` = ?," : null} ${data.lastname ? "`lastname` = ?," : null} ${data.dob ? "`dob` = ?," : null} - ${data.email ? "`email` = ?," : null} - ${data.is_mail_verified ? "`is_mail_verified` = ?," : null} - ${data.is_admin ? "`is_admin` = ?," : null} - ${data.gdpr ? "`gdpr` = ?," : null} - ${data.hash ? "`hash` = ?" : null}`; - const _values = [ - data.username, - data.firstname, - data.lastname, - data.dob, - data.email, - data.is_mail_verified, - data.is_admin, - data.gdpr, - data.hash, - data.id, - ]; + ${data.gdpr ? "`gdpr` = ?," : null}` const _sql = `UPDATE "users" SET ${_template} WHERE 'id' = ?`; handler.execute(_sql, _values).then((result) => {