♻️ refactor: create Redis helper and replace direct Redis access

This commit is contained in:
2026-02-18 12:17:26 +07:00
parent 9686153a82
commit 9e84460a22
3 changed files with 35 additions and 7 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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);
}
};