refactor: move project to frontend directory

This commit is contained in:
wea_ondara
2023-10-08 11:20:02 +02:00
parent 2a9cfba4d8
commit 34b0135da7
79 changed files with 2 additions and 2 deletions

View 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;
}
}

View 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());
});
}

View 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);
}
}