import { EventEmitter, Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from "@angular/router"; import { HttpClient } from "@angular/common/http"; import { Observable } from "rxjs/internal/Observable"; import { environment } from "../../environments/environment"; import { Awardee } from "./awardee"; @Injectable({ providedIn: 'root' }) export class AwardeeService implements Resolve> { private apiEndPoint = `${environment.apiUrl}/awardee`; private apiEndPointImage = `${environment.apiUrl}/awardee-image`; private cachedAwardees: Array = []; public changed: EventEmitter> = new EventEmitter>(); constructor(private httpClient: HttpClient) { } public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise> { return this.getJudges().toPromise(); } public getJudges(): Observable> { return this.httpClient.get>(this.apiEndPoint); } get awardees(): Array { return this.cachedAwardees; } set awardees(judges: Array) { this.cachedAwardees = judges; this.triggerChange(); } public triggerChange() { this.changed.emit(this.cachedAwardees); } public persist(awardee: Awardee): Observable { return awardee.id === null ? this.create(awardee) : this.update(awardee); } public create(awardee: Awardee): Observable { return this.httpClient.post(this.apiEndPoint, awardee); } public update(awardee: Awardee): Observable { return this.httpClient.put(`${this.apiEndPoint}/${awardee.id}`, awardee); } public saveImage(slug: string, image: File, type: string) { let form = new FormData(); form.append('image', image); return this.httpClient.post(`${this.apiEndPointImage}/${type}/${slug}`, form); } public delete(id: number): Observable { return this.httpClient.delete(`${this.apiEndPoint}/${id}`); } }