OrderbookFilterController.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace Controllers;
  3. use Libs\ResponseLib;
  4. use Models\OrderbookSearchModel;
  5. use Psr\Http\Message\ServerRequestInterface;
  6. use Respect\Validation\Exceptions\ValidationException;
  7. use Respect\Validation\Validator as val;
  8. class OrderbookFilterController
  9. {
  10. private OrderbookSearchModel $searchModel;
  11. public function __construct()
  12. {
  13. $this->searchModel = new OrderbookSearchModel();
  14. }
  15. public function __invoke(ServerRequestInterface $request)
  16. {
  17. $body = json_decode((string)$request->getBody(), true) ?? [];
  18. try {
  19. val::key('state', val::stringType()->notEmpty())
  20. ->key('commodity_type', val::stringType()->notEmpty())
  21. ->assert($body);
  22. } catch (ValidationException $e) {
  23. return ResponseLib::sendFail(
  24. 'Validation failed: ' . $e->getFullMessage(),
  25. [],
  26. 'E_VALIDATE'
  27. )->withStatus(400);
  28. }
  29. $state = strtoupper(trim((string)$body['state']));
  30. $commodityType = trim((string)$body['commodity_type']);
  31. try {
  32. $orders = $this->searchModel->searchOpenOrders($state, $commodityType);
  33. } catch (\Throwable $e) {
  34. return ResponseLib::sendFail(
  35. 'Falha ao consultar orderbook: ' . $e->getMessage(),
  36. [],
  37. 'E_DATABASE'
  38. )->withStatus(500);
  39. }
  40. $companyId = (int)($request->getAttribute('api_company_id') ?? 0);
  41. if (!$orders) {
  42. return ResponseLib::sendOk(
  43. [
  44. 'state' => $state,
  45. 'commodity_type' => $commodityType,
  46. 'orders' => [],
  47. ],
  48. 'S_ORDERBOOK_EMPTY'
  49. );
  50. }
  51. $orders = array_map(static function (array $order) use ($companyId) {
  52. $orderCompanyId = isset($order['company_id']) ? (int)$order['company_id'] : null;
  53. $order['editable'] = $companyId > 0 && $orderCompanyId === $companyId;
  54. unset($order['company_id']);
  55. return $order;
  56. }, $orders);
  57. return ResponseLib::sendOk([
  58. 'state' => $state,
  59. 'commodity_type' => $commodityType,
  60. 'orders' => $orders,
  61. ], 'S_ORDERBOOK_FILTER');
  62. }
  63. }