Files
adam-acs/start/routes.ts
T
Kevin L'HereecandCopilot aff8e14a63 feat: compliance report + auto-versioning for configurations
- Add ComplianceStatus.PENDING and configVersion to DeviceComplianceInfo
- Add ComplianceReport + ComplianceDeviceResult types to ConfigurationEngine
- Expose evaluateSpecific() as public (used by compliance + dry-run)
- Add complianceReport() method: filter matching devices, evaluate each
- Fix matchesCriteria: skip parameterCriteria entries with null/empty name
- Fix getDeviceParameterValue: fallback to plain object arrays (DeviceRecord)
- Fix findDevice: support lookup by both identifier and deviceId.id
- ConfigurationService.update: version is now auto-managed (no user input)
  - behavioral changes (criteria/params/policy/priority/…) → patch bump
  - bumpType field allows 'patch' | 'minor' | 'major'
  - cosmetic changes (name/tags) → no bump
- Add sanitizeCriteria: filter null/empty parameterCriteria names silently
- Add isBehavioralChange helper
- Add DeviceModel.resetComplianceForConfiguration call on behavioral update
- Add ConfigurationModel.distinctTags() + controller endpoint GET /tags
- Add controller endpoint GET /configurations/:id/compliance
- Add DeviceModel.getDistinctValues for inventory fields
- Fix unit tests: mock DeviceModel, remove obsolete version-validation test
- Add 14 new unit tests (engine: 5, service: 9)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-01 11:32:17 +02:00

79 lines
4.6 KiB
TypeScript

import router from '@adonisjs/core/services/router'
import { middleware } from '#start/kernel'
const DevicesController = () => import('#controllers/devices_controller')
const CommandsController = () => import('#controllers/commands_controller')
const ConfigurationsV1Controller = () => import('#controllers/configurations_v1_controller')
const FirmwareCatalogController = () => import('#controllers/firmware_catalog_controller')
const HealthController = () => import('#controllers/health_controller')
const PagesController = () => import('#controllers/pages_controller')
const CwmpController = () => import('#controllers/cwmp_controller')
// CWMP/TR-069 endpoint (SOAP/XML) - uses dedicated middleware for XML parsing
router.post('/cwmp10', [CwmpController, 'handle']).use([middleware.cwmpLogger(), middleware.cwmp()])
// Health checks
router.get('/api/v1/checklife', [HealthController, 'checklife'])
router.get('/api/v1/checkservice', [HealthController, 'checkservice'])
// REST API routes
router.group(() => {
// Devices
router.get('/devices', [DevicesController, 'index'])
router.get('/devices/criteria-values', [DevicesController, 'criteriaValues'])
router.get('/devices/:identifier', [DevicesController, 'show'])
router.delete('/devices/:identifier', [DevicesController, 'destroy'])
router.post('/devices/:identifier/command', [DevicesController, 'executeCommand'])
router.post('/devices/:identifier/refresh', [DevicesController, 'refresh'])
// Commands
router.get('/commands', [CommandsController, 'index'])
router.get('/commands/:id', [CommandsController, 'show'])
router.post('/commands', [CommandsController, 'store'])
// Unified Configuration API (v1)
router.get('/configurations', [ConfigurationsV1Controller, 'index'])
router.get('/configurations/tags', [ConfigurationsV1Controller, 'listTags'])
router.post('/configurations', [ConfigurationsV1Controller, 'store'])
router.get('/configurations/:id', [ConfigurationsV1Controller, 'show'])
router.put('/configurations/:id', [ConfigurationsV1Controller, 'update'])
router.delete('/configurations/:id', [ConfigurationsV1Controller, 'destroy'])
router.patch('/configurations/:id/toggle', [ConfigurationsV1Controller, 'toggleEnabled'])
router.patch('/configurations/:id/tags', [ConfigurationsV1Controller, 'manageTags'])
router.get('/configurations/:id/history', [ConfigurationsV1Controller, 'history'])
router.post('/configurations/:id/dry-run', [ConfigurationsV1Controller, 'dryRun'])
router.get('/configurations/:id/compliance', [ConfigurationsV1Controller, 'compliance'])
// Firmware Catalog API (v1)
router.get('/firmware-catalog', [FirmwareCatalogController, 'index'])
router.get('/firmware-catalog/entries', [FirmwareCatalogController, 'listEntries'])
router.get('/firmware-catalog/entries/:id', [FirmwareCatalogController, 'showEntry'])
router.get('/firmware-catalog/routes', [FirmwareCatalogController, 'listRoutes'])
router.post('/firmware-catalog/entries', [FirmwareCatalogController, 'createEntry'])
router.put('/firmware-catalog/entries/:id', [FirmwareCatalogController, 'updateEntry'])
router.delete('/firmware-catalog/entries/:id', [FirmwareCatalogController, 'deleteEntry'])
router.post('/firmware-catalog/routes', [FirmwareCatalogController, 'createRoute'])
router.put('/firmware-catalog/routes/:id', [FirmwareCatalogController, 'updateRoute'])
router.delete('/firmware-catalog/routes/:id', [FirmwareCatalogController, 'deleteRoute'])
}).prefix('/api/v1')
// Inertia page routes
router.get('/', [PagesController, 'home'])
router.get('/devices/:identifier', [PagesController, 'deviceDetail'])
router.post('/devices/:identifier/refresh', [PagesController, 'refreshDevice'])
router.post('/devices/:identifier/get-model', [PagesController, 'getModel'])
router.get('/commands', [PagesController, 'commands']).as('commands.page')
router.get('/commands/fleet', [PagesController, 'commandsFleet'])
router.post('/commands/fleet', [PagesController, 'storeFleetDevices'])
router.post('/commands/fleet/command', [PagesController, 'storeFleetCommand'])
// Unified Configuration System Inertia routes
router.get('/configurations', [PagesController, 'configurationsList'])
router.get('/configurations/create', [PagesController, 'configurationCreate'])
router.get('/configurations/:id/edit', [PagesController, 'configurationEdit'])
router.get('/configurations/:id/detail', [PagesController, 'configurationDetail'])
router.get('/firmware-catalog', [PagesController, 'firmwareCatalog'])
router.get('/firmware-catalog/create', [PagesController, 'firmwareCatalogCreate'])
router.get('/firmware-catalog/:id/edit', [PagesController, 'firmwareCatalogEdit'])