api/app/controllers/internals_controller.ts
2025-08-20 16:43:31 +02:00

46 lines
1.4 KiB
TypeScript

import type { HttpContext } from '@adonisjs/core/http'
import redis from '@adonisjs/redis/services/main'
import { DateTime } from 'luxon'
export default class InternalsController {
// POST /internals/back-fetch
async backFetch({ response, request }: HttpContext) {
const className = request.input('className')
if (!className) {
return response.badRequest({ message: 'className is required' })
}
// Start a new thread to avoid blocking the event loop
response.send({
success: true,
message: `Fetching colles for class ${className}...`,
})
setImmediate(async () => {
await queue(className)
console.log(`Colles fetching for class ${className} completed.`)
})
}
}
async function queue(className: string) {
// 1er Septembre 2019 début de BJColle
const startDate = DateTime.fromISO('2019-09-01T00:00:00')
const endDate = DateTime.now()
let date = endDate
// Loop through all days from startDate to endDate
while (date >= startDate) {
await redis.publish(
'jobs_queue',
JSON.stringify({
type: 1, // Fetch day colles
// Format DD/MM/YYYY
date: date.toFormat('dd/MM/yyyy'),
class_name: className,
})
)
date = date.minus({ days: 1 })
// Wait for 1 second to avoid overwhelming the queue
await new Promise((resolve) => setTimeout(resolve, 1000))
}
}