import type { HttpContext } from '@adonisjs/core/http' import logger from '@adonisjs/core/services/logger' import DeviceModel from '#models/device' import { Tr069TraceService } from '#services/tr069_trace_service' export default class Tr069TraceController { private get service(): Tr069TraceService { return Tr069TraceService.getInstance() } async index({ response }: HttpContext) { return response.status(200).json({ entries: this.service.list() }) } async store({ request, response }: HttpContext) { const deviceId = request.input('deviceId') as string | undefined if (!deviceId) { return response.status(422).json({ error: 'deviceId is required' }) } if (this.service.isTraced(deviceId)) { return response.status(409).json({ error: 'Device is already being traced' }) } const record = await DeviceModel.findByIdentifier(deviceId) if (!record) { return response.status(404).json({ error: `Device ${deviceId} not found` }) } await this.service.addDevice({ deviceId, manufacturer: record.deviceId?.manufacturer ?? '', oui: record.deviceId?.oui ?? '', productClass: record.deviceId?.productClass ?? '', serialNumber: record.deviceId?.serialNumber ?? '', }) logger.info({ deviceId }, 'TR-069 trace enabled for device') const entry = this.service.list().find((traceEntry) => traceEntry.deviceId === deviceId) return response.status(201).json({ entry }) } async destroy({ params, response }: HttpContext) { const removed = await this.service.removeDevice(params.id) if (!removed) { return response.status(404).json({ error: `Device ${params.id} is not being traced` }) } logger.info({ deviceId: params.id }, 'TR-069 trace disabled for device') return response.status(204).send('') } }