feat: Implement user authentication, admin user management, and role-based access control.

This commit is contained in:
Missez 2026-01-16 16:37:16 +07:00
parent 8a2ca592bc
commit 38648581ec
19 changed files with 1762 additions and 514 deletions

View file

@ -4,7 +4,8 @@ import { authService } from '~/services/auth.service';
interface User {
id: string;
email: string;
fullName: string;
firstName: string;
lastName: string;
role: 'INSTRUCTOR' | 'ADMIN' | 'STUDENT';
}
@ -24,23 +25,32 @@ export const useAuthStore = defineStore('auth', {
actions: {
async login(email: string, password: string) {
try {
// Call real API
const response = await authService.login(email, password);
this.token = response.token;
this.user = response.user as User;
this.isAuthenticated = true;
// Save to localStorage (including refreshToken)
if (process.client) {
localStorage.setItem('token', this.token);
localStorage.setItem('refreshToken', response.refreshToken);
localStorage.setItem('user', JSON.stringify(this.user));
}
// Save to cookies
const tokenCookie = useCookie('token', {
maxAge: 60 * 60 * 24, // 24 hours
sameSite: 'strict'
});
const refreshTokenCookie = useCookie('refreshToken', {
maxAge: 60 * 60 * 24 * 7, // 7 days
sameSite: 'strict'
});
const userCookie = useCookie('user', {
maxAge: 60 * 60 * 24, // 24 hours
sameSite: 'strict'
});
tokenCookie.value = this.token;
refreshTokenCookie.value = response.refreshToken;
userCookie.value = JSON.stringify(this.user);
return { token: this.token, user: this.user };
} catch (error: any) {
// Re-throw error to be handled by login page
throw error;
}
},
@ -50,21 +60,30 @@ export const useAuthStore = defineStore('auth', {
this.token = null;
this.isAuthenticated = false;
if (process.client) {
localStorage.removeItem('token');
localStorage.removeItem('user');
}
// Clear cookies
const tokenCookie = useCookie('token');
const refreshTokenCookie = useCookie('refreshToken');
const userCookie = useCookie('user');
tokenCookie.value = null;
refreshTokenCookie.value = null;
userCookie.value = null;
},
checkAuth() {
if (process.client) {
const token = localStorage.getItem('token');
const user = localStorage.getItem('user');
const tokenCookie = useCookie('token');
const userCookie = useCookie('user');
if (token && user) {
this.token = token;
this.user = JSON.parse(user);
if (tokenCookie.value && userCookie.value) {
this.token = tokenCookie.value;
try {
this.user = typeof userCookie.value === 'string'
? JSON.parse(userCookie.value)
: userCookie.value;
this.isAuthenticated = true;
} catch (e) {
// Invalid user data
this.logout();
}
}
}