109 lines
2.9 KiB
PHP
109 lines
2.9 KiB
PHP
|
|
<?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
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|