import {Injectable} from "@angular/core"; import {HttpClient} from "@angular/common/http"; import {Observable} from "rxjs" import {Page} from "../../models/page"; import {IResource} from "../../models/resources/resource"; import {Library} from "../../models/library"; import {LibraryItem} from "../../models/library-item"; import {map} from "rxjs/operators"; import {Season} from "../../models/season"; import {Episode} from "../../models/episode"; import {People} from "../../models/people"; export interface ApiArgs { sortBy?: string; limit?: number; afterID?: number; [key: string]: any; } class CrudApi { constructor(protected client: HttpClient, private route: string) {} get(id: number | string): Observable { return this.client.get(`/api/${this.route}/${id}`); } protected ArgsAsQuery(args: ApiArgs): string { if (args == null) return ""; let params: string = Object.keys(args).map(x => `${x}=${args[x]}`).join("&"); return params ? `?${params}` : ""; } getAll(args?: ApiArgs): Observable> { return this.client.get>(`/api/${this.route}${this.ArgsAsQuery(args)}`) .pipe(map(x => Object.assign(new Page(), x))); } create(item: T): Observable { return this.client.post(`/api/${this.route}`, item); } edit(item: T): Observable { return this.client.put(`/api/${this.route}`, item); } delete(item: T): Observable { return this.client.delete(`/api/${this.route}/${item.slug}`); } } @Injectable({ providedIn: 'root' }) export class LibraryService extends CrudApi { constructor(client: HttpClient) { super(client, "libraries"); } } @Injectable({ providedIn: 'root' }) export class LibraryItemService extends CrudApi { constructor(client: HttpClient) { super(client, "items"); } } @Injectable({ providedIn: 'root' }) export class SeasonService extends CrudApi { constructor(client: HttpClient) { super(client, "seasons"); } getForShow(show: string | number, args?: ApiArgs): Observable> { return this.client.get(`/api/show/${show}/seasons${this.ArgsAsQuery(args)}`) .pipe(map(x => Object.assign(new Page(), x))); } } @Injectable({ providedIn: 'root' }) export class EpisodeService extends CrudApi { constructor(client: HttpClient) { super(client, "episodes"); } getFromSeason(season: string | number, args?: ApiArgs): Observable> { return this.client.get(`/api/seasons/${season}/episodes${this.ArgsAsQuery(args)}`) .pipe(map(x => Object.assign(new Page(), x))); } getFromSeasonNumber(show: string | number, seasonNumber: number, args?: ApiArgs): Observable> { return this.client.get(`/api/seasons/${show}-${seasonNumber}/episodes${this.ArgsAsQuery(args)}`) .pipe(map(x => Object.assign(new Page(), x))); } } @Injectable({ providedIn: 'root' }) export class PeopleService extends CrudApi { constructor(client: HttpClient) { super(client, "people"); } getFromShow(show: string | number, args?: ApiArgs): Observable> { return this.client.get(`/api/shows/${show}/people${this.ArgsAsQuery(args)}`) .pipe(map(x => Object.assign(new Page(), x))); } }