summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid T. Sadler <davidtsadler@googlemail.com>2021-09-18 12:20:59 +0100
committerDavid T. Sadler <davidtsadler@googlemail.com>2021-09-18 12:20:59 +0100
commit2b15ee9eae6a98fba871b4c587cdd8cfc1b1b48a (patch)
treee3ceb3a87c11b925f0df0088da82427f793b2e14 /src
parent3431dc10bc8c9925dcda272855de379321d832b2 (diff)
Beginning of rewrite
Diffstat (limited to 'src')
-rw-r--r--src/DTS/Bookmark.php27
-rw-r--r--src/DTS/BookmarkRepository.php87
2 files changed, 114 insertions, 0 deletions
diff --git a/src/DTS/Bookmark.php b/src/DTS/Bookmark.php
new file mode 100644
index 0000000..93c7a29
--- /dev/null
+++ b/src/DTS/Bookmark.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace DTS;
+
+class Bookmark
+{
+ public string $id;
+
+ public string $url;
+
+ public string $tag;
+
+ public string $addedAt;
+
+ public bool $read;
+
+ function __construct(string $id, string $url, string $tag, string $addedAt, bool $read)
+ {
+ $this->id = $id;
+ $this->url = $url;
+ $this->tag = $tag;
+ $this->addedAt = $addedAt;
+ $this->read = $read;
+ }
+}
diff --git a/src/DTS/BookmarkRepository.php b/src/DTS/BookmarkRepository.php
new file mode 100644
index 0000000..deb188c
--- /dev/null
+++ b/src/DTS/BookmarkRepository.php
@@ -0,0 +1,87 @@
+<?php
+
+declare(strict_types=1);
+
+namespace DTS;
+
+class BookmarkRepository implements \Iterator
+{
+ private string $pathToRepository;
+
+ private array $repository = [];
+
+ private int $position = 0;
+
+ function __construct(string $pathToRepository)
+ {
+ $this->pathToRepository = $pathToRepository;
+ }
+
+ public function load(): void
+ {
+ if (!is_file($this->pathToRepository) || !is_readable($this->pathToRepository)) {
+ throw new \Exception("Unable to locate repository {$this->pathToRepository}");
+ }
+
+ if (($fp = fopen($this->pathToRepository, 'r')) === FALSE) {
+ throw new \Exception("Unable to read from repository {$this->pathToRepository}");
+ }
+
+ while (($data = fgetcsv($fp)) !== FALSE) {
+ $this->repository[] = new Bookmark(
+ $data[0], // Id.
+ $data[1], // Url.
+ $data[2], // Tag.
+ $data[3], // Added At.
+ (bool)$data[4], // Read.
+ );
+ }
+
+ fclose($fp);
+ }
+
+ public function sort(bool $asc = true): BookmarkRepository
+ {
+ usort($this->repository, function ($a, $b) use ($asc) {
+ return $asc ? $a->addedAt <=> $b->addedAt
+ : $b->addedAt <=> $a->addedAt;
+ });
+
+ return $this;
+ }
+
+ public function filter(string $tag): BookmarkRepository
+ {
+ $this->repository = array_filter(
+ $this->repository,
+ fn($bookmark) => $bookmark->tag === $tag
+ );
+
+ return $this;
+ }
+
+ public function current(): mixed
+ {
+ return $this->repository[$this->position];
+ }
+
+ public function key(): mixed
+ {
+ return $this->position;
+ }
+
+ public function next(): void
+ {
+ ++$this->position;
+ }
+
+ public function rewind(): void
+ {
+ $this->position = 0;
+ }
+
+ public function valid(): bool
+ {
+ return isset($this->repository[$this->position]);
+ }
+}