nextcloud-memento/lib/Controller/ TimeMapController.php
75 lines
2.6 KiB

  1. <?php
  2. namespace OCA\Memento\Controller;
  3. require_once __DIR__ . '/findMementos.php';
  4. require_once __DIR__ . '/datetimeConversion.php';
  5. use OCP\IRequest;
  6. use OCP\IServerContainer;
  7. use OCP\IURLGenerator;
  8. use OCP\AppFramework\Controller;
  9. use OCP\AppFramework\Http\DataDisplayResponse;
  10. class TimeMapController extends Controller {
  11. private $userFolder;
  12. private $URLGenerator;
  13. public function __construct(
  14. $AppName,
  15. IRequest $request,
  16. $UserId,
  17. IServerContainer $serverContainer,
  18. IURLGenerator $URLGenerator
  19. ) {
  20. parent::__construct($AppName, $request);
  21. $this->userFolder = $serverContainer->getUserFolder($UserId);
  22. $this->URLGenerator = $URLGenerator;
  23. }
  24. /**
  25. * @NoAdminRequired
  26. * @NoCSRFRequired
  27. */
  28. public function timeMap($url) {
  29. $matchingMementos = findMementos($this->userFolder, $url);
  30. // Build the list of links.
  31. // $timeMapUrl = $this->URLGenerator->linkToRouteAbsolute('timeMap#timeMap', [ 'url' => $url ]);
  32. // $timeGateUrl = $this->URLGenerator->linkToRouteAbsolute('timeGate#timeGate', [ 'url' => $url ]);
  33. // FIXME ...is linkToRouteAbsolute broken? Hardcoding the path then..
  34. $timeMapUrl = $this->URLGenerator->getAbsoluteUrl("/apps/memento/timemap/$url");
  35. $timeGateUrl = $this->URLGenerator->getAbsoluteUrl("/apps/memento/timegate/$url");
  36. if (count($matchingMementos) > 0) {
  37. $firstDatetime = datetimeTimestampToString($matchingMementos[0]['datetime']);
  38. $lastMemento = $matchingMementos[count($matchingMementos)-1];
  39. $lastDatetime = datetimeTimestampToString($lastMemento['datetime']);
  40. }
  41. $links = [
  42. // FIXME Our $url param has its duplicate slashes removed, so it looks like 'http:/abc'.
  43. "<$url>;rel=\"original\"",
  44. "<$timeGateUrl>;rel=\"timegate\"",
  45. "<$timeMapUrl>;rel=\"self\";type=\"application/link-format\"" .
  46. ($firstDatetime && $lastDatetime ? ";from=\"$firstDatetime\";until=\"$lastDatetime\"" : "")
  47. ];
  48. foreach ($matchingMementos as $index => $memento) {
  49. $datetime = datetimeTimestampToString($memento['datetime']);
  50. $maybeFirst = $index === 0 ? 'first ' : '';
  51. $maybeLast = $index === count($matchingMementos)-1 ? 'last ' : '';
  52. // Make absolute, as the spec says URLs are to be interpreted relative to the *original* url!
  53. $absoluteMementoUrl = $this->URLGenerator->getAbsoluteURL($memento['mementoUrl']);
  54. $links[] = "<$absoluteMementoUrl>"
  55. . ";rel=\"{$maybeFirst}{$maybeLast}memento\""
  56. . ";datetime=\"$datetime\"";
  57. }
  58. $linksString = implode(",\n", $links);
  59. $headers = [
  60. "Content-Type" => "application/link-format"
  61. ];
  62. $response = new DataDisplayResponse($linksString, 200, $headers);
  63. return $response;
  64. }
  65. }