Files
rentman-clone/frontend/src/services/api.ts
T
Agent Zero e4830549ac fix: 7 Bugs behoben – Backend+Frontend lauffähig getestet
Backend-Fixes:
- vehicles-Relation in Account-Model ergänzt (500er bei Auth)
- security.py: bcrypt direkt statt passlib (bcrypt 5.x-Kompatibilität)
- auth.py Login: selectinload(User.role) gegen Lazy-Loading-500er
- equipment_group.py: LocationRef-Import via TYPE_CHECKING

Frontend-Fixes:
- api.ts: Python-Docstring durch JS-Kommentar ersetzt
- AppLayout.tsx: AddressBook→Contact (existiert nicht in lucide-react)
- package.json: axios-Dependency ergänzt

Tests bestanden:
- Health 200, Register 201, Login 200, Projects CRUD 200, alle API-Listen 200
- tsc --noEmit: sauber, vite build: erfolgreich
2026-05-31 20:49:10 +00:00

71 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Axios API client with base URL and auth interceptor.
import axios from 'axios';
const API_BASE_URL = import.meta.env.VITE_API_URL || 'http://localhost:8000/api/v1';
const api = axios.create({
baseURL: API_BASE_URL,
headers: {
'Content-Type': 'application/json',
},
});
// Request interceptor: attach access token
api.interceptors.request.use(
(config) => {
const token = localStorage.getItem('access_token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => Promise.reject(error),
);
// Response interceptor: handle 401 & auto-refresh
api.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
// If 401 and not already retried and a refresh token exists
if (
error.response?.status === 401 &&
!originalRequest._retry &&
localStorage.getItem('refresh_token')
) {
originalRequest._retry = true;
try {
const refreshToken = localStorage.getItem('refresh_token');
const response = await axios.post(`${API_BASE_URL}/auth/refresh`, {
refresh_token: refreshToken,
});
const { access_token, refresh_token: newRefreshToken, user } = response.data;
localStorage.setItem('access_token', access_token);
localStorage.setItem('refresh_token', newRefreshToken);
// Optionally update store
const { useAuthStore } = await import('../stores/authStore');
useAuthStore.getState().setUser(user);
// Retry original request with new token
originalRequest.headers.Authorization = `Bearer ${access_token}`;
return api(originalRequest);
} catch (refreshError) {
// Refresh failed logout
localStorage.removeItem('access_token');
localStorage.removeItem('refresh_token');
localStorage.removeItem('user');
window.location.href = '/login';
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
},
);
export default api;