leeds_backend/src/Libs/RequestLib.php
2026-01-29 18:28:39 -03:00

133 lines
2.8 KiB
PHP

<?php
declare(strict_types=1);
namespace Bass\Webclient\Libs;
use Bass\Webclient\Domain\Client\ClientModel;
use React\Http\Message\Response;
use Bass\Webclient\Http\ResponseLib;
use Bass\Webclient\Schema\ClientCreateSchema;
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 = ClientCreateSchema::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 ClientModel())->insert($data);
if (!$ok) {
return ResponseLib::sendFail(
'Internal server error',
500,
[
'code' => 'DATABASE_ERROR'
]
);
}
self::sendEmails($data);
return ResponseLib::sendOk(
[
'client_id' => $result['client_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']
])
);
}
}