auth.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import { defineStore } from 'pinia'
  2. import { ref, computed } from 'vue'
  3. import authApi from '@/api/auth'
  4. export const useAuthStore = defineStore('auth', () => {
  5. const user = ref(null)
  6. const accessToken = ref(null)
  7. const refreshToken = ref(null)
  8. const loading = ref(false)
  9. const error = ref(null)
  10. const isAuthenticated = computed(() => !!accessToken.value)
  11. const isSuperadmin = computed(() => user.value?.role === 'superadmin')
  12. const isOwner = computed(() => user.value?.role === 'owner')
  13. const isAdmin = computed(() => user.value?.role === 'admin')
  14. function setTokens(access, refresh) {
  15. accessToken.value = access
  16. refreshToken.value = refresh
  17. localStorage.setItem('access_token', access)
  18. if (refresh) {
  19. localStorage.setItem('refresh_token', refresh)
  20. }
  21. }
  22. function setUser(userData) {
  23. user.value = userData
  24. localStorage.setItem('user', JSON.stringify(userData))
  25. }
  26. function clearAuth() {
  27. user.value = null
  28. accessToken.value = null
  29. refreshToken.value = null
  30. localStorage.removeItem('access_token')
  31. localStorage.removeItem('refresh_token')
  32. localStorage.removeItem('user')
  33. }
  34. async function login(email, password) {
  35. loading.value = true
  36. error.value = null
  37. try {
  38. const data = await authApi.login(email, password)
  39. setTokens(data.access_token, data.refresh_token)
  40. setUser(data.user)
  41. return data.user
  42. } catch (err) {
  43. error.value = err.response?.data?.detail || 'Login failed'
  44. throw err
  45. } finally {
  46. loading.value = false
  47. }
  48. }
  49. async function logout() {
  50. try {
  51. await authApi.logout()
  52. } catch (err) {
  53. console.error('Logout API error:', err)
  54. } finally {
  55. clearAuth()
  56. }
  57. }
  58. async function checkAuth() {
  59. const storedToken = localStorage.getItem('access_token')
  60. const storedUser = localStorage.getItem('user')
  61. if (storedToken && storedUser) {
  62. accessToken.value = storedToken
  63. refreshToken.value = localStorage.getItem('refresh_token')
  64. user.value = JSON.parse(storedUser)
  65. // Verify token is still valid
  66. try {
  67. const userData = await authApi.getMe()
  68. setUser(userData)
  69. } catch (err) {
  70. console.error('Token verification failed:', err)
  71. clearAuth()
  72. }
  73. }
  74. }
  75. return {
  76. user,
  77. accessToken,
  78. refreshToken,
  79. loading,
  80. error,
  81. isAuthenticated,
  82. isSuperadmin,
  83. isOwner,
  84. isAdmin,
  85. login,
  86. logout,
  87. checkAuth,
  88. clearAuth
  89. }
  90. })