100 lines
2.2 KiB
TypeScript
100 lines
2.2 KiB
TypeScript
import apiClient from './api/client'
|
|
|
|
export interface LoginRequest {
|
|
email: string
|
|
password: string
|
|
}
|
|
|
|
export interface LoginResponse {
|
|
accessToken: string
|
|
refreshToken: string
|
|
user: {
|
|
id: string
|
|
email: string
|
|
firstName: string
|
|
lastName: string
|
|
role: string
|
|
}
|
|
}
|
|
|
|
export interface RefreshTokenResponse {
|
|
accessToken: string
|
|
}
|
|
|
|
class AuthService {
|
|
/**
|
|
* Login user with email and password
|
|
*/
|
|
async login(credentials: LoginRequest): Promise<LoginResponse> {
|
|
const response = await apiClient.post<LoginResponse>('/auth/login', credentials)
|
|
|
|
// Store tokens
|
|
if (response.data.accessToken) {
|
|
localStorage.setItem('access_token', response.data.accessToken)
|
|
}
|
|
if (response.data.refreshToken) {
|
|
localStorage.setItem('refresh_token', response.data.refreshToken)
|
|
}
|
|
if (response.data.user) {
|
|
localStorage.setItem('user', JSON.stringify(response.data.user))
|
|
}
|
|
|
|
return response.data
|
|
}
|
|
|
|
/**
|
|
* Logout user
|
|
*/
|
|
async logout(): Promise<void> {
|
|
try {
|
|
await apiClient.post('/auth/logout')
|
|
} finally {
|
|
// Clear local storage even if API call fails
|
|
localStorage.removeItem('access_token')
|
|
localStorage.removeItem('refresh_token')
|
|
localStorage.removeItem('user')
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Refresh access token
|
|
*/
|
|
async refreshToken(): Promise<RefreshTokenResponse> {
|
|
const refreshToken = localStorage.getItem('refresh_token')
|
|
const response = await apiClient.post<RefreshTokenResponse>('/auth/refresh', {
|
|
refreshToken,
|
|
})
|
|
|
|
if (response.data.accessToken) {
|
|
localStorage.setItem('access_token', response.data.accessToken)
|
|
}
|
|
|
|
return response.data
|
|
}
|
|
|
|
/**
|
|
* Get current user from localStorage
|
|
*/
|
|
getCurrentUser() {
|
|
const userStr = localStorage.getItem('user')
|
|
return userStr ? JSON.parse(userStr) : null
|
|
}
|
|
|
|
/**
|
|
* Check if user is authenticated
|
|
*/
|
|
isAuthenticated(): boolean {
|
|
return !!localStorage.getItem('access_token')
|
|
}
|
|
|
|
/**
|
|
* Check if user is admin
|
|
*/
|
|
isAdmin(): boolean {
|
|
const user = this.getCurrentUser()
|
|
return user?.role === 'ADMIN'
|
|
}
|
|
}
|
|
|
|
export const authService = new AuthService()
|