151 lines
5.0 KiB
TypeScript

import { Zone, ZoneFormData, MowingHistoryResponse, MowingStats, MowingFormData, Mower, MowerFormData, BulkMowingFormData } from '../types/zone';
const APP_MODE = import.meta.env.VITE_ENV;
const API_BASE = APP_MODE == "development" ? new URL('api', import.meta.env.VITE_API_URL).toString() : import.meta.env.VITE_API_URL;
export const api = {
async getZones(): Promise<Zone[]> {
const response = await fetch(`${API_BASE}/zones`);
//console.log(`${APP_MODE}`);
//console.log(`${API_BASE}/zones`);
if (!response.ok) throw new Error('Failed to fetch zones');
return response.json();
},
async getZone(id: number): Promise<Zone> {
const response = await fetch(`${API_BASE}/zones/${id}`);
if (!response.ok) throw new Error('Failed to fetch zone');
return response.json();
},
async createZone(data: ZoneFormData): Promise<Zone> {
const formData = new FormData();
formData.append('name', data.name);
formData.append('area', data.area.toString());
formData.append('scheduleType', data.scheduleType);
if (data.scheduleType === 'interval' && data.intervalDays) {
formData.append('intervalDays', data.intervalDays.toString());
} else if (data.scheduleType === 'specific' && data.nextMowDate) {
formData.append('nextMowDate', data.nextMowDate);
}
if (data.image) {
formData.append('image', data.image);
}
const response = await fetch(`${API_BASE}/zones`, {
method: 'POST',
body: formData,
});
if (!response.ok) throw new Error('Failed to create zone');
return response.json();
},
async updateZone(id: number, data: ZoneFormData): Promise<Zone> {
const formData = new FormData();
formData.append('name', data.name);
formData.append('area', data.area.toString());
formData.append('scheduleType', data.scheduleType);
if (data.lastMowedDate) {
formData.append('lastMowedDate', data.lastMowedDate);
}
if (data.scheduleType === 'interval' && data.intervalDays) {
formData.append('intervalDays', data.intervalDays.toString());
} else if (data.scheduleType === 'specific' && data.nextMowDate) {
formData.append('nextMowDate', data.nextMowDate);
}
if (data.image) {
formData.append('image', data.image);
}
const response = await fetch(`${API_BASE}/zones/${id}`, {
method: 'PUT',
body: formData,
});
console.log(response);
if (!response.ok) throw new Error('Ошибка изменения данных зоны');
return response.json();
},
async deleteZone(id: number): Promise<void> {
const response = await fetch(`${API_BASE}/zones/${id}`, {
method: 'DELETE',
});
if (!response.ok) throw new Error('Failed to delete zone');
},
async markAsMowed(id: number, data?: MowingFormData): Promise<Zone> {
const response = await fetch(`${API_BASE}/zones/${id}/mow`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data || {}),
});
if (!response.ok) throw new Error('Failed to mark as mowed');
return response.json();
},
async markAsTrimmed(id: number, data?: MowingFormData): Promise<void> {
const response = await fetch(`${API_BASE}/zones/${id}/trim`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data || {}),
});
if (!response.ok) throw new Error('Failed to mark as trimmed');
},
async bulkMarkAsMowed(data: BulkMowingFormData): Promise<void> {
const response = await fetch(`${API_BASE}/zones/bulk-mow`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
});
if (!response.ok) throw new Error('Failed to record bulk mowing session');
},
async getMowingHistory(zoneId?: number, limit = 10, offset = 0): Promise<MowingHistoryResponse> {
const params = new URLSearchParams({
limit: limit.toString(),
offset: offset.toString(),
});
if (zoneId) {
params.append('zoneId', zoneId.toString());
}
const response = await fetch(`${API_BASE}/history?${params}`);
if (!response.ok) throw new Error('Failed to fetch mowing history');
return response.json();
},
async getMowingStats(period = 30): Promise<MowingStats> {
const response = await fetch(`${API_BASE}/history/stats?period=${period}`);
if (!response.ok) throw new Error('Failed to fetch mowing statistics');
return response.json();
},
async getMowers(): Promise<Mower[]> {
const response = await fetch(`${API_BASE}/mowers`);
if (!response.ok) throw new Error('Failed to fetch mowers');
return response.json();
},
async createMower(data: MowerFormData): Promise<Mower> {
const response = await fetch(`${API_BASE}/mowers`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
});
if (!response.ok) throw new Error('Failed to create mower');
return response.json();
},
};