gdias 4 недель назад
Родитель
Сommit
0de94ea536
3 измененных файлов с 111 добавлено и 0 удалено
  1. 53 0
      controllers/TshieldWebhookController.php
  2. 26 0
      models/TshieldWebhookModel.php
  3. 32 0
      public/index_webhook.php

+ 53 - 0
controllers/TshieldWebhookController.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace Controllers;
+
+use Libs\ResponseLib;
+use Models\TshieldWebhookModel;
+use Psr\Http\Message\ServerRequestInterface;
+
+class TshieldWebhookController
+{
+    private TshieldWebhookModel $model;
+
+    public function __construct()
+    {
+        $this->model = new TshieldWebhookModel();
+    }
+
+    public function __invoke(ServerRequestInterface $request)
+    {
+        $body = json_decode((string)$request->getBody(), true);
+
+        if (!is_array($body)) {
+            return ResponseLib::sendFail('Invalid JSON payload.', [], 'E_VALIDATE')->withStatus(400);
+        }
+
+        $statusDescription = $body['status']['status'] ?? null;
+        if ($statusDescription !== 'Aprovado') {
+            return ResponseLib::sendOk([
+                'processed' => false,
+                'reason' => 'Status not approved. No action taken.',
+            ], 'S_IGNORED');
+        }
+
+        $externalNumber = $body['number'] ?? $body['token'] ?? null;
+        if (!is_string($externalNumber) || trim($externalNumber) === '') {
+            return ResponseLib::sendFail('Missing analysis number/token in payload.', [], 'E_VALIDATE')->withStatus(400);
+        }
+
+        $updated = $this->model->approveByExternalId($externalNumber);
+        if (!$updated) {
+            return ResponseLib::sendFail(
+                'No user found for provided analysis number.',
+                ['number' => $externalNumber],
+                'E_NOT_FOUND'
+            )->withStatus(404);
+        }
+
+        return ResponseLib::sendOk([
+            'processed' => true,
+            'number' => $externalNumber,
+        ]);
+    }
+}

+ 26 - 0
models/TshieldWebhookModel.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace Models;
+
+class TshieldWebhookModel
+{
+    private \PDO $pdo;
+
+    public function __construct()
+    {
+        if (!isset($GLOBALS['pdo']) || !($GLOBALS['pdo'] instanceof \PDO)) {
+            throw new \RuntimeException('Database connection not initialized.');
+        }
+
+        $this->pdo = $GLOBALS['pdo'];
+    }
+
+    public function approveByExternalId(string $externalId): bool
+    {
+        $stmt = $this->pdo->prepare(
+            'UPDATE "user" SET user_kyc = 1 WHERE kyc_external_id = :external_id AND user_flag = \'a\''
+        );
+        $stmt->execute(['external_id' => $externalId]);
+        return $stmt->rowCount() > 0;
+    }
+}

+ 32 - 0
public/index_webhook.php

@@ -0,0 +1,32 @@
+<?php
+
+require __DIR__ . '/../vendor/autoload.php';
+
+use FrameworkX\App;
+
+if (class_exists(Dotenv\Dotenv::class) && file_exists(__DIR__ . '/../.env')) {
+    Dotenv\Dotenv::createImmutable(
+        dirname(__DIR__),
+        null,
+        true
+    )->safeLoad();
+}
+
+error_reporting(E_ALL);
+
+$dsn = $_ENV['DB_DSN'] ?? (function () {
+    $host = $_ENV['DB_HOST'] ?? 'localhost';
+    $port = $_ENV['DB_PORT'] ?? '5432';
+    $name = $_ENV['DB_NAME'] ?? 'postgres';
+    return "pgsql:host={$host};port={$port};dbname={$name}";
+})();
+$dbUser = $_ENV['DB_USER'] ?? 'postgres';
+$dbPass = $_ENV['DB_PASSWORD'] ?? '';
+$GLOBALS['pdo'] = new \PDO($dsn, $dbUser, $dbPass);
+$GLOBALS['pdo']->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+
+$app = new App();
+
+$app->post('/tshield', \Controllers\TshieldWebhookController::class);
+
+$app->run();