TshieldWebhookController.php 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. <?php
  2. namespace Controllers;
  3. use Libs\ResponseLib;
  4. use Models\TshieldWebhookModel;
  5. use Psr\Http\Message\ServerRequestInterface;
  6. class TshieldWebhookController
  7. {
  8. private TshieldWebhookModel $model;
  9. public function __construct()
  10. {
  11. $this->model = new TshieldWebhookModel();
  12. }
  13. public function __invoke(ServerRequestInterface $request)
  14. {
  15. $body = json_decode((string)$request->getBody(), true);
  16. if (!is_array($body)) {
  17. return ResponseLib::sendFail('Invalid JSON payload.', [], 'E_VALIDATE')->withStatus(400);
  18. }
  19. $statusDescription = $body['status']['status'] ?? null;
  20. if ($statusDescription !== 'Aprovado') {
  21. return ResponseLib::sendOk([
  22. 'processed' => false,
  23. 'reason' => 'Status not approved. No action taken.',
  24. ], 'S_IGNORED');
  25. }
  26. $externalNumber = $body['number'] ?? $body['token'] ?? null;
  27. if (!is_string($externalNumber) || trim($externalNumber) === '') {
  28. return ResponseLib::sendFail('Missing analysis number/token in payload.', [], 'E_VALIDATE')->withStatus(400);
  29. }
  30. $updated = $this->model->approveByExternalId($externalNumber);
  31. if (!$updated) {
  32. return ResponseLib::sendFail(
  33. 'No user found for provided analysis number.',
  34. ['number' => $externalNumber],
  35. 'E_NOT_FOUND'
  36. )->withStatus(404);
  37. }
  38. return ResponseLib::sendOk([
  39. 'processed' => true,
  40. 'number' => $externalNumber,
  41. ]);
  42. }
  43. }