service = $service; } public function postActionProcess(Request $request): stdClass { $body = $request->getParsedBody(); $entityType = $body->entityType ?? null; $action = $body->action ?? null; $params = $body->params ?? null; $data = $body->data ?? (object) []; $isIdle = $body->idle ?? false; if (!$entityType || !$action || !$params) { throw new BadRequest(); } $rawParams = $this->prepareMassActionParams($params); try { $massActionParams = Params::fromRaw($rawParams, $entityType); } catch (RuntimeException $e) { throw new BadRequest($e->getMessage()); } $serviceParams = ServiceParams::create($massActionParams) ->withIsIdle($isIdle); $result = $this->service->process( $entityType, $action, $serviceParams, $data ); return $this->convertResult($result); } public function getActionStatus(Request $request): stdClass { $id = $request->getQueryParam('id'); if (!$id) { throw new BadRequest(); } return $this->service->getStatusData($id); } public function postActionSubscribeToNotificationOnSuccess(Request $request, Response $response): void { $id = $request->getParsedBody()->id ?? null; if (!$id || !is_string($id)) { throw new BadRequest(); } $this->service->subscribeToNotificationOnSuccess($id); $response->writeBody('true'); } private function prepareMassActionParams(stdClass $data): array { $where = $data->where ?? null; $searchParams = $data->searchParams ?? $data->selectData ?? null; $ids = $data->ids ?? null; if (!is_null($where) || !is_null($searchParams)) { $params = []; if (!is_null($where)) { $params['where'] = json_decode(json_encode($where), true); } if (!is_null($searchParams)) { $params['searchParams'] = json_decode(json_encode($searchParams), true); } return $params; } if (!is_null($ids)) { return [ 'ids' => $ids, ]; } throw new BadRequest("Bad search params for mass action."); } private function convertResult(ServiceResult $serviceResult): stdClass { if (!$serviceResult->hasResult()) { return (object) [ 'id' => $serviceResult->getId(), ]; } $result = $serviceResult->getResult(); if (!$result) { throw new Error(); } $data = (object) []; if ($result->hasCount()) { $data->count = $result->getCount(); } if ($result->hasIds()) { $data->ids = $result->getIds(); } return $data; } }