activitypub-1.0.x-dev/src/Controller/EntityController.php
src/Controller/EntityController.php
<?php namespace Drupal\activitypub\Controller; use Drupal\activitypub\Entity\ActivityPubActivityInterface; use Drupal\comment\CommentInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\node\NodeInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; class EntityController extends BaseController { /** * Node self routing callback with activity+json accept header. * * @param \Symfony\Component\HttpFoundation\Request $request * @param \Drupal\node\NodeInterface $node * * @return \Symfony\Component\HttpFoundation\JsonResponse * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ public function node(Request $request, NodeInterface $node) { return $this->json($request, $node); } /** * Comment self routing callback with activity+json accept header. * * @param \Symfony\Component\HttpFoundation\Request $request * @param \Drupal\comment\CommentInterface $comment * * @return \Symfony\Component\HttpFoundation\JsonResponse * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ public function comment(Request $request, CommentInterface $comment) { return $this->json($request, $comment); } /** * Entity self routing callback with activity+json accept header. * * @param \Symfony\Component\HttpFoundation\Request $request * @param \Drupal\Core\Entity\EntityInterface $entity * * @return array|\Symfony\Component\HttpFoundation\JsonResponse * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ public function json(Request $request, EntityInterface $entity) { $this->killSwitch->trigger(); /** @var \Drupal\activitypub\Entity\Storage\ActivityPubActorStorageInterface $actorStorage */ $actorStorage = $this->entityTypeManager()->getStorage('activitypub_actor'); $actor = $actorStorage->loadActorByEntityIdAndType($entity->getOwnerId(), 'person'); /** @var \Drupal\activitypub\Entity\Storage\ActivityPubActivityStorageInterface $activityStorage */ /** @var \Drupal\activitypub\Entity\ActivityPubActivityInterface $activity */ $activity = NULL; $activityStorage = $this->entityTypeManager()->getStorage('activitypub_activity'); $activities = $activityStorage->loadByProperties(['entity_type_id' => $entity->getEntityTypeId(), 'entity_id' => $entity->id(), 'collection' => 'outbox']); if (!empty($activities)) { $activity = array_shift($activities); } if ($actor && $activity) { $build = $activity->buildActivity(); if (is_array($build['object'])) { $output = $build['object']; } else { $output = $build; } $output['@context'] = ActivityPubActivityInterface::CONTEXT_URL; $response = new JsonResponse($output, 200); $response->headers->set('Content-Type', 'application/activity+json'); return $response; } else { $accept = $request->getAcceptableContentTypes(); if (in_array('text/html', $accept)) { $request->setRequestFormat('html'); $view_mode = 'full'; if ($entity->getEntityTypeId() == 'comment') { $view_mode = 'indieweb_microformat'; if (empty($entity->getOwnerId())) { $view_mode = 'full'; } } return $this->entityTypeManager()->getViewBuilder($entity->getEntityTypeId())->view($entity, $view_mode); } return new JsonResponse(NULL, 404); } } }