'use server'; import { cookies } from 'next/headers'; import { ResultDto } from '@/dtos/response/common'; import { LoginRequest, RegisterRequest, VerifyEmailRequest, ResendEmailRequest, ForgotPasswordRequest, ResetPasswordRequest } from '@/dtos/request/auth'; import { LoginResponse } from '@/dtos/response/auth'; import { fetchJson, getAccessToken, getRefreshToken } from '@/lib/utils/server'; // 로그인 export async function fetchLogin(request: LoginRequest): Promise> { const res = await fetchJson('/api/auth/login', { method: 'POST', body: JSON.stringify(request) }); if (res.success && res.data) { const cookie = await cookies(); const option = { httpOnly: true, path: '/' }; cookie.set('accessToken', res.data.accessToken, option); cookie.set('refreshToken', res.data.refreshToken, option); } return res; } // 로그아웃 export async function fetchLogout(): Promise { const res = await fetchJson('/api/auth/logout', { method: 'POST' }); if (res.success) { const cookie = await cookies(); cookie.delete('accessToken'); cookie.delete('refreshToken'); } return res; } // 회원가입 요청 export async function fetchRegister(request: RegisterRequest): Promise { return await fetchJson('/api/auth/register', { method: 'POST', body: JSON.stringify(request) }); } // 회원가입 완료 export async function Registration(email: string|null): Promise { const cookie = (await cookies()).get('isVerified-Registration'); return await fetchJson(`/api/auth/registration/${email}`, { method: 'GET', headers: { 'Cookie': `isVerified-Registration=${cookie?.value || ""}` } }); } // 비밀번호 찾기 export async function fetchForgotPassword(request: ForgotPasswordRequest): Promise { return await fetchJson(`/api/auth/forgot-password`, { method: 'POST', body: JSON.stringify(request) }); } // 인증번호 확인 export async function fetchVerifyEmail(request: VerifyEmailRequest): Promise { return await fetchJson('/api/auth/verify-email', { method: 'POST', body: JSON.stringify(request) }); } // 인증번호 다시 받기 export async function fetchResendEmail(params: ResendEmailRequest): Promise { return await fetchJson('/api/auth/resend-email', { method: 'POST', body: JSON.stringify(params) }); } // 비밀번호 변경 export async function fetchResetPassword(params: ResetPasswordRequest): Promise { const cookie = (await cookies()).get('isVerified-ForgotPassword'); return await fetchJson('/api/auth/reset-password', { method: 'POST', headers: { 'Cookie': `isVerified-ForgotPassword=${cookie?.value || ""}` }, body: JSON.stringify(params) }); } // RefreshToken으로 AccessToken 갱신 export async function refreshAccessToken(): Promise { const refreshToken = await getRefreshToken(); if (!refreshToken) { return false; } return await fetchJson('/api/auth/refresh-token', { method: 'POST', body: JSON.stringify({ RefreshToken: refreshToken }) }).then(res => res.success); } // 로그인 확인 export async function checkAuthServer(): Promise { const accessToken = await getAccessToken(); if (accessToken) { try { const payload = JSON.parse( Buffer.from(accessToken.split('.')[1], 'base64').toString() ); if (payload.exp * 1000 > Date.now()) { return true; } } catch { } } return await refreshAccessToken(); }