import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { catchError, mergeMap, Observable, of, tap } from 'rxjs'; import { Pokemon } from './pokemon'; @Injectable() export class PokemonService { constructor(private http: HttpClient) {} getPokemonList(): Observable { return this.http.get('api/pokemons').pipe( tap((pokemonList) => this.log(pokemonList)), catchError((error) => this.handleError(error, [])) ); } getPokemonById(pokemonId: number): Observable { return this.http.get(`api/pokemons/${pokemonId}`).pipe( tap((pokemon) => this.log(pokemon)), catchError((error) => this.handleError(error, undefined)) ); } getPokemonTypeList(): Observable { return this.http.get('api/pokemons').pipe( mergeMap((pokemons: Pokemon[]) => { const set = new Set(); pokemons.forEach((pokemon) => pokemon.types.forEach((type) => set.add(type)) ); return [Array.from(set.values())]; }), tap((pokemon) => this.log(pokemon)), catchError((error) => this.handleError(error, [])) ); } updatePokemon(pokemon: Pokemon): Observable { const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }), }; return this.http.put('api/pokemons', pokemon, httpOptions).pipe( tap((response) => this.log(response)), catchError((error) => this.handleError(error, null)) ); } addPokemon(pokemon: Pokemon): Observable { const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }), }; return this.http.post('api/pokemons', pokemon, httpOptions).pipe( tap((response) => this.log(response)), catchError((error) => this.handleError(error, null)) ); } deletePokemonById(pokemon: Pokemon): Observable { return this.http.delete(`api/pokemons/${pokemon.id}`).pipe( tap((response) => this.log(response)), catchError((error) => this.handleError(error, null)) ); } private log(response: any) { console.table(response); } private handleError(error: Error, errorValue: any) { console.error(error); return of(errorValue); } }