Files
api-btekno/src/Modules/Retribusi/RetribusiRoutes.php

135 lines
5.5 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
namespace App\Modules\Retribusi;
use App\Config\AppConfig;
use App\Middleware\ApiKeyMiddleware;
use App\Middleware\JwtMiddleware;
use App\Middleware\RoleMiddleware;
use App\Modules\Retribusi\Frontend\AuditService;
use App\Modules\Retribusi\Frontend\GateController;
use App\Modules\Retribusi\Frontend\LocationController;
use App\Modules\Retribusi\Frontend\RetribusiReadService;
use App\Modules\Retribusi\Frontend\RetribusiWriteService;
use App\Modules\Retribusi\Frontend\StreamController;
use App\Modules\Retribusi\Frontend\TariffController;
use App\Modules\Retribusi\Ingest\IngestController;
use App\Modules\Retribusi\Ingest\IngestService;
use App\Support\Database;
use PDO;
use PDOException;
use Slim\App;
class RetribusiRoutes
{
/**
* Register retribusi routes
*
* @param App $app
* @return void
*/
public static function register(App $app): void
{
// Get API key from environment
$apiKey = AppConfig::get('RETRIBUSI_API_KEY', '');
$apiKeyMiddleware = new ApiKeyMiddleware($apiKey);
// JWT middleware for frontend routes
$jwtMiddleware = new JwtMiddleware();
// Role middleware
$operatorRoleMiddleware = new RoleMiddleware(['admin', 'operator']);
$adminRoleMiddleware = new RoleMiddleware(['admin']);
// Get database connection
$dbHost = AppConfig::get('DB_HOST', 'localhost');
$dbName = AppConfig::get('DB_NAME', '');
$dbUser = AppConfig::get('DB_USER', '');
$dbPass = AppConfig::get('DB_PASS', '');
$db = Database::getConnection($dbHost, $dbName, $dbUser, $dbPass);
// Initialize services with database
$ingestService = new IngestService($db);
$ingestController = new IngestController($ingestService);
$readService = new RetribusiReadService($db);
$writeService = new RetribusiWriteService($db);
$auditService = new AuditService($db);
$gateController = new GateController($readService, $writeService, $auditService);
$locationController = new LocationController($readService, $writeService, $auditService);
$streamController = new StreamController($readService);
$tariffController = new TariffController($writeService, $auditService);
// Register routes
$app->group('/retribusi', function ($group) use (
$apiKeyMiddleware,
$jwtMiddleware,
$operatorRoleMiddleware,
$adminRoleMiddleware,
$ingestController,
$gateController,
$locationController,
$streamController,
$tariffController
) {
$group->group('/v1', function ($v1Group) use (
$apiKeyMiddleware,
$jwtMiddleware,
$operatorRoleMiddleware,
$adminRoleMiddleware,
$ingestController,
$gateController,
$locationController,
$streamController,
$tariffController
) {
// Ingest routes (with API key middleware)
$v1Group->post('/ingest', [$ingestController, 'ingest'])
->add($apiKeyMiddleware);
// Frontend routes (with JWT middleware)
$v1Group->group('/frontend', function ($frontendGroup) use (
$operatorRoleMiddleware,
$adminRoleMiddleware,
$gateController,
$locationController,
$streamController,
$tariffController
) {
// Read routes (viewer, operator, admin)
$frontendGroup->get('/gates', [$gateController, 'getGates']);
$frontendGroup->get('/locations', [$locationController, 'getLocations']);
$frontendGroup->get('/streams', [$streamController, 'getStreams']);
// Write routes (operator, admin)
$frontendGroup->post('/locations', [$locationController, 'createLocation'])
->add($operatorRoleMiddleware);
$frontendGroup->put('/locations/{code}', [$locationController, 'updateLocation'])
->add($operatorRoleMiddleware);
$frontendGroup->delete('/locations/{code}', [$locationController, 'deleteLocation'])
->add($adminRoleMiddleware);
$frontendGroup->post('/gates', [$gateController, 'createGate'])
->add($operatorRoleMiddleware);
$frontendGroup->put('/gates/{location_code}/{gate_code}', [$gateController, 'updateGate'])
->add($operatorRoleMiddleware);
$frontendGroup->delete('/gates/{location_code}/{gate_code}', [$gateController, 'deleteGate'])
->add($adminRoleMiddleware);
$frontendGroup->post('/tariffs', [$tariffController, 'createTariff'])
->add($operatorRoleMiddleware);
$frontendGroup->put('/tariffs/{location_code}/{gate_code}/{category}', [$tariffController, 'updateTariff'])
->add($operatorRoleMiddleware);
$frontendGroup->delete('/tariffs/{location_code}/{gate_code}/{category}', [$tariffController, 'deleteTariff'])
->add($adminRoleMiddleware);
})->add($jwtMiddleware);
});
});
}
}