mirror of
https://github.com/tcgdex/cards-database.git
synced 2025-04-24 03:42:13 +00:00
80 lines
1.8 KiB
TypeScript
80 lines
1.8 KiB
TypeScript
import type { SupportedLanguages } from '@tcgdex/sdk'
|
|
import { type Query, Sort } from '../../libs/QueryEngine/filter'
|
|
import { recordToQuery } from '../../libs/QueryEngine/parsers'
|
|
import { checkLanguage } from '../../util'
|
|
import Card from '../Components/Card'
|
|
import Serie from '../Components/Serie'
|
|
import Set from '../Components/Set'
|
|
|
|
// TODO: make a better way to find the language
|
|
function getLang(e: any): SupportedLanguages {
|
|
// get the locale directive
|
|
const langArgument = e?.fieldNodes?.[0]?.directives?.[0]?.arguments?.[0]?.value
|
|
|
|
if (!langArgument) {
|
|
return 'en'
|
|
}
|
|
|
|
if (langArgument.kind === 'Variable') {
|
|
return e.variableValues[langArgument.name.value]
|
|
}
|
|
return langArgument.value
|
|
}
|
|
|
|
const middleware = (fn: (lang: SupportedLanguages, query: Query<object>) => any) => (
|
|
data: Record<string, any>,
|
|
_: any,
|
|
e: any
|
|
) => {
|
|
// get the locale directive
|
|
const lang = getLang(e)
|
|
|
|
const query = recordToQuery(data.filters ?? {})
|
|
|
|
// Deprecated code handling
|
|
if (data.pagination) {
|
|
query.$page = data.pagination.page ?? 1
|
|
query.$limit = data.pagination.itemsPerPage ?? 100
|
|
}
|
|
|
|
|
|
if (data.sort) {
|
|
query.$sort = {
|
|
[data.sort.field]: data.sort.order === 'DESC' ? Sort.DESC : Sort.ASC
|
|
}
|
|
}
|
|
|
|
if (!checkLanguage(lang)) {
|
|
return undefined
|
|
}
|
|
|
|
return fn(lang, query)
|
|
}
|
|
|
|
export default {
|
|
// Cards Endpoints
|
|
cards: middleware((lang, query) => {
|
|
return Card.find(lang, query)
|
|
}),
|
|
card: middleware((lang, query) => {
|
|
return Card.findOne(lang, query)
|
|
}),
|
|
|
|
// Set Endpoints
|
|
set: middleware((lang, query) => {
|
|
return Set.findOne(lang, query)
|
|
}),
|
|
sets: middleware((lang, query) => {
|
|
return Set.find(lang, query)
|
|
}),
|
|
|
|
// Serie Endpoints
|
|
serie: middleware((lang, query) => {
|
|
return Serie.findOne(lang, query)
|
|
}),
|
|
series: middleware((lang, query) => {
|
|
return Serie.find(lang, query)
|
|
}),
|
|
|
|
};
|