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("/catalog", CatalogRouter);
app.use("/rent", RentRouter);
logger.info("Routers loaded !");
logger.info("Routers loaded !\n");
} catch (err) {
logger.error(err);
throw null;
@ -51,7 +51,13 @@ try {
try {
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) {
logger.error(`Server failed to start: ${error}`);
process.exit(1);

View File

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

View File

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

View File

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

View File

@ -135,6 +135,8 @@ async function getAllModels(): Promise<IDbModel[] | null> {
}
}
logger.debug("Service loaded.");
/**
* ModelService is responsible for managing models.
* @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> {
return new Promise((resolve, reject) => {
if (!data.id) return reject("Id is undefined");

View File

@ -1,14 +1,13 @@
import type {IDbUser} from "@interfaces/database/IDbUser";
import type {IReqLogin} from "@interfaces/requests/IReqLogin";
import type {IReqRegister} from "@interfaces/requests/IReqRegister";
import {ErrorType, type ISError} from "@interfaces/services/ISError";
import type { IDbUser } from "@interfaces/database/IDbUser";
import type { IReqLogin } from "@interfaces/requests/IReqLogin";
import type { IReqRegister } from "@interfaces/requests/IReqRegister";
import { ErrorType, type ISError } from "@interfaces/services/ISError";
import CredentialService from "@services/credential.service";
import JwtService from "@services/jwt.service";
import MySqlService from "@services/mysql.service";
import MysqlService from "@services/mysql.service";
import {Logger} from "tslog";
import {v4} from "uuid";
import { Logger } from "tslog";
import { v4 } from "uuid";
const logger = new Logger({
name: "UserService",
@ -77,17 +76,18 @@ async function getUserFromIdService(id: string): Promise<IDbUser | ISError> {
}
}
async function register(ReqData: IReqRegister): Promise<ISError | string> {
if (ReqData.password.length < 6) {
async function register(inputData: IReqRegister): Promise<ISError | string> {
if (inputData.password.length < 6) {
return {
error: ErrorType.InvalidData,
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 ?
if (ReqData.gdpr !== true) {
if (inputData.gdpr !== true) {
return {
error: ErrorType.InvalidData,
message: "GDPR acceptance is required.",
@ -96,32 +96,44 @@ async function register(ReqData: IReqRegister): Promise<ISError | string> {
const currentDate = new Date();
// 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) {
return {
error: dbUserIfExist.error,
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, {
id: v4(),
email: ReqData.email,
username: ReqData.username,
firstname: ReqData.firstName,
lastname: ReqData.lastName,
dob: ReqData.dob,
id: currentId,
email: inputData.email,
username: inputData.username,
firstname: inputData.firstName,
lastname: inputData.lastName,
dob: inputData.dob,
hash: passwordHash,
gdpr: currentDate,
is_admin: false,
is_mail_verified: false,
});
if ("error" in NewUser || !NewUser.id) {
return {
error: ErrorType.DatabaseError,
message: 'Error when inserting user in database.'
};
}
if ("error" in NewUser || NewUser.affectedRows === 0) {
return {
error: ErrorType.DatabaseError,
message: "Error when inserting user in database.",
};
}
logger.info(`New user created ! (${inputData.username}::${currentId})`);
// JWT
const token = await JwtService.sign(
@ -273,6 +285,7 @@ async function deleteUserService(targetId) {
}
}
logger.debug("Service loaded.");
const UserService = {
register: register,
login: login,