diff --git a/src/modules/auth/auth.types.ts b/backup/modules/auth/auth.types.ts similarity index 95% rename from src/modules/auth/auth.types.ts rename to backup/modules/auth/auth.types.ts index f6463fd..f2ec672 100644 --- a/src/modules/auth/auth.types.ts +++ b/backup/modules/auth/auth.types.ts @@ -1,65 +1,65 @@ -export interface LoginWithPasswordRequest { - identifier: string; - password: string; -} - -export interface JWTSessionPayload { - id: string; - isAuthenticated: boolean; - userId: string; - deviceType: string; - deviceOs: string; - deviceIp: string; - isOnline: boolean; - lastOnline: Date; - validUntil: Date; - deletedAt: null; - createdAt: Date; - updatedAt: Date; - user: User; - iat: number; - exp: number; -} -interface User { - id: string; - name: string; - username: string; - email: string; - birthDate: null; - gender: null; - phoneCC: null; - phoneNumber: null; - bioProfile: null; - profilePicture: null; - commentPicture: null; - preferenceId: null; - verifiedAt: null; - disabledAt: null; - deletedAt: null; - createdAt: Date; - updatedAt: Date; - roles: Role[]; -} -interface Role { - id: string; - name: string; - primaryColor: string; - secondaryColor: string; - pictureImage: string; - badgeImage: null; - isSuperadmin: boolean; - canEditMedia: boolean; - canManageMedia: boolean; - canEditEpisodes: boolean; - canManageEpisodes: boolean; - canEditComment: boolean; - canManageComment: boolean; - canEditUser: boolean; - canManageUser: boolean; - canEditSystem: boolean; - canManageSystem: boolean; - createdBy: string; - deletedAt: null; - createdAt: Date; - updatedAt: Date; -} +export interface LoginWithPasswordRequest { + identifier: string; + password: string; +} + +export interface JWTSessionPayload { + id: string; + isAuthenticated: boolean; + userId: string; + deviceType: string; + deviceOs: string; + deviceIp: string; + isOnline: boolean; + lastOnline: Date; + validUntil: Date; + deletedAt: null; + createdAt: Date; + updatedAt: Date; + user: User; + iat: number; + exp: number; +} +interface User { + id: string; + name: string; + username: string; + email: string; + birthDate: null; + gender: null; + phoneCC: null; + phoneNumber: null; + bioProfile: null; + profilePicture: null; + commentPicture: null; + preferenceId: null; + verifiedAt: null; + disabledAt: null; + deletedAt: null; + createdAt: Date; + updatedAt: Date; + roles: Role[]; +} +interface Role { + id: string; + name: string; + primaryColor: string; + secondaryColor: string; + pictureImage: string; + badgeImage: null; + isSuperadmin: boolean; + canEditMedia: boolean; + canManageMedia: boolean; + canEditEpisodes: boolean; + canManageEpisodes: boolean; + canEditComment: boolean; + canManageComment: boolean; + canEditUser: boolean; + canManageUser: boolean; + canEditSystem: boolean; + canManageSystem: boolean; + createdBy: string; + deletedAt: null; + createdAt: Date; + updatedAt: Date; +} diff --git a/src/modules/auth/controller/authVerification.controller.ts b/backup/modules/auth/controller/authVerification.controller.ts similarity index 97% rename from src/modules/auth/controller/authVerification.controller.ts rename to backup/modules/auth/controller/authVerification.controller.ts index 61e3eb7..631e835 100644 --- a/src/modules/auth/controller/authVerification.controller.ts +++ b/backup/modules/auth/controller/authVerification.controller.ts @@ -1,27 +1,27 @@ -import { - returnErrorResponse, - returnWriteResponse, -} from "../../../helpers/callback/httpResponse"; -import { Context } from "elysia"; -import { getCookie } from "../../../helpers/http/userHeader/cookies/getCookies"; -import { authVerificationService } from "../services/authVerification.service"; -import { mainErrorHandler } from "../../../helpers/error/handler"; -import { clearCookies } from "../../../helpers/http/userHeader/cookies/clearCookies"; -import { COOKIE_KEYS } from "../../../constants/cookie.keys"; - -export const authVerification = async (ctx: Context) => { - try { - // Get the auth token from cookies - const cookie = getCookie(ctx); - if (!cookie.auth_token) - return returnErrorResponse(ctx.set, 401, "Auth token not found"); - - // Verify the auth token and get the user session - const authService = await authVerificationService(cookie.auth_token); - return returnWriteResponse(ctx.set, 200, "User authenticated", authService); - } catch (error) { - // If token is invalid or expired, clear the auth cookie and return an error response - clearCookies(ctx.set, [COOKIE_KEYS.AUTH]); - return mainErrorHandler(ctx.set, error); - } -}; +import { + returnErrorResponse, + returnWriteResponse, +} from "../../../helpers/callback/httpResponse"; +import { Context } from "elysia"; +import { getCookie } from "../../../helpers/http/userHeader/cookies/getCookies"; +import { authVerificationService } from "../services/authVerification.service"; +import { mainErrorHandler } from "../../../helpers/error/handler"; +import { clearCookies } from "../../../helpers/http/userHeader/cookies/clearCookies"; +import { COOKIE_KEYS } from "../../../constants/cookie.keys"; + +export const authVerification = async (ctx: Context) => { + try { + // Get the auth token from cookies + const cookie = getCookie(ctx); + if (!cookie.auth_token) + return returnErrorResponse(ctx.set, 401, "Auth token not found"); + + // Verify the auth token and get the user session + const authService = await authVerificationService(cookie.auth_token); + return returnWriteResponse(ctx.set, 200, "User authenticated", authService); + } catch (error) { + // If token is invalid or expired, clear the auth cookie and return an error response + clearCookies(ctx.set, [COOKIE_KEYS.AUTH]); + return mainErrorHandler(ctx.set, error); + } +}; diff --git a/src/modules/auth/controller/loginWithPassword.controller.ts b/backup/modules/auth/controller/loginWithPassword.controller.ts similarity index 97% rename from src/modules/auth/controller/loginWithPassword.controller.ts rename to backup/modules/auth/controller/loginWithPassword.controller.ts index 9d09e26..99101cf 100644 --- a/src/modules/auth/controller/loginWithPassword.controller.ts +++ b/backup/modules/auth/controller/loginWithPassword.controller.ts @@ -1,74 +1,74 @@ -import { - returnErrorResponse, - returnWriteResponse, -} from "../../../helpers/callback/httpResponse"; -import { Context } from "elysia"; -import { loginWithPasswordService } from "../services/loginWithPassword.service"; -import { LoginWithPasswordRequest } from "../auth.types"; -import { mainErrorHandler } from "../../../helpers/error/handler"; -import { getUserHeaderInformation } from "../../../helpers/http/userHeader/getUserHeaderInformation"; -import { setCookie } from "../../../helpers/http/userHeader/cookies/setCookies"; -import { COOKIE_KEYS } from "../../../constants/cookie.keys"; -import { loginWithPasswordSchema } from "../schemas/loginWithPassword"; - -/** - * @function loginWithPassword - * @description Authenticates user using username/email and password. - * On successful login, sets JWT token in cookies and returns token in response (development only). - * In production environment, only sets cookie without returning token in response body. - * - * @param {Context & { body: LoginWithPasswordRequest }} ctx - The context object containing request information. - * @param {Object} ctx.body - The login credentials. - * - * @returns {Promise} A response object indicating authentication success or failure. - * @throws {Object} An error response if validation fails or authentication error occurs. - * - * @example - * Request route: POST /auth/legacy - * Request body: - * { - * "identifier": "user@example.com" or "username123", - * "password": "securePassword123" - * } - * - * Success Response: - * Status: 200 OK - * Development: - * { - * "message": "Authentication Success", - * "token": "" // Only in development environment - * } - * - * Failure Responses: - * - 400 Bad Request: Invalid user input or missing fields - * - 401 Unauthorized: Invalid credentials - * - 500 Internal Server Error: Server error during authentication - */ -export const loginWithPassword = async ( - ctx: Context & { body: LoginWithPasswordRequest } -) => { - // Validate the request body against the schema - const { error } = loginWithPasswordSchema.validate(ctx.body); - if (error || !ctx.body) - return returnErrorResponse(ctx.set, 400, "Invalid user input", error); - - // Extract user header information - const userHeaderInfo = getUserHeaderInformation(ctx); - - try { - // Call the service to handle login with password - const jwtToken = await loginWithPasswordService(ctx.body, userHeaderInfo); - - // Set the authentication cookie with the JWT token - setCookie(ctx.set, COOKIE_KEYS.AUTH, jwtToken); - return returnWriteResponse( - ctx.set, - 200, - "Authentication Success", - jwtToken - ); - } catch (error) { - // Handle any errors that occur during the login process - return mainErrorHandler(ctx.set, error); - } -}; +import { + returnErrorResponse, + returnWriteResponse, +} from "../../../helpers/callback/httpResponse"; +import { Context } from "elysia"; +import { loginWithPasswordService } from "../services/loginWithPassword.service"; +import { LoginWithPasswordRequest } from "../auth.types"; +import { mainErrorHandler } from "../../../helpers/error/handler"; +import { getUserHeaderInformation } from "../../../helpers/http/userHeader/getUserHeaderInformation"; +import { setCookie } from "../../../helpers/http/userHeader/cookies/setCookies"; +import { COOKIE_KEYS } from "../../../constants/cookie.keys"; +import { loginWithPasswordSchema } from "../schemas/loginWithPassword"; + +/** + * @function loginWithPassword + * @description Authenticates user using username/email and password. + * On successful login, sets JWT token in cookies and returns token in response (development only). + * In production environment, only sets cookie without returning token in response body. + * + * @param {Context & { body: LoginWithPasswordRequest }} ctx - The context object containing request information. + * @param {Object} ctx.body - The login credentials. + * + * @returns {Promise} A response object indicating authentication success or failure. + * @throws {Object} An error response if validation fails or authentication error occurs. + * + * @example + * Request route: POST /auth/legacy + * Request body: + * { + * "identifier": "user@example.com" or "username123", + * "password": "securePassword123" + * } + * + * Success Response: + * Status: 200 OK + * Development: + * { + * "message": "Authentication Success", + * "token": "" // Only in development environment + * } + * + * Failure Responses: + * - 400 Bad Request: Invalid user input or missing fields + * - 401 Unauthorized: Invalid credentials + * - 500 Internal Server Error: Server error during authentication + */ +export const loginWithPassword = async ( + ctx: Context & { body: LoginWithPasswordRequest } +) => { + // Validate the request body against the schema + const { error } = loginWithPasswordSchema.validate(ctx.body); + if (error || !ctx.body) + return returnErrorResponse(ctx.set, 400, "Invalid user input", error); + + // Extract user header information + const userHeaderInfo = getUserHeaderInformation(ctx); + + try { + // Call the service to handle login with password + const jwtToken = await loginWithPasswordService(ctx.body, userHeaderInfo); + + // Set the authentication cookie with the JWT token + setCookie(ctx.set, COOKIE_KEYS.AUTH, jwtToken); + return returnWriteResponse( + ctx.set, + 200, + "Authentication Success", + jwtToken + ); + } catch (error) { + // Handle any errors that occur during the login process + return mainErrorHandler(ctx.set, error); + } +}; diff --git a/src/modules/auth/controller/logout.controller.ts b/backup/modules/auth/controller/logout.controller.ts similarity index 100% rename from src/modules/auth/controller/logout.controller.ts rename to backup/modules/auth/controller/logout.controller.ts diff --git a/src/modules/auth/index.ts b/backup/modules/auth/index.ts similarity index 97% rename from src/modules/auth/index.ts rename to backup/modules/auth/index.ts index fe4425b..283e16f 100644 --- a/src/modules/auth/index.ts +++ b/backup/modules/auth/index.ts @@ -1,12 +1,12 @@ -import Elysia from "elysia"; -import { loginWithPassword } from "./controller/loginWithPassword.controller"; -import { authMiddleware } from "../../middleware/auth.middleware"; -import { authVerification } from "./controller/authVerification.controller"; -import { logoutController } from "./controller/logout.controller"; - -export const authModule = new Elysia({ prefix: "/auth" }) - .post("/legacy", loginWithPassword) - .post("/verification", authVerification, { - beforeHandle: authMiddleware, - }) - .post("/logout", logoutController); +import Elysia from "elysia"; +import { loginWithPassword } from "./controller/loginWithPassword.controller"; +import { authMiddleware } from "../../middleware/auth.middleware"; +import { authVerification } from "./controller/authVerification.controller"; +import { logoutController } from "./controller/logout.controller"; + +export const authModule = new Elysia({ prefix: "/auth" }) + .post("/legacy", loginWithPassword) + .post("/verification", authVerification, { + beforeHandle: authMiddleware, + }) + .post("/logout", logoutController); diff --git a/src/modules/auth/schemas/loginWithPassword.ts b/backup/modules/auth/schemas/loginWithPassword.ts similarity index 96% rename from src/modules/auth/schemas/loginWithPassword.ts rename to backup/modules/auth/schemas/loginWithPassword.ts index 6fea031..2d87bb7 100644 --- a/src/modules/auth/schemas/loginWithPassword.ts +++ b/backup/modules/auth/schemas/loginWithPassword.ts @@ -1,6 +1,6 @@ -import Joi from "joi"; - -export const loginWithPasswordSchema = Joi.object({ - identifier: Joi.string().required(), - password: Joi.string().required(), -}); +import Joi from "joi"; + +export const loginWithPasswordSchema = Joi.object({ + identifier: Joi.string().required(), + password: Joi.string().required(), +}); diff --git a/src/modules/auth/services/authVerification.service.ts b/backup/modules/auth/services/authVerification.service.ts similarity index 97% rename from src/modules/auth/services/authVerification.service.ts rename to backup/modules/auth/services/authVerification.service.ts index bdcd4ea..fedcdf7 100644 --- a/src/modules/auth/services/authVerification.service.ts +++ b/backup/modules/auth/services/authVerification.service.ts @@ -1,44 +1,44 @@ -import { AppError } from "../../../helpers/error/instances/app"; -import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; -import { jwtDecode } from "../../../helpers/http/jwt/decode"; -import { checkUserSessionInCacheService } from "../../userSession/services/checkUserSessionInCache.service"; -import { getUserSessionFromDBService } from "../../userSession/services/getUserSessionFromDB.service"; -import { storeUserSessionToCacheService } from "../../userSession/services/storeUserSessionToCache.service"; -import { JWTSessionPayload } from "../auth.types"; - -export const authVerificationService = async (cookie: string) => { - try { - // Decode the JWT token to get the session payload - const jwtSession = jwtDecode(cookie) as JWTSessionPayload; - - // Check if the session exists in Redis - const sessionCheckOnRedis = await checkUserSessionInCacheService( - jwtSession.userId, - jwtSession.id - ); - - if (!sessionCheckOnRedis) { - // If not found in Redis, check the database - const sessionCheckOnDB = await getUserSessionFromDBService(jwtSession.id); - - // If the session found in the database, store it in Redis. if not, throw an error - if (!sessionCheckOnDB) { - throw new AppError(401, "Session invalid or expired"); - } else { - // Store the session in Redis with the remaining time until expiration - const timeExpires = Math.floor( - (new Date(sessionCheckOnDB.validUntil).getTime() - - new Date().getTime()) / - 1000 - ); - await storeUserSessionToCacheService(sessionCheckOnDB, timeExpires); - return sessionCheckOnDB; - } - } else { - // If the session is found in Redis, return it - return jwtSession; - } - } catch (error) { - ErrorForwarder(error, 401, "Token is invalid"); - } -}; +import { AppError } from "../../../helpers/error/instances/app"; +import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; +import { jwtDecode } from "../../../helpers/http/jwt/decode"; +import { checkUserSessionInCacheService } from "../../userSession/services/checkUserSessionInCache.service"; +import { getUserSessionFromDBService } from "../../userSession/services/getUserSessionFromDB.service"; +import { storeUserSessionToCacheService } from "../../userSession/services/storeUserSessionToCache.service"; +import { JWTSessionPayload } from "../auth.types"; + +export const authVerificationService = async (cookie: string) => { + try { + // Decode the JWT token to get the session payload + const jwtSession = jwtDecode(cookie) as JWTSessionPayload; + + // Check if the session exists in Redis + const sessionCheckOnRedis = await checkUserSessionInCacheService( + jwtSession.userId, + jwtSession.id + ); + + if (!sessionCheckOnRedis) { + // If not found in Redis, check the database + const sessionCheckOnDB = await getUserSessionFromDBService(jwtSession.id); + + // If the session found in the database, store it in Redis. if not, throw an error + if (!sessionCheckOnDB) { + throw new AppError(401, "Session invalid or expired"); + } else { + // Store the session in Redis with the remaining time until expiration + const timeExpires = Math.floor( + (new Date(sessionCheckOnDB.validUntil).getTime() - + new Date().getTime()) / + 1000 + ); + await storeUserSessionToCacheService(sessionCheckOnDB, timeExpires); + return sessionCheckOnDB; + } + } else { + // If the session is found in Redis, return it + return jwtSession; + } + } catch (error) { + ErrorForwarder(error, 401, "Token is invalid"); + } +}; diff --git a/src/modules/auth/services/loginFromSystem.service.ts b/backup/modules/auth/services/loginFromSystem.service.ts similarity index 97% rename from src/modules/auth/services/loginFromSystem.service.ts rename to backup/modules/auth/services/loginFromSystem.service.ts index 0802c7c..cee9175 100644 --- a/src/modules/auth/services/loginFromSystem.service.ts +++ b/backup/modules/auth/services/loginFromSystem.service.ts @@ -1,18 +1,18 @@ -import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; -import { UserHeaderInformation } from "../../../helpers/http/userHeader/getUserHeaderInformation/types"; -import { createUserSessionService } from "../../userSession/services/createUserSession.service"; - -export const loginFromSystemService = async ( - userId: string, - userHeaderInfo: UserHeaderInformation -) => { - try { - const userSession = await createUserSessionService({ - userId, - userHeaderInformation: userHeaderInfo, - }); - return userSession; - } catch (error) { - ErrorForwarder(error); - } -}; +import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; +import { UserHeaderInformation } from "../../../helpers/http/userHeader/getUserHeaderInformation/types"; +import { createUserSessionService } from "../../userSession/services/createUserSession.service"; + +export const loginFromSystemService = async ( + userId: string, + userHeaderInfo: UserHeaderInformation +) => { + try { + const userSession = await createUserSessionService({ + userId, + userHeaderInformation: userHeaderInfo, + }); + return userSession; + } catch (error) { + ErrorForwarder(error); + } +}; diff --git a/src/modules/auth/services/loginWithPassword.service.ts b/backup/modules/auth/services/loginWithPassword.service.ts similarity index 97% rename from src/modules/auth/services/loginWithPassword.service.ts rename to backup/modules/auth/services/loginWithPassword.service.ts index 5e2df2d..8de47e7 100644 --- a/src/modules/auth/services/loginWithPassword.service.ts +++ b/backup/modules/auth/services/loginWithPassword.service.ts @@ -1,40 +1,40 @@ -import bcrypt from "bcrypt"; -import { findUserByEmailOrUsernameService } from "../../user/services/getUserData.service"; -import { LoginWithPasswordRequest } from "../auth.types"; -import { AppError } from "../../../helpers/error/instances/app"; -import { UserHeaderInformation } from "../../../helpers/http/userHeader/getUserHeaderInformation/types"; -import { createUserSessionService } from "../../userSession/services/createUserSession.service"; -import { jwtEncode } from "../../../helpers/http/jwt/encode"; -import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; - -export const loginWithPasswordService = async ( - request: LoginWithPasswordRequest, - userHeaderInfo: UserHeaderInformation -) => { - try { - // search for user data using an identifier (username or email) - const userData = await findUserByEmailOrUsernameService( - request.identifier, - { verbose: true } - ); - - // if user data is not found, throw an error - if (!userData) throw new AppError(404, "User not found"); - - // validate the password in the request with the existing one - if (!(await bcrypt.compare(request.password, userData.password))) - throw new AppError(401, "Password incorrect"); - - // create new user session - const userSession = await createUserSessionService({ - userId: userData.id, - userHeaderInformation: userHeaderInfo, - }); - - // create JWT token that contain user session - const jwtToken = jwtEncode(userSession); - return jwtToken; - } catch (error) { - ErrorForwarder(error); - } -}; +import bcrypt from "bcrypt"; +import { findUserByEmailOrUsernameService } from "../../user/services/getUserData.service"; +import { LoginWithPasswordRequest } from "../auth.types"; +import { AppError } from "../../../helpers/error/instances/app"; +import { UserHeaderInformation } from "../../../helpers/http/userHeader/getUserHeaderInformation/types"; +import { createUserSessionService } from "../../userSession/services/createUserSession.service"; +import { jwtEncode } from "../../../helpers/http/jwt/encode"; +import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; + +export const loginWithPasswordService = async ( + request: LoginWithPasswordRequest, + userHeaderInfo: UserHeaderInformation +) => { + try { + // search for user data using an identifier (username or email) + const userData = await findUserByEmailOrUsernameService( + request.identifier, + { verbose: true } + ); + + // if user data is not found, throw an error + if (!userData) throw new AppError(404, "User not found"); + + // validate the password in the request with the existing one + if (!(await bcrypt.compare(request.password, userData.password))) + throw new AppError(401, "Password incorrect"); + + // create new user session + const userSession = await createUserSessionService({ + userId: userData.id, + userHeaderInformation: userHeaderInfo, + }); + + // create JWT token that contain user session + const jwtToken = jwtEncode(userSession); + return jwtToken; + } catch (error) { + ErrorForwarder(error); + } +}; diff --git a/src/modules/auth/services/logout.service.ts b/backup/modules/auth/services/logout.service.ts similarity index 100% rename from src/modules/auth/services/logout.service.ts rename to backup/modules/auth/services/logout.service.ts diff --git a/src/modules/userRole/controller/createUserRole.controller.ts b/backup/modules/userRole/controller/createUserRole.controller.ts similarity index 96% rename from src/modules/userRole/controller/createUserRole.controller.ts rename to backup/modules/userRole/controller/createUserRole.controller.ts index bf0e5f5..ccc558c 100644 --- a/src/modules/userRole/controller/createUserRole.controller.ts +++ b/backup/modules/userRole/controller/createUserRole.controller.ts @@ -1,81 +1,81 @@ -import { Prisma } from "@prisma/client"; -import { Context } from "elysia"; -import { - returnErrorResponse, - returnWriteResponse, -} from "../../../helpers/callback/httpResponse"; -import { createUserRoleService } from "../services/createUserRole.service"; -import { mainErrorHandler } from "../../../helpers/error/handler"; -import { createUserRoleSchema } from "../schemas/createUserRole.schema"; -import { getCookie } from "../../../helpers/http/userHeader/cookies/getCookies"; -import { jwtDecode } from "../../../helpers/http/jwt/decode"; - -/** - * @function createUserRole - * @description Creates a new user role in the database. - * - * @param {Context & { body: UserRole }} ctx - The context object containing the request body. - * @param {UserRole} ctx.body - The user role data to be created. - * - * @returns {Promise} A response object indicating success or failure. - * @throws {Object} An error response object if validation fails or an error occurs during role creation. - * - * @example - * Request route: POST /roles - * Request body: - * { - * "userID": "e31668e6-c261-4a7e-9469-ffad734cf2dd", - * "name": "Admin", - * "primaryColor": "#D9D9D9", - * "secondaryColor": "#FFFFFF", - * "pictureImage": "https://example.com/picture.jpg", - * "badgeImage": "https://example.com/badge.jpg", - * "isSuperadmin": false, - * "canEditMedia": false, - * "canManageMedia": false, - * "canEditEpisodes": false, - * "canManageEpisodes": false, - * "canEditComment": false, - * "canManageComment": false, - * "canEditUser": false, - * "canManageUser": false, - * "canEditSystem": false, - * "canManageSystem": false - * } - */ -export const createUserRoleController = async ( - ctx: Context & { body: Prisma.UserRoleUncheckedCreateInput } -) => { - // Validation input form with schema - const { error } = createUserRoleSchema.validate(ctx.body); - if (error) - return returnErrorResponse(ctx.set, 400, "Invalid user input", error); - - // Delete this, use middleware instead!!! - const cookie = getCookie(ctx); - if (!cookie.auth_token) - return returnErrorResponse( - ctx.set, - 403, - "Forbidden, You don't have access to this resouce" - ); - - const jwtSession = jwtDecode(cookie.auth_token); - - const formData: Prisma.UserRoleUncheckedCreateInput = { - ...ctx.body, - createdBy: jwtSession.userId, - }; - - try { - const newUserRole = await createUserRoleService(formData); - return returnWriteResponse( - ctx.set, - 201, - "User role created successfully", - newUserRole - ); - } catch (error) { - return mainErrorHandler(ctx.set, error); - } -}; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; +import { + returnErrorResponse, + returnWriteResponse, +} from "../../../helpers/callback/httpResponse"; +import { createUserRoleService } from "../services/createUserRole.service"; +import { mainErrorHandler } from "../../../helpers/error/handler"; +import { createUserRoleSchema } from "../schemas/createUserRole.schema"; +import { getCookie } from "../../../helpers/http/userHeader/cookies/getCookies"; +import { jwtDecode } from "../../../helpers/http/jwt/decode"; + +/** + * @function createUserRole + * @description Creates a new user role in the database. + * + * @param {Context & { body: UserRole }} ctx - The context object containing the request body. + * @param {UserRole} ctx.body - The user role data to be created. + * + * @returns {Promise} A response object indicating success or failure. + * @throws {Object} An error response object if validation fails or an error occurs during role creation. + * + * @example + * Request route: POST /roles + * Request body: + * { + * "userID": "e31668e6-c261-4a7e-9469-ffad734cf2dd", + * "name": "Admin", + * "primaryColor": "#D9D9D9", + * "secondaryColor": "#FFFFFF", + * "pictureImage": "https://example.com/picture.jpg", + * "badgeImage": "https://example.com/badge.jpg", + * "isSuperadmin": false, + * "canEditMedia": false, + * "canManageMedia": false, + * "canEditEpisodes": false, + * "canManageEpisodes": false, + * "canEditComment": false, + * "canManageComment": false, + * "canEditUser": false, + * "canManageUser": false, + * "canEditSystem": false, + * "canManageSystem": false + * } + */ +export const createUserRoleController = async ( + ctx: Context & { body: Prisma.UserRoleUncheckedCreateInput } +) => { + // Validation input form with schema + const { error } = createUserRoleSchema.validate(ctx.body); + if (error) + return returnErrorResponse(ctx.set, 400, "Invalid user input", error); + + // Delete this, use middleware instead!!! + const cookie = getCookie(ctx); + if (!cookie.auth_token) + return returnErrorResponse( + ctx.set, + 403, + "Forbidden, You don't have access to this resouce" + ); + + const jwtSession = jwtDecode(cookie.auth_token); + + const formData: Prisma.UserRoleUncheckedCreateInput = { + ...ctx.body, + createdBy: jwtSession.userId, + }; + + try { + const newUserRole = await createUserRoleService(formData); + return returnWriteResponse( + ctx.set, + 201, + "User role created successfully", + newUserRole + ); + } catch (error) { + return mainErrorHandler(ctx.set, error); + } +}; diff --git a/src/modules/userRole/index.ts b/backup/modules/userRole/index.ts similarity index 97% rename from src/modules/userRole/index.ts rename to backup/modules/userRole/index.ts index 753ed18..5f83beb 100644 --- a/src/modules/userRole/index.ts +++ b/backup/modules/userRole/index.ts @@ -1,9 +1,9 @@ -import Elysia from "elysia"; -import { createUserRoleController } from "./controller/createUserRole.controller"; -import { unautenticatedMiddleware } from "../../middleware/auth/unauthenticated.middleware"; - -export const userRoleModule = new Elysia({ prefix: "/roles" }) - .get("/", () => "Hello User Role Module", { - beforeHandle: unautenticatedMiddleware, - }) - .post("/", createUserRoleController); +import Elysia from "elysia"; +import { createUserRoleController } from "./controller/createUserRole.controller"; +import { unautenticatedMiddleware } from "../../middleware/auth/unauthenticated.middleware"; + +export const userRoleModule = new Elysia({ prefix: "/roles" }) + .get("/", () => "Hello User Role Module", { + beforeHandle: unautenticatedMiddleware, + }) + .post("/", createUserRoleController); diff --git a/src/modules/userRole/repositories/createUserRole.repository.ts b/backup/modules/userRole/repositories/createUserRole.repository.ts similarity index 96% rename from src/modules/userRole/repositories/createUserRole.repository.ts rename to backup/modules/userRole/repositories/createUserRole.repository.ts index d28dbb1..48782e4 100644 --- a/src/modules/userRole/repositories/createUserRole.repository.ts +++ b/backup/modules/userRole/repositories/createUserRole.repository.ts @@ -1,11 +1,11 @@ -import { Prisma } from "@prisma/client"; -import { userRoleModel } from "../userRole.model"; - -export const createUserRoleRepo = async ( - data: Prisma.UserRoleUncheckedCreateInput -) => { - const newUserRole = await userRoleModel.create({ - data, - }); - return newUserRole; -}; +import { Prisma } from "@prisma/client"; +import { userRoleModel } from "../userRole.model"; + +export const createUserRoleRepo = async ( + data: Prisma.UserRoleUncheckedCreateInput +) => { + const newUserRole = await userRoleModel.create({ + data, + }); + return newUserRole; +}; diff --git a/src/modules/userRole/schemas/createUserRole.schema.ts b/backup/modules/userRole/schemas/createUserRole.schema.ts similarity index 97% rename from src/modules/userRole/schemas/createUserRole.schema.ts rename to backup/modules/userRole/schemas/createUserRole.schema.ts index 0ce7de6..1a9308d 100644 --- a/src/modules/userRole/schemas/createUserRole.schema.ts +++ b/backup/modules/userRole/schemas/createUserRole.schema.ts @@ -1,28 +1,28 @@ -import Joi from "joi"; - -export const createUserRoleSchema = Joi.object({ - name: Joi.string().min(4).max(255).required(), - primaryColor: Joi.string() - .pattern(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/) - .optional(), - secondaryColor: Joi.string() - .pattern(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/) - .optional(), - pictureImage: Joi.string() - .uri({ scheme: ["http", "https"] }) - .optional(), - badgeImage: Joi.string() - .uri({ scheme: ["http", "https"] }) - .optional(), - isSuperadmin: Joi.boolean().required(), - canEditMedia: Joi.boolean().required(), - canManageMedia: Joi.boolean().required(), - canEditEpisodes: Joi.boolean().required(), - canManageEpisodes: Joi.boolean().required(), - canEditComment: Joi.boolean().required(), - canManageComment: Joi.boolean().required(), - canEditUser: Joi.boolean().required(), - canManageUser: Joi.boolean().required(), - canEditSystem: Joi.boolean().required(), - canManageSystem: Joi.boolean().required(), -}); +import Joi from "joi"; + +export const createUserRoleSchema = Joi.object({ + name: Joi.string().min(4).max(255).required(), + primaryColor: Joi.string() + .pattern(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/) + .optional(), + secondaryColor: Joi.string() + .pattern(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/) + .optional(), + pictureImage: Joi.string() + .uri({ scheme: ["http", "https"] }) + .optional(), + badgeImage: Joi.string() + .uri({ scheme: ["http", "https"] }) + .optional(), + isSuperadmin: Joi.boolean().required(), + canEditMedia: Joi.boolean().required(), + canManageMedia: Joi.boolean().required(), + canEditEpisodes: Joi.boolean().required(), + canManageEpisodes: Joi.boolean().required(), + canEditComment: Joi.boolean().required(), + canManageComment: Joi.boolean().required(), + canEditUser: Joi.boolean().required(), + canManageUser: Joi.boolean().required(), + canEditSystem: Joi.boolean().required(), + canManageSystem: Joi.boolean().required(), +}); diff --git a/src/modules/userRole/schemas/UserRoleAssignment.schema.ts b/backup/modules/userRole/schemas/userRoleAssignment.schema.ts similarity index 100% rename from src/modules/userRole/schemas/UserRoleAssignment.schema.ts rename to backup/modules/userRole/schemas/userRoleAssignment.schema.ts diff --git a/src/modules/userRole/services/createUserRole.service.ts b/backup/modules/userRole/services/createUserRole.service.ts similarity index 97% rename from src/modules/userRole/services/createUserRole.service.ts rename to backup/modules/userRole/services/createUserRole.service.ts index 4a349b0..05ee869 100644 --- a/src/modules/userRole/services/createUserRole.service.ts +++ b/backup/modules/userRole/services/createUserRole.service.ts @@ -1,29 +1,29 @@ -import { Prisma } from "@prisma/client"; -import { createUserRoleRepo } from "../repositories/createUserRole.repository"; -import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; - -export const createUserRoleService = async ( - userRoleData: Prisma.UserRoleUncheckedCreateInput -) => { - try { - const dataPayload = { - ...userRoleData, - isSuperadmin: Boolean(userRoleData.isSuperadmin), - canEditMedia: Boolean(userRoleData.canEditMedia), - canManageMedia: Boolean(userRoleData.canManageMedia), - canEditEpisodes: Boolean(userRoleData.canEditEpisodes), - canManageEpisodes: Boolean(userRoleData.canManageEpisodes), - canEditComment: Boolean(userRoleData.canEditComment), - canManageComment: Boolean(userRoleData.canManageComment), - canEditUser: Boolean(userRoleData.canEditUser), - canManageUser: Boolean(userRoleData.canManageUser), - canEditSystem: Boolean(userRoleData.canEditSystem), - canManageSystem: Boolean(userRoleData.canManageSystem), - deletedAt: null, - }; - const newUserRole = await createUserRoleRepo(dataPayload); - return newUserRole; - } catch (error) { - ErrorForwarder(error); - } -}; +import { Prisma } from "@prisma/client"; +import { createUserRoleRepo } from "../repositories/createUserRole.repository"; +import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; + +export const createUserRoleService = async ( + userRoleData: Prisma.UserRoleUncheckedCreateInput +) => { + try { + const dataPayload = { + ...userRoleData, + isSuperadmin: Boolean(userRoleData.isSuperadmin), + canEditMedia: Boolean(userRoleData.canEditMedia), + canManageMedia: Boolean(userRoleData.canManageMedia), + canEditEpisodes: Boolean(userRoleData.canEditEpisodes), + canManageEpisodes: Boolean(userRoleData.canManageEpisodes), + canEditComment: Boolean(userRoleData.canEditComment), + canManageComment: Boolean(userRoleData.canManageComment), + canEditUser: Boolean(userRoleData.canEditUser), + canManageUser: Boolean(userRoleData.canManageUser), + canEditSystem: Boolean(userRoleData.canEditSystem), + canManageSystem: Boolean(userRoleData.canManageSystem), + deletedAt: null, + }; + const newUserRole = await createUserRoleRepo(dataPayload); + return newUserRole; + } catch (error) { + ErrorForwarder(error); + } +}; diff --git a/src/modules/userRole/userRole.model.ts b/backup/modules/userRole/userRole.model.ts similarity index 97% rename from src/modules/userRole/userRole.model.ts rename to backup/modules/userRole/userRole.model.ts index d2822f7..8b2d986 100644 --- a/src/modules/userRole/userRole.model.ts +++ b/backup/modules/userRole/userRole.model.ts @@ -1,3 +1,3 @@ -import { prisma } from "../../utils/databases/prisma/connection"; - -export const userRoleModel = prisma.userRole; +import { prisma } from "../../utils/databases/prisma/connection"; + +export const userRoleModel = prisma.userRole; diff --git a/src/modules/userRole/userRole.types.ts b/backup/modules/userRole/userRole.types.ts similarity index 100% rename from src/modules/userRole/userRole.types.ts rename to backup/modules/userRole/userRole.types.ts diff --git a/src/modules/userRoleAssignment/controller/assignRoleToUser.controller.ts b/backup/modules/userRoleAssignment/controller/assignRoleToUser.controller.ts similarity index 100% rename from src/modules/userRoleAssignment/controller/assignRoleToUser.controller.ts rename to backup/modules/userRoleAssignment/controller/assignRoleToUser.controller.ts diff --git a/src/modules/userRoleAssignment/index.ts b/backup/modules/userRoleAssignment/index.ts similarity index 100% rename from src/modules/userRoleAssignment/index.ts rename to backup/modules/userRoleAssignment/index.ts diff --git a/src/modules/userRoleAssignment/repositories/assignRoleToUser.repository.ts b/backup/modules/userRoleAssignment/repositories/assignRoleToUser.repository.ts similarity index 100% rename from src/modules/userRoleAssignment/repositories/assignRoleToUser.repository.ts rename to backup/modules/userRoleAssignment/repositories/assignRoleToUser.repository.ts diff --git a/src/modules/userRoleAssignment/schemas/assignRoleToUser.schema.ts b/backup/modules/userRoleAssignment/schemas/assignRoleToUser.schema.ts similarity index 100% rename from src/modules/userRoleAssignment/schemas/assignRoleToUser.schema.ts rename to backup/modules/userRoleAssignment/schemas/assignRoleToUser.schema.ts diff --git a/src/modules/userRoleAssignment/services/assignRoleToUser.service.ts b/backup/modules/userRoleAssignment/services/assignRoleToUser.service.ts similarity index 100% rename from src/modules/userRoleAssignment/services/assignRoleToUser.service.ts rename to backup/modules/userRoleAssignment/services/assignRoleToUser.service.ts diff --git a/src/modules/userRoleAssignment/userRoleAssignment.model.ts b/backup/modules/userRoleAssignment/userRoleAssignment.model.ts similarity index 100% rename from src/modules/userRoleAssignment/userRoleAssignment.model.ts rename to backup/modules/userRoleAssignment/userRoleAssignment.model.ts diff --git a/src/modules/userRoleAssignment/userRoleAssignment.types.ts b/backup/modules/userRoleAssignment/userRoleAssignment.types.ts similarity index 100% rename from src/modules/userRoleAssignment/userRoleAssignment.types.ts rename to backup/modules/userRoleAssignment/userRoleAssignment.types.ts diff --git a/src/modules/userSession/controllers/createUserSession.controller.ts b/backup/modules/userSession/controllers/createUserSession.controller.ts similarity index 96% rename from src/modules/userSession/controllers/createUserSession.controller.ts rename to backup/modules/userSession/controllers/createUserSession.controller.ts index 85f3a0c..9d15ee2 100644 --- a/src/modules/userSession/controllers/createUserSession.controller.ts +++ b/backup/modules/userSession/controllers/createUserSession.controller.ts @@ -1,35 +1,35 @@ -import { Context } from "elysia"; -import { createUserSessionService } from "../services/createUserSession.service"; -import { getUserHeaderInformation } from "../../../helpers/http/userHeader/getUserHeaderInformation"; -import { mainErrorHandler } from "../../../helpers/error/handler"; -import { - returnErrorResponse, - returnWriteResponse, -} from "../../../helpers/callback/httpResponse"; - -export const createUserSessionRole = async ( - ctx: Context & { body: { userId?: string } } -) => { - // Validate request body - if (!ctx.body?.userId) { - return returnErrorResponse(ctx.set, 400, "User ID is required"); - } - - // Get user device and browser information - const userHeaderData = getUserHeaderInformation(ctx); - - try { - const newUserSession = await createUserSessionService({ - userId: ctx.body.userId, - userHeaderInformation: userHeaderData, - }); - return returnWriteResponse( - ctx.set, - 201, - "User session created", - newUserSession - ); - } catch (error) { - return mainErrorHandler(ctx.set, error); - } -}; +import { Context } from "elysia"; +import { createUserSessionService } from "../services/createUserSession.service"; +import { getUserHeaderInformation } from "../../../helpers/http/userHeader/getUserHeaderInformation"; +import { mainErrorHandler } from "../../../helpers/error/handler"; +import { + returnErrorResponse, + returnWriteResponse, +} from "../../../helpers/callback/httpResponse"; + +export const createUserSessionRole = async ( + ctx: Context & { body: { userId?: string } } +) => { + // Validate request body + if (!ctx.body?.userId) { + return returnErrorResponse(ctx.set, 400, "User ID is required"); + } + + // Get user device and browser information + const userHeaderData = getUserHeaderInformation(ctx); + + try { + const newUserSession = await createUserSessionService({ + userId: ctx.body.userId, + userHeaderInformation: userHeaderData, + }); + return returnWriteResponse( + ctx.set, + 201, + "User session created", + newUserSession + ); + } catch (error) { + return mainErrorHandler(ctx.set, error); + } +}; diff --git a/src/modules/userSession/index.ts b/backup/modules/userSession/index.ts similarity index 97% rename from src/modules/userSession/index.ts rename to backup/modules/userSession/index.ts index b2647e8..d0302ac 100644 --- a/src/modules/userSession/index.ts +++ b/backup/modules/userSession/index.ts @@ -1,7 +1,7 @@ -import Elysia from "elysia"; -import { createUserSessionRole } from "./controllers/createUserSession.controller"; - -export const userSessionModule = new Elysia({ prefix: "/user-sessions" }).post( - "/", - createUserSessionRole -); +import Elysia from "elysia"; +import { createUserSessionRole } from "./controllers/createUserSession.controller"; + +export const userSessionModule = new Elysia({ prefix: "/user-sessions" }).post( + "/", + createUserSessionRole +); diff --git a/src/modules/userSession/repositories/checkUserSessionInCache.repository.ts b/backup/modules/userSession/repositories/checkUserSessionInCache.repository.ts similarity index 97% rename from src/modules/userSession/repositories/checkUserSessionInCache.repository.ts rename to backup/modules/userSession/repositories/checkUserSessionInCache.repository.ts index 74837af..d407f8a 100644 --- a/src/modules/userSession/repositories/checkUserSessionInCache.repository.ts +++ b/backup/modules/userSession/repositories/checkUserSessionInCache.repository.ts @@ -1,13 +1,13 @@ -import { AppError } from "../../../helpers/error/instances/app"; -import { redis } from "../../../utils/databases/redis/connection"; - -export const checkUserSessionInCacheRepo = async (redisKeyName: string) => { - try { - const userSessionInRedis = await redis.exists(redisKeyName); - if (!userSessionInRedis) return false; - - return userSessionInRedis; - } catch (error) { - throw new AppError(500, "Server cache error", error); - } -}; +import { AppError } from "../../../helpers/error/instances/app"; +import { redis } from "../../../utils/databases/redis/connection"; + +export const checkUserSessionInCacheRepo = async (redisKeyName: string) => { + try { + const userSessionInRedis = await redis.exists(redisKeyName); + if (!userSessionInRedis) return false; + + return userSessionInRedis; + } catch (error) { + throw new AppError(500, "Server cache error", error); + } +}; diff --git a/src/modules/userSession/repositories/deleteUserSessionFromCache.repository.ts b/backup/modules/userSession/repositories/deleteUserSessionFromCache.repository.ts similarity index 100% rename from src/modules/userSession/repositories/deleteUserSessionFromCache.repository.ts rename to backup/modules/userSession/repositories/deleteUserSessionFromCache.repository.ts diff --git a/src/modules/userSession/repositories/deleteUserSessionFromDB.repository.ts b/backup/modules/userSession/repositories/deleteUserSessionFromDB.repository.ts similarity index 100% rename from src/modules/userSession/repositories/deleteUserSessionFromDB.repository.ts rename to backup/modules/userSession/repositories/deleteUserSessionFromDB.repository.ts diff --git a/src/modules/userSession/repositories/findUniqueUserSessionInDB.repository.ts b/backup/modules/userSession/repositories/findUniqueUserSessionInDB.repository.ts similarity index 95% rename from src/modules/userSession/repositories/findUniqueUserSessionInDB.repository.ts rename to backup/modules/userSession/repositories/findUniqueUserSessionInDB.repository.ts index 57b296a..3ec8cb1 100644 --- a/src/modules/userSession/repositories/findUniqueUserSessionInDB.repository.ts +++ b/backup/modules/userSession/repositories/findUniqueUserSessionInDB.repository.ts @@ -1,32 +1,32 @@ -import { AppError } from "../../../helpers/error/instances/app"; -import { prisma } from "../../../utils/databases/prisma/connection"; - -export const findUniqueUserSessionInDBRepo = async (identifier: string) => { - try { - const userSession = await prisma.userSession.findUnique({ - where: { - id: identifier, - }, - include: { - user: { - omit: { - password: true, - updatedAt: true, - }, - include: { - roles: true, - }, - }, - }, - omit: { - updatedAt: true, - }, - }); - - if (!userSession) return false; - - return userSession; - } catch (error) { - throw new AppError(500, "Database Error", error); - } -}; +import { AppError } from "../../../helpers/error/instances/app"; +import { prisma } from "../../../utils/databases/prisma/connection"; + +export const findUniqueUserSessionInDBRepo = async (identifier: string) => { + try { + const userSession = await prisma.userSession.findUnique({ + where: { + id: identifier, + }, + include: { + user: { + omit: { + password: true, + updatedAt: true, + }, + include: { + roles: true, + }, + }, + }, + omit: { + updatedAt: true, + }, + }); + + if (!userSession) return false; + + return userSession; + } catch (error) { + throw new AppError(500, "Database Error", error); + } +}; diff --git a/src/modules/userSession/repositories/insertUserSessionToDB.repository.ts b/backup/modules/userSession/repositories/insertUserSessionToDB.repository.ts similarity index 95% rename from src/modules/userSession/repositories/insertUserSessionToDB.repository.ts rename to backup/modules/userSession/repositories/insertUserSessionToDB.repository.ts index 637dbdf..94b59ee 100644 --- a/src/modules/userSession/repositories/insertUserSessionToDB.repository.ts +++ b/backup/modules/userSession/repositories/insertUserSessionToDB.repository.ts @@ -1,27 +1,27 @@ -import { Prisma } from "@prisma/client"; -import { userSessionModel } from "../userSession.model"; - -export const createUserSessionRepo = async ( - data: Prisma.UserSessionUncheckedCreateInput -) => { - const newUserSession = await userSessionModel.create({ - data: data, - include: { - user: { - omit: { - password: true, - }, - include: { - roles: true, - }, - }, - }, - omit: { - lastOnline: true, - createdAt: true, - updatedAt: true, - }, - }); - - return newUserSession; -}; +import { Prisma } from "@prisma/client"; +import { userSessionModel } from "../userSession.model"; + +export const createUserSessionRepo = async ( + data: Prisma.UserSessionUncheckedCreateInput +) => { + const newUserSession = await userSessionModel.create({ + data: data, + include: { + user: { + omit: { + password: true, + }, + include: { + roles: true, + }, + }, + }, + omit: { + lastOnline: true, + createdAt: true, + updatedAt: true, + }, + }); + + return newUserSession; +}; diff --git a/src/modules/userSession/repositories/storeUserSessionToCache.repository.ts b/backup/modules/userSession/repositories/storeUserSessionToCache.repository.ts similarity index 96% rename from src/modules/userSession/repositories/storeUserSessionToCache.repository.ts rename to backup/modules/userSession/repositories/storeUserSessionToCache.repository.ts index 794921f..c366725 100644 --- a/src/modules/userSession/repositories/storeUserSessionToCache.repository.ts +++ b/backup/modules/userSession/repositories/storeUserSessionToCache.repository.ts @@ -1,14 +1,14 @@ -import { Prisma } from "@prisma/client"; -import { redis } from "../../../utils/databases/redis/connection"; - -export const storeUserSessionToCacheRepo = async ( - userSession: Prisma.UserSessionUncheckedCreateInput, - timeExpires: number -) => { - await redis.set( - `${process.env.APP_NAME}:users:${userSession.userId}:sessions:${userSession.id}`, - String(userSession.validUntil), - "EX", - timeExpires - ); -}; +import { Prisma } from "@prisma/client"; +import { redis } from "../../../utils/databases/redis/connection"; + +export const storeUserSessionToCacheRepo = async ( + userSession: Prisma.UserSessionUncheckedCreateInput, + timeExpires: number +) => { + await redis.set( + `${process.env.APP_NAME}:users:${userSession.userId}:sessions:${userSession.id}`, + String(userSession.validUntil), + "EX", + timeExpires + ); +}; diff --git a/src/modules/userSession/services/checkUserSessionInCache.service.ts b/backup/modules/userSession/services/checkUserSessionInCache.service.ts similarity index 97% rename from src/modules/userSession/services/checkUserSessionInCache.service.ts rename to backup/modules/userSession/services/checkUserSessionInCache.service.ts index ceb61eb..0d20859 100644 --- a/src/modules/userSession/services/checkUserSessionInCache.service.ts +++ b/backup/modules/userSession/services/checkUserSessionInCache.service.ts @@ -1,19 +1,19 @@ -import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; -import { checkUserSessionInCacheRepo } from "../repositories/checkUserSessionInCache.repository"; - -export const checkUserSessionInCacheService = async ( - userId: string, - sessionId: string -) => { - try { - // Construct the Redis key name using the userId and sessionId - const redisKeyName = `${process.env.APP_NAME}:users:${userId}:sessions:${sessionId}`; - - // Check if the user session exists in Redis - const userSessionInRedis = await checkUserSessionInCacheRepo(redisKeyName); - return userSessionInRedis; - } catch (error) { - // Forward the error with a 400 status code and a message - ErrorForwarder(error, 400, "Bad Request"); - } -}; +import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; +import { checkUserSessionInCacheRepo } from "../repositories/checkUserSessionInCache.repository"; + +export const checkUserSessionInCacheService = async ( + userId: string, + sessionId: string +) => { + try { + // Construct the Redis key name using the userId and sessionId + const redisKeyName = `${process.env.APP_NAME}:users:${userId}:sessions:${sessionId}`; + + // Check if the user session exists in Redis + const userSessionInRedis = await checkUserSessionInCacheRepo(redisKeyName); + return userSessionInRedis; + } catch (error) { + // Forward the error with a 400 status code and a message + ErrorForwarder(error, 400, "Bad Request"); + } +}; diff --git a/src/modules/userSession/services/createUserSession.service.ts b/backup/modules/userSession/services/createUserSession.service.ts similarity index 97% rename from src/modules/userSession/services/createUserSession.service.ts rename to backup/modules/userSession/services/createUserSession.service.ts index 3c769a5..754981b 100644 --- a/src/modules/userSession/services/createUserSession.service.ts +++ b/backup/modules/userSession/services/createUserSession.service.ts @@ -1,27 +1,27 @@ -import { createUserSessionServiceParams } from "../userSession.types"; -import { createUserSessionRepo } from "../repositories/insertUserSessionToDB.repository"; -import { storeUserSessionToCacheRepo } from "../repositories/storeUserSessionToCache.repository"; -import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; - -export const createUserSessionService = async ( - data: createUserSessionServiceParams -) => { - const sessionLifetime = Number(process.env.SESSION_EXPIRE!); - try { - const newUserSession = await createUserSessionRepo({ - userId: data.userId, - isAuthenticated: true, - deviceType: data.userHeaderInformation.deviceType, - deviceOs: data.userHeaderInformation.deviceOS, - deviceIp: data.userHeaderInformation.ip, - validUntil: new Date(new Date().getTime() + sessionLifetime * 1000), - }); - - const timeExpires = Number(process.env.SESSION_EXPIRE!); - await storeUserSessionToCacheRepo(newUserSession, timeExpires); - - return newUserSession; - } catch (error) { - ErrorForwarder(error); - } -}; +import { createUserSessionServiceParams } from "../userSession.types"; +import { createUserSessionRepo } from "../repositories/insertUserSessionToDB.repository"; +import { storeUserSessionToCacheRepo } from "../repositories/storeUserSessionToCache.repository"; +import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; + +export const createUserSessionService = async ( + data: createUserSessionServiceParams +) => { + const sessionLifetime = Number(process.env.SESSION_EXPIRE!); + try { + const newUserSession = await createUserSessionRepo({ + userId: data.userId, + isAuthenticated: true, + deviceType: data.userHeaderInformation.deviceType, + deviceOs: data.userHeaderInformation.deviceOS, + deviceIp: data.userHeaderInformation.ip, + validUntil: new Date(new Date().getTime() + sessionLifetime * 1000), + }); + + const timeExpires = Number(process.env.SESSION_EXPIRE!); + await storeUserSessionToCacheRepo(newUserSession, timeExpires); + + return newUserSession; + } catch (error) { + ErrorForwarder(error); + } +}; diff --git a/src/modules/userSession/services/deleteUserSessionInCacheAndDB.service.ts b/backup/modules/userSession/services/deleteUserSessionInCacheAndDB.service.ts similarity index 100% rename from src/modules/userSession/services/deleteUserSessionInCacheAndDB.service.ts rename to backup/modules/userSession/services/deleteUserSessionInCacheAndDB.service.ts diff --git a/src/modules/userSession/services/getUserSessionFromDB.service.ts b/backup/modules/userSession/services/getUserSessionFromDB.service.ts similarity index 97% rename from src/modules/userSession/services/getUserSessionFromDB.service.ts rename to backup/modules/userSession/services/getUserSessionFromDB.service.ts index 42787ae..fc9fb9f 100644 --- a/src/modules/userSession/services/getUserSessionFromDB.service.ts +++ b/backup/modules/userSession/services/getUserSessionFromDB.service.ts @@ -1,24 +1,24 @@ -import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; -import { findUniqueUserSessionInDBRepo } from "../repositories/findUniqueUserSessionInDB.repository"; - -export const getUserSessionFromDBService = async (identifier: string) => { - try { - // Check is session exists in DB - const userSession = await findUniqueUserSessionInDBRepo(identifier); - - // If session not found, return false - if ( - !userSession || - !userSession.isAuthenticated || - userSession.deletedAt || - new Date(userSession.validUntil) < new Date() - ) - return false; - - // If session found, return it - return userSession; - } catch (error) { - // If any DB error occurs, throw an AppError - ErrorForwarder(error, 401, "Unable to get user session"); - } -}; +import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; +import { findUniqueUserSessionInDBRepo } from "../repositories/findUniqueUserSessionInDB.repository"; + +export const getUserSessionFromDBService = async (identifier: string) => { + try { + // Check is session exists in DB + const userSession = await findUniqueUserSessionInDBRepo(identifier); + + // If session not found, return false + if ( + !userSession || + !userSession.isAuthenticated || + userSession.deletedAt || + new Date(userSession.validUntil) < new Date() + ) + return false; + + // If session found, return it + return userSession; + } catch (error) { + // If any DB error occurs, throw an AppError + ErrorForwarder(error, 401, "Unable to get user session"); + } +}; diff --git a/src/modules/userSession/services/storeUserSessionToCache.service.ts b/backup/modules/userSession/services/storeUserSessionToCache.service.ts similarity index 97% rename from src/modules/userSession/services/storeUserSessionToCache.service.ts rename to backup/modules/userSession/services/storeUserSessionToCache.service.ts index 53175df..adf0255 100644 --- a/src/modules/userSession/services/storeUserSessionToCache.service.ts +++ b/backup/modules/userSession/services/storeUserSessionToCache.service.ts @@ -1,17 +1,17 @@ -import { Prisma } from "@prisma/client"; -import { storeUserSessionToCacheRepo } from "../repositories/storeUserSessionToCache.repository"; -import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; - -export const storeUserSessionToCacheService = async ( - userSession: Prisma.UserSessionUncheckedCreateInput, - timeExpires: number -) => { - try { - // Store user session in cache with expiration time - await storeUserSessionToCacheRepo(userSession, timeExpires); - return; - } catch (error) { - // If any error occurs while storing session in cache, throw an AppError - ErrorForwarder(error, 401, "Failed to store user session to cache"); - } -}; +import { Prisma } from "@prisma/client"; +import { storeUserSessionToCacheRepo } from "../repositories/storeUserSessionToCache.repository"; +import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; + +export const storeUserSessionToCacheService = async ( + userSession: Prisma.UserSessionUncheckedCreateInput, + timeExpires: number +) => { + try { + // Store user session in cache with expiration time + await storeUserSessionToCacheRepo(userSession, timeExpires); + return; + } catch (error) { + // If any error occurs while storing session in cache, throw an AppError + ErrorForwarder(error, 401, "Failed to store user session to cache"); + } +}; diff --git a/src/modules/userSession/userSession.model.ts b/backup/modules/userSession/userSession.model.ts similarity index 97% rename from src/modules/userSession/userSession.model.ts rename to backup/modules/userSession/userSession.model.ts index f58d6da..6c993a4 100644 --- a/src/modules/userSession/userSession.model.ts +++ b/backup/modules/userSession/userSession.model.ts @@ -1,3 +1,3 @@ -import { prisma } from "../../utils/databases/prisma/connection"; - -export const userSessionModel = prisma.userSession; +import { prisma } from "../../utils/databases/prisma/connection"; + +export const userSessionModel = prisma.userSession; diff --git a/src/modules/userSession/userSession.types.ts b/backup/modules/userSession/userSession.types.ts similarity index 97% rename from src/modules/userSession/userSession.types.ts rename to backup/modules/userSession/userSession.types.ts index 3c19e21..f451af3 100644 --- a/src/modules/userSession/userSession.types.ts +++ b/backup/modules/userSession/userSession.types.ts @@ -1,6 +1,6 @@ -import { UserHeaderInformation } from "../../helpers/http/userHeader/getUserHeaderInformation/types"; - -export interface createUserSessionServiceParams { - userId: string; - userHeaderInformation: UserHeaderInformation; -} +import { UserHeaderInformation } from "../../helpers/http/userHeader/getUserHeaderInformation/types"; + +export interface createUserSessionServiceParams { + userId: string; + userHeaderInformation: UserHeaderInformation; +}