feat: add back fetch route

This commit is contained in:
Nathan Lamy 2025-08-20 16:43:31 +02:00
parent 1d3728b48d
commit fb00495840
3 changed files with 54 additions and 1 deletions

View file

@ -0,0 +1,46 @@
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))
}
}

View file

@ -97,7 +97,6 @@ export class GradeService {
periodStartDate
)
console.log(this.reduce(subjectAverages), subjectAverages)
results.push({
period: periodStartDate.toFormat('MMM'),
average: periodAverage,

View file

@ -62,3 +62,11 @@ router
const GradesController = () => import('#controllers/grades_controller')
router.get('/grades', [GradesController, 'index']).use(middleware.auth())
const InternalsController = () => import('#controllers/internals_controller')
router
.group(() => {
router.post('/back-fetch', [InternalsController, 'backFetch'])
})
.prefix('/internals')
// TODO: Token authentication