From 69fae2b7804ec0923dc3ba774f490815706ada98 Mon Sep 17 00:00:00 2001 From: Mathis Date: Wed, 24 Apr 2024 15:04:44 +0200 Subject: [PATCH] feat(services): :sparkles: db - user interaction #4 --- src/services/mysql.service.ts | 211 ++++++++++++++++++++-------------- 1 file changed, 125 insertions(+), 86 deletions(-) diff --git a/src/services/mysql.service.ts b/src/services/mysql.service.ts index 7a4cad5..3e9dd8c 100644 --- a/src/services/mysql.service.ts +++ b/src/services/mysql.service.ts @@ -1,14 +1,14 @@ import mysql, {type Connection, type ConnectionOptions} from 'mysql2'; import {Logger} from "tslog"; -// biome-ignore lint/style/useImportType: -import DbUserData from "@interfaces/UserData"; +import type {IDbModel} from "@interfaces/database/IDbModel"; +import type {IDbUser} from "@interfaces/database/IDbUser"; const access: ConnectionOptions = { host: `${process.env["MYSQL_HOST"]}`, port: Number.parseInt(`${process.env["MYSQL_PORT"]}`), user: `${process.env["MYSQL_USER"]}`, - database: `${process.env["MYSQL_USER"]}`, + database: `${process.env["MYSQL_DATABASE"]}`, password: `${process.env["MYSQL_PASS"]}` }; @@ -83,23 +83,32 @@ class MysqlHandler { const MySqlService = { Handler : MysqlHandler, User: { - insert(handler: MysqlHandler, userData: DbUserData) { + + /** + * Insert a user into the database. + * + * @param {MysqlHandler} handler - The MySQL database handler. + * @param {IDbUser} userData - The user data to insert. + * @returns {Promise} A promise that resolves if the user was inserted successfully, or rejects with an error. + * @throws {Error} If an error occurs while executing the query. + */ + insert(handler: MysqlHandler, userData: IDbUser) { return new Promise((resolve, reject) => { - const _now = new Date() - const _sql = "INSERT INTO `users`(`username`, `displayName`, `firstName`, `lastName`, `email`, `passwordHash`, `isAdmin`, `isDisabled`, `dob`, `gdpr`, `iat`, `uat`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + if (!userData.id) return reject('Id is undefined'); + if (userData.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 = [ + userData.id, userData.username, - userData.displayName, - userData.firstName, - userData.lastName, - userData.email, - userData.passwordHash, - userData.isAdmin, - userData.isDisabled, + userData.firstname, + userData.lastname, userData.dob, + userData.email, + userData.is_mail_verified, + userData.is_admin, userData.gdpr, - _now, - _now + userData.hash ] try { resolve(handler.execute(_sql, _values)) @@ -109,101 +118,123 @@ const MySqlService = { }) }, - update(handler: MysqlHandler, userData: DbUserData) { + /** + * Updates user data in the database. + * @param {MysqlHandler} handler - The MySQL handler object. + * @param {IDbUser} userData - The user data to be updated. + * @returns {Promise} - A promise that resolves when the update is successful. + * @throws {Error} - If an error occurs during the update process. + */ + update(handler: MysqlHandler, userData: IDbUser): Promise { return new Promise((resolve, reject) => { + if (!userData.id) return reject('Id is undefined'); + if (userData.id.length !== 36) return reject('Id invalid'); - //@ts-ignore - const _t = ` - ${userData.username ? "`username` = ?," : null} - ${userData.displayName ? "`displayName` = ?," : null} - ${userData.firstName ? "`firstName` = ?," : null}` - - - - - const __sql = "UPDATE `users` SET `lastName` = ?, `email` = ?, `passwordHash` = ?, `isAdmin` = ?, `isDisabled` = ?, `dob` = ?, `gdpr` = ? WHERE `id` = ?"; - const __values = [ - userData.username, - userData.displayName, - userData.firstName, - userData.lastName, - userData.email, - userData.passwordHash, - userData.isAdmin, - userData.isDisabled, - userData.dob, - userData.gdpr - ]; try { - resolve(handler.execute(__sql, __values)); + const _template = ` + ${userData.username ? "`username` = ?," : null} + ${userData.firstname ? "`firstname` = ?," : null} + ${userData.lastname ? "`lastname` = ?," : null} + ${userData.dob ? "`dob` = ?," : null} + ${userData.email ? "`email` = ?," : null} + ${userData.is_mail_verified ? "`is_mail_verified` = ?," : null} + ${userData.is_admin ? "`is_admin` = ?," : null} + ${userData.gdpr ? "`gdpr` = ?," : null} + ${userData.hash ? "`hash` = ?" : null}` + const _values = [ + userData.username, + userData.firstname, + userData.lastname, + userData.dob, + userData.email, + userData.is_mail_verified, + userData.is_admin, + userData.gdpr, + userData.hash, + userData.id + ] + + const _sql = `UPDATE "users" SET ${_template} WHERE 'id' = ?`; + return resolve(handler.execute(_sql, _values)); + } catch (err: unknown) { reject(err as Error); } }); }, - getById(handler: MysqlHandler, userId: string): Promise { + /** + * Retrieves a user from the database based on their ID. + * + * @param {MysqlHandler} handler - The MySQL handler object used to execute the query. + * @param {string} userId - The ID of the user to retrieve from the database. + * + * @return {Promise} - A promise that resolves with the retrieved user object (of type IDbUser). + * - Rejects with an error if the ID is invalid or if an error occurs during the database operation. + */ + getById(handler: MysqlHandler, userId: string): Promise { return new Promise((resolve, reject) => { - const _sql = "SELECT * FROM `users` WHERE `id` = ?"; - const _values = [userId]; - try { - resolve(handler.execute(_sql, _values) as unknown as DbUserData); - } catch (err: unknown) { - reject(err as Error); - } + if (userId.length !== 36) return reject('Id invalid'); + const _sql = "SELECT * FROM `users` WHERE `id` = ?"; + const _values = [userId]; + try { + resolve(handler.execute(_sql, _values) as unknown as IDbUser); + } catch (err: unknown) { + reject(err as Error); + } }); }, - getAll(handler: MysqlHandler): Promise> { - return new Promise((resolve, reject) => { - const _sql = "SELECT * FROM `users`"; - try { - return resolve(handler.query(_sql) as unknown as Array); - } catch (err: unknown) { - return reject(); - } - }); - }, + /** + * Retrieves all users from the database. + * + * @param {MysqlHandler} handler - The MySQL handler object used to query the database. + * @return {Promise>} - A promise that resolves with an array of user objects from the database. + * @throws {Error} - If an error occurs while querying the database. + */ + getAll(handler: MysqlHandler): Promise> { + return new Promise((resolve, reject) => { + const _sql = "SELECT * FROM `users`"; + try { + resolve(handler.query(_sql) as unknown as Array); + } catch (err: unknown) { + reject(err as Error); + } + }); + }, - getByUsername(handler: MysqlHandler, username: string) { - return new Promise((resolve, reject) => { - const _sql = "SELECT * FROM `users` WHERE `username` = ?"; - const _values = [username]; - try { - resolve(handler.execute(_sql, _values)); - } catch (err: unknown) { - reject(err as Error); - } - }); - }, - - getByEmail(handler: MysqlHandler, email: string) { + /** + * Retrieves a user from the database by email. + * + * @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. + * @throws {Error} - If an error occurs while retrieving the user. + */ + 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 { - resolve(handler.execute(_sql, _values)); - } catch (err: unknown) { - reject(err as Error); - } - }); - }, - - getByDisplayName(handler: MysqlHandler, displayName: string) { - return new Promise((resolve, reject) => { - const _sql = "SELECT * FROM `users` WHERE `displayName` = ?"; - const _values = [displayName]; - try { - resolve(handler.execute(_sql, _values)); + resolve(handler.execute(_sql, _values) as unknown as IDbUser); } catch (err: unknown) { reject(err as Error); } }); }, + /** + * Retrieves the admin state for a given user ID. + * + * @param {MysqlHandler} handler - The MySQL handler object used for executing the query. + * @param {string} userId - The ID of the user to get the admin state for. + * @return {Promise} A Promise that resolves to a boolean value indicating whether the user is an admin or not. + * @throws {Error} if an error occurs during the execution of the query. + */ getAdminStateForId(handler: MysqlHandler, userId: string) : Promise { return new Promise((resolve, reject) => { - const _sql = "SELECT `isAdmin` FROM `users` WHERE `id` = ?"; + const _sql = "SELECT `is_admin` FROM `users` WHERE `id` = ?"; const _values = [userId]; try { const isAdmin = handler.execute(_sql, _values) @@ -217,8 +248,16 @@ const MySqlService = { }); }, - delete(handler: MysqlHandler, userId: string) { + /** + * Deletes a user from the database. + * @param {MysqlHandler} handler - The MySQL handler object. + * @param {string} userId - The ID of the user to delete. + * @return {Promise} - A Promise that resolves when the deletion is successful, or rejects with an error. + */ + delete(handler: MysqlHandler, userId: string): Promise { return new Promise((resolve, reject) => { + if (!userId) return reject('Id is undefined'); + if (userId.length !== 36) return reject('Id invalid'); const _sql = "DELETE FROM `users` WHERE `id` = ?"; const _values = [userId]; try { @@ -228,7 +267,7 @@ const MySqlService = { } }); } - }, + } } export default MySqlService \ No newline at end of file