133 lines
2.8 KiB
PHP
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']
|
|
])
|
|
);
|
|
}
|
|
}
|