leeds_backend/src/Libs/RequestLib.php
2026-02-08 17:41:26 -03:00

111 lines
2.5 KiB
PHP

<?php
declare(strict_types=1);
namespace Bass\Webclient\Libs;
use Bass\Webclient\Model\LeadModel;
use Bass\Webclient\Schema\LeadSchema;
use React\Http\Message\Response;
class RequestLib
{
public static function handleClientRequest(string $raw): Response
{
$data = json_decode($raw, true);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
return ResponseLib::sendFail(
'Invalid JSON payload',
400,
[
'code' => 'INVALID_JSON',
'message' => json_last_error_msg()
]
);
}
if (!is_array($data)) {
return ResponseLib::sendFail(
'JSON body must be an object',
400,
[
'code' => 'INVALID_JSON_TYPE',
'expected' => 'object'
]
);
}
$schema = LeadSchema::schema();
[$ok, $err] = GuardLib::requireJsonObject($data);
if (!$ok) {
return ResponseLib::sendFail($err['message'], 400, $err);
}
[$ok, $err] = GuardLib::maxPayloadFields($data);
if (!$ok) {
return ResponseLib::sendFail($err['message'], 400, $err);
}
[$ok, $err] = GuardLib::allowOnlyFields($data, array_keys($schema));
if (!$ok) {
return ResponseLib::sendFail($err['message'], 400, $err);
}
[$ok, $err] = GuardLib::blockDangerousPatterns($data);
if (!$ok) {
return ResponseLib::sendFail($err['message'], 400, $err);
}
[$ok, $err] = GuardLib::requiredBySchema($data, $schema);
if (!$ok) {
return ResponseLib::sendFail($err['message'], 422, $err);
}
[$ok, $err] = GuardLib::validateBySchema($data, $schema);
if (!$ok) {
return ResponseLib::sendFail($err['message'], 422, $err);
}
[, $data] = SanitizationLib::cleanBySchema($data, $schema);
[$ok, $result] = (new LeadModel())->insert($data);
if (!$ok) {
return ResponseLib::sendFail(
'Internal server error',
500,
['code' => 'DATABASE_ERROR']
);
}
self::sendEmails($data);
return ResponseLib::sendOk(
[
'lead_id' => $result['lead_id'],
'status' => 'received'
],
201
);
}
private static function sendEmails(array $data): void
{
ExecLib::run(
'bin/email-cli',
'sales@empresa.com',
'Novo lead recebido',
json_encode($data)
);
ExecLib::run(
'bin/email-cli',
$data['email'],
'Recebemos sua solicitação',
json_encode([
'name' => $data['name'],
'company' => $data['company_name']
])
);
}
}