bookmarks/lib/Db/Bookmark.php

128 lines
3.7 KiB
PHP

<?php
/*
* Copyright (c) 2020-2024. The Nextcloud Bookmarks contributors.
*
* This file is licensed under the Affero General Public License version 3 or later. See the COPYING file.
*/
namespace OCA\Bookmarks\Db;
use OCP\AppFramework\Db\Entity;
/**
* Class Bookmark
*
* @package OCA\Bookmarks\Db
* @method string getUrl()
* @method setUrl(string $url)
* @method string getTitle()
* @method string getDescription()
* @method int getLastmodified()
* @method setLastmodified(int $lastmodified)
* @method int getAdded()
* @method setAdded(int $added)
* @method int getClickcount
* @method setClickcount(int $count)
* @method int getLastPreview()
* @method setLastPreview(int $lastpreview)
* @method bool getAvailable()
* @method setAvailable(boolean $available)
* @method int getArchivedFile()
* @method setArchivedFile(int $fileId)
* @method string getTextContent()
* @method setTextContent(string $content)
* @method string getHtmlContent()
* @method setHtmlContent(string $content)
* @method string getUserId()
* @method setUserId(string $userId)
*/
class Bookmark extends Entity {
protected $url;
protected $title;
protected $userId;
protected $description;
protected $public;
protected $added;
protected $lastmodified;
protected $clickcount;
protected $lastPreview;
protected $available;
protected $archivedFile;
protected $textContent;
protected $htmlContent;
public static $columns = ['id', 'url', 'title', 'description', 'lastmodified', 'added', 'clickcount', 'last_preview', 'available', 'archived_file', 'user_id', 'text_content', 'html_content'];
public static $fields = ['id', 'url', 'title', 'description', 'lastmodified', 'added', 'clickcount', 'lastPreview', 'available', 'archivedFile', 'userId', 'textContent','htmlContent'];
public static function fromArray($props): self {
$bookmark = new Bookmark();
foreach ($props as $prop => $val) {
if ($prop === 'target') {
$prop = 'url';
}
$bookmark->{'set' . $prop}($val);
}
return $bookmark;
}
public function __construct() {
// add types in constructor
$this->addType('id', 'integer');
$this->addType('url', 'string');
$this->addType('title', 'string');
$this->addType('userId', 'string');
$this->addType('description', 'string');
$this->addType('added', 'integer');
$this->addType('lastmodified', 'integer');
$this->addType('clickcount', 'integer');
$this->addType('lastPreview', 'integer');
$this->addType('available', 'boolean');
$this->addType('archivedFile', 'integer');
}
public function toArray(): array {
$array = [];
foreach (self::$fields as $field) {
if ($field === 'url') {
if (!preg_match('/^javascript:/i', $this->url)) {
$array['url'] = $this->url;
} else {
$array['url'] = '';
}
$array['target'] = $this->url;
continue;
}
$array[$field] = $this->{$field};
}
return $array;
}
public function markPreviewCreated(): void {
$this->setLastPreview(time());
}
public function incrementClickcount(): void {
$this->setClickcount($this->clickcount + 1);
}
public function setTitle(string $title): void {
// Cap title length at 1024 because the DB doesn't have more space currently (4096 byte with utf8mb4)
if (mb_strlen($title) > 1024) {
$title = mb_substr($title, 0, 1023) . '…';
}
$this->setter('title', [$title]);
}
public function setDescription(string $desc): void {
// Cap title length at 1024 because the DB doesn't have more space currently (4096 byte with utf8mb4)
if (mb_strlen($desc) > 1024) {
$desc = mb_substr($desc, 0, 1023) . '…';
}
$this->setter('description', [$desc]);
}
public function isWebLink() {
return (bool) preg_match('/^https?:/i', $this->getUrl());
}
}