nextcloud-memento/lib/Controller/ TimeMapController.php
82 lines
2.6 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. * @NoAdminRequired
  27. * @NoCSRFRequired
  28. */
  29. public function timeMap($url) {
  30. $matchingMementos = findMementos($this->userFolder, $url);
  31. // Build the list of links.
  32. // $timeMapUrl = $this->URLGenerator->linkToRouteAbsolute('timeMap#timeMap', [ 'url' => $url ]);
  33. // $timeGateUrl = $this->URLGenerator->linkToRouteAbsolute('timeGate#timeGate', [ 'url' => $url ]);
  34. // FIXME ...is linkToRouteAbsolute broken? Hardcoding the path then..
  35. $timeMapUrl = $this->URLGenerator->getAbsoluteUrl("/apps/memento/timemap/$url");
  36. $timeGateUrl = $this->URLGenerator->getAbsoluteUrl("/apps/memento/timegate/$url");
  37. if (count($matchingMementos) > 0) {
  38. $firstDatetime = formatDatetime($matchingMementos[0]['datetime']);
  39. $lastDatetime = formatDatetime($matchingMementos[count($matchingMementos)-1]['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 = formatDatetime($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. }
  66. function formatDatetime($datetime) {
  67. $datetime = new DateTime("@$datetime");
  68. $s = $datetime->format("D, d M Y H:i:s") . " GMT";
  69. return $s;
  70. }