Jared Whiklo
7 years ago
committed by
Diego Pino Navarro
4 changed files with 1 additions and 234 deletions
@ -1,90 +0,0 @@
|
||||
<?php |
||||
|
||||
namespace Drupal\islandora\Controller; |
||||
|
||||
use Drupal\Core\Cache\CacheableJsonResponse; |
||||
use Drupal\Core\Controller\ControllerBase; |
||||
use Drupal\jsonld\ContextGenerator\JsonldContextGeneratorInterface; |
||||
use Symfony\Component\DependencyInjection\ContainerInterface; |
||||
use Symfony\Component\HttpFoundation\Request; |
||||
use Symfony\Component\HttpFoundation\Response; |
||||
use Drupal\rdf\Entity\RdfMapping; |
||||
use Drupal\Core\Cache\Cache; |
||||
use Drupal\Core\Cache\CacheableMetadata; |
||||
|
||||
/** |
||||
* Class JsonLdContextController. |
||||
* |
||||
* @package Drupal\islandora\Controller |
||||
*/ |
||||
class JsonLdContextController extends ControllerBase { |
||||
|
||||
/** |
||||
* Injected JsonldContextGenerator. |
||||
* |
||||
* @var \Drupal\jsonld\ContextGenerator\JsonldContextGeneratorInterface |
||||
*/ |
||||
private $jsonldContextGenerator; |
||||
|
||||
/** |
||||
* JsonLdContextController constructor. |
||||
* |
||||
* @param \Drupal\jsonld\ContextGenerator\JsonldContextGeneratorInterface $jsonld_context_generator |
||||
* Injected JsonldContextGenerator. |
||||
*/ |
||||
public function __construct(JsonldContextGeneratorInterface $jsonld_context_generator) { |
||||
$this->jsonldContextGenerator = $jsonld_context_generator; |
||||
} |
||||
|
||||
/** |
||||
* Controller's create method for dependecy injection. |
||||
* |
||||
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container |
||||
* The App Container. |
||||
* |
||||
* @return static |
||||
* An instance of our jsonld.contextgenerator service. |
||||
*/ |
||||
public static function create(ContainerInterface $container) { |
||||
return new static($container->get('jsonld.contextgenerator')); |
||||
} |
||||
|
||||
/** |
||||
* Returns an JSON-LD Context for a entity bundle. |
||||
* |
||||
* @param string $entity_type |
||||
* Route argument, an entity type. |
||||
* @param string $bundle |
||||
* Route argument, a bundle. |
||||
* @param \Symfony\Component\HttpFoundation\Request $request |
||||
* The Symfony Http Request. |
||||
* |
||||
* @return \Symfony\Component\HttpFoundation\Response |
||||
* An Http response. |
||||
*/ |
||||
public function content($entity_type, $bundle, Request $request) { |
||||
|
||||
// TODO: expose cached/not cached through |
||||
// more varied HTTP response codes. |
||||
try { |
||||
$context = $this->jsonldContextGenerator->getContext("$entity_type.$bundle"); |
||||
$response = new CacheableJsonResponse(json_decode($context), 200); |
||||
$response->setEncodingOptions(JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK); |
||||
$response->headers->set('X-Powered-By', 'Islandora CLAW API'); |
||||
$response->headers->set('Content-Type', 'application/ld+json'); |
||||
|
||||
// For now deal with Cache dependencies manually. |
||||
$meta = new CacheableMetadata(); |
||||
$meta->setCacheContexts(['user.permissions', 'ip', 'url']); |
||||
$meta->setCacheTags(RdfMapping::load("$entity_type.$bundle")->getCacheTags()); |
||||
$meta->setCacheMaxAge(Cache::PERMANENT); |
||||
$response->addCacheableDependency($meta); |
||||
} |
||||
catch (\Exception $e) { |
||||
$response = new Response($e->getMessage(), 400); |
||||
} |
||||
|
||||
return $response; |
||||
} |
||||
|
||||
} |
@ -1,41 +0,0 @@
|
||||
<?php |
||||
|
||||
namespace Drupal\islandora\Tests\Web; |
||||
|
||||
use Drupal\simpletest\WebTestBase; |
||||
|
||||
/** |
||||
* Abstract base class for Islandora Web tests. |
||||
*/ |
||||
abstract class IslandoraWebTestBase extends WebTestBase { |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public static $modules = [ |
||||
'system', |
||||
'user', |
||||
'field', |
||||
'filter', |
||||
'block', |
||||
'node', |
||||
'path', |
||||
'text', |
||||
'options', |
||||
'inline_entity_form', |
||||
'serialization', |
||||
'rest', |
||||
'rdf', |
||||
'action', |
||||
'context', |
||||
'context_ui', |
||||
'jsonld', |
||||
'views', |
||||
'key', |
||||
'jwt', |
||||
'basic_auth', |
||||
'filehash', |
||||
'islandora', |
||||
]; |
||||
|
||||
} |
@ -1,94 +0,0 @@
|
||||
<?php |
||||
|
||||
namespace Drupal\islandora\Tests\Web; |
||||
|
||||
use Drupal\Core\Url; |
||||
use Drupal\node\Entity\NodeType; |
||||
use Drupal\rdf\Entity\RdfMapping; |
||||
|
||||
/** |
||||
* Implements WEB tests for Context routing response in various scenarios. |
||||
* |
||||
* @group islandora |
||||
*/ |
||||
class JsonldContextGeneratorWebTest extends IslandoraWebTestBase { |
||||
|
||||
/** |
||||
* A user entity. |
||||
* |
||||
* @var \Drupal\Core\Session\AccountInterface |
||||
*/ |
||||
private $user; |
||||
|
||||
/** |
||||
* Jwt does not define a config schema breaking this tests. |
||||
* |
||||
* @var bool |
||||
*/ |
||||
protected $strictConfigSchema = FALSE; |
||||
|
||||
/** |
||||
* Initial setup tasks that for every method method. |
||||
*/ |
||||
public function setUp() { |
||||
parent::setUp(); |
||||
|
||||
$test_type = NodeType::create([ |
||||
'type' => 'test_type', |
||||
'label' => 'Test Type', |
||||
]); |
||||
$test_type->save(); |
||||
|
||||
// Give it a basic rdf mapping. |
||||
$mapping = RdfMapping::create([ |
||||
'id' => 'node.test_type', |
||||
'targetEntityType' => 'node', |
||||
'bundle' => 'test_type', |
||||
'types' => ['schema:Thing'], |
||||
'fieldMappings' => [ |
||||
'title' => [ |
||||
'properties' => ['dc11:title'], |
||||
], |
||||
], |
||||
]); |
||||
$mapping->save(); |
||||
|
||||
$this->user = $this->drupalCreateUser([ |
||||
'administer site configuration', |
||||
'administer nodes', |
||||
]); |
||||
|
||||
// Login. |
||||
$this->drupalLogin($this->user); |
||||
} |
||||
|
||||
/** |
||||
* Tests that the Context Response Page can be reached. |
||||
*/ |
||||
public function testJsonldcontextPageExists() { |
||||
$url = Url::fromRoute('islandora.jsonldcontext', ['entity_type' => 'node', 'bundle' => 'test_type']); |
||||
$this->drupalGet($url); |
||||
$this->assertResponse(200); |
||||
} |
||||
|
||||
/** |
||||
* Tests that the response is in fact application/ld+json. |
||||
*/ |
||||
public function testJsonldcontextContentypeheaderResponseIsValid() { |
||||
$url = Url::fromRoute('islandora.jsonldcontext', ['entity_type' => 'node', 'bundle' => 'test_type']); |
||||
$this->drupalGet($url); |
||||
$this->assertEqual($this->drupalGetHeader('Content-Type'), 'application/ld+json', 'Correct JSON-LD mime type was returned'); |
||||
} |
||||
|
||||
/** |
||||
* Tests that the Context received has the basic structural needs. |
||||
*/ |
||||
public function testJsonldcontextResponseIsValid() { |
||||
$url = Url::fromRoute('islandora.jsonldcontext', ['entity_type' => 'node', 'bundle' => 'test_type']); |
||||
$this->drupalGet($url); |
||||
$jsonldarray = json_decode($this->getRawContent(), TRUE); |
||||
// Check if the only key is "@context". |
||||
$this->assertTrue(count(array_keys($jsonldarray)) == 1 && (key($jsonldarray) == '@context'), "JSON-LD to array encoded response has just one key and that key is @context"); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue