77 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @license
							 | 
						||
| 
								 | 
							
								 * Copyright Google LLC All Rights Reserved.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Use of this source code is governed by an MIT-style license that can be
							 | 
						||
| 
								 | 
							
								 * found in the LICENSE file at https://angular.io/license
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';
							 | 
						||
| 
								 | 
							
								import {Injectable} from '@angular/core';
							 | 
						||
| 
								 | 
							
								import {Observable, throwError} from 'rxjs';
							 | 
						||
| 
								 | 
							
								import {catchError} from 'rxjs/operators';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {Hero} from './hero';
							 | 
						||
| 
								 | 
							
								import {HeroService} from './hero-service';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const cudOptions = {
							 | 
						||
| 
								 | 
							
								  headers: new HttpHeaders({'Content-Type': 'application/json'})
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@Injectable()
							 | 
						||
| 
								 | 
							
								export class HttpClientHeroService extends HeroService {
							 | 
						||
| 
								 | 
							
								  constructor(private http: HttpClient) {
							 | 
						||
| 
								 | 
							
								    super();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  getHeroes(): Observable<Hero[]> {
							 | 
						||
| 
								 | 
							
								    return this.http.get<Hero[]>(this.heroesUrl).pipe(catchError(this.handleError));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // This get-by-id will 404 when id not found
							 | 
						||
| 
								 | 
							
								  getHero(id: number): Observable<Hero> {
							 | 
						||
| 
								 | 
							
								    const url = `${this.heroesUrl}/${id}`;
							 | 
						||
| 
								 | 
							
								    return this.http.get<Hero>(url).pipe(catchError(this.handleError));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // This get-by-id does not 404; returns undefined when id not found
							 | 
						||
| 
								 | 
							
								  // getHero<Data>(id: number): Observable<Hero> {
							 | 
						||
| 
								 | 
							
								  //   const url = `${this._heroesUrl}/?id=${id}`;
							 | 
						||
| 
								 | 
							
								  //   return this.http.get<Hero[]>(url)
							 | 
						||
| 
								 | 
							
								  //     .map(heroes => heroes[0] as Hero)
							 | 
						||
| 
								 | 
							
								  //     .catch(this.handleError);
							 | 
						||
| 
								 | 
							
								  // }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  addHero(name: string): Observable<Hero> {
							 | 
						||
| 
								 | 
							
								    const hero = {name};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return this.http.post<Hero>(this.heroesUrl, hero, cudOptions)
							 | 
						||
| 
								 | 
							
								        .pipe(catchError(this.handleError));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  deleteHero(hero: Hero|number): Observable<Hero> {
							 | 
						||
| 
								 | 
							
								    const id = typeof hero === 'number' ? hero : hero.id;
							 | 
						||
| 
								 | 
							
								    const url = `${this.heroesUrl}/${id}`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return this.http.delete<Hero>(url, cudOptions).pipe(catchError(this.handleError));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  searchHeroes(term: string): Observable<Hero[]> {
							 | 
						||
| 
								 | 
							
								    term = term.trim();
							 | 
						||
| 
								 | 
							
								    // add safe, encoded search parameter if term is present
							 | 
						||
| 
								 | 
							
								    const options = term ? {params: new HttpParams().set('name', term)} : {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return this.http.get<Hero[]>(this.heroesUrl, options).pipe(catchError(this.handleError));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  updateHero(hero: Hero): Observable<Hero> {
							 | 
						||
| 
								 | 
							
								    return this.http.put<Hero>(this.heroesUrl, hero, cudOptions).pipe(catchError(this.handleError));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  private handleError(error: any) {
							 | 
						||
| 
								 | 
							
								    // In a real world app, we might send the error to remote logging infrastructure
							 | 
						||
| 
								 | 
							
								    // and reformat for user consumption
							 | 
						||
| 
								 | 
							
								    return throwError(error);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |