refactor: move project to frontend directory
This commit is contained in:
33
frontend/src/data/api/AniListApi.ts
Normal file
33
frontend/src/data/api/AniListApi.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import type {AniListUser} from '@/data/models/anilist/AniListUser';
|
||||
import {handleJsonResponse} from '@/data/api/ApiUtils';
|
||||
import type {AniListMangaListCollection} from '@/data/models/anilist/AniListMangaListCollection';
|
||||
|
||||
export default class AniListApi {
|
||||
async fetchUser(userName: string): Promise<AniListUser> {
|
||||
const res = fetch('/graphql', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
'query': 'query($id:Int,$name:String){User(id:$id,name:$name){id name previousNames{name updatedAt}avatar{large}bannerImage about isFollowing isFollower donatorTier donatorBadge createdAt moderatorRoles isBlocked bans options{profileColor restrictMessagesToFollowing}mediaListOptions{scoreFormat}statistics{anime{count meanScore standardDeviation minutesWatched episodesWatched genrePreview:genres(limit:10,sort:COUNT_DESC){genre count}}manga{count meanScore standardDeviation chaptersRead volumesRead genrePreview:genres(limit:10,sort:COUNT_DESC){genre count}}}stats{activityHistory{date amount level}}favourites{anime{edges{favouriteOrder node{id type status(version:2)format isAdult bannerImage title{userPreferred}coverImage{large}startDate{year}}}}manga{edges{favouriteOrder node{id type status(version:2)format isAdult bannerImage title{userPreferred}coverImage{large}startDate{year}}}}characters{edges{favouriteOrder node{id name{userPreferred}image{large}}}}staff{edges{favouriteOrder node{id name{userPreferred}image{large}}}}studios{edges{favouriteOrder node{id name}}}}}}',
|
||||
'variables': {'name': userName},
|
||||
}),
|
||||
});
|
||||
return (await handleJsonResponse(res)).data.User;
|
||||
}
|
||||
|
||||
async fetchManga(userId: number): Promise<AniListMangaListCollection> {
|
||||
const res = fetch('/graphql', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
'query': 'query($userId:Int,$userName:String,$type:MediaType){MediaListCollection(userId:$userId,userName:$userName,type:$type){lists{name isCustomList isCompletedList:isSplitCompletedList entries{...mediaListEntry}}user{id name avatar{large}mediaListOptions{scoreFormat rowOrder animeList{sectionOrder customLists splitCompletedSectionByFormat theme}mangaList{sectionOrder customLists splitCompletedSectionByFormat theme}}}}}fragment mediaListEntry on MediaList{id mediaId status score progress progressVolumes repeat priority private hiddenFromStatusLists customLists advancedScores notes updatedAt startedAt{year month day}completedAt{year month day}media{id title{userPreferred romaji english native}coverImage{extraLarge large}type format status(version:2)episodes volumes chapters averageScore popularity isAdult countryOfOrigin genres bannerImage startDate{year month day}}}',
|
||||
'variables': {'userId': userId, 'type': 'MANGA'},
|
||||
}),
|
||||
});
|
||||
return (await handleJsonResponse(res)).data.MediaListCollection;
|
||||
}
|
||||
}
|
||||
17
frontend/src/data/api/ApiUtils.ts
Normal file
17
frontend/src/data/api/ApiUtils.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export class ApiError extends Error {
|
||||
readonly statusCode: number;
|
||||
|
||||
constructor(statusCode: number, message?: string) {
|
||||
super(message);
|
||||
this.statusCode = statusCode;
|
||||
}
|
||||
}
|
||||
|
||||
export function handleJsonResponse<T>(res: Promise<Response>): Promise<T> {
|
||||
return res.then(async e => {
|
||||
if (e.status === 200) {
|
||||
return await e.json();
|
||||
}
|
||||
throw new ApiError(e.status, 'Api error ' + e.status + ': ' + await e.text());
|
||||
});
|
||||
}
|
||||
30
frontend/src/data/api/MangaUpdatesApi.ts
Normal file
30
frontend/src/data/api/MangaUpdatesApi.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import {handleJsonResponse} from '@/data/api/ApiUtils';
|
||||
|
||||
import type {MangaUpdatesSearchResult} from '@/data/models/mangaupdates/MangaUpdatesSearchResult';
|
||||
import type {MangaUpdatesSeries} from '@/data/models/mangaupdates/MangaUpdatesSeries';
|
||||
import type {MangaUpdatesSeriesGroups} from '@/data/models/mangaupdates/MangaUpdatesSeriesGroups';
|
||||
|
||||
export default class MangaUpdatesApi {
|
||||
search(name: string): Promise<MangaUpdatesSearchResult> {
|
||||
const res = fetch('/mangaupdates/v1/series/search', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({
|
||||
search: name,
|
||||
stype: 'title',
|
||||
type: 'Manga',
|
||||
}),
|
||||
});
|
||||
return handleJsonResponse(res);
|
||||
}
|
||||
|
||||
get(id: number): Promise<MangaUpdatesSeries> {
|
||||
const res = fetch(`/mangaupdates/v1/series/${id}`);
|
||||
return handleJsonResponse(res);
|
||||
}
|
||||
|
||||
groups(id: number): Promise<MangaUpdatesSeriesGroups> {
|
||||
const res = fetch(`/mangaupdates/v1/series/${id}/groups`);
|
||||
return handleJsonResponse(res);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user