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 tekrar
  • ArticleService: 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 ile include olarak 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.updateShowHomePagePATCH /<id>/show-home-page
  • SchoolCommentService.approvePATCH /<id>/approve
  • SchoolCommentService.rejectPATCH /<id>/reject

SchoolService Farklılığı

SchoolService.getByIdWithAllRelations() — tüm include’ları tek seferde çeker; edit sayfaları için kullanılır.