diff --git a/src/services/mysql.service.ts b/src/services/mysql.service.ts index b4bd2a2..aa6e45c 100644 --- a/src/services/mysql.service.ts +++ b/src/services/mysql.service.ts @@ -12,6 +12,7 @@ import type { IDbVehicle } from "@interfaces/database/IDbVehicle"; import type { IUserUpdate } from "@interfaces/services/IUserUpdate"; import mysql, { type Connection, type ConnectionOptions } from "mysql2"; import { Logger } from "tslog"; +import { v4 } from "uuid"; const access: ConnectionOptions = { host: `${process.env["MYSQL_HOST"]}`, @@ -23,7 +24,7 @@ const access: ConnectionOptions = { class MysqlHandler { private readonly handlerName: string; - private Logger: Logger; + Logger: Logger; private Connection: Connection; constructor(handlerName?: string) { @@ -69,19 +70,35 @@ class MysqlHandler { factorize(data: IDbFactorizeInput): Promise { return new Promise((resolve, reject) => { try { + let _id = ""; // @ts-ignore - data.values.id ? delete data.values.id : null; + if (data.values.id) { + // @ts-ignore + _id = data.values.id; + // @ts-ignore + delete data.values.id; + } const _sqlQueryKeys = Object.keys(data.values).map( - (key: string) => `\'${key}\' = ?`, + (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(", "); + if (_id && _id.length > 2) { + this.Logger.trace(`Id post-pushed in factorized data`); + values.push(_id); + } + + const questionMarksFields = Array(values.length) + .fill("?") + .join(", ") + .toString(); const factorizedOutput: IDbFactorizeOutput = { _keysTemplate: sqlQueryKeys, + _questionMarksFields: questionMarksFields, totalFields: _sqlQueryKeys.length, _valuesArray: values, }; @@ -159,27 +176,41 @@ const MySqlService = { if (!data.id) return reject("Id is undefined"); if (data.id.length !== 36) return reject("Id invalid"); - const _sql = - "INSERT INTO `users`(`id`,`username`, `firstname`, `lastname`, `dob`, `email`, `is_mail_verified`, `is_admin`, `gdpr`, `hash`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; - const _values = [ - data.id, - data.username, - data.firstname, - data.lastname, - data.dob, - data.email, - data.is_mail_verified, - data.is_admin, - data.gdpr, - data.hash, - ]; - try { - handler.execute(_sql, _values).then((result) => { - return resolve(result as unknown as IDbStatusResult); + // const _values = [ + // data.id, + // data.username, + // data.firstname, + // data.lastname, + // data.dob, + // data.email, + // data.is_mail_verified, + // data.is_admin, + // data.gdpr, + // data.hash, + // ]; + + handler + .factorize({ + values: data, + actionName: "Inserting new user", + }) + .then((result) => { + const valuesArray = result._valuesArray; + const template = result._keysTemplate; + const _sql = `INSERT INTO users (${template + `, id`}) VALUES(${ + result._questionMarksFields + })`; + + try { + handler.Logger.trace(_sql); + handler.Logger.trace(valuesArray); + handler.execute(_sql, valuesArray).then((result) => { + return resolve(result as unknown as IDbStatusResult); + }); + } catch (err: unknown) { + reject(err as Error); + } }); - } catch (err: unknown) { - reject(err as Error); - } }); }, @@ -215,14 +246,14 @@ const MySqlService = { }); }, - getById(handler: MysqlHandler, userId: string): Promise { + getById(handler: MysqlHandler, userId: string): Promise> { return new Promise((resolve, reject) => { if (userId.length !== 36) return reject("Id invalid"); const _sql = "SELECT * FROM `users` WHERE `id` = ?"; const _values = [userId]; try { handler.execute(_sql, _values).then((result) => { - return resolve(result as unknown as IDbUser); + return resolve(result as unknown as Array); }); } catch (err: unknown) { reject(err as Error); @@ -255,17 +286,17 @@ const MySqlService = { * * @param {MysqlHandler} handler - The MySQL database handler instance. * @param {string} email - The email of the user to retrieve. - * @return {Promise} - A promise that resolves to the retrieved user object. + * @return {Promise>} - A promise that resolves to the retrieved user object. * @throws {Error} - If an error occurs while retrieving the user. */ - getByEmail(handler: MysqlHandler, email: string): Promise { + getByEmail(handler: MysqlHandler, email: string): Promise> { return new Promise((resolve, reject) => { if (!email) return reject("email is undefined"); const _sql = "SELECT * FROM `users` WHERE `email` = ?"; const _values = [email]; try { handler.execute(_sql, _values).then((result) => { - return resolve(result as unknown as IDbUser); + return resolve(result as unknown as Array); }); } catch (err: unknown) { reject(err as Error);