shinkan-jinkendo/frontend/src/utils/api.js

325 lines
7.4 KiB
JavaScript
Raw Normal View History

/**
* Shinkan Jinkendo API Client
*
* Zentrale API-Kommunikation mit automatischer Token-Injektion
*/
const API_URL = import.meta.env.VITE_API_URL || ''
/**
* Generic API request with automatic token injection
*/
async function request(endpoint, options = {}) {
const token = localStorage.getItem('authToken')
const headers = {
'Content-Type': 'application/json',
...options.headers
}
if (token) {
headers['X-Auth-Token'] = token
}
const response = await fetch(`${API_URL}${endpoint}`, {
...options,
headers
})
if (!response.ok) {
const error = await response.json().catch(() => ({ detail: 'Unknown error' }))
throw new Error(error.detail || `HTTP ${response.status}`)
}
return response.json()
}
// ============================================================================
// Auth
// ============================================================================
export async function login(email, password) {
return request('/api/auth/login', {
method: 'POST',
body: JSON.stringify({ email, password })
})
}
export async function register(email, password, name) {
return request('/api/auth/register', {
method: 'POST',
body: JSON.stringify({ email, password, name })
})
}
export async function logout() {
return request('/api/auth/logout', { method: 'POST' })
}
export async function getCurrentProfile() {
return request('/api/profiles/me')
}
// ============================================================================
// Clubs & Groups
// ============================================================================
export async function listClubs() {
return request('/api/clubs')
}
export async function getClub(id) {
return request(`/api/clubs/${id}`)
}
export async function createClub(data) {
return request('/api/clubs', {
method: 'POST',
body: JSON.stringify(data)
})
}
export async function updateClub(id, data) {
return request(`/api/clubs/${id}`, {
method: 'PUT',
body: JSON.stringify(data)
})
}
export async function deleteClub(id) {
return request(`/api/clubs/${id}`, { method: 'DELETE' })
}
export async function listDivisions(clubId) {
const query = clubId ? `?club_id=${clubId}` : ''
return request(`/api/divisions${query}`)
}
export async function createDivision(data) {
return request('/api/divisions', {
method: 'POST',
body: JSON.stringify(data)
})
}
export async function updateDivision(id, data) {
return request(`/api/divisions/${id}`, {
method: 'PUT',
body: JSON.stringify(data)
})
}
export async function deleteDivision(id) {
return request(`/api/divisions/${id}`, { method: 'DELETE' })
}
export async function listTrainingGroups(filters = {}) {
const query = new URLSearchParams(filters).toString()
return request(`/api/groups${query ? '?' + query : ''}`)
}
export async function getTrainingGroup(id) {
return request(`/api/groups/${id}`)
}
export async function createTrainingGroup(data) {
return request('/api/groups', {
method: 'POST',
body: JSON.stringify(data)
})
}
export async function updateTrainingGroup(id, data) {
return request(`/api/groups/${id}`, {
method: 'PUT',
body: JSON.stringify(data)
})
}
export async function deleteTrainingGroup(id) {
return request(`/api/groups/${id}`, { method: 'DELETE' })
}
// ============================================================================
// Skills & Methods
// ============================================================================
export async function listSkills(filters = {}) {
const query = new URLSearchParams(filters).toString()
return request(`/api/skills${query ? '?' + query : ''}`)
}
export async function getSkill(id) {
return request(`/api/skills/${id}`)
}
export async function createSkill(data) {
return request('/api/skills', {
method: 'POST',
body: JSON.stringify(data)
})
}
export async function updateSkill(id, data) {
return request(`/api/skills/${id}`, {
method: 'PUT',
body: JSON.stringify(data)
})
}
export async function deleteSkill(id) {
return request(`/api/skills/${id}`, { method: 'DELETE' })
}
export async function listMethods(filters = {}) {
const query = new URLSearchParams(filters).toString()
return request(`/api/methods${query ? '?' + query : ''}`)
}
export async function getMethod(id) {
return request(`/api/methods/${id}`)
}
export async function createMethod(data) {
return request('/api/methods', {
method: 'POST',
body: JSON.stringify(data)
})
}
export async function updateMethod(id, data) {
return request(`/api/methods/${id}`, {
method: 'PUT',
body: JSON.stringify(data)
})
}
export async function deleteMethod(id) {
return request(`/api/methods/${id}`, { method: 'DELETE' })
}
// ============================================================================
// Exercises
// ============================================================================
export async function listExercises(filters = {}) {
const query = new URLSearchParams(filters).toString()
return request(`/api/exercises${query ? '?' + query : ''}`)
}
export async function getExercise(id) {
return request(`/api/exercises/${id}`)
}
export async function createExercise(data) {
return request('/api/exercises', {
method: 'POST',
body: JSON.stringify(data)
})
}
export async function updateExercise(id, data) {
return request(`/api/exercises/${id}`, {
method: 'PUT',
body: JSON.stringify(data)
})
}
export async function deleteExercise(id) {
return request(`/api/exercises/${id}`, { method: 'DELETE' })
}
// ============================================================================
// Training Planning
// ============================================================================
export async function listTrainingUnits(groupId, startDate, endDate) {
const query = new URLSearchParams({ group_id: groupId, start_date: startDate, end_date: endDate }).toString()
return request(`/api/training-units?${query}`)
}
export async function getTrainingUnit(id) {
return request(`/api/training-units/${id}`)
}
export async function createTrainingUnit(data) {
return request('/api/training-units', {
method: 'POST',
body: JSON.stringify(data)
})
}
export async function updateTrainingUnit(id, data) {
return request(`/api/training-units/${id}`, {
method: 'PUT',
body: JSON.stringify(data)
})
}
// ============================================================================
// Version & Health
// ============================================================================
export async function getVersion() {
return request('/api/version')
}
export async function healthCheck() {
return request('/health')
}
export const api = {
// Auth
login,
register,
logout,
getCurrentProfile,
// Clubs & Groups
listClubs,
getClub,
createClub,
updateClub,
deleteClub,
listDivisions,
createDivision,
updateDivision,
deleteDivision,
listTrainingGroups,
getTrainingGroup,
createTrainingGroup,
updateTrainingGroup,
deleteTrainingGroup,
// Skills & Methods
listSkills,
getSkill,
createSkill,
updateSkill,
deleteSkill,
listMethods,
getMethod,
createMethod,
updateMethod,
deleteMethod,
// Exercises
listExercises,
getExercise,
createExercise,
updateExercise,
deleteExercise,
// Training Planning
listTrainingUnits,
getTrainingUnit,
createTrainingUnit,
updateTrainingUnit,
// System
getVersion,
healthCheck
}
export default api