Drupal modules for browsing and managing Fedora-based digital repositories.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

126 lines
4.1 KiB

<?php
namespace Drupal\islandora_text_extraction\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\File\FileSystem;
use Drupal\Core\File\FileSystemInterface;
use Drupal\media\Entity\Media;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
/**
* Controller for Media Source.
*/
class MediaSourceController extends ControllerBase {
/**
* Adds file to existing media.
*
* @param Drupal\media\Entity\Media $media
* The media to which file is added.
* @param string $destination_field
* The name of the media field to add file reference.
* @param string $destination_text_field
* The name of the media field to add file reference.
* @param \Symfony\Component\HttpFoundation\Request $request
* The request object.
*
* @return \Symfony\Component\HttpFoundation\Response
* 201 on success with a Location link header.
*
* @throws \Drupal\Core\Entity\EntityStorageException
* @throws \Drupal\Core\TypedData\Exception\ReadOnlyException
*/
/**
* File system service.
*
* @var \Drupal\Core\File\FileSystem
*/
protected $fileSystem;
/**
* MediaSourceController constructor.
*
* @param \Drupal\Core\File\FileSystem $fileSystem
* Filesystem service.
*/
public function __construct(FileSystem $fileSystem) {
$this->fileSystem = $fileSystem;
}
/**
* Controller's create method for dependency injection.
*
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
* The App Container.
*
* @return \Drupal\islandora\Controller\MediaSourceController
* Controller instance.
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('file_system')
);
}
/**
* Attaches incoming file to existing media.
*
* @param \Drupal\media\Entity\Media $media
* Media to hold file.
* @param string $destination_field
* Media field to hold file.
* @param string $destination_text_field
* Media field to hold extracted text.
* @param \Symfony\Component\HttpFoundation\Request $request
* HTTP Request from Karaf.
*
* @return \Symfony\Component\HttpFoundation\Response
* HTTP response.
*
* @throws \Drupal\Core\Entity\EntityStorageException
* @throws \Drupal\Core\TypedData\Exception\ReadOnlyException
*/
public function attachToMedia(
Media $media,
string $destination_field,
string $destination_text_field,
Request $request) {
$content_location = $request->headers->get('Content-Location', "");
$contents = $request->getContent();
if ($contents) {
$directory = $this->fileSystem->dirname($content_location);
if (!$this->fileSystem->prepareDirectory($directory, FileSystemInterface::CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS)) {
throw new HttpException(500, "The destination directory does not exist, could not be created, or is not writable");
}
$file = file_save_data($contents, $content_location, FileSystemInterface::EXISTS_REPLACE);
if ($media->hasField($destination_field)) {
$media->{$destination_field}->setValue([
'target_id' => $file->id(),
]);
}
else {
$this->getLogger('islandora')->warning("Field $destination_field is not defined in Media Type {$media->bundle()}");
}
if ($media->hasField($destination_text_field)) {
// @todo The request actually has a malformed parameter string, ?text_format=plain_text?connection_close=true.
if (substr($request->query->get('text_format'), 0, 10) == 'plain_text') {
$contents = nl2br($contents);
}
$media->{$destination_text_field}->setValue($contents);
}
else {
$this->getLogger('islandora')->warning("Field $destination_text_field is not defined in Media Type {$media->bundle()}");
}
$media->save();
}
// We'd only ever get here if testing the function with GET.
return new Response("<h1>Complete</h1>");
}
}