diff --git a/api/main.go b/api/main.go index f246a5d..f482b37 100644 --- a/api/main.go +++ b/api/main.go @@ -247,6 +247,31 @@ func main() { sendJSON(w, AuthResponse{token}, 200) }) + mux.HandleFunc("GET /user", func(w http.ResponseWriter, r *http.Request) { + userId, err := getUserIdFromRequest(r) + if err != nil { + sendApiError(w, "invalid token", err, 401) + return + } + + row := db.QueryRowx("SELECT * FROM users WHERE id = ?", userId) + if row.Err() != nil { + sendApiError(w, "user not found", row.Err(), 401) + return + } + + var user User + if err := row.StructScan(&user); err != nil { + sendApiError(w, "user not found", err, 401) + return + } + + if err := sendJSON(w, user, 200); err != nil { + sendApiError(w, "user not found", err, 401) + return + } + }) + mux.HandleFunc("GET /articles", func(w http.ResponseWriter, r *http.Request) { userId, err := getUserIdFromRequest(r) if err != nil { diff --git a/web/src/api/auth/useUserQuery.ts b/web/src/api/auth/useUserQuery.ts new file mode 100644 index 0000000..bb7f6c9 --- /dev/null +++ b/web/src/api/auth/useUserQuery.ts @@ -0,0 +1,19 @@ +import { $axios } from "@/lib/axios"; +import { useQuery } from "@tanstack/react-query"; + +export type User = { + id: number; + email: string; + created_at: string; + updated_at: string; +}; + +export const useUserQuery = () => { + return useQuery({ + queryKey: ["user"], + queryFn: async () => { + const resp = await $axios.get("/user"); + return resp.data; + }, + }); +}; diff --git a/web/src/components/Header.tsx b/web/src/components/Header.tsx index 02e8ec7..34e3b7e 100644 --- a/web/src/components/Header.tsx +++ b/web/src/components/Header.tsx @@ -1,7 +1,38 @@ +"use client"; + +import { useUserQuery } from "@/api/auth/useUserQuery"; +import { Button } from "@/components/ui/Button"; +import { useQueryClient } from "@tanstack/react-query"; +import { useRouter } from "next/navigation"; +import { useEffect } from "react"; + export const Header = () => { + const queryClient = useQueryClient(); + const router = useRouter(); + + const { data: user, error } = useUserQuery(); + + useEffect(() => { + if (error) { + document.cookie = `access_token=; SameSite=None; Secure; Expires=${new Date(0)}; Path=/`; + router.push("/login"); + } + }, [error, router]); + + const handleLogout = () => { + document.cookie = `access_token=; SameSite=None; Secure; Expires=${new Date(0)}; Path=/`; + queryClient.clear(); + router.push("/login"); + }; + return ( -
+

archive.local

+
+ +
); };