File

src/app/providers/hero.service.ts

Index

Properties
Methods

Constructor

constructor(http: HttpClient, messageService: MessageService)
Parameters :
Name Type Optional
http HttpClient No
messageService MessageService No

Methods

addHero
addHero(hero: Hero)

POST: add a new hero to the server

Parameters :
Name Type Optional
hero Hero No
Returns : Observable<Hero>
deleteHero
deleteHero(hero: Hero | number)

DELETE: delete the hero from the server

Parameters :
Name Type Optional
hero Hero | number No
Returns : Observable<Hero>
getHero
getHero(id: number)

GET hero by id. Will 404 if id not found

Parameters :
Name Type Optional
id number No
Returns : Observable<Hero>
getHeroes
getHeroes()

GET heroes from the server

Returns : Observable<Hero[]>
getHeroNo404
getHeroNo404(id: number)
Type parameters :
  • Data

GET hero by id. Return undefined when id not found

Parameters :
Name Type Optional
id number No
Returns : Observable<Hero>
Private handleError
handleError(operation: string, result?: T)
Type parameters :
  • T

Handle Http operation that failed. Let the app continue.

Parameters :
Name Type Optional Default value Description
operation string No 'operation'
  • name of the operation that failed
result T Yes
  • optional value to return as the observable result
Returns : (error: any) => any
Private log
log(message: string)

Log a HeroService message with the MessageService

Parameters :
Name Type Optional
message string No
Returns : void
searchHeroes
searchHeroes(term: string)
Parameters :
Name Type Optional
term string No
Returns : Observable<Hero[]>
updateHero
updateHero(hero: Hero)

PUT: update the hero on the server

Parameters :
Name Type Optional
hero Hero No
Returns : Observable<any>

Properties

Private heroesUrl
heroesUrl: string
Type : string
Default value : 'api/heroes'
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';

import { Observable, of } from 'rxjs';
import { catchError, map, tap } from 'rxjs/operators';

import { Hero } from '../hero';
import { MessageService } from './message.service';

const httpOptions = {
  headers: new HttpHeaders({ 'Content-Type': 'application/json' })
};

@Injectable({ providedIn: 'root' })
export class HeroService {

  private heroesUrl = 'api/heroes';  // URL to web api

  constructor(
    private http: HttpClient,
    private messageService: MessageService) { }

  /** GET heroes from the server */
  getHeroes (): Observable<Hero[]> {
    return this.http.get<Hero[]>(this.heroesUrl)
      .pipe(
        tap(_ => this.log('fetched heroes')),
        catchError(this.handleError('getHeroes', []))
      );
  }

  /** GET hero by id. Return `undefined` when id not found */
  getHeroNo404<Data>(id: number): Observable<Hero> {
    const url = `${this.heroesUrl}/?id=${id}`;
    return this.http.get<Hero[]>(url)
      .pipe(
        map(heroes => heroes[0]), // returns a {0|1} element array
        tap(h => {
          const outcome = h ? `fetched` : `did not find`;
          this.log(`${outcome} hero id=${id}`);
        }),
        catchError(this.handleError<Hero>(`getHero id=${id}`))
      );
  }

  /** GET hero by id. Will 404 if id not found */
  getHero(id: number): Observable<Hero> {
    const url = `${this.heroesUrl}/${id}`;
    return this.http.get<Hero>(url).pipe(
      tap(_ => this.log(`fetched hero id=${id}`)),
      catchError(this.handleError<Hero>(`getHero id=${id}`))
    );
  }

  /* GET heroes whose name contains search term */
  searchHeroes(term: string): Observable<Hero[]> {
    if (!term.trim()) {
      // if not search term, return empty hero array.
      return of([]);
    }
    return this.http.get<Hero[]>(`${this.heroesUrl}/?name=${term}`).pipe(
      tap(_ => this.log(`found heroes matching "${term}"`)),
      catchError(this.handleError<Hero[]>('searchHeroes', []))
    );
  }

  //////// Save methods //////////

  /** POST: add a new hero to the server */
  addHero (hero: Hero): Observable<Hero> {
    return this.http.post<Hero>(this.heroesUrl, hero, httpOptions).pipe(
      tap((hero: Hero) => this.log(`added hero w/ id=${hero.id}`)),
      catchError(this.handleError<Hero>('addHero'))
    );
  }

  /** DELETE: delete the hero from the server */
  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, httpOptions).pipe(
      tap(_ => this.log(`deleted hero id=${id}`)),
      catchError(this.handleError<Hero>('deleteHero'))
    );
  }

  /** PUT: update the hero on the server */
  updateHero (hero: Hero): Observable<any> {
    return this.http.put(this.heroesUrl, hero, httpOptions).pipe(
      tap(_ => this.log(`updated hero id=${hero.id}`)),
      catchError(this.handleError<any>('updateHero'))
    );
  }

  /**
   * Handle Http operation that failed.
   * Let the app continue.
   * @param operation - name of the operation that failed
   * @param result - optional value to return as the observable result
   */
  private handleError<T> (operation = 'operation', result?: T) {
    return (error: any): Observable<T> => {

      // TODO: send the error to remote logging infrastructure
      console.error(error); // log to console instead

      // TODO: better job of transforming error for user consumption
      this.log(`${operation} failed: ${error.message}`);

      // Let the app keep running by returning an empty result.
      return of(result as T);
    };
  }

  /** Log a HeroService message with the MessageService */
  private log(message: string) {
    this.messageService.add(`HeroService: ${message}`);
  }
}

result-matching ""

    No results matching ""