From 9e84460a22e9b36cb5c8d15f4438bc0aa94391ae Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Wed, 18 Feb 2026 12:17:26 +0700 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20create=20Redis?= =?UTF-8?q?=20helper=20and=20replace=20direct=20Redis=20access?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/http/tokenValidation.service.ts | 5 ++-- .../services/createUserSession.service.ts | 7 ++--- .../createUserSessionInRedis.service.ts | 30 +++++++++++++++++++ 3 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 src/modules/userSession/services/internal/createUserSessionInRedis.service.ts diff --git a/src/modules/auth/services/http/tokenValidation.service.ts b/src/modules/auth/services/http/tokenValidation.service.ts index aa9b28d..f078b91 100644 --- a/src/modules/auth/services/http/tokenValidation.service.ts +++ b/src/modules/auth/services/http/tokenValidation.service.ts @@ -3,6 +3,7 @@ import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; import { jwtDecode } from "../../../../helpers/http/jwt/decode"; import { redis } from "../../../../utils/databases/redis/connection"; import { checkUserSessionInDBService } from "../../../userSession/services/internal/checkUserSessionInDB.service"; +import { createUserSessionInRedisService } from "../../../userSession/services/internal/createUserSessionInRedis.service"; export const tokenValidationService = async (payload: string) => { try { @@ -20,13 +21,11 @@ export const tokenValidationService = async (payload: string) => { const dbValidationResult = await checkUserSessionInDBService(decoded.id); if (!dbValidationResult) throw new AppError(403, "Unauthorized: Invalid session"); - const createRedisKey = `${process.env.APP_NAME}:users:${decoded.user.id}:sessions:${decoded.id}`; - await redis.hset(createRedisKey, { + await createUserSessionInRedisService({ userId: decoded.user.id, sessionId: decoded.id, validUntil: decoded.validUntil, }); - await redis.expire(createRedisKey, Number(process.env.SESSION_EXPIRE)); } return decoded; diff --git a/src/modules/userSession/services/createUserSession.service.ts b/src/modules/userSession/services/createUserSession.service.ts index cefb850..ac275c3 100644 --- a/src/modules/userSession/services/createUserSession.service.ts +++ b/src/modules/userSession/services/createUserSession.service.ts @@ -4,10 +4,11 @@ import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; import { createUserSessionRepository } from "../repositories/createUserSession.repository"; import { redis } from "../../../utils/databases/redis/connection"; import { jwtEncode } from "../../../helpers/http/jwt/encode"; +import { createUserSessionInRedisService } from "./internal/createUserSessionInRedis.service"; export const createUserSessionService = async ( userId: string, - userHeaderInfo: UserHeaderInformation + userHeaderInfo: UserHeaderInformation, ) => { try { // set the date when the token will expire @@ -29,13 +30,11 @@ export const createUserSessionService = async ( const createUserSession = await createUserSessionRepository(constructData); // caching user session data into Redis - const createRedisKey = `${process.env.APP_NAME}:users:${userId}:sessions:${createUserSession.id}`; - await redis.hset(createRedisKey, { + await createUserSessionInRedisService({ userId, sessionId: createUserSession.id, validUntil: createUserSession.validUntil, }); - await redis.expire(createRedisKey, Number(process.env.SESSION_EXPIRE)); // create a jwt token with a payload containing the created user session, then return jwt return jwtEncode(createUserSession); diff --git a/src/modules/userSession/services/internal/createUserSessionInRedis.service.ts b/src/modules/userSession/services/internal/createUserSessionInRedis.service.ts new file mode 100644 index 0000000..77cf6d8 --- /dev/null +++ b/src/modules/userSession/services/internal/createUserSessionInRedis.service.ts @@ -0,0 +1,30 @@ +import { AppError } from "../../../../helpers/error/instances/app"; +import { redis } from "../../../../utils/databases/redis/connection"; + +export const createUserSessionInRedisService = async ({ + userId, + sessionId, + validUntil, + exp, +}: { + userId: string; + sessionId: string; + validUntil?: Date; + exp?: number; +}) => { + try { + const createRedisKey = `${process.env.APP_NAME}:users:${userId}:sessions:${sessionId}`; + await redis.hset(createRedisKey, { + userId, + sessionId, + validUntil: validUntil, + }); + await redis.expire( + createRedisKey, + exp || Number(process.env.SESSION_CACHE_EXPIRE!), + ); + return true; + } catch (error) { + throw new AppError(500, "Error creating user session in Redis", error); + } +};