recordServiceContainer = $recordServiceContainer; $this->entityManager = $entityManager; $this->accessChecker = $accessChecker; } /** * Get file data (for downloading). * * @throws NotFound * @throws Forbidden */ public function getFileData(string $id): FileData { /** @var ?Attachment $attachment */ $attachment = $this->recordServiceContainer ->get(Attachment::ENTITY_TYPE) ->getEntity($id); if (!$attachment) { throw new NotFound(); } return new FileData( $attachment->getName(), $attachment->getType(), $this->getAttachmentRepository()->getStream($attachment), $this->getAttachmentRepository()->getSize($attachment) ); } /** * Copy an attachment record (to reuse the same file w/o copying it in the storage). * * @throws Forbidden * @throws NotFound */ public function copy(string $id, FieldData $data): Attachment { $this->accessChecker->check($data); /** @var ?Attachment $attachment */ $attachment = $this->recordServiceContainer ->get(Attachment::ENTITY_TYPE) ->getEntity($id); if (!$attachment) { throw new NotFound(); } $copied = $this->getAttachmentRepository()->getCopiedAttachment($attachment); $copied->set('parentType', $data->getParentType()); $copied->set('relatedType', $data->getRelatedType()); $copied->setTargetField($data->getField()); $copied->setRole(Attachment::ROLE_ATTACHMENT); $this->getAttachmentRepository()->save($copied); return $copied; } private function getAttachmentRepository(): AttachmentRepository { /** @var AttachmentRepository */ return $this->entityManager->getRepositoryByClass(Attachment::class); } }