73 lines
2.0 KiB
JavaScript
73 lines
2.0 KiB
JavaScript
// js/ApiClient.js
|
|
export class ApiClient {
|
|
constructor({ baseUrl, authToken, csrfToken }) {
|
|
this.baseUrl = baseUrl;
|
|
this.authToken = authToken;
|
|
this.csrfToken = csrfToken;
|
|
}
|
|
|
|
async request(endpoint, options = {}) {
|
|
const url = `${this.baseUrl}${endpoint}`;
|
|
const headers = {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': `Token ${this.authToken}`,
|
|
'X-CSRF-Token': this.csrfToken
|
|
};
|
|
|
|
try {
|
|
const response = await fetch(url, {
|
|
...options,
|
|
headers: {
|
|
...headers,
|
|
...options.headers
|
|
}
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
|
|
const contentType = response.headers.get("content-type");
|
|
if (contentType && contentType.includes("application/json")) {
|
|
return await response.json();
|
|
}
|
|
|
|
return await response.text();
|
|
} catch (error) {
|
|
console.error('API request failed:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// イベント関連のAPI
|
|
async getEvents() {
|
|
return this.request('/new-events/');
|
|
}
|
|
|
|
async getZekkenNumbers(eventCode) {
|
|
return this.request(`/zekken_numbers/${eventCode}`);
|
|
}
|
|
|
|
// チーム関連のAPI
|
|
async getTeamInfo(zekkenNumber) {
|
|
return this.request(`/team_info/${zekkenNumber}/`);
|
|
}
|
|
|
|
async getCheckins(zekkenNumber, eventCode) {
|
|
return this.request(`/checkins/${zekkenNumber}/${eventCode}/`);
|
|
}
|
|
|
|
async updateCheckin(checkinId, data) {
|
|
return this.request(`/checkins/${checkinId}`, {
|
|
method: 'PUT',
|
|
body: JSON.stringify(data)
|
|
});
|
|
}
|
|
|
|
async deleteCheckin(checkinId) {
|
|
return this.request(`/checkins/${checkinId}`, {
|
|
method: 'DELETE'
|
|
});
|
|
}
|
|
}
|