This commit is contained in:
sebseb7
2025-07-19 21:58:07 +02:00
commit 102a4ec9ff
37 changed files with 14258 additions and 0 deletions

View File

@@ -0,0 +1,84 @@
class AuthService {
constructor() {
this.baseURL = '/api';
}
async googleLogin(tokenResponse) {
try {
const response = await fetch(`${this.baseURL}/auth/google`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
token: tokenResponse.credential || tokenResponse.access_token,
}),
});
if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
console.log('Server error response:', errorData);
const errorMessage = errorData.message || errorData.error || `HTTP ${response.status}: Login failed`;
throw new Error(errorMessage);
}
return await response.json();
} catch (error) {
console.error('Google login error:', error);
throw error;
}
}
async verifyToken(token) {
try {
const response = await fetch(`${this.baseURL}/auth/verify`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
},
});
if (!response.ok) {
return null;
}
const data = await response.json();
return data.user;
} catch (error) {
console.error('Token verification error:', error);
return null;
}
}
async apiCall(endpoint, options = {}) {
const token = localStorage.getItem('token');
const defaultOptions = {
headers: {
'Content-Type': 'application/json',
...(token && { 'Authorization': `Bearer ${token}` }),
},
};
const mergedOptions = {
...defaultOptions,
...options,
headers: {
...defaultOptions.headers,
...options.headers,
},
};
const response = await fetch(`${this.baseURL}${endpoint}`, mergedOptions);
if (response.status === 401 || response.status === 403) {
// Token is invalid or user is no longer authorized
localStorage.removeItem('token');
window.location.reload();
return;
}
return response;
}
}
export default AuthService;