From 42aa7ed8d35c93ff75c67a71dc550fe5c28c0953 Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Fri, 13 Feb 2026 19:46:44 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20add=20logout=20endpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/helpers/http/jwt/decode/example.json | 0 .../auth/services/http/logout.service.ts | 9 ++++++++- .../deleteUserSession.repository.ts | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/helpers/http/jwt/decode/example.json create mode 100644 src/modules/userSession/repositories/deleteUserSession.repository.ts diff --git a/src/helpers/http/jwt/decode/example.json b/src/helpers/http/jwt/decode/example.json new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/auth/services/http/logout.service.ts b/src/modules/auth/services/http/logout.service.ts index 0662960..40ade6a 100644 --- a/src/modules/auth/services/http/logout.service.ts +++ b/src/modules/auth/services/http/logout.service.ts @@ -1,13 +1,20 @@ import { AppError } from "../../../../helpers/error/instances/app"; import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; import { jwtDecode } from "../../../../helpers/http/jwt/decode"; +import { redis } from "../../../../utils/databases/redis/connection"; +import { deleteUserSessionRepository } from "../../../userSession/repositories/deleteUserSession.repository"; export const logoutService = async (jwtToken?: any) => { try { if (!jwtToken) throw new AppError(403, "No auth token provided"); const jwtPayload = jwtDecode(jwtToken); - return jwtPayload; + + await redis.del( + `${process.env.APP_NAME}:users:${jwtPayload.user.id}:sessions:${jwtPayload.id}`, + ); + + return deleteUserSessionRepository(jwtPayload.id); } catch (error) { ErrorForwarder(error); } diff --git a/src/modules/userSession/repositories/deleteUserSession.repository.ts b/src/modules/userSession/repositories/deleteUserSession.repository.ts new file mode 100644 index 0000000..def23ad --- /dev/null +++ b/src/modules/userSession/repositories/deleteUserSession.repository.ts @@ -0,0 +1,18 @@ +import { AppError } from "../../../helpers/error/instances/app"; +import { prisma } from "../../../utils/databases/prisma/connection"; + +export const deleteUserSessionRepository = async (sessionId: string) => { + try { + return await prisma.userSession.update({ + where: { + id: sessionId, + }, + data: { + isAuthenticated: false, + deletedAt: new Date(), + }, + }); + } catch (error) { + throw new AppError(500, "Failed to delete user session", error); + } +};