import { HttpClient, HttpHeaders, httpResource, HttpResourceRef } from '@angular/common/http'; import { Injectable, Signal, inject } from '@angular/core'; import { Observable } from 'rxjs'; import { catchError } from 'rxjs/operators'; import { Customer } from '../core/customer'; import { ErrorLoggerService } from '../core/error-logger.service'; import { PagedResult } from '../core/paged-result'; const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }), }; const url = '/api/customers'; const serviceName = 'CustomerService'; @Injectable({ providedIn: 'root', }) export class CustomerService { private http = inject(HttpClient); private log = inject(ErrorLoggerService); get(id: Signal | string | null): HttpResourceRef { return httpResource(() => { const idVal = typeof id === 'function' ? id() : id; return idVal === null || idVal === undefined ? url : `${url}/${idVal}`; }); } list(q: string | null, page = 0, size = 50, field = 'name', direction = 'asc'): Observable> { const params = { ...(q ? { q } : {}), p: page, s: size, f: field, d: direction, }; return this.http .get>(`${url}/list`, { params }) .pipe(catchError(this.log.handleError(serviceName, 'list'))) as Observable>; } query( q: Signal, p: Signal, s: Signal, f: Signal, d: Signal, ): HttpResourceRef | undefined> { return httpResource>(() => { return { url: `${url}/list`, params: { q: q(), p: p(), s: s(), f: f(), d: d(), }, }; }); } save(customer: Customer): Observable { return this.http .post(`${url}`, customer, httpOptions) .pipe(catchError(this.log.handleError(serviceName, 'save'))) as Observable; } update(customer: Customer): Observable { return this.http .put(`${url}/${customer.id}`, customer, httpOptions) .pipe(catchError(this.log.handleError(serviceName, 'update'))) as Observable; } saveOrUpdate(customer: Customer): Observable { if (!customer.id) { return this.save(customer); } return this.update(customer); } delete(id: string): Observable { return this.http .delete(`${url}/${id}`, httpOptions) .pipe(catchError(this.log.handleError(serviceName, 'delete'))) as Observable; } autocomplete(query: Signal | string | null): HttpResourceRef { return httpResource(() => { const qVal = typeof query === 'function' ? query() : query; return `${url}/query?q=${qVal ?? ''}`; }); } }