diff --git a/apps/cs/src/entities/auth/api/auth-service.ts b/apps/cs/src/entities/auth/api/auth-service.ts index e48569677..9837aac8e 100644 --- a/apps/cs/src/entities/auth/api/auth-service.ts +++ b/apps/cs/src/entities/auth/api/auth-service.ts @@ -1,16 +1,17 @@ -import { getRemainingMs } from "@common/auth"; import { - ENDPOINT, - CLAIM_NAME, ACCESS_TOKEN, AUTH_USER_ID, + CLAIM_NAME, + ENDPOINT, } from "@/shared/config"; -import type { ILogin } from "../model/auth-interface"; +import { getRemainingMs } from "@common/auth"; + import { - setToken, clearAuthToken, + setToken, setupRefreshTimer, } from "../lib/token-manager"; +import type { AuthPayload, AuthService } from "../model/auth-interface"; function resolveLoginError(message: string | undefined): string { switch (message) { @@ -27,7 +28,7 @@ function resolveLoginError(message: string | undefined): string { } } -export async function login(payload: ILogin): Promise { +async function login(payload: AuthPayload): Promise { const response = await fetch(`/api/proxy${ENDPOINT.USER_SERVICE.LOGIN}`, { method: "POST", headers: { "Content-Type": "application/json" }, @@ -56,7 +57,7 @@ export async function login(payload: ILogin): Promise { } } -export async function silentRefresh(): Promise { +async function silentRefresh(): Promise { console.log(`[silentRefresh] Called at ${new Date().toISOString()}`); try { const response = await fetch( @@ -97,9 +98,15 @@ export async function silentRefresh(): Promise { } } -export async function logout(): Promise { +async function logout(): Promise { clearAuthToken(); if (typeof window !== "undefined") { window.dispatchEvent(new CustomEvent("auth:logout")); } } + +export const authService: AuthService = { + login, + silentRefresh, + logout, +}; diff --git a/apps/cs/src/entities/auth/index.ts b/apps/cs/src/entities/auth/index.ts index 76b22ca39..7f0d0081a 100644 --- a/apps/cs/src/entities/auth/index.ts +++ b/apps/cs/src/entities/auth/index.ts @@ -1,3 +1,3 @@ -export { login, silentRefresh, logout } from "./api/auth-service"; +export { authService } from "./api/auth-service"; export { AuthWrapper } from "./lib/auth-wrapper"; -export { tokenManager } from "./lib/token-manager"; \ No newline at end of file +export { tokenManager } from "./lib/token-manager"; diff --git a/apps/cs/src/entities/auth/lib/auth-wrapper.tsx b/apps/cs/src/entities/auth/lib/auth-wrapper.tsx index 3c4dea9c7..4b6c181a8 100644 --- a/apps/cs/src/entities/auth/lib/auth-wrapper.tsx +++ b/apps/cs/src/entities/auth/lib/auth-wrapper.tsx @@ -2,20 +2,24 @@ import { useEffect } from "react"; import { useRouter } from "next/navigation"; + import { isAxiosError } from "axios"; + +import { client } from "@/shared/api"; +import { + AUTH_LOGIN_REDIRECT_URL, + AUTH_USER_ID, + CLAIM_NAME, + ENDPOINT, +} from "@/shared/config"; +import { useUserStore } from "@/shared/lib"; +import type { IUserInfo } from "@/shared/store"; import { getRemainingMs } from "@common/auth"; import { isAtLoginRedirectUrl } from "@common/network"; -import { client } from "@/shared/api"; -import type { IUserInfo } from "@/shared/store"; -import { useUserStore } from "@/shared/lib"; -import { - ENDPOINT, - AUTH_USER_ID, - AUTH_LOGIN_REDIRECT_URL, - CLAIM_NAME, -} from "@/shared/config"; + +import { authService } from "../api/auth-service"; + import { getToken, setupRefreshTimer } from "./token-manager"; -import { silentRefresh } from "../api/auth-service"; const AuthWrapper = ({ children }: { children: React.ReactNode }) => { const router = useRouter(); @@ -31,7 +35,7 @@ const AuthWrapper = ({ children }: { children: React.ReactNode }) => { console.log( `[AuthWrapper] Refresh timer set: ${remainingMs}ms (${remainingMs / 1000}s)`, ); - setupRefreshTimer(silentRefresh, remainingMs); + setupRefreshTimer(authService.silentRefresh, remainingMs); } } diff --git a/apps/cs/src/entities/auth/model/auth-interface.ts b/apps/cs/src/entities/auth/model/auth-interface.ts index 012f81457..c4b2d2691 100644 --- a/apps/cs/src/entities/auth/model/auth-interface.ts +++ b/apps/cs/src/entities/auth/model/auth-interface.ts @@ -1,4 +1,10 @@ -export interface ILogin { +export interface AuthPayload { userId: string; password: string; } + +export interface AuthService { + login(payload: AuthPayload): Promise; + silentRefresh(): Promise; + logout(): Promise; +} diff --git a/apps/cs/src/pages/auth/login/ui/login-page.tsx b/apps/cs/src/pages/auth/login/ui/login-page.tsx index fa7b84185..6a7fe120d 100644 --- a/apps/cs/src/pages/auth/login/ui/login-page.tsx +++ b/apps/cs/src/pages/auth/login/ui/login-page.tsx @@ -2,8 +2,10 @@ import { useState } from "react"; import Image from "next/image"; + +import { authService } from "@/entities/auth"; import { images } from "@common/assets"; -import { login } from "@/entities/auth"; + import "./login.css"; function LoginPage() { @@ -18,7 +20,7 @@ function LoginPage() { const password = formData.get("password") as string; try { - await login({ userId, password }); + await authService.login({ userId, password }); window.location.href = "/dashboard"; } catch (error) { const message = @@ -31,12 +33,14 @@ function LoginPage() {
-

+

유역하수도통합플랫폼
하수도플랫폼 통합관리(CMS)시스템

-

유역하수도통합플랫폼 통합관리(CMS)시스템에 오신 것을 환영합니다.

+

+ 유역하수도통합플랫폼 통합관리(CMS)시스템에 오신 것을 환영합니다. +

logo