Proje: OkulUp · Hub: OkulUp — Conventions
Service Layer Pattern
Kurallar
Dosya Organizasyonu
- Her resource için ayrı dosya:
src/services/api/{resource}.ts - Named exports, default export yok
- Barrel export:
src/services/api/index.ts
Fonksiyon Return Pattern
// List → PaginatedResponse<T> döner (response.data'yı olduğu gibi)
export async function getAnnouncements(params): Promise<PaginatedResponse<Announcement>> {
const response = await apiClient.get('/announcements', { params });
return response.data;
}
// Detail/Create/Update → T döner (response.data.data unwrap)
export async function getAnnouncement(id: number): Promise<Announcement> {
const response = await apiClient.get<ApiResponse<Announcement>>(`/announcements/${id}`);
return response.data.data;
}
// Delete → void
export async function deleteAnnouncement(id: number): Promise<void> {
await apiClient.delete(`/announcements/${id}`);
}
// File Upload → Content-Type override, createFormData() utility
export async function uploadMedia(file: MediaFile): Promise<Media> {
const formData = createFormData(file);
const response = await apiClient.post('/media', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
});
return response.data.data;
}Endpoint Format
apiClient.get('/endpoint') — /api prefix Axios baseURL’inde var, tekrar yazılmaz.
Related
- react-query-hooks-pattern — service’leri kullanan hook’lar
- api-client-architecture — Axios instance detayları