Yaltopia-Ticket-Admin/src/services/auth.service.ts

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()