From 4bdb16ab9c0002e43d2545c0c88687c93dfef53d Mon Sep 17 00:00:00 2001 From: Md-Rubel-Ahmed-Rana Date: Sat, 6 Jul 2024 16:12:57 +0600 Subject: [PATCH 1/2] logout api design completed --- backend/dist/controllers/user.controller.js | 13 +++++++++++++ backend/dist/routes/user.route.js | 1 + backend/src/controllers/user.controller.ts | 13 +++++++++++++ backend/src/routes/user.route.ts | 2 ++ 4 files changed, 29 insertions(+) diff --git a/backend/dist/controllers/user.controller.js b/backend/dist/controllers/user.controller.js index 2230d28..e5e96df 100644 --- a/backend/dist/controllers/user.controller.js +++ b/backend/dist/controllers/user.controller.js @@ -72,6 +72,19 @@ class Controller extends rootController_1.default { data: null, }); })); + this.logout = this.catchAsync((req, res) => __awaiter(this, void 0, void 0, function* () { + res.clearCookie("tmAccessToken", { + httpOnly: true, + sameSite: "none", + secure: true, + }); + this.apiResponse(res, { + statusCode: http_status_1.default.OK, + success: true, + message: "Logout successful", + data: null, + }); + })); } } exports.UserController = new Controller(); diff --git a/backend/dist/routes/user.route.js b/backend/dist/routes/user.route.js index df5ab4b..d460e88 100644 --- a/backend/dist/routes/user.route.js +++ b/backend/dist/routes/user.route.js @@ -15,4 +15,5 @@ router.get("/", user_controller_1.UserController.getAllUsers); router.get("/auth", auth_1.default, user_controller_1.UserController.auth); router.patch("/update/:id", (0, validateRequest_1.default)(user_validation_1.UserValidationSchema.updateZodSchema), user_controller_1.UserController.updateUser); router.post("/login", (0, validateRequest_1.default)(user_validation_1.UserValidationSchema.loginZodSchema), user_controller_1.UserController.login); +router.delete("/logout", user_controller_1.UserController.logout); exports.UserRoutes = router; diff --git a/backend/src/controllers/user.controller.ts b/backend/src/controllers/user.controller.ts index 74a157d..fa103ea 100644 --- a/backend/src/controllers/user.controller.ts +++ b/backend/src/controllers/user.controller.ts @@ -62,6 +62,19 @@ class Controller extends RootController { data: null, }); }); + logout = this.catchAsync(async (req: Request, res: Response) => { + res.clearCookie("tmAccessToken", { + httpOnly: true, + sameSite: "none", + secure: true, + }); + this.apiResponse(res, { + statusCode: httpStatus.OK, + success: true, + message: "Logout successful", + data: null, + }); + }); } export const UserController = new Controller(); diff --git a/backend/src/routes/user.route.ts b/backend/src/routes/user.route.ts index 718e004..800bd9d 100644 --- a/backend/src/routes/user.route.ts +++ b/backend/src/routes/user.route.ts @@ -28,4 +28,6 @@ router.post( UserController.login ); +router.delete("/logout", UserController.logout); + export const UserRoutes = router; From 52781b47a33a8efdc80c08be1ae11987f2fc36a8 Mon Sep 17 00:00:00 2001 From: Md-Rubel-Ahmed-Rana Date: Sat, 6 Jul 2024 16:31:06 +0600 Subject: [PATCH 2/2] Logout api integrated --- .../dashboard/navigationBars/Sidebar.tsx | 19 ++++++++++++++----- .../pages/dashboard/navigationBars/TopBar.tsx | 19 ++++++++++++++----- frontend/src/components/shared/Navbar.tsx | 10 ++++++---- frontend/src/features/user/index.ts | 9 +++++++++ 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/pages/dashboard/navigationBars/Sidebar.tsx b/frontend/src/components/pages/dashboard/navigationBars/Sidebar.tsx index 8e6caa8..81c2990 100644 --- a/frontend/src/components/pages/dashboard/navigationBars/Sidebar.tsx +++ b/frontend/src/components/pages/dashboard/navigationBars/Sidebar.tsx @@ -1,12 +1,11 @@ import React from "react"; -import Cookies from "js-cookie"; import Link from "next/link"; import { useRouter } from "next/router"; import { useAssignedProjectsQuery, useMyProjectsQuery, } from "@/features/project"; -import { useLoggedInUserQuery } from "@/features/user"; +import { useLoggedInUserQuery, useLogoutUserMutation } from "@/features/user"; import { IUser } from "@/interfaces/user.interface"; import { CgProfile } from "react-icons/cg"; import { TbBrandTeams } from "react-icons/tb"; @@ -18,10 +17,12 @@ import { import { FcLeave } from "react-icons/fc"; import { BiLogoMicrosoftTeams } from "react-icons/bi"; import { GrProjects } from "react-icons/gr"; +import Swal from "sweetalert2"; const Sidebar = ({ setActiveView, activeView }: any) => { const router = useRouter(); const { data: userData } = useLoggedInUserQuery({}); + const [logout] = useLogoutUserMutation({}); const user: IUser = userData?.data; const { data: projects } = useMyProjectsQuery(user?.id); const { data: assignedProjects } = useAssignedProjectsQuery(user?.id); @@ -36,9 +37,17 @@ const Sidebar = ({ setActiveView, activeView }: any) => { }); }; - const handleLogOut = () => { - Cookies.remove("tmAccessToken"); - window.location.replace("/"); + const handleLogOut = async () => { + const res: any = await logout(""); + if (res?.data?.statusCode === 200) { + Swal.fire({ + position: "center", + icon: "success", + title: res?.data?.message, + showConfirmButton: false, + }); + window.location.replace("/"); + } }; return ( diff --git a/frontend/src/components/pages/dashboard/navigationBars/TopBar.tsx b/frontend/src/components/pages/dashboard/navigationBars/TopBar.tsx index 00530f1..54625f0 100644 --- a/frontend/src/components/pages/dashboard/navigationBars/TopBar.tsx +++ b/frontend/src/components/pages/dashboard/navigationBars/TopBar.tsx @@ -1,18 +1,19 @@ /* eslint-disable react-hooks/exhaustive-deps */ import React, { useEffect } from "react"; -import Cookies from "js-cookie"; import Link from "next/link"; import { useRouter } from "next/router"; import { useAssignedProjectsQuery, useMyProjectsQuery, } from "@/features/project"; -import { useLoggedInUserQuery } from "@/features/user"; +import { useLoggedInUserQuery, useLogoutUserMutation } from "@/features/user"; import { IUser } from "@/interfaces/user.interface"; +import Swal from "sweetalert2"; const TopBar = ({ setActiveView, activeView }: any) => { const router = useRouter(); const { data: userData } = useLoggedInUserQuery({}); + const [logout] = useLogoutUserMutation({}); const user: IUser = userData?.data; const { data: projects } = useMyProjectsQuery(user?.id); const { data: assignedProjects } = useAssignedProjectsQuery(user?.id); @@ -38,9 +39,17 @@ const TopBar = ({ setActiveView, activeView }: any) => { } }; - const handleLogOut = () => { - Cookies.remove("tmAccessToken"); - window.location.replace("/"); + const handleLogOut = async () => { + const res: any = await logout(""); + if (res?.data?.statusCode === 200) { + Swal.fire({ + position: "center", + icon: "success", + title: res?.data?.message, + showConfirmButton: false, + }); + window.location.replace("/"); + } }; useEffect(() => { diff --git a/frontend/src/components/shared/Navbar.tsx b/frontend/src/components/shared/Navbar.tsx index bde9768..1a16df0 100644 --- a/frontend/src/components/shared/Navbar.tsx +++ b/frontend/src/components/shared/Navbar.tsx @@ -5,7 +5,7 @@ import { BiX } from "react-icons/bi"; import NotificationModal from "../pages/notifications/NotificationModal"; import { useContext, useEffect, useState } from "react"; import { IUser } from "@/interfaces/user.interface"; -import { useLoggedInUserQuery } from "@/features/user"; +import { useLoggedInUserQuery, useLogoutUserMutation } from "@/features/user"; import Link from "next/link"; import { useTheme } from "next-themes"; import Cookies from "js-cookie"; @@ -17,6 +17,7 @@ const Navbar = () => { const { socket }: any = useContext(SocketContext); const { theme, setTheme } = useTheme(); const { data }: any = useLoggedInUserQuery({}); + const [logout] = useLogoutUserMutation({}); const user: IUser = data?.data; const [isOpen, setIsOpen] = useState(false); const [toggle, setToggle] = useState(false); @@ -26,9 +27,10 @@ const Navbar = () => { INotification[] >([]); - const handleLogOut = () => { - Cookies.remove("tmAccessToken"); - window.location.replace("/"); + const handleLogOut = async () => { + const res = await logout(""); + console.log(res); + // window.location.replace("/"); }; useEffect(() => { diff --git a/frontend/src/features/user/index.ts b/frontend/src/features/user/index.ts index 3d968da..80e9fb4 100644 --- a/frontend/src/features/user/index.ts +++ b/frontend/src/features/user/index.ts @@ -39,6 +39,14 @@ const userApi = apiSlice.injectEndpoints({ }), invalidatesTags: ["user", "team"] as any, }), + logoutUser: builder.mutation({ + query: () => ({ + method: "DELETE", + url: `/user/logout`, + credentials: "include", + }), + invalidatesTags: ["user"] as any, + }), }), }); @@ -48,4 +56,5 @@ export const { useLoginUserMutation, useLoggedInUserQuery, useUpdateUserMutation, + useLogoutUserMutation, } = userApi;