This commit is contained in:
2026-07-20 22:49:45 +07:00
parent c314e4f329
commit db558c87d1
24 changed files with 1464 additions and 1362 deletions
+197 -197
View File
@@ -1,226 +1,226 @@
import { defineStore } from 'pinia';
import { computed,ref } from 'vue';
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
import { type User } from '@/api/generated/crabs/evening_detective_server';
import { buildClient } from '@/api/generated/crabs/evening_detective_server/client';
import { type User } from '@/api/generated/crabs/evening_detective_server'
import { buildClient } from '@/api/generated/crabs/evening_detective_server/client'
export const useAuthStore = defineStore('auth', () => {
// ===== STATE =====
const accessToken = ref<string | null>(null);
const refreshToken = ref<string | null>(null);
const user = ref<User | null>(null);
const isLoading = ref(false);
const error = ref<string | null>(null);
// ===== STATE =====
const accessToken = ref<string | null>(null)
const refreshToken = ref<string | null>(null)
const user = ref<User | null>(null)
const isLoading = ref(false)
const error = ref<string | null>(null)
// ===== GETTERS =====
const isAuthenticated = computed(() => !!accessToken.value);
const username = computed(() => user.value?.username || '');
const userRoles = computed(() => user.value?.roles || []);
// ===== GETTERS =====
const isAuthenticated = computed(() => !!accessToken.value)
const username = computed(() => user.value?.username || '')
const userRoles = computed(() => user.value?.roles || [])
// ===== ACTIONS =====
// ===== ACTIONS =====
// Инициализация из localStorage при загрузке
function initFromStorage() {
const token = localStorage.getItem('accessToken');
const refresh = localStorage.getItem('refreshToken');
// Инициализация из localStorage при загрузке
function initFromStorage() {
const token = localStorage.getItem('accessToken')
const refresh = localStorage.getItem('refreshToken')
if (token) {
accessToken.value = token;
refreshToken.value = refresh;
if (token) {
accessToken.value = token
refreshToken.value = refresh
// Получаем данные пользователя
fetchUser();
// Получаем данные пользователя
fetchUser()
}
}
function getToken(): string | null {
return accessToken.value
}
// Получение данных пользователя
async function fetchUser() {
if (!accessToken.value) return
try {
const client = buildClient(getToken)
const response = await client.GetMe({})
if (response.error) {
error.value = response.error
return
}
if (response.user) {
user.value = response.user
}
} catch (err) {
console.error('Failed to fetch user:', err)
// Если 401 — токен протух
if (err instanceof Error && err.message.includes('401')) {
await logout()
}
}
}
// Логин
async function login(email: string, password: string) {
isLoading.value = true
error.value = null
try {
const client = buildClient(getToken)
const response = await client.Login({ email, password })
if (response.error) {
error.value = response.error
return false
}
// Сохраняем токены
if (response.accessToken) {
accessToken.value = response.accessToken
refreshToken.value = response.refreshToken || null
// Сохраняем в localStorage
localStorage.setItem('accessToken', response.accessToken)
if (response.refreshToken) {
localStorage.setItem('refreshToken', response.refreshToken)
}
// Получаем данные пользователя
await fetchUser()
return true
}
return false
} catch (err) {
error.value = err instanceof Error ? err.message : 'Login failed'
return false
} finally {
isLoading.value = false
}
}
function getToken(): string | null {
return accessToken.value
// Обновление токена
async function refreshTokenAction() {
if (!refreshToken.value) return false
try {
const client = buildClient(getToken)
const response = await client.Refresh({
refreshToken: refreshToken.value,
})
if (response.error || !response.accessToken) {
return false
}
// Обновляем токены
accessToken.value = response.accessToken
refreshToken.value = response.refreshToken || null
localStorage.setItem('accessToken', response.accessToken)
if (response.refreshToken) {
localStorage.setItem('refreshToken', response.refreshToken)
}
return true
} catch {
return false
}
}
// Получение данных пользователя
async function fetchUser() {
if (!accessToken.value) return;
// Регистрация
async function signup(username: string, email: string) {
isLoading.value = true
error.value = null
try {
const client = buildClient(getToken);
const response = await client.GetMe({});
try {
const client = buildClient(getToken)
const response = await client.Signup({ username, email })
if (response.error) {
error.value = response.error;
return;
}
if (response.error) {
error.value = response.error
return false
}
if (response.user) {
user.value = response.user;
}
} catch (err) {
console.error('Failed to fetch user:', err);
// Если 401 — токен протух
if (err instanceof Error && err.message.includes('401')) {
await logout();
}
}
return true
} catch (err) {
error.value = err instanceof Error ? err.message : 'Signup failed'
return false
} finally {
isLoading.value = false
}
}
// Логин
async function login(email: string, password: string) {
isLoading.value = true;
error.value = null;
// Восстановление пароля
async function refreshPassword(email: string) {
isLoading.value = true
error.value = null
try {
const client = buildClient(getToken);
const response = await client.Login({ email, password });
try {
const client = buildClient(getToken)
const response = await client.RefreshPassword({ email })
if (response.error) {
error.value = response.error;
return false;
}
if (response.error) {
error.value = response.error
return false
}
// Сохраняем токены
if (response.accessToken) {
accessToken.value = response.accessToken;
refreshToken.value = response.refreshToken || null;
// Сохраняем в localStorage
localStorage.setItem('accessToken', response.accessToken);
if (response.refreshToken) {
localStorage.setItem('refreshToken', response.refreshToken);
}
// Получаем данные пользователя
await fetchUser();
return true;
}
return false;
} catch (err) {
error.value = err instanceof Error ? err.message : 'Login failed';
return false;
} finally {
isLoading.value = false;
}
return true
} catch (err) {
error.value = err instanceof Error ? err.message : 'Password reset failed'
return false
} finally {
isLoading.value = false
}
}
// Обновление токена
async function refreshTokenAction() {
if (!refreshToken.value) return false;
// Выход
async function logout() {
accessToken.value = null
refreshToken.value = null
user.value = null
error.value = null
try {
const client = buildClient(getToken);
const response = await client.Refresh({
refreshToken: refreshToken.value
});
localStorage.removeItem('accessToken')
localStorage.removeItem('refreshToken')
}
if (response.error || !response.accessToken) {
return false;
}
// Проверка ролей
function hasRole(role: string): boolean {
return userRoles.value.includes(role)
}
// Обновляем токены
accessToken.value = response.accessToken;
refreshToken.value = response.refreshToken || null;
function hasAnyRole(roles: string[]): boolean {
return roles.some((role) => userRoles.value.includes(role))
}
localStorage.setItem('accessToken', response.accessToken);
if (response.refreshToken) {
localStorage.setItem('refreshToken', response.refreshToken);
}
// ===== RETURN =====
return {
// State
accessToken,
refreshToken,
user,
isLoading,
error,
return true;
} catch {
return false;
}
}
// Getters
isAuthenticated,
username,
userRoles,
// Регистрация
async function signup(username: string, email: string) {
isLoading.value = true;
error.value = null;
try {
const client = buildClient(getToken);
const response = await client.Signup({ username, email });
if (response.error) {
error.value = response.error;
return false;
}
return true
} catch (err) {
error.value = err instanceof Error ? err.message : 'Signup failed';
return false;
} finally {
isLoading.value = false;
}
}
// Восстановление пароля
async function refreshPassword(email: string) {
isLoading.value = true;
error.value = null;
try {
const client = buildClient(getToken);
const response = await client.RefreshPassword({ email });
if (response.error) {
error.value = response.error;
return false;
}
return true;
} catch (err) {
error.value = err instanceof Error ? err.message : 'Password reset failed';
return false;
} finally {
isLoading.value = false;
}
}
// Выход
async function logout() {
accessToken.value = null;
refreshToken.value = null;
user.value = null;
error.value = null;
localStorage.removeItem('accessToken');
localStorage.removeItem('refreshToken');
}
// Проверка ролей
function hasRole(role: string): boolean {
return userRoles.value.includes(role);
}
function hasAnyRole(roles: string[]): boolean {
return roles.some(role => userRoles.value.includes(role));
}
// ===== RETURN =====
return {
// State
accessToken,
refreshToken,
user,
isLoading,
error,
// Getters
isAuthenticated,
username,
userRoles,
// Actions
initFromStorage,
getToken,
login,
signup,
refreshPassword,
logout,
fetchUser,
refreshTokenAction,
hasRole,
hasAnyRole,
};
});
// Actions
initFromStorage,
getToken,
login,
signup,
refreshPassword,
logout,
fetchUser,
refreshTokenAction,
hasRole,
hasAnyRole,
}
})