Skip to content

Commit

Permalink
refactor: anime client
Browse files Browse the repository at this point in the history
  • Loading branch information
tutkli committed Feb 6, 2024
1 parent a385a50 commit a291094
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 184 deletions.
271 changes: 88 additions & 183 deletions src/clients/anime.client.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { AxiosError } from 'axios';
import { CacheAxiosResponse } from 'axios-cache-interceptor';
import { AnimeEndpoints } from '../constants';
import {
Anime,
Expand All @@ -24,264 +22,171 @@ import { BaseClient } from './base.client';
* See also: [Jikan Documentation](https://docs.api.jikan.moe/)
*/
export class AnimeClient extends BaseClient {
/**
* Get all the Animes within the given filter. Returns all the Animes if no filters are given.
* @param searchParams Filter parameters
* @returns JikanResponse with Anime array data
*/
public async getAnimeSearch(
searchParams?: Partial<AnimeSearchParams>
): Promise<JikanResponse<Anime[]>> {
return new Promise<JikanResponse<Anime[]>>((resolve, reject) => {
const endpoint = `${AnimeEndpoints.AnimeSearch}`;
this.api
.get<JikanResponse<Anime[]>>(endpoint, { params: searchParams })
.then((response: CacheAxiosResponse<JikanResponse<Anime[]>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
});
}

/**
* Get a complete Anime resource data
* @param mal_id The Anime ID
* @param id The Anime ID
* @returns JikanResponse with Anime data
*/
public async getAnimeFullById(mal_id: number): Promise<JikanResponse<Anime>> {
return new Promise<JikanResponse<Anime>>((resolve, reject) => {
const endpoint = this.replacePathParams(AnimeEndpoints.AnimeFullById, {
id: mal_id,
});
this.api
.get<JikanResponse<Anime>>(endpoint)
.then((response: CacheAxiosResponse<JikanResponse<Anime>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
});
public async getAnimeFullById(id: number): Promise<JikanResponse<Anime>> {
return this.getResource<JikanResponse<Anime>>(
AnimeEndpoints.AnimeFullById,
{ id }
);
}

/**
* Get Anime resource data
* @param mal_id The Anime ID
* @param id The Anime ID
* @returns JikanResponse with Anime data
*/
public async getAnimeById(mal_id: number): Promise<JikanResponse<Anime>> {
return new Promise<JikanResponse<Anime>>((resolve, reject) => {
const endpoint = this.replacePathParams(AnimeEndpoints.AnimeById, {
id: mal_id,
});
this.api
.get<JikanResponse<Anime>>(endpoint)
.then((response: CacheAxiosResponse<JikanResponse<Anime>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
public async getAnimeById(id: number): Promise<JikanResponse<Anime>> {
return this.getResource<JikanResponse<Anime>>(AnimeEndpoints.AnimeById, {
id,
});
}

/**
* Get Characters of a specific Anime
* @param mal_id The Anime ID
* @returns JikanResponse with AnimeCharacter array data
* @param id The Anime ID
* @returns JikanResponse with array of AnimeCharacter data
*/
public async getAnimeCharacters(
mal_id: number
id: number
): Promise<JikanResponse<AnimeCharacter[]>> {
return new Promise<JikanResponse<AnimeCharacter[]>>((resolve, reject) => {
const endpoint = this.replacePathParams(AnimeEndpoints.AnimeCharacters, {
id: mal_id,
});
this.api
.get<JikanResponse<AnimeCharacter[]>>(endpoint)
.then((response: CacheAxiosResponse<JikanResponse<AnimeCharacter[]>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
});
return this.getResource<JikanResponse<AnimeCharacter[]>>(
AnimeEndpoints.AnimeCharacters,
{ id }
);
}

/**
* Get Staff of a specific Anime
* @param mal_id The Anime ID
* @returns JikanResponse with AnimeStaff array data
* @param id The Anime ID
* @returns JikanResponse with array of AnimeStaff data
*/
public async getAnimeStaff(
mal_id: number
): Promise<JikanResponse<AnimeStaff[]>> {
return new Promise<JikanResponse<AnimeStaff[]>>((resolve, reject) => {
const endpoint = this.replacePathParams(AnimeEndpoints.AnimeStaff, {
id: mal_id,
});
this.api
.get<JikanResponse<AnimeStaff[]>>(endpoint)
.then((response: CacheAxiosResponse<JikanResponse<AnimeStaff[]>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
});
public async getAnimeStaff(id: number): Promise<JikanResponse<AnimeStaff[]>> {
return this.getResource<JikanResponse<AnimeStaff[]>>(
AnimeEndpoints.AnimeStaff,
{ id }
);
}

/**
* Get a list of all the episodes of a specific Anime
* @param mal_id The Anime ID
* @param id The Anime ID
* @param page The page number
* @returns JikanResponse with AnimeEpisode array data
* @returns JikanResponse with array of AnimeEpisode data
*/
public async getAnimeEpisodes(
mal_id: number,
id: number,
page = 1
): Promise<JikanResponse<AnimeEpisode[]>> {
return new Promise<JikanResponse<AnimeEpisode[]>>((resolve, reject) => {
const endpoint = this.replacePathParams(AnimeEndpoints.AnimeEpisodes, {
id: mal_id,
});
this.api
.get<JikanResponse<AnimeEpisode[]>>(endpoint, { params: { page } })
.then((response: CacheAxiosResponse<JikanResponse<AnimeEpisode[]>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
});
return this.getResource<JikanResponse<AnimeEpisode[]>>(
AnimeEndpoints.AnimeEpisodes,
{ id },
{ page }
);
}

/**
* Get a single Episode of a specific Anime by its ID
* @param anime_mal_id The Anime ID
* @param episode_mal_id The Episode ID
* @param anime_id The Anime ID
* @param episode_id The Episode ID
* @returns JikanResponse with AnimeEpisode data
*/
public async getAnimeEpisodeById(
anime_mal_id: number,
episode_mal_id: number
anime_id: number,
episode_id: number
): Promise<JikanResponse<AnimeEpisode>> {
return new Promise<JikanResponse<AnimeEpisode>>((resolve, reject) => {
const endpoint = this.replacePathParams(AnimeEndpoints.AnimeEpisodeById, {
id: anime_mal_id,
episode: episode_mal_id,
});
this.api
.get<JikanResponse<AnimeEpisode>>(endpoint)
.then((response: CacheAxiosResponse<JikanResponse<AnimeEpisode>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
});
return this.getResource<JikanResponse<AnimeEpisode>>(
AnimeEndpoints.AnimeEpisodeById,
{ id: anime_id, episode: episode_id }
);
}

/**
* Get Videos related to a specific Anime
* @param mal_id The Anime ID
* @param id The Anime ID
* @returns JikanResponse with AnimeVideo data
*/
public async getAnimeVideos(
mal_id: number
): Promise<JikanResponse<AnimeVideos>> {
return new Promise<JikanResponse<AnimeVideos>>((resolve, reject) => {
const endpoint = this.replacePathParams(AnimeEndpoints.AnimeVideos, {
id: mal_id,
});
this.api
.get<JikanResponse<AnimeVideos>>(endpoint)
.then((response: CacheAxiosResponse<JikanResponse<AnimeVideos>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
});
public async getAnimeVideos(id: number): Promise<JikanResponse<AnimeVideos>> {
return this.getResource<JikanResponse<AnimeVideos>>(
AnimeEndpoints.AnimeVideos,
{ id }
);
}

/**
* Get Episode Videos related to a specific Anime
* @param mal_id The Anime ID
* @param id The Anime ID
* @param page The page number
* @returns JikanResponse with AnimeVideoEpisode array data
* @returns JikanResponse with array of AnimeVideoEpisode data
*/
public async getAnimeEpisodeVideos(
mal_id: number,
id: number,
page = 1
): Promise<JikanResponse<AnimeEpisodeVideo[]>> {
return new Promise<JikanResponse<AnimeEpisodeVideo[]>>(
(resolve, reject) => {
const endpoint = this.replacePathParams(
AnimeEndpoints.AnimeVideosEpisodes,
{ id: mal_id }
);
this.api
.get<JikanResponse<AnimeEpisodeVideo[]>>(endpoint, {
params: { page },
})
.then(
(
response: CacheAxiosResponse<JikanResponse<AnimeEpisodeVideo[]>>
) => resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
}
return this.getResource<JikanResponse<AnimeEpisodeVideo[]>>(
AnimeEndpoints.AnimeVideosEpisodes,
{ id },
{ page }
);
}

/**
* Get Pictures related to a specific Anime
* @param mal_id The Anime ID
* @returns JikanResponse with AnimePicture array data
* @param id The Anime ID
* @returns JikanResponse with array of AnimePicture data
*/
public async getAnimePictures(
mal_id: number
id: number
): Promise<JikanResponse<AnimePicture[]>> {
return new Promise<JikanResponse<AnimePicture[]>>((resolve, reject) => {
const endpoint = this.replacePathParams(AnimeEndpoints.AnimePictures, {
id: mal_id,
});
this.api
.get<JikanResponse<AnimePicture[]>>(endpoint)
.then((response: CacheAxiosResponse<JikanResponse<AnimePicture[]>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
});
return this.getResource<JikanResponse<AnimePicture[]>>(
AnimeEndpoints.AnimePictures,
{ id }
);
}

/**
* Get Statistics related to a specific Anime
* @param mal_id The Anime ID
* @param id The Anime ID
* @returns JikanResponse with AnimeStatistics data
*/
public async getAnimeStatistics(
mal_id: number
id: number
): Promise<JikanResponse<AnimeStatistics>> {
return new Promise<JikanResponse<AnimeStatistics>>((resolve, reject) => {
const endpoint = this.replacePathParams(AnimeEndpoints.AnimeStatistics, {
id: mal_id,
});
this.api
.get<JikanResponse<AnimeStatistics>>(endpoint)
.then((response: CacheAxiosResponse<JikanResponse<AnimeStatistics>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
});
return this.getResource<JikanResponse<AnimeStatistics>>(
AnimeEndpoints.AnimeStatistics,
{ id }
);
}

/**
* Get Recommendations related to a specific Anime
* @param mal_id The Anime ID
* @returns JikanResponse with Recommendation array data
* @param id The Anime ID
* @returns JikanResponse with array of Recommendation data
*/
public async getAnimeRecommendations(
mal_id: number
id: number
): Promise<JikanResponse<Recommendation[]>> {
return new Promise<JikanResponse<Recommendation[]>>((resolve, reject) => {
const endpoint = this.replacePathParams(
AnimeEndpoints.AnimeRecommendations,
{ id: mal_id }
);
this.api
.get<JikanResponse<Recommendation[]>>(endpoint)
.then((response: CacheAxiosResponse<JikanResponse<Recommendation[]>>) =>
resolve(response.data)
)
.catch((error: AxiosError<string>) => reject(error));
});
return this.getResource<JikanResponse<Recommendation[]>>(
AnimeEndpoints.AnimeRecommendations,
{ id }
);
}

/**
* Get all the Animes within the given filter. Returns all the Animes if no filters are given.
* @param searchParams Filter parameters
* @returns JikanResponse with Anime array data
*/
public async getAnimeSearch(
searchParams?: Partial<AnimeSearchParams>
): Promise<JikanResponse<Anime[]>> {
return this.getResource<JikanResponse<Anime[]>>(
AnimeEndpoints.AnimeSearch,
{},
{ searchParams }
);
}
}
12 changes: 12 additions & 0 deletions src/clients/base.client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,18 @@ export abstract class BaseClient {
}
}

protected async getResource<T>(
endpoint: string,
pathParams: { [key in string]: unknown } = {},
params: { [key in string]: unknown } = {}
): Promise<T> {
return (
await this.api.get<T>(this.replacePathParams(endpoint, pathParams), {
params,
})
).data;
}

protected replacePathParams(
path: string,
params: { [key in string]: unknown }
Expand Down
Loading

0 comments on commit a291094

Please sign in to comment.