fix: manejar error 401 automaticamente y agregar migracion de columnas routes

This commit is contained in:
2026-02-25 19:49:29 -05:00
parent fd95df461b
commit dc827bcbf4
4 changed files with 83 additions and 4 deletions

View File

@ -31,6 +31,22 @@ client.interceptors.response.use(
(error) => {
if (error.response) {
console.error('API Error:', error.response.status, error.response.data)
// Si el token expiró o es inválido, limpiar sesión y redirigir al login
if (error.response.status === 401) {
const currentPath = window.location.pathname
// Solo redirigir si no estamos ya en la página de login
if (!currentPath.includes('/auth') && !currentPath.includes('/login')) {
localStorage.removeItem('auth_token')
localStorage.removeItem('user_role')
localStorage.removeItem('user_name')
localStorage.removeItem('profile_photo_url')
// Redirigir al login con mensaje
window.location.href = '/auth?reason=session_expired'
}
}
} else if (error.request) {
// La solicitud fue hecha pero no hubo respuesta (timeout, servidor dormido, etc.)
console.error('Network Error: No response from server', error.message)
}
return Promise.reject(error)
}

View File

@ -354,12 +354,25 @@ async function confirmCreateRoute() {
isCreating.value = false
} catch (err: any) {
console.error('Error creating route:', err)
if (err.response?.status === 401) {
// El interceptor ya redirige al login, pero mostramos aviso
alert('Tu sesión ha expirado. Serás redirigido al inicio de sesión.')
return
} else if (err.response?.status === 403) {
alert('No tienes permisos de administrador para crear rutas.')
return
} else if (!err.response && err.request) {
// Network Error - servidor no respondió
alert('No se pudo conectar al servidor. Si es la primera solicitud del día, el servidor puede tardar ~30 segundos en iniciar. Por favor, intenta de nuevo en un momento.')
return
}
const errorMsg = err.response?.data?.detail
|| err.response?.data?.message
|| err.message
|| 'Error desconocido'
const errorDetail = err.response ? `Status: ${err.response.status}` : 'No hubo respuesta del servidor (Network Error)'
alert(`No se pudo crear la ruta: ${errorMsg}\n\nDetalle: ${errorDetail}`)
alert(`No se pudo crear la ruta: ${errorMsg}`)
}
}

View File

@ -1,6 +1,6 @@
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { useRouter, useRoute } from 'vue-router'
import LoginForm from '@/components/auth/LoginForm.vue'
import RegisterForm from '@/components/auth/RegisterForm.vue'
import { getGoogleRedirectResult } from '@/firebaseConfig'
@ -10,11 +10,17 @@ import { useAuthStore } from '@/stores/auth'
const isLogin = ref(true)
const toggleAuth = () => { isLogin.value = !isLogin.value }
const router = useRouter()
const route = useRoute()
const authStore = useAuthStore()
const redirectErrorMessage = ref('')
const sessionExpiredMessage = ref('')
// Handle redirect result from Google Sign-In on mobile
// Detectar si fue redirigido por sesión expirada
onMounted(async () => {
if (route.query.reason === 'session_expired') {
sessionExpiredMessage.value = 'Tu sesión ha expirado. Por favor, inicia sesión nuevamente.'
}
try {
const result = await getGoogleRedirectResult()
if (result) {
@ -73,6 +79,12 @@ onMounted(async () => {
</button>
</div>
<!-- Alerta de sesión expirada -->
<div v-if="sessionExpiredMessage" class="redirect-error" style="background: rgba(234, 179, 8, 0.1); border-color: rgba(234, 179, 8, 0.2); color: #eab308;">
<span class="material-icons">lock_clock</span>
{{ sessionExpiredMessage }}
</div>
<!-- Alerta de error en redirección -->
<div v-if="redirectErrorMessage" class="redirect-error">
<span class="material-icons">warning</span>