'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'] ]) ); } }