87 lines
2.6 KiB
TypeScript
87 lines
2.6 KiB
TypeScript
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<string | null>) {
|
|
return httpResource<Product>(() => {
|
|
const getUrl: string = id() === null ? `${url}` : `${url}/${id()}`;
|
|
return getUrl;
|
|
});
|
|
}
|
|
|
|
list() {
|
|
return httpResource<Product[]>(() => `${url}/list`);
|
|
}
|
|
|
|
save(product: Product): Observable<Product> {
|
|
return this.http
|
|
.post<Product>(`${url}`, product)
|
|
.pipe(catchError(this.log.handleError('ProductService', 'save'))) as Observable<Product>;
|
|
}
|
|
|
|
update(product: Product): Observable<Product> {
|
|
return this.http
|
|
.put<Product>(`${url}/${product.id}`, product)
|
|
.pipe(catchError(this.log.handleError('ProductService', 'update'))) as Observable<Product>;
|
|
}
|
|
|
|
saveOrUpdate(product: Product): Observable<Product> {
|
|
if (!product.id) {
|
|
return this.save(product);
|
|
}
|
|
return this.update(product);
|
|
}
|
|
|
|
delete(id: string): Observable<Product> {
|
|
return this.http
|
|
.delete<Product>(`${url}/${id}`)
|
|
.pipe(catchError(this.log.handleError('ProductService', 'delete'))) as Observable<Product>;
|
|
}
|
|
|
|
autocompleteProduct(query: Signal<string | null>, isPurchased: Signal<boolean | null>) {
|
|
return httpResource<ProductSku[]>(() => {
|
|
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<string | null>,
|
|
isPurchased: Signal<boolean | null>,
|
|
date: Signal<string | null>,
|
|
vendorId: Signal<string | null>,
|
|
) {
|
|
return httpResource<ProductSku[]>(() => {
|
|
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 };
|
|
});
|
|
}
|
|
}
|