Initial commit: Slim Framework 4 API Retribusi dengan modular architecture
This commit is contained in:
108
src/Modules/Retribusi/Ingest/IngestController.php
Normal file
108
src/Modules/Retribusi/Ingest/IngestController.php
Normal file
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Modules\Retribusi\Ingest;
|
||||
|
||||
use App\Support\ResponseHelper;
|
||||
use App\Support\Validator;
|
||||
use PDOException;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
|
||||
class IngestController
|
||||
{
|
||||
private IngestService $service;
|
||||
|
||||
public function __construct(IngestService $service)
|
||||
{
|
||||
$this->service = $service;
|
||||
}
|
||||
|
||||
public function ingest(
|
||||
ServerRequestInterface $request,
|
||||
ResponseInterface $response
|
||||
): ResponseInterface {
|
||||
$body = $request->getParsedBody();
|
||||
|
||||
// Validate request body
|
||||
if (!is_array($body)) {
|
||||
return ResponseHelper::json(
|
||||
$response,
|
||||
[
|
||||
'error' => 'validation_error',
|
||||
'fields' => ['body' => 'Invalid JSON body']
|
||||
],
|
||||
422
|
||||
);
|
||||
}
|
||||
|
||||
// Basic format validation
|
||||
$errors = Validator::validateIngest($body);
|
||||
|
||||
if (!empty($errors)) {
|
||||
return ResponseHelper::json(
|
||||
$response,
|
||||
[
|
||||
'error' => 'validation_error',
|
||||
'fields' => $errors
|
||||
],
|
||||
422
|
||||
);
|
||||
}
|
||||
|
||||
// Get source IP
|
||||
$serverParams = $request->getServerParams();
|
||||
$sourceIp = $serverParams['REMOTE_ADDR'] ?? '0.0.0.0';
|
||||
|
||||
try {
|
||||
// Process ingest with database validation
|
||||
$result = $this->service->processIngest($body, $sourceIp);
|
||||
|
||||
if (!$result['valid']) {
|
||||
// Not found error
|
||||
if ($result['code'] === 'not_found') {
|
||||
return ResponseHelper::json(
|
||||
$response,
|
||||
[
|
||||
'error' => 'not_found',
|
||||
'message' => $result['error']
|
||||
],
|
||||
404
|
||||
);
|
||||
}
|
||||
|
||||
// Other validation errors
|
||||
return ResponseHelper::json(
|
||||
$response,
|
||||
[
|
||||
'error' => 'validation_error',
|
||||
'message' => $result['error']
|
||||
],
|
||||
422
|
||||
);
|
||||
}
|
||||
|
||||
// Success
|
||||
return ResponseHelper::json(
|
||||
$response,
|
||||
[
|
||||
'success' => true,
|
||||
'data' => ['stored' => true],
|
||||
'timestamp' => time()
|
||||
]
|
||||
);
|
||||
|
||||
} catch (PDOException $e) {
|
||||
// Database error
|
||||
return ResponseHelper::json(
|
||||
$response,
|
||||
[
|
||||
'error' => 'server_error',
|
||||
'message' => 'Database error occurred'
|
||||
],
|
||||
500
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user