wikipedia-game-solver/apps/api/app/controllers/wikipedia/pages/get_wikipedia_pages.ts

43 lines
1.2 KiB
TypeScript
Raw Permalink Normal View History

2024-08-16 02:50:11 +02:00
import Page, { type PageRaw } from "#app/models/page.ts"
2024-08-15 15:14:21 +02:00
import { throttle } from "#start/limiter.ts"
import type { HttpContext } from "@adonisjs/core/http"
import router from "@adonisjs/core/services/router"
2024-08-16 02:50:11 +02:00
import { sanitizePageTitle } from "@repo/wikipedia"
import vine from "@vinejs/vine"
2024-08-16 02:50:11 +02:00
export const get_wikipedia_pages_validator = vine.compile(
vine.object({
title: vine
.string()
.minLength(1)
.maxLength(255)
.transform((value) => {
return sanitizePageTitle(value)
}),
limit: vine.number().withoutDecimals().range([1, 100]).optional(),
}),
)
2024-08-16 02:50:11 +02:00
export default class get_wikipedia_pages {
2024-08-18 02:31:02 +02:00
public async handle(context: HttpContext): Promise<{
__response: PageRaw[]
__status: 200
}> {
2024-08-16 02:50:11 +02:00
const payload = await context.request.validateUsing(
get_wikipedia_pages_validator,
)
const pages = await Page.query()
.whereLike("title", `${payload.title}%`)
.limit(payload.limit ?? 5)
2024-08-18 02:31:02 +02:00
return context.response.ok(pages)
}
}
2024-08-16 02:50:11 +02:00
router
.get("/wikipedia/pages", [get_wikipedia_pages])
.use(throttle)
.openapi({
description: "Search Wikipedia pages by title.",
tags: ["wikipedia"],
})