import type { HttpContext } from '@adonisjs/core/http' import db from '@adonisjs/lucid/services/db' import NzbService from '#services/nzb_service' /** The catalog (REBUILD.md, part 9): a name search and a release's NZB. */ export default class ReleasesController { /** Releases whose name has every word of `q` (dots, dashes, underscores and spaces alike), newest first. */ async index({ request }: HttpContext) { const q = String(request.input('q', '')).trim() const limit = Math.min(Number(request.input('limit', 50)) || 50, 200) const query = db .from('releases') .select('id', 'name', 'poster', 'groups', 'posted_at', 'files', 'file_total', 'bytes', 'complete', 'readable') .orderBy('posted_at', 'desc') .limit(limit) for (const word of q.split(/[\s._-]+/).filter(Boolean)) query.whereILike('name', `%${word.replace(/[\\%_]/g, '\\$&')}%`) return { releases: await query } } async nzb({ params, response }: HttpContext) { const nzb = await NzbService.build(Number(params.id)) if (!nzb) return response.notFound({ error: 'No such release' }) response.header('Content-Type', 'application/x-nzb') response.header('Content-Disposition', `attachment; filename="${nzb.name.replace(/["\\/]/g, '_')}.nzb"`) return nzb.xml } }