nextcloud-memento/lib/Controller/ TimeMapController.php
83 lines
2.7 KiB

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