ng-pokemon-app/src/app/pokemon/pokemon.service.ts

75 lines
2.3 KiB
TypeScript

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<Pokemon[]> {
return this.http.get<Pokemon[]>('api/pokemons').pipe(
tap((pokemonList) => this.log(pokemonList)),
catchError((error) => this.handleError(error, []))
);
}
getPokemonById(pokemonId: number): Observable<Pokemon | undefined> {
return this.http.get<Pokemon>(`api/pokemons/${pokemonId}`).pipe(
tap((pokemon) => this.log(pokemon)),
catchError((error) => this.handleError(error, undefined))
);
}
getPokemonTypeList(): Observable<string[]> {
return this.http.get<Pokemon[]>('api/pokemons').pipe(
mergeMap((pokemons: Pokemon[]) => {
const set = new Set<string>();
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<null> {
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<Pokemon> {
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
};
return this.http.post<Pokemon>('api/pokemons', pokemon, httpOptions).pipe(
tap((response) => this.log(response)),
catchError((error) => this.handleError(error, null))
);
}
deletePokemonById(pokemon: Pokemon): Observable<null> {
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);
}
}