import { HttpClient, httpResource, HttpParams } from '@angular/common/http'; import { inject, Injectable, Signal } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { catchError } from 'rxjs/operators'; import { ErrorLoggerService } from '../core/error-logger.service'; import { Product } from '../core/product'; import { ProductSku } from '../core/product-sku'; const url = '/api/products'; @Injectable({ providedIn: 'root' }) export class ProductService { private http = inject(HttpClient); private log = inject(ErrorLoggerService); get(id: Signal) { return httpResource(() => { const getUrl: string = id() === null ? `${url}` : `${url}/${id()}`; return getUrl; }); } list() { return httpResource(() => `${url}/list`); } save(product: Product): Observable { return this.http .post(`${url}`, product) .pipe(catchError(this.log.handleError('ProductService', 'save'))) as Observable; } update(product: Product): Observable { return this.http .put(`${url}/${product.id}`, product) .pipe(catchError(this.log.handleError('ProductService', 'update'))) as Observable; } saveOrUpdate(product: Product): Observable { if (!product.id) { return this.save(product); } return this.update(product); } delete(id: string): Observable { return this.http .delete(`${url}/${id}`) .pipe(catchError(this.log.handleError('ProductService', 'delete'))) as Observable; } autocompleteProduct(query: Signal, isPurchased: Signal) { return httpResource(() => { const q = query(); if (!q) return undefined; let params = new HttpParams().set('q', q || ''); if (isPurchased() !== null) { params = params.set('p', isPurchased.toString()); } return { url: `${url}/q-product`, params }; }); } autocompleteSku( query: Signal, isPurchased: Signal, date: Signal, vendorId: Signal, ) { return httpResource(() => { const q = query(); if (!q) return undefined; let params = new HttpParams().set('q', q || ''); const p = isPurchased(); if (p !== null) { params = params.set('p', p.toString()); } const v = vendorId(); const d = date(); if (!!v && !!d) { params = params.set('v', v).set('d', d); } return { url: `${url}/q-sku`, params }; }); } }