Files
training-tracker/frontend/js/api.js
2026-01-19 19:50:33 +01:00

140 lines
3.0 KiB
JavaScript

// API Client for Training Tracker
const API_BASE_URL = 'http://localhost:8080/api';
class ApiClient {
constructor(baseUrl = API_BASE_URL) {
this.baseUrl = baseUrl;
}
async request(endpoint, options = {}) {
const url = `${this.baseUrl}${endpoint}`;
const config = {
headers: {
'Content-Type': 'application/json',
...options.headers,
},
...options,
};
if (config.body && typeof config.body === 'object') {
config.body = JSON.stringify(config.body);
}
try {
const response = await fetch(url, config);
if (response.status === 204) {
return null;
}
const data = await response.json();
if (!response.ok) {
throw new Error(data.error || 'API request failed');
}
return data;
} catch (error) {
console.error('API Error:', error);
throw error;
}
}
// Exercises
async getExercises() {
return this.request('/exercises');
}
async getExercise(id) {
return this.request(`/exercises/${id}`);
}
async createExercise(data) {
return this.request('/exercises', {
method: 'POST',
body: data,
});
}
async updateExercise(id, data) {
return this.request(`/exercises/${id}`, {
method: 'PUT',
body: data,
});
}
async deleteExercise(id) {
return this.request(`/exercises/${id}`, {
method: 'DELETE',
});
}
// Training Plans
async getPlans() {
return this.request('/plans');
}
async getPlan(id) {
return this.request(`/plans/${id}`);
}
async createPlan(data) {
return this.request('/plans', {
method: 'POST',
body: data,
});
}
async updatePlan(id, data) {
return this.request(`/plans/${id}`, {
method: 'PUT',
body: data,
});
}
async deletePlan(id) {
return this.request(`/plans/${id}`, {
method: 'DELETE',
});
}
// Sessions
async getSessions() {
return this.request('/sessions');
}
async getSession(id) {
return this.request(`/sessions/${id}`);
}
async createSession(data) {
return this.request('/sessions', {
method: 'POST',
body: data,
});
}
async updateSession(id, data) {
return this.request(`/sessions/${id}`, {
method: 'PUT',
body: data,
});
}
async deleteSession(id) {
return this.request(`/sessions/${id}`, {
method: 'DELETE',
});
}
async addSessionEntry(sessionId, data) {
return this.request(`/sessions/${sessionId}/entries`, {
method: 'POST',
body: data,
});
}
}
const api = new ApiClient();