nextcloud-memento/lib/Controller/ TimeMapController.php
99 lines
3.2 KiB

  1. <?php
  2. namespace OCA\Memento\Controller;
  3. require_once __DIR__ . '/findMementos.php';
  4. require_once __DIR__ . '/datetimeConversion.php';
  5. require_once __DIR__ . '/getUrlParameter.php';
  6. use OCP\IRequest;
  7. use OCP\IServerContainer;
  8. use OCP\IURLGenerator;
  9. use OCP\AppFramework\Controller;
  10. use OCP\AppFramework\Http\DataDisplayResponse;
  11. class TimeMapController extends Controller {
  12. use MementoFinder;
  13. private $loggedInUserId;
  14. private $serverContainer;
  15. public function __construct(
  16. $AppName,
  17. IRequest $request,
  18. $UserId,
  19. IServerContainer $serverContainer
  20. ) {
  21. parent::__construct($AppName, $request);
  22. $this->loggedInUserId = $UserId;
  23. $this->serverContainer = $serverContainer;
  24. }
  25. /**
  26. * @NoAdminRequired
  27. * @NoCSRFRequired
  28. * @PublicPage
  29. */
  30. public function singleUserTimeMap($userId, $url) {
  31. // XXX workaround, as nextcloud corrupts the $url parameter.
  32. $routePrefix = "u/$userId/";
  33. $url = getUrlParameter("{$routePrefix}timemap");
  34. $matchingMementos = $this->findSingleUserMementosForUrl($userId, $url);
  35. return $this->makeResponse($url, $matchingMementos, $routePrefix);
  36. }
  37. /**
  38. * @NoAdminRequired
  39. * @NoCSRFRequired
  40. * @PublicPage
  41. */
  42. public function allUsersTimeMap($url) {
  43. $routePrefix = "";
  44. $url = getUrlParameter("{$routePrefix}timemap");
  45. $matchingMementos = $this->findAllUsersMementosForUrl($url);
  46. return $this->makeResponse($url, $matchingMementos, $routePrefix);
  47. }
  48. private function makeResponse($url, $matchingMementos, $routePrefix) {
  49. // Build the list of links.
  50. // $timeMapUrl = $this->URLGenerator->linkToRouteAbsolute('timeMap#timeMap', [ 'url' => $url ]);
  51. // $timeGateUrl = $this->URLGenerator->linkToRouteAbsolute('timeGate#timeGate', [ 'url' => $url ]);
  52. // FIXME ...is linkToRouteAbsolute broken? Hardcoding the path then..
  53. $URLGenerator = $this->serverContainer->getURLGenerator();
  54. $timeMapUrl = $URLGenerator->getAbsoluteUrl("/apps/memento/{$routePrefix}timemap/$url");
  55. $timeGateUrl = $URLGenerator->getAbsoluteUrl("/apps/memento/{$routePrefix}timegate/$url");
  56. if (count($matchingMementos) > 0) {
  57. $firstDatetime = datetimeTimestampToString($matchingMementos[0]['datetime']);
  58. $lastMemento = $matchingMementos[count($matchingMementos)-1];
  59. $lastDatetime = datetimeTimestampToString($lastMemento['datetime']);
  60. }
  61. $links = [
  62. "<$url>;rel=\"original\"",
  63. "<$timeGateUrl>;rel=\"timegate\"",
  64. "<$timeMapUrl>;rel=\"self\";type=\"application/link-format\"" .
  65. ($firstDatetime && $lastDatetime ? ";from=\"$firstDatetime\";until=\"$lastDatetime\"" : "")
  66. ];
  67. foreach ($matchingMementos as $index => $memento) {
  68. $datetime = datetimeTimestampToString($memento['datetime']);
  69. $maybeFirst = $index === 0 ? 'first ' : '';
  70. $maybeLast = $index === count($matchingMementos)-1 ? 'last ' : '';
  71. // Make absolute, as the spec says URLs are to be interpreted relative to the *original* url!
  72. $absoluteMementoUrl = $URLGenerator->getAbsoluteURL($memento['mementoUrl']);
  73. $links[] = "<$absoluteMementoUrl>"
  74. . ";rel=\"{$maybeFirst}{$maybeLast}memento\""
  75. . ";datetime=\"$datetime\"";
  76. }
  77. $linksString = implode(",\n", $links);
  78. $headers = [
  79. "Content-Type" => "application/link-format"
  80. ];
  81. $response = new DataDisplayResponse($linksString, 200, $headers);
  82. return $response;
  83. }
  84. }