- $link = [
- 'title' => ! empty($input['title']) ? $input['title'] : $input['url'],
- 'url' => $input['url'],
- 'description' => ! empty($input['description']) ? $input['description'] : '',
- 'tags' => ! empty($input['tags']) ? implode(' ', $input['tags']) : '',
- 'private' => $private,
- 'created' => new \DateTime(),
+ $bookmark->setTitle(! empty($input['title']) ? $input['title'] : '');
+ $bookmark->setUrl($url);
+ $bookmark->setDescription(! empty($input['description']) ? $input['description'] : '');
+
+ // Be permissive with provided tags format
+ if (is_string($input['tags'] ?? null)) {
+ $input['tags'] = tags_str2array($input['tags'], $tagsSeparator);
+ }
+ if (is_array($input['tags'] ?? null) && count($input['tags']) === 1 && is_string($input['tags'][0])) {
+ $input['tags'] = tags_str2array($input['tags'][0], $tagsSeparator);
+ }
+
+ $bookmark->setTags(! empty($input['tags']) ? $input['tags'] : []);
+ $bookmark->setPrivate($private);
+
+ $created = \DateTime::createFromFormat(\DateTime::ATOM, $input['created'] ?? '');
+ if ($created instanceof \DateTimeInterface) {
+ $bookmark->setCreated($created);
+ }
+ $updated = \DateTime::createFromFormat(\DateTime::ATOM, $input['updated'] ?? '');
+ if ($updated instanceof \DateTimeInterface) {
+ $bookmark->setUpdated($updated);
+ }
+
+ return $bookmark;
+ }
+
+ /**
+ * Update link fields using an updated link object.
+ *
+ * @param Bookmark $oldLink data
+ * @param Bookmark $newLink data
+ *
+ * @return Bookmark $oldLink updated with $newLink values
+ */
+ public static function updateLink($oldLink, $newLink)
+ {
+ $oldLink->setTitle($newLink->getTitle());
+ $oldLink->setUrl($newLink->getUrl());
+ $oldLink->setDescription($newLink->getDescription());
+ $oldLink->setTags($newLink->getTags());
+ $oldLink->setPrivate($newLink->isPrivate());
+
+ return $oldLink;
+ }
+
+ /**
+ * Format a Tag for the REST API.
+ *
+ * @param string $tag Tag name
+ * @param int $occurrences Number of bookmarks using this tag
+ *
+ * @return array Link data formatted for the REST API.
+ */
+ public static function formatTag($tag, $occurences)
+ {
+ return [
+ 'name' => $tag,
+ 'occurrences' => $occurences,