diff --git a/frontend/src/components/Topbar.tsx b/frontend/src/components/Topbar.tsx index 9d1c19e..13700d8 100644 --- a/frontend/src/components/Topbar.tsx +++ b/frontend/src/components/Topbar.tsx @@ -1,17 +1,18 @@ import { Menu, X } from 'lucide-react'; import MenuButton from "./buttons/MenuButton.tsx"; import clsx from "clsx"; +import type {User} from "../utils/types.ts"; type props = { sidebarToggled: boolean; setSidebarToggled: Function; + user: User | null; className?: string; } -const Topbar = ({sidebarToggled, setSidebarToggled, className}: props) => { +const Topbar = ({sidebarToggled, setSidebarToggled, user, className}: props) => { const apiUrl = import.meta.env.VITE_API_URL; - const redirectUri = encodeURIComponent(window.location.href); - const loginUrl = `${apiUrl}/oauth2/authorization/google?redirect_uri=${redirectUri}`; + const loginUrl = `${apiUrl}/oauth2/authorization/google`; return (
@@ -19,9 +20,9 @@ const Topbar = ({sidebarToggled, setSidebarToggled, className}: props) => { {sidebarToggled ? : } - globalThis.location.href = loginUrl}> - Login + { user ? user.name : "Login" }
) diff --git a/frontend/src/layouts/MainLayout.tsx b/frontend/src/layouts/MainLayout.tsx index 1490916..aca598e 100644 --- a/frontend/src/layouts/MainLayout.tsx +++ b/frontend/src/layouts/MainLayout.tsx @@ -2,10 +2,26 @@ import Sidebar from '../components/Sidebar' import Topbar from '../components/Topbar' import { Outlet } from 'react-router-dom'; -import {useState} from "react"; +import {useEffect, useState} from "react"; +import type {User} from "../utils/types"; +import { getUser } from "../utils/endpoints"; const MainLayout = () => { const [sidebarToggled, setSidebarToggled] = useState(false); + const [user, setUser] = useState(null); + + useEffect(() => { + const fetchUser = async () => { + try { + const userData = await getUser(); + setUser(userData); + } catch (error) { + console.error('Failed to fetch user:', error); + } + }; + + fetchUser(); + }, []); return (
@@ -14,7 +30,8 @@ const MainLayout = () => { + setSidebarToggled={setSidebarToggled} + user={user}/>
diff --git a/frontend/src/utils/endpoints.ts b/frontend/src/utils/endpoints.ts index a916dfc..a5b20fe 100644 --- a/frontend/src/utils/endpoints.ts +++ b/frontend/src/utils/endpoints.ts @@ -1,4 +1,4 @@ -import type {VideoMetadata, APIResponse} from "./types.ts"; +import type {VideoMetadata, APIResponse, User} from "./types.ts"; /** * Uploads a file to the backend. @@ -129,10 +129,23 @@ const getMetadata = async (uuid: string): Promise => { } }; +const getUser = async (): Promise => { + try { + const response = await fetch('/api/v1/auth/user', {credentials: "include",}); + + const result = await response.json(); + return result.data; + } catch (error: unknown) { + console.error('Error fetching user:', error); + return null; + } +} + export { uploadFile, editFile, processFile, getProgress, getMetadata, + getUser }; \ No newline at end of file diff --git a/frontend/src/utils/types.ts b/frontend/src/utils/types.ts index 0572b48..43f80d0 100644 --- a/frontend/src/utils/types.ts +++ b/frontend/src/utils/types.ts @@ -13,7 +13,13 @@ type APIResponse = { message: string } +type User = { + name: string, + email: string +} + export type { APIResponse, - VideoMetadata + VideoMetadata, + User } \ No newline at end of file diff --git a/src/main/java/com/ddf/vodsystem/configuration/SecurityConfig.java b/src/main/java/com/ddf/vodsystem/configuration/SecurityConfig.java index 6e3bd10..ac05736 100644 --- a/src/main/java/com/ddf/vodsystem/configuration/SecurityConfig.java +++ b/src/main/java/com/ddf/vodsystem/configuration/SecurityConfig.java @@ -1,5 +1,6 @@ package com.ddf.vodsystem.configuration; +import com.ddf.vodsystem.security.CustomOAuth2UserService; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -46,4 +47,4 @@ public class SecurityConfig { return (request, response, authentication) -> response.sendRedirect(frontendUrl); } -} +} \ No newline at end of file diff --git a/src/main/java/com/ddf/vodsystem/controllers/AuthController.java b/src/main/java/com/ddf/vodsystem/controllers/AuthController.java index 56a4e00..523182c 100644 --- a/src/main/java/com/ddf/vodsystem/controllers/AuthController.java +++ b/src/main/java/com/ddf/vodsystem/controllers/AuthController.java @@ -1,5 +1,8 @@ package com.ddf.vodsystem.controllers; +import com.ddf.vodsystem.entities.APIResponse; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.web.bind.annotation.GetMapping; @@ -13,7 +16,21 @@ import java.util.Map; public class AuthController { @GetMapping("/user") - public Map user(@AuthenticationPrincipal OAuth2User principal) { - return principal.getAttributes(); + public ResponseEntity>> user(@AuthenticationPrincipal OAuth2User principal) { + if (principal == null) { + return ResponseEntity.status(HttpStatus.FORBIDDEN). + body(new APIResponse<>( + "error", + "User not authenticated", + null + )); + } + + return ResponseEntity.ok( + new APIResponse<>("success", "User details retrieved successfully", Map.of( + "name", principal.getAttribute("name"), + "email", principal.getAttribute("email")) + ) + ); } -} +} \ No newline at end of file diff --git a/src/main/java/com/ddf/vodsystem/configuration/CustomOAuth2UserService.java b/src/main/java/com/ddf/vodsystem/security/CustomOAuth2UserService.java similarity index 97% rename from src/main/java/com/ddf/vodsystem/configuration/CustomOAuth2UserService.java rename to src/main/java/com/ddf/vodsystem/security/CustomOAuth2UserService.java index 1c788d9..2cf1212 100644 --- a/src/main/java/com/ddf/vodsystem/configuration/CustomOAuth2UserService.java +++ b/src/main/java/com/ddf/vodsystem/security/CustomOAuth2UserService.java @@ -1,4 +1,4 @@ -package com.ddf.vodsystem.configuration; +package com.ddf.vodsystem.security; import com.ddf.vodsystem.entities.User; import com.ddf.vodsystem.repositories.UserRepository;