diff --git a/endpoints/series.ts b/endpoints/series.ts index 8b76d98..5551a37 100644 --- a/endpoints/series.ts +++ b/endpoints/series.ts @@ -27,6 +27,6 @@ export default class implements Endpoint isSetAvailable(set, this.lang)) + return (await getSets(undefined, this.lang)) } public async sub(common: Array, item: string) { diff --git a/utils/serieUtil.ts b/utils/serieUtil.ts index 8e0271b..d2535d6 100644 --- a/utils/serieUtil.ts +++ b/utils/serieUtil.ts @@ -1,16 +1,29 @@ import { smartGlob } from "./util" -import { setToSetSimple, getSets } from "./setUtil" +import { setToSetSimple, getSets, getSet, isSetAvailable } from "./setUtil" import { Serie, SupportedLanguages, Set } from 'db/interfaces' import { Serie as SerieSingle, SerieResume } from '@tcgdex/sdk/interfaces' -export async function getSeries(): Promise> { - const series = await Promise.all((await smartGlob('./db/data/*.js')) +export async function getSeries(lang: SupportedLanguages): Promise> { + let series: Array = (await Promise.all((await smartGlob('./db/data/*.js')) + //Find Serie's name .map((it) => it.substring(it.lastIndexOf('/') + 1, it.length - 3)) - .map((it) => getSerie(it))) - const tmp: Array<[Serie, Set | undefined]> = await Promise.all(series.map( async (it) => { - return [it, (await getSets(it.name.en)).reduce((p, c) => p ? p.releaseDate < c.releaseDate ? p : c : c, undefined) as Set] as [Serie, Set] + // Fetch the Serie + .map((it) => getSerie(it)))) + // Filter the serie if no name's exists in the selected lang + .filter((serie) => !!serie.name[lang]) + + // Filter available series + const isAvailable = await Promise.all(series.map((serie) => isSerieAvailable(serie, lang))) + series = series.filter((_, index) => isAvailable[index]) + + // Sort series by the first set release date + const tmp: Array<[Serie, Set | undefined]> = await Promise.all(series.map(async (it) => { + return [ + it, + (await getSets(it.name.en, lang)) + .reduce((p, c) => p ? p.releaseDate < c.releaseDate ? p : c : c, undefined) as Set] as [Serie, Set] })) - tmp.forEach((t) => !t[1] && console.log(t[0].name) ) + return tmp.sort((a, b) => (a[1] ? a[1].releaseDate : '0') > (b[1] ? b[1].releaseDate : '0') ? 1 : -1).map((it) => it[0]) } @@ -18,6 +31,14 @@ export async function getSerie(name: string): Promise { return (await import(`../db/data/${name}.js`)).default } +export async function isSerieAvailable(serie: Serie, lang: SupportedLanguages) { + if (!serie.name[lang]) { + return false + } + const sets = (await getSets(serie.name.en, lang)) + return sets.length > 0 +} + export async function serieToSerieSimple(serie: Serie, lang: SupportedLanguages): Promise { return { id: serie.id, @@ -26,7 +47,7 @@ export async function serieToSerieSimple(serie: Serie, lang: SupportedLanguages) } export async function serieToSerieSingle(serie: Serie, lang: SupportedLanguages): Promise { - const setsTmp = await getSets(serie.name.en) + const setsTmp = await getSets(serie.name.en, lang) const sets = await Promise.all(setsTmp .sort((a, b) => { return a.releaseDate > b.releaseDate ? 1 : -1 diff --git a/utils/setUtil.ts b/utils/setUtil.ts index 9606ec5..1915387 100644 --- a/utils/setUtil.ts +++ b/utils/setUtil.ts @@ -10,22 +10,31 @@ interface t { const setCache: t = {} // Dont use cache as it wont necessary have them all -export async function getSets(serie = '*'): Promise> { - const sets = (await smartGlob(`./db/data/${serie}/*.js`)).map((set) => set.substring(set.lastIndexOf('/')+1, set.lastIndexOf('.'))) - return Promise.all(sets.map((set) => getSet(set, serie))) +export async function getSets(serie = '*', lang: SupportedLanguages): Promise> { + // list sets names + const rawSets = (await smartGlob(`./db/data/${serie}/*.js`)).map((set) => set.substring(set.lastIndexOf('/')+1, set.lastIndexOf('.'))) + // Fetch sets + const sets = (await Promise.all(rawSets.map((set) => getSet(set, serie, lang)))) + // Filter sets + .filter((set) => isSetAvailable(set, lang)) + // Sort sets by release date + .sort((a, b) => { + return a.releaseDate > b.releaseDate ? 1 : -1 + }) + return sets } /** * Return the set * @param name the name of the set (don't include.js/.ts) */ -export async function getSet(name: string, serie = '*'): Promise { +export async function getSet(name: string, serie = '*', lang: SupportedLanguages): Promise { if (!setCache[name]) { try { const [path] = await smartGlob(`./db/data/${serie}/${name}.js`) setCache[name] = (await import(path.replace('./', '../'))).default } catch (e) { - const set = (await getSets()).find((s) => s.id === name) + const set = (await getSets(undefined, lang)).find((s) => s.id === name) if (set) { return set }