From da6427807f382cb72a0ed0ef90f709ab493cd71d Mon Sep 17 00:00:00 2001 From: Alexander B Date: Fri, 28 Apr 2023 20:26:34 +0600 Subject: [PATCH] feat: add multi-search, adjust types to allow type narrowing --- package-lock.json | 4 ++-- src/endpoints/search.ts | 15 ++++++++++++--- src/endpoints/trending.ts | 4 ++-- src/types/index.ts | 32 +++++++++++++++----------------- src/types/search.ts | 7 +++++++ src/types/trending.ts | 21 +++++++++++++++------ 6 files changed, 53 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e532f1..1eaba42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "tmdb-ts", - "version": "0.2.0", + "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "tmdb-ts", - "version": "0.2.0", + "version": "1.0.0", "license": "MIT", "dependencies": { "cross-fetch": "^3.1.4" diff --git a/src/endpoints/search.ts b/src/endpoints/search.ts index 3c32437..83fd6c1 100644 --- a/src/endpoints/search.ts +++ b/src/endpoints/search.ts @@ -1,5 +1,5 @@ import { BaseEndpoint } from './base'; -import { Search } from '../types/search'; +import { MultiSearchResult, Search } from '../types/search'; import { Collection, Company, Movie, Person, TV } from '../types'; const BASE_SEARCH = '/search'; @@ -24,6 +24,10 @@ export interface PeopleSearchOptions extends SearchOptions { include_adult?: boolean; } +export interface MultiSearchOptions extends SearchOptions { + include_adult?: boolean; +} + export class SearchEndpoint extends BaseEndpoint { constructor(protected readonly accessToken: string) { super(accessToken); @@ -60,9 +64,14 @@ export class SearchEndpoint extends BaseEndpoint { return await this.api.get>(`${BASE_SEARCH}/person`, options); } - // TODO: Multi search - async tvShows(options: TvSearchOptions): Promise> { return await this.api.get>(`${BASE_SEARCH}/tv`, options); } + + async multi(options: MultiSearchOptions): Promise> { + return await this.api.get>( + `${BASE_SEARCH}/multi`, + options + ); + } } diff --git a/src/endpoints/trending.ts b/src/endpoints/trending.ts index 0e0ecd0..1d2124b 100644 --- a/src/endpoints/trending.ts +++ b/src/endpoints/trending.ts @@ -1,4 +1,4 @@ -import { MediaType, TimeWindow, TrendingResults } from '../types'; +import { TrendingMediaType, TimeWindow, TrendingResults } from '../types'; import { BaseEndpoint } from './base'; export class TrendingEndpoint extends BaseEndpoint { @@ -6,7 +6,7 @@ export class TrendingEndpoint extends BaseEndpoint { super(accessToken); } - async trending( + async trending( mediaType: T, timeWindow: TimeWindow ): Promise> { diff --git a/src/types/index.ts b/src/types/index.ts index 8432a50..8d4ad57 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -15,6 +15,8 @@ export * from './find'; export * from './keywords'; export * from './collections'; +export type MediaType = 'movie' | 'tv' | 'person'; + export interface AuthorDetails { name: string; username: string; @@ -22,23 +24,7 @@ export interface AuthorDetails { rating?: number; } -export interface KnownFor { - id: number; - overview: string; - release_date: string; - video: boolean; - adult: boolean; - backdrop_path: string; - media_type: string; - genre_ids: number[]; - title: string; - original_language: string; - original_title: string; - poster_path: string; - vote_count: number; - vote_average: number; - popularity: number; -} +export type KnownFor = MovieWithMediaType | TVWithMediaType; export interface Person { id: number; @@ -51,6 +37,10 @@ export interface Person { popularity: number; } +export interface PersonWithMediaType extends Person { + media_type: 'person'; +} + export interface Movie { id: number; poster_path: string; @@ -68,6 +58,10 @@ export interface Movie { vote_average: number; } +export interface MovieWithMediaType extends Movie { + media_type: 'movie'; +} + export interface Company { id: number; logo_path: string; @@ -91,6 +85,10 @@ export interface TV { vote_average: number; } +export interface TVWithMediaType extends TV { + media_type: 'tv'; +} + export interface Genre { id: number; name: string; diff --git a/src/types/search.ts b/src/types/search.ts index 30bdf0e..e60abe2 100644 --- a/src/types/search.ts +++ b/src/types/search.ts @@ -1,6 +1,13 @@ +import { MovieWithMediaType, PersonWithMediaType, TVWithMediaType } from '.'; + export interface Search { page: number; results: T[]; total_pages: number; total_results: number; } + +export type MultiSearchResult = + | MovieWithMediaType + | TVWithMediaType + | PersonWithMediaType; diff --git a/src/types/trending.ts b/src/types/trending.ts index 0761615..ef6c6ba 100644 --- a/src/types/trending.ts +++ b/src/types/trending.ts @@ -1,19 +1,28 @@ -import { Movie, Person, TV } from '.'; -export type MediaType = 'all' | 'movie' | 'tv' | 'person'; +import { + Movie, + Person, + TV, + MediaType, + MovieWithMediaType, + TVWithMediaType, + PersonWithMediaType, +} from '.'; export type TimeWindow = 'day' | 'week'; -type TrendingResult = T extends 'tv' +export type TrendingMediaType = MediaType | 'all'; + +type TrendingResult = T extends 'tv' ? TV : T extends 'movie' ? Movie : T extends 'person' ? Person - : TV | Movie | Person; + : TVWithMediaType | MovieWithMediaType | PersonWithMediaType; -export interface TrendingResults { +export interface TrendingResults { page: number; - results: (TrendingResult & { media_type: MediaType })[]; + results: TrendingResult[]; total_pages: number; total_results: number; }