import { Injectable } from "@angular/core"; import { HttpClient } from "@angular/common/http"; import { Observable } from "rxjs"; import { Page } from "../models/page"; import { Genre } from "../models/resources/genre"; import { IResource } from "../models/resources/resource"; import { Library } from "../models/resources/library"; import { LibraryItem } from "../models/resources/library-item"; import { map } from "rxjs/operators"; import { Season } from "../models/resources/season"; import { Episode } from "../models/resources/episode"; import { Font } from "../models/font"; import { People } from "../models/resources/people"; import { Show } from "../models/resources/show"; import { Studio } from "../models/resources/studio"; 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 ""; const 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}`); } search(name: string): Observable { return this.client.get(`/api/search/${name}/${this.route}`); } } @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}-s${seasonNumber}/episodes${this.ArgsAsQuery(args)}`) .pipe(map(x => Object.assign(new Page(), x))); } getFonts(id: string | number): Observable { return this.client.get(`/api/episodes/${id}/fonts`); } } @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))); } } @Injectable({ providedIn: "root" }) export class GenreService extends CrudApi { constructor(client: HttpClient) { super(client, "genres"); } getFromShow(show: string | number, args?: ApiArgs): Observable> { return this.client.get>(`/api/shows/${show}/genres${this.ArgsAsQuery(args)}`) .pipe(map(x => Object.assign(new Page(), x))); } } @Injectable({ providedIn: "root" }) export class ShowService extends CrudApi { constructor(client: HttpClient) { super(client, "shows"); } getForCollection(collection: string | number, args?: ApiArgs): Observable> { return this.client.get>(`/api/collections/${collection}/shows${this.ArgsAsQuery(args)}`) .pipe(map(x => Object.assign(new Page(), x))); } } @Injectable({ providedIn: "root" }) export class StudioService extends CrudApi { constructor(client: HttpClient) { super(client, "studios"); } getForShow(show: string | number): Observable { return this.client.get(`/api/show/${show}/studio}`); } }