Files
buildpath/frontend/server/api/champion/[alias].ts
Valentin Haudiquet e1ab81854a
All checks were successful
pipeline / lint-and-format (push) Successful in 4m22s
pipeline / build-and-push-images (push) Successful in 2m11s
refactor: make match-collector export its types, and consume them in frontend
2026-04-30 00:06:53 +02:00

68 lines
2.0 KiB
TypeScript

import type { MongoClient } from 'mongodb'
import type { ChampionData } from 'match_collector'
import { connectToDatabase, fetchLatestPatch } from '../../utils/mongo'
async function championInfos(client: MongoClient, patch: string, championAlias: string) {
const database = client.db('champions')
const collection = database.collection(patch)
const query = { alias: championAlias }
const championInfo = (await collection.findOne(query)) as unknown as ChampionData | null
return championInfo
}
export default defineEventHandler(async event => {
try {
const championAlias = (getRouterParam(event, 'alias') as string).toLowerCase()
// Validate champion alias
if (!championAlias || typeof championAlias !== 'string') {
throw createError({
statusCode: 400,
statusMessage: 'Invalid champion alias',
data: { alias: championAlias }
})
}
const client = await connectToDatabase()
const latestPatch = await fetchLatestPatch(client)
const data = await championInfos(client, latestPatch, championAlias)
await client.close()
if (!data) {
throw createError({
statusCode: 404,
statusMessage: 'Champion not found',
data: { alias: championAlias, patch: latestPatch }
})
}
return data
} catch (error) {
console.error('Error in champion API:', error)
// Handle different error types
if (error instanceof Error) {
throw createError({
statusCode: 500,
statusMessage: 'Failed to fetch champion data',
data: {
error: error.message,
championAlias: getRouterParam(event, 'alias')
}
})
}
// Re-throw if it's already a proper error
if (error && typeof error === 'object' && 'statusCode' in error) {
throw error
}
// Fallback error
throw createError({
statusCode: 500,
statusMessage: 'Internal server error',
data: { championAlias: getRouterParam(event, 'alias') }
})
}
})