import { Injectable, inject } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { ApiEntry, ApiEntryListItem, ApiListResponse, ApiListQuery } from '@datacat/shared'; @Injectable({ providedIn: 'root' }) export class ApiService { private http = inject(HttpClient); private baseUrl = '/api/apis'; list(query?: ApiListQuery): Observable { const params: Record = {}; if (query?.search) params['search'] = query.search; if (query?.type) params['type'] = query.type; if (query?.categoryId) params['categoryId'] = query.categoryId; if (query?.page) params['page'] = String(query.page); if (query?.limit) params['limit'] = String(query.limit); return this.http.get(this.baseUrl, { params }); } get(id: string): Observable { return this.http.get(`${this.baseUrl}/${id}`); } update(id: string, data: { convention?: string; name?: string; provider?: string; versionMajor?: number; versionMinor?: number; versionPatch?: number; description?: string | null; categoryId?: string | null; contactFunctionalName?: string; contactFunctionalEntity?: string; contactFunctionalEmail?: string; contactTechnicalName?: string; contactTechnicalEntity?: string; contactTechnicalEmail?: string; }): Observable { return this.http.patch(`${this.baseUrl}/${id}`, data); } delete(id: string): Observable { return this.http.delete(`${this.baseUrl}/${id}`); } getVersions(id: string): Observable { return this.http.get(`${this.baseUrl}/${id}/versions`); } setCurrent(id: string): Observable { return this.http.post(`${this.baseUrl}/${id}/set-current`, {}); } regenerate(id: string): Observable { return this.http.post(`${this.baseUrl}/${id}/regenerate`, {}); } upload(formData: FormData): Observable { return this.http.post('/api/uploads', formData); } validate(formData: FormData): Observable<{ valid: boolean; type: 'ASYNCAPI' | 'OPENAPI' | null; mainFile: string | null; name: string | null; versionMajor: number | null; versionMinor: number | null; versionPatch: number | null; description: string | null; errors: Array<{ file: string; message: string }>; }> { return this.http.post<{ valid: boolean; type: 'ASYNCAPI' | 'OPENAPI' | null; mainFile: string | null; name: string | null; versionMajor: number | null; versionMinor: number | null; versionPatch: number | null; description: string | null; errors: Array<{ file: string; message: string }>; }>('/api/uploads/validate', formData); } }