add:module:auth:*logout | add logout module and clean all session in system

This commit is contained in:
2025-06-19 17:16:54 +07:00
parent fdfafcd2e0
commit ac82676505
15 changed files with 130 additions and 5 deletions

View File

@ -0,0 +1,16 @@
import { AppError } from "../../../helpers/error/instances/app";
import { redis } from "../../../utils/databases/redis/connection";
export const deleteUserSessionFromCacheRepo = async (
userId: string,
sessionId: string
) => {
try {
const deleteUserSessionFromCache = redis.del(
`${process.env.APP_NAME}:users:${userId}:sessions:${sessionId}`
);
return deleteUserSessionFromCache;
} catch (error) {
throw new AppError(500, "Error while remove data from cache", error);
}
};

View File

@ -0,0 +1,19 @@
import { AppError } from "../../../helpers/error/instances/app";
import { prisma } from "../../../utils/databases/prisma/connection";
export const deleteUserSessionFromDBRepo = async (sessionId: string) => {
try {
const deleteUserSessionFromCacheDB = await prisma.userSession.update({
where: {
id: sessionId,
},
data: {
deletedAt: new Date(),
},
});
return deleteUserSessionFromCacheDB;
} catch (error) {
throw new AppError(500, "Error while remove delete from database", error);
}
};

View File

@ -19,7 +19,6 @@ export const findUniqueUserSessionInDBRepo = async (identifier: string) => {
},
},
omit: {
deletedAt: true,
updatedAt: true,
},
});

View File

@ -20,7 +20,6 @@ export const createUserSessionRepo = async (
},
omit: {
lastOnline: true,
deletedAt: true,
createdAt: true,
updatedAt: true,
},

View File

@ -8,7 +8,7 @@ export const storeUserSessionToCacheRepo = async (
) => {
try {
await redis.set(
`${process.env.app_name}:users:${userSession.userId}:sessions:${userSession.id}`,
`${process.env.APP_NAME}:users:${userSession.userId}:sessions:${userSession.id}`,
String(userSession.validUntil),
"EX",
timeExpires

View File

@ -7,7 +7,7 @@ export const checkUserSessionInCacheService = async (
) => {
try {
// Construct the Redis key name using the userId and sessionId
const redisKeyName = `${process.env.app_name}:users:${userId}:sessions:${sessionId}`;
const redisKeyName = `${process.env.APP_NAME}:users:${userId}:sessions:${sessionId}`;
// Check if the user session exists in Redis
const userSessionInRedis = await checkUserSessionInCacheRepo(redisKeyName);

View File

@ -0,0 +1,25 @@
import { ErrorForwarder } from "../../../helpers/error/instances/forwarder";
import { JWTAuthToken } from "../../../helpers/http/jwt/decode/types";
import { deleteUserSessionFromCacheRepo } from "../repositories/deleteUserSessionFromCache.repository";
import { deleteUserSessionFromDBRepo } from "../repositories/deleteUserSessionFromDB.repository";
export const deleteUserSessionInCacheAndDBService = async (
jwtToken: JWTAuthToken
) => {
try {
const userId = jwtToken.userId;
const sessionId = jwtToken.id;
await deleteUserSessionFromCacheRepo(userId, sessionId);
const deleteUserSessionFromDB = await deleteUserSessionFromDBRepo(
sessionId
);
return deleteUserSessionFromDB;
} catch (error) {
ErrorForwarder(
error,
500,
"Delete user session service had encountered error"
);
}
};

View File

@ -10,6 +10,7 @@ export const getUserSessionFromDBService = async (identifier: string) => {
if (
!userSession ||
!userSession.isAuthenticated ||
userSession.deletedAt ||
new Date(userSession.validUntil) < new Date()
)
return false;