feat(services): add memory usage info, update user, enhance log and register function

- Added log for loaded services
- Implemented feature to update user in MySQL service
- Added memory usage information in the server start log
- Enhanced registration function in user service to provide more detailed response and log information
- Minor code formatting improvements

Issue: #18
Signed-off-by: Mathis <yidhra@tuta.io>
This commit is contained in:
Mathis H (Avnyr) 2024-04-30 14:08:00 +02:00
parent 3232e5fac1
commit 0635c512cc
Signed by: Mathis
GPG Key ID: DD9E0666A747D126
7 changed files with 61 additions and 27 deletions

View File

@ -43,7 +43,7 @@ try {
app.use("/auth", AuthRouter); app.use("/auth", AuthRouter);
app.use("/catalog", CatalogRouter); app.use("/catalog", CatalogRouter);
app.use("/rent", RentRouter); app.use("/rent", RentRouter);
logger.info("Routers loaded !"); logger.info("Routers loaded !\n");
} catch (err) { } catch (err) {
logger.error(err); logger.error(err);
throw null; throw null;
@ -51,7 +51,13 @@ try {
try { try {
app.listen(process.env["APP_PORT"]); app.listen(process.env["APP_PORT"]);
logger.info("Server is running !"); logger.info(
`Server is running !\n >> Memory total: ${
process.memoryUsage().rss / 1_000_000
} Mio\n >> Memory heap usage: ${
process.memoryUsage().heapUsed / 1_000_000
} Mio\n\n`,
);
} catch (error) { } catch (error) {
logger.error(`Server failed to start: ${error}`); logger.error(`Server failed to start: ${error}`);
process.exit(1); process.exit(1);

View File

@ -168,6 +168,8 @@ async function deleteBrand(brandId: string): Promise<boolean> {
return true; return true;
} }
logger.debug("Service loaded.");
const BrandService = { const BrandService = {
create: createBrand, create: createBrand,
update: updateBrand, update: updateBrand,

View File

@ -127,6 +127,8 @@ async function deleteCategory(id: string): Promise<unknown> {
} }
} }
logger.debug("Service loaded.");
const CategoryService = { const CategoryService = {
create: createCategory, create: createCategory,
delete: deleteCategory, delete: deleteCategory,

View File

@ -64,6 +64,8 @@ async function JwtSignService(
.sign(new TextEncoder().encode(`${process.env["JWT_SECRET"]}`)); .sign(new TextEncoder().encode(`${process.env["JWT_SECRET"]}`));
} }
logger.debug("Service loaded.");
const JwtService = { const JwtService = {
verify: JwtVerifyService, verify: JwtVerifyService,
sign: JwtSignService, sign: JwtSignService,

View File

@ -135,6 +135,8 @@ async function getAllModels(): Promise<IDbModel[] | null> {
} }
} }
logger.debug("Service loaded.");
/** /**
* ModelService is responsible for managing models. * ModelService is responsible for managing models.
* @namespace * @namespace

View File

@ -135,6 +135,13 @@ const MySqlService = {
}); });
}, },
/**
* Updates a user in the database.
* @param {MysqlHandler} handler - The MySQL handler object.
* @param {IDbUser} data - The updated user data.
* @returns {Promise<IDbStatusResult>} - 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<IDbStatusResult> { update(handler: MysqlHandler, data: IDbUser): Promise<IDbStatusResult> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!data.id) return reject("Id is undefined"); if (!data.id) return reject("Id is undefined");

View File

@ -1,14 +1,13 @@
import type {IDbUser} from "@interfaces/database/IDbUser"; import type { IDbUser } from "@interfaces/database/IDbUser";
import type {IReqLogin} from "@interfaces/requests/IReqLogin"; import type { IReqLogin } from "@interfaces/requests/IReqLogin";
import type {IReqRegister} from "@interfaces/requests/IReqRegister"; import type { IReqRegister } from "@interfaces/requests/IReqRegister";
import {ErrorType, type ISError} from "@interfaces/services/ISError"; import { ErrorType, type ISError } from "@interfaces/services/ISError";
import CredentialService from "@services/credential.service"; import CredentialService from "@services/credential.service";
import JwtService from "@services/jwt.service"; import JwtService from "@services/jwt.service";
import MySqlService from "@services/mysql.service"; import MySqlService from "@services/mysql.service";
import MysqlService from "@services/mysql.service"; import MysqlService from "@services/mysql.service";
import {Logger} from "tslog"; import { Logger } from "tslog";
import {v4} from "uuid"; import { v4 } from "uuid";
const logger = new Logger({ const logger = new Logger({
name: "UserService", name: "UserService",
@ -77,17 +76,18 @@ async function getUserFromIdService(id: string): Promise<IDbUser | ISError> {
} }
} }
async function register(ReqData: IReqRegister): Promise<ISError | string> { async function register(inputData: IReqRegister): Promise<ISError | string> {
if (ReqData.password.length < 6) { if (inputData.password.length < 6) {
return { return {
error: ErrorType.InvalidData, error: ErrorType.InvalidData,
message: "Password must be at least 6 characters long.", message: "Password must be at least 6 characters long.",
}; };
} }
const passwordHash = await CredentialService.hash(`${ReqData.password}`); //TODO check Object content keys
const passwordHash = await CredentialService.hash(`${inputData.password}`);
// Does the new user has accepted GDPR ? // Does the new user has accepted GDPR ?
if (ReqData.gdpr !== true) { if (inputData.gdpr !== true) {
return { return {
error: ErrorType.InvalidData, error: ErrorType.InvalidData,
message: "GDPR acceptance is required.", message: "GDPR acceptance is required.",
@ -96,32 +96,44 @@ async function register(ReqData: IReqRegister): Promise<ISError | string> {
const currentDate = new Date(); const currentDate = new Date();
// Check if exist and return // Check if exist and return
const dbUserIfExist: IDbUser | ISError = await getUserByEmail(ReqData.email); const dbUserIfExist: IDbUser | ISError = await getUserByEmail(
inputData.email,
);
if ("error" in dbUserIfExist) { if ("error" in dbUserIfExist) {
return { return {
error: dbUserIfExist.error, error: dbUserIfExist.error,
message: dbUserIfExist.message, message: dbUserIfExist.message,
}; };
} }
if (dbUserIfExist.id) {
logger.info(
`User already exist for email "${inputData.email}".\n(${dbUserIfExist.username}::${dbUserIfExist.id})\n`,
);
return {
error: ErrorType.UnAuthorized,
message: "User already exists.",
};
}
const currentId = v4();
const NewUser = await MySqlService.User.insert(DbHandler, { const NewUser = await MySqlService.User.insert(DbHandler, {
id: v4(), id: currentId,
email: ReqData.email, email: inputData.email,
username: ReqData.username, username: inputData.username,
firstname: ReqData.firstName, firstname: inputData.firstName,
lastname: ReqData.lastName, lastname: inputData.lastName,
dob: ReqData.dob, dob: inputData.dob,
hash: passwordHash, hash: passwordHash,
gdpr: currentDate, gdpr: currentDate,
is_admin: false, is_admin: false,
is_mail_verified: false, is_mail_verified: false,
}); });
if ("error" in NewUser || !NewUser.id) { if ("error" in NewUser || NewUser.affectedRows === 0) {
return { return {
error: ErrorType.DatabaseError, error: ErrorType.DatabaseError,
message: 'Error when inserting user in database.' message: "Error when inserting user in database.",
}; };
} }
logger.info(`New user created ! (${inputData.username}::${currentId})`);
// JWT // JWT
const token = await JwtService.sign( const token = await JwtService.sign(
@ -273,6 +285,7 @@ async function deleteUserService(targetId) {
} }
} }
logger.debug("Service loaded.");
const UserService = { const UserService = {
register: register, register: register,
login: login, login: login,