Proje: Okul.com.tr CRM · Hub: Okul.com.tr CRM — Conventions
CRM Servis Katmanı Pattern
Temel Yapı
Her domain için bir servis dosyası: src/services/<Entity>Service.ts
export const EntityService = {
getAll: async () => get<Entity[]>(endpoints.entity(), {}),
getWithParams: async (params: ListQueryParams = {}) => {
const queryParams = new URLSearchParams();
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== null && value !== '') {
if (Array.isArray(value)) {
value.forEach(item => queryParams.append(key, item.toString()));
} else {
queryParams.append(key, value.toString());
}
}
});
queryParams.append('_t', Date.now().toString()); // cache busting
return get<Entity[]>(`${endpoints.entity()}?${queryParams.toString()}`);
},
getById: async (id: number) => get<Entity>(endpoints.entity(id)),
create: async (data: EntityFormValues) => post<Entity>(endpoints.entity(), data),
update: async (id: number, data: EntityFormValues) => put<Entity>(endpoints.entity(id), data),
delete: async (id: number) => del<object>(endpoints.entity(id)),
};
export default EntityService;FormValues Tipi
Her servis dosyasında EntityFormValues interface’i tanımlanır:
export interface EntityFormValues {
field1: string;
field2: number;
field3?: boolean | null;
}Cache Busting
getWithParams’ta _t: Date.now() eklenir — API’nin önbelleğini bypass etmek için.
Array Parametreleri
Array değerler iki şekilde gönderilir:
AnnouncementService:queryParams.append(key, item.toString())— düz tekrarArticleService:queryParams.append(${key}[], item.toString())— köşeli parantezle
Hangi yöntemi kullandığına dikkat et; API’nin beklentisine göre seçilmiş.
Include / Relation Parametreleri
- List endpoint:
includes[]=creator&includes[]=schools(köşeli parantez) - Show endpoint:
include[]=category&include[]=user(köşeli parantez — BE tutarsızlığı var) SchoolService.getById: URLSearchParams ileincludeolarak gönderilir
NOT: includes[] vs include[] — API tutarsız, her servisin kendi endpoint’ine bak.
Özel PATCH Metotları
Bazı servisler standart CRUD dışında özel işlemler içerir:
AnnouncementService.updateShowHomePage→PATCH /<id>/show-home-pageSchoolCommentService.approve→PATCH /<id>/approveSchoolCommentService.reject→PATCH /<id>/reject
SchoolService Farklılığı
SchoolService.getByIdWithAllRelations() — tüm include’ları tek seferde çeker; edit sayfaları için kullanılır.
Related
- liste-sayfasi-pattern — Servislerin sayfalarda nasıl kullanıldığı
- endpoint-tablosu — Tüm endpoint mapping’leri