1
0
mirror of https://github.com/tcgdex/cards-database.git synced 2025-08-16 09:08:52 +00:00

feat: less errors

This commit is contained in:
2025-08-05 21:02:50 +02:00
parent 5d1dcccd0a
commit 66e7a10d9f
8 changed files with 64 additions and 76 deletions

View File

@@ -28,6 +28,7 @@
"@types/express": "^4.17.21",
"@types/node": "^20.17.32",
"@types/swagger-ui-express": "^4.1.8",
"@typescript/native-preview": "^7.0.0-dev.20250805.1",
"glob": "^10.4.5",
"typescript": "^4.9.5"
}

View File

@@ -53,11 +53,17 @@ export async function getAllCards(lang: SupportedLanguages): Promise<Array<SDKCa
}
async function transformCard(card: MappedCard): Promise<SDKCard> {
console.time('cardmarket')
const cardmarket = await getCardMarketPrice(card)
console.timeEnd('cardmarket')
console.time('tcgplayer')
const tcgplayer = await getTCGPlayerPrice(card)
console.timeEnd('tcgplayer')
return {
...objectOmit(card, 'thirdParty'),
pricing: {
cardmarket: await getCardMarketPrice(card),
tcgplayer: await getTCGPlayerPrice(card)
cardmarket: cardmarket,
tcgplayer: tcgplayer
}
}
}

View File

@@ -1,7 +1,5 @@
import { objectLoop } from '@dzeio/object-util'
import type { Serie as SDKSerie, SerieResume, SupportedLanguages } from '@tcgdex/sdk'
import { executeQuery, type Query } from '../../libs/QueryEngine/filter'
import { findOneSet } from './Set'
import de from '../../../generated/de/series.json'
import en from '../../../generated/en/series.json'
@@ -44,55 +42,32 @@ const series = {
'zh-cn': zhcn,
} as const
type LocalSerie = Omit<SDKSerie, 'sets'> & {sets: () => Array<TCGSet>}
type MappedSerie = any // (typeof en)[number]
export default class Serie implements LocalSerie {
export async function getAllSeries(lang: SupportedLanguages): Promise<Array<SDKSerie>> {
return Promise.all((series[lang] as Array<MappedSerie>).map(transformSerie))
}
id!: string
name!: string
logo?: string | undefined
async function transformSerie(serie: MappedSerie): Promise<SDKSerie> {
return serie
}
public constructor(
private lang: SupportedLanguages,
private serie: SDKSerie
) {
objectLoop(serie, (it, key) => {
if (key === 'sets') {
return
}
this[key as 'id'] = it as string
})
export async function findSeries(lang: SupportedLanguages, query: Query<SDKSerie>) {
return executeQuery(await getAllSeries(lang), query).data
}
export async function findOneSerie(lang: SupportedLanguages, query: Query<SDKSerie>) {
const res = await findSeries(lang, query)
if (res.length === 0) {
return undefined
}
return res[0]
}
public async sets(): Array<TCGSet> {
return Promise.all(this.serie.sets.map((s) => findOneSet(this.lang, { id: s.id })))
}
public static getAll(lang: SupportedLanguages): Array<SDKSerie> {
return series[lang]
}
public static find(lang: SupportedLanguages, query: Query<SDKSerie>) {
return executeQuery(Serie.getAll(lang), query).data.map((it) => new Serie(lang, it))
}
public static findOne(lang: SupportedLanguages, query: Query<SDKSerie>) {
const res = Serie.find(lang, query)
if (res.length === 0) {
return undefined
}
return res[0]
}
public resume(): SerieResume {
return {
id: this.id,
name: this.name,
logo: this.logo
}
}
public full(): SDKSerie {
return this.serie
export function serieToBrief(set: SDKSerie): SerieResume {
return {
id: set.id,
name: set.name,
logo: set.logo
}
}

View File

@@ -1,8 +1,6 @@
import { objectLoop } from '@dzeio/object-util'
import type { Set as SDKSet, SetResume, SupportedLanguages } from '@tcgdex/sdk'
import { executeQuery, type Query } from '../../libs/QueryEngine/filter'
import { findOneCard, type Card } from './Card'
import Serie from './Serie'
import { objectOmit } from '@dzeio/object-util'
import de from '../../../generated/de/sets.json'
import en from '../../../generated/en/sets.json'
@@ -52,7 +50,7 @@ export async function getAllSets(lang: SupportedLanguages): Promise<Array<SDKSet
async function transformSet(set: MappedSet): Promise<SDKSet> {
return {
...objectOmit(card, 'thirdParty'),
...objectOmit(set, 'thirdParty'),
// pricing: {
// cardmarket: await getCardMarketPrice(card),
// tcgplayer: await getTCGPlayerPrice(card)

View File

@@ -7,8 +7,8 @@ import type { Query } from '../../libs/QueryEngine/filter'
import { recordToQuery } from '../../libs/QueryEngine/parsers'
import { betterSorter, checkLanguage, unique } from '../../util'
import { getAllCards, findOneCard, findCards, toBrief } from '../Components/Card'
import { getAllSets, findOneSet, findSets, setToBrief } from '../Components/Set'
import Serie from '../Components/Serie'
import { findOneSet, findSets, setToBrief } from '../Components/Set'
import { findOneSerie, findSeries, serieToBrief } from '../Components/Serie'
type CustomRequest = Request & {
/**
@@ -86,16 +86,16 @@ server
// biome-ignore lint/style/noNonNullAssertion: <explanation>
const query: Query = req.advQuery!
let data: Array<SDKCard | any | Serie> = []
let data: Array<SDKCard | any> = []
switch (what.toLowerCase()) {
case 'card':
data = await findCards(lang, query)
break
case 'set':
data = findSets(lang, query)
data = await findSets(lang, query)
break
case 'serie':
data = Serie.find(lang, query)
data = await findSeries(lang, query)
break
default:
sendError(Errors.NOT_FOUND, res, { details: `You can only run random requests on "card", "set" or "serie" while you did on "${what}"` })
@@ -153,13 +153,12 @@ server
'serie.name': tmp
}]
}
result = await findSets(lang, query).map(setToBrief)
result = (await findSets(lang, query)).map(setToBrief)
break
}
case 'series':
result = Serie
.find(lang, query)
.map((c) => c.resume())
result = (await findSeries(lang, query))
.map(serieToBrief)
break
case 'categories':
case "energy-types":
@@ -210,6 +209,7 @@ server
* ex: /v2/en/cards/base1-1
*/
.get('/:lang/:endpoint/:id', async (req: CustomRequest, res) => {
console.time('request')
let { id, lang, endpoint } = req.params
if (id.endsWith('.json')) {
@@ -232,16 +232,16 @@ server
break
case 'sets':
result = await findOneset(lang, { id })
result = await findOneSet(lang, { id })
if (!result) {
result = await findOneset(lang, { name: id })
result = await findOneSet(lang, { name: id })
}
break
case 'series':
result = Serie.findOne(lang, { id })?.full()
result = await findOneSerie(lang, { id })
if (!result) {
result = Serie.findOne(lang, { name: id })?.full()
result = await findOneSerie(lang, { name: id })
}
break
case 'dex-ids': {
@@ -263,6 +263,8 @@ server
.map(toBrief)
}
}
console.timeEnd('request')
if (!result) {
sendError(Errors.NOT_FOUND, res)
return

View File

@@ -3,8 +3,8 @@ import { type Query, Sort } from '../../libs/QueryEngine/filter'
import { recordToQuery } from '../../libs/QueryEngine/parsers'
import { checkLanguage } from '../../util'
import { findCards, findOneCard } from '../Components/Card'
import Serie from '../Components/Serie'
import Set from '../Components/Set'
import { findSets, findOneSet } from '../Components/Set'
import { findSeries, findOneSerie } from '../Components/Serie'
// TODO: make a better way to find the language
function getLang(e: any): SupportedLanguages {
@@ -62,18 +62,18 @@ export default {
// Set Endpoints
set: middleware((lang, query) => {
return Set.findOne(lang, query)
return findOneSet(lang, query)
}),
sets: middleware((lang, query) => {
return Set.find(lang, query)
return findSets(lang, query)
}),
// Serie Endpoints
serie: middleware((lang, query) => {
return Serie.findOne(lang, query)
return findOneSerie(lang, query)
}),
series: middleware((lang, query) => {
return Serie.find(lang, query)
return findSeries(lang, query)
}),
};

View File

@@ -43,8 +43,14 @@ export async function updateTCGPlayerDatas(): Promise<boolean> {
.map((it) => it!.thirdParty!.tcgplayer)
for (const product of products) {
const data = await fetch(`https://tcgcsv.com/tcgplayer/3/${product}/prices`)
.then((res) => res.json() as Promise<Root>)
const res = await fetch(`https://tcgcsv.com/tcgplayer/3/${product}/prices`)
if (res.status >= 400) {
console.warn(`couldn\'t load TCGplayer datas for ${product} :(` + await res.text())
continue
}
const data = await res.json()
// console.log('data:', data)
for (const item of data.results) {

View File

@@ -1,7 +1,7 @@
import { objectKeys, objectLoop, objectMap } from '@dzeio/object-util'
import express from 'express'
import Serie from './V2/Components/Serie'
import Set from './V2/Components/Set'
import * as Serie from './V2/Components/Serie'
import * as Set from './V2/Components/Set'
import de from '../generated/de/stats.json'
import en from '../generated/en/stats.json'