decodeJsonBody($request, 'orders.json#/definitions/order_request'); $requestedRecords = $this->toRequestedRecordsArray($data->data->records); $availableRecords = $this->fetchRecords($requestedRecords); $records = $this->filterOrderableRecords($availableRecords); $recordRequest = new RecordsRequest($records, new ArrayCollection($availableRecords), null, RecordsRequest::FLATTEN_YES); $filler = new OrderFiller($this->app['repo.collection-references'], $this->app['orm.em']); $filler->assertAllRecordsHaveOrderMaster($recordRequest); $order = new Order(); $order->setUser($this->getAuthenticatedUser()); $order->setDeadline(new \DateTime($data->data->deadline, new \DateTimeZone('UTC'))); $order->setOrderUsage($data->data->usage); $filler->fillOrder($order, $recordRequest); $transformer = new OrderTransformer(new OrderElementTransformer($this->app)); $result = Result::create($request, [ 'order' => $transformer->transform($order), ]); $this->dispatch(PhraseaEvents::ORDER_CREATE, new OrderEvent($order)); return $result->createResponse(); } /** * @param array $records * @return array */ private function toRequestedRecordsArray(array $records) { $requestedRecords = []; foreach ($records as $item) { $requestedRecords[] = [ 'databox_id' => $item->databox_id, 'record_id' => $item->record_id, ]; } return $requestedRecords; } /** * @param array $recordIds * @return \record_adapter[] */ private function fetchRecords(array $recordIds) { $perDataboxRecords = []; foreach ($recordIds as $index => $record) { if (!isset($perDataboxRecords[$record['databox_id']])) { $perDataboxRecords[$record['databox_id']] = []; } $perDataboxRecords[$record['databox_id']][$record['record_id']] = $index; } $records = []; foreach ($perDataboxRecords as $databoxId => $recordIndexes) { $repository = $this->findDataboxById($databoxId)->getRecordRepository(); foreach ($repository->findByRecordIds(array_keys($perDataboxRecords[$databoxId])) as $record) { $records[$recordIndexes[$record->getRecordId()]] = $record; } } ksort($records); return $records; } /** * @param \record_adapter[] $records * @return \record_adapter[] */ private function filterOrderableRecords(array $records) { $acl = $this->getAclForUser(); return array_filter($records, function (\record_adapter $record) use ($acl) { return $acl->has_right_on_base($record->getBaseId(), 'cancmd'); }); } }