This repository has been archived on 2024-04-19. You can view files and clone it, but cannot push or open issues or pull requests.
brief-04-back/controllers/ThreadController.js
2024-04-17 16:55:04 +02:00

281 lines
7.8 KiB
JavaScript

const {JwtVerify} = require("../services/JwtService");
const {
CreateThreadService,
GetAllThreadService,
GetThreadByIdService,
UpdateThreadService,
DeleteThreadService,
GetUserThreadService
} = require("../services/ThreadService");
const req = require("express/lib/request");
/**
* Retrieves the payload of a JWT token from the request headers.
* @param {Object} req - The HTTP request object.
* @return {Promise<Object|boolean>} - The payload of the JWT token if it exists, otherwise false.
*/
async function getJwtPayload(req) {
const authHeader = req.headers.authorization;
const bearerToken = authHeader.split(' ')[1];
const jwtPayload = await JwtVerify(bearerToken);
if (jwtPayload) {
return jwtPayload;
}
console.log(`AUTH :> Invalid jwt (${req.ip})`)
return false
}
/**
* CreateThreadController - Controller function for creating a thread
*
* @param {Object} req - The request object
* @param {Object} res - The response object
*
* @return {Promise} - A Promise that resolves to the response object with appropriate status and JSON payload
*/
async function CreateThreadController(req, res) {
console.log(`CTRL :> Thread creation (${req.ip})`)
const payload = await getJwtPayload(req)
if (payload) {
const body = req.body;
if (!body) {
return res
.type('application/json')
.status(400)
.json({ error: 'Invalid input data' });
}
if (!body.title || !body.subTitle || !body.base64Banner || !body.desc || !body.price) {
return res
.type('application/json')
.status(400)
.json({ error: 'Field(s) missing' });
}
const userId = payload.sub
const sanitizedData = {
userId: `${userId}`,
title: `${body.title}`,
subTitle: `${body.subTitle}`,
base64Banner: `${body.base64Banner}`,
desc: `${body.desc}`,
price: Number.parseFloat(body.price)
}
const CreateThreadServiceResult = await CreateThreadService(sanitizedData)
if (!CreateThreadServiceResult) {
return res
.type('application/json')
.status(500)
.json({ error: 'Failed to create thread' });
}
return res
.type('application/json')
.status(200)
.json({ success: 'Thread created successfully' });
}
}
/**
* Retrieves a thread by its ID.
* @async
* @function GetThreadByIdController
* @param {Object} req - The request object containing the parameters and body.
* @param {Object} res - The response object used to send the response.
* @return {Promise<void>} - A promise that resolves once the thread is retrieved and the response is sent.
*/
async function GetThreadByIdController(req, res) {
const payload = await getJwtPayload(req)
const body = req.body;
if (payload) {
if (!req.params.id) {
return res
.type('application/json')
.status(400)
.json({ error: 'Field(s) missing' });
}
const threadId = req.params.id;
const GetThreadByIdServiceResult = await GetThreadByIdService(threadId);
if (GetThreadByIdServiceResult.error === 'ThreadNotFound') {
return res
.type('application/json')
.status(404)
.json({ message: `${GetThreadByIdServiceResult.message}` });
}
return res
.type('application/json')
.status(200)
.json(GetThreadByIdServiceResult);
}
}
/**
* Retrieve all threads for a user.
*
* @param {Object} req - The request object.
* @param {Object} req.ip - The IP address of the requesting client.
* @param {Object} res - The response object.
* @returns {Promise} A promise that resolves with the JSON response containing all threads, or rejects with an error.
*/
async function GetAllThreadController(req, res) {
console.log(`CTRL :> Query all threads (${req.ip})`)
const payload = await getJwtPayload(req)
if (payload) {
const ServiceResult = await GetAllThreadService({userId: payload.sub})
if (!ServiceResult) {
return res
.type('application/json')
.status(200)
.json({ error: 'No threads found' });
}
if (ServiceResult.error) {
return res
.type('application/json')
.status(500)
.json({ error: ServiceResult.message });
}
return res
.type('application/json')
.status(200)
.json(ServiceResult);
}
}
/**
* Retrieves a user's thread from the server.
*
* @param {Object} req - The request object.
* @param {Object} res - The response object.
* @return {Object} The response object containing the retrieved user thread.
* @throws {Error} If an error occurs while retrieving the user thread.
*/
async function GetUserThreadController(req, res) {
const payload = await getJwtPayload(req)
const GetUserThreadServiceResult = await GetUserThreadService(payload.sub);
if (GetUserThreadServiceResult.error === 'ThreadNotFound') {
return res
.type('application/json')
.status(200)
.json({ error: 'No threads found' });
}
if (GetUserThreadServiceResult.error) {
return res
.type('application/json')
.status(500)
.json({ error: GetUserThreadServiceResult.message });
}
return res
.type('application/json')
.status(200)
.json(GetUserThreadServiceResult);
}
/**
* UpdateThreadController is an asynchronous function that handles the logic for updating a thread.
*
* @param {Object} req - The request object.
* @param {Object} res - The response object.
* @return {Object} - The response object.
*/
async function UpdateThreadController(req, res) {
const payload = await getJwtPayload(req)
if (payload) {
const body = req.body;
if (!body) {
return res
.type('application/json')
.status(400)
.json({ error: 'Invalid input data' });
}
if (!req.params.id) {
return res
.type('application/json')
.status(400)
.json({ error: 'Missing identifier' });
}
const threadId = req.params.id;
if (!body) {
return res
.type('application/json')
.status(400)
.json({ error: 'Invalid input data' });
}
if (!body.title || !body.subTitle || !body.base64Banner || !body.desc || !body.price || !body.userId) {
return res
.type('application/json')
.status(400)
.json({ error: 'Field(s) missing' });
}
const sanitizedData = {
title: `${body.title}`,
subTitle: `${body.subTitle}`,
base64Banner: `${body.base64Banner}`,
desc: `${body.desc}`,
price: Number.parseFloat(body.price)
}
const UpdateThreadServiceResult = await UpdateThreadService(threadId, sanitizedData);
if (UpdateThreadServiceResult.error === 'ThreadNotFound') {
return res
.type('application/json')
.status(404)
.json({ message: `${UpdateThreadServiceResult.message}` });
}
return res
.type('application/json')
.status(200)
.json({ message: 'Thread updated successfully' });
}
}
/**
* Deletes a thread.
* @param {Object} req - The request object.
* @param {Object} res - The response object.
* @return {Promise} - A promise that resolves with the response.
*/
async function DeleteThreadController(req, res) {
const payload = await getJwtPayload(req)
if (payload) {
const body = req.body;
if (!body) {
return res
.type('application/json')
.status(400)
.json({ error: 'Invalid input data' });
}
if (!req.params.id) {
return res
.type('application/json')
.status(400)
.json({ error: 'Field(s) missing' });
}
const threadId = `${body.id}`;
const DeleteThreadServiceResult = await DeleteThreadService(threadId);
if (!DeleteThreadServiceResult) {
return res
.type('application/json')
.status(500)
.json({ error: 'Failed to delete thread' });
}
if (DeleteThreadServiceResult.error === 'ThreadNotFound') {
return res
.type('application/json')
.status(404)
.json({ message: `${DeleteThreadServiceResult.message}` });
}
return res
.type('application/json')
.status(200)
.json({ message: 'Thread deleted successfully' });
}
}
module.exports = {
CreateThreadController,
GetThreadByIdController,
GetAllThreadController,
GetUserThreadController,
UpdateThreadController,
DeleteThreadController
}