From 9e4cac0123c8b75a740abfa552d7fb3ff9fd6ecb Mon Sep 17 00:00:00 2001 From: Diogo Peralta Cordeiro Date: Fri, 13 Aug 2021 20:09:20 +0100 Subject: [PATCH] [ENTITY] Refactor RemoteURL entities to Link RemoteURL was being an awfully confusing term. --- components/Posting/Posting.php | 8 +-- plugins/Embed/Embed.php | 63 ++++++++++--------- plugins/Embed/Entity/AttachmentEmbed.php | 16 ++--- .../Embed/templates/embed/embedView.html.twig | 2 +- plugins/StoreRemoteMedia/StoreRemoteMedia.php | 42 ++++++++----- ...LToAttachment.php => AttachmentToLink.php} | 20 +++--- src/Entity/{RemoteURL.php => Link.php} | 61 +++++++++--------- .../{RemoteURLToNote.php => NoteToLink.php} | 36 +++++------ 8 files changed, 129 insertions(+), 119 deletions(-) rename src/Entity/{RemoteURLToAttachment.php => AttachmentToLink.php} (78%) rename src/Entity/{RemoteURL.php => Link.php} (66%) rename src/Entity/{RemoteURLToNote.php => NoteToLink.php} (61%) diff --git a/components/Posting/Posting.php b/components/Posting/Posting.php index 3a411e9a2b..8c4ba36de1 100644 --- a/components/Posting/Posting.php +++ b/components/Posting/Posting.php @@ -31,9 +31,9 @@ use App\Core\Modules\Component; use App\Entity\Attachment; use App\Entity\AttachmentToNote; use App\Entity\GSActorToAttachment; +use App\Entity\Link; use App\Entity\Note; -use App\Entity\RemoteURL; -use App\Entity\RemoteURLToNote; +use App\Entity\NoteToLink; use App\Util\Common; use App\Util\Exception\InvalidFormException; use App\Util\Exception\RedirectException; @@ -142,8 +142,8 @@ END; preg_match_all(self::URL_REGEX, $content, $matched_urls, PREG_SET_ORDER); foreach ($matched_urls as $match) { try { - $remoteurl_id = RemoteURL::getOrCreate($match[0])->getId(); - DB::persist(RemoteURLToNote::create(['remoteurl_id' => $remoteurl_id, 'note_id' => $note->getId()])); + $link_id = Link::getOrCreate($match[0])->getId(); + DB::persist(NoteToLink::create(['link_id' => $link_id, 'note_id' => $note->getId()])); $processed_urls = true; } catch (InvalidArgumentException) { continue; diff --git a/plugins/Embed/Embed.php b/plugins/Embed/Embed.php index d0ffe4e950..156d3c75d4 100644 --- a/plugins/Embed/Embed.php +++ b/plugins/Embed/Embed.php @@ -46,8 +46,8 @@ use App\Core\Modules\Plugin; use App\Core\Router\RouteLoader; use App\Core\Router\Router; use App\Entity\Attachment; +use App\Entity\Link; use App\Entity\Note; -use App\Entity\RemoteURL; use App\Util\Common; use App\Util\Exception\DuplicateFoundException; use App\Util\Exception\NotFoundException; @@ -134,24 +134,24 @@ class Embed extends Plugin * * @return bool */ - public function onViewRemoteUrl(array $vars, array &$res): bool + public function onViewLink(array $vars, array &$res): bool { - $remote_url = $vars['remote_url']; + $link = $vars['link']; try { - $embed = Cache::get('attachment-embed-' . $remote_url->getId(), - fn () => DB::findOneBy('attachment_embed', ['remoteurl_id' => $remote_url->getId()])); + $embed = Cache::get('attachment-embed-' . $link->getId(), + fn () => DB::findOneBy('attachment_embed', ['link_id' => $link->getId()])); } catch (DuplicateFoundException $e) { Log::warning($e); return Event::next; } catch (NotFoundException) { - Log::debug("Embed doesn\\'t have a representation for the remote_url id={$remote_url->getId()}. Must have been stored before the plugin was enabled."); + Log::debug("Embed doesn't have a representation for the link id={$link->getId()}. Must have been stored before the plugin was enabled."); return Event::next; } $attributes = $embed->getImageHTMLAttributes(['class' => 'u-photo embed']); $res[] = Formatting::twigRenderFile('embed/embedView.html.twig', - ['embed' => $embed, 'attributes' => $attributes, 'remote_url' => $remote_url]); + ['embed' => $embed, 'attributes' => $attributes, 'link' => $link]); return Event::stop; } @@ -159,31 +159,32 @@ class Embed extends Plugin /** * Save embedding information for an Attachment, if applicable. * - * @param RemoteURL $remote_url - * @param Note $note + * @param Link $link + * @param Note $note * - * @throws DuplicateFoundException + *@throws DuplicateFoundException * * @return bool + * */ - public function onNewRemoteURLFromNote(RemoteURL $remote_url, Note $note): bool + public function onNewLinkFromNote(Link $link, Note $note): bool { // Only handle text mime - $mimetype = $remote_url->getMimetype(); + $mimetype = $link->getMimetype(); if (!(Formatting::startsWith($mimetype, 'text/html') || Formatting::startsWith($mimetype, 'application/xhtml+xml'))) { return Event::next; } // Ignore if already handled - $attachment_embed = DB::find('attachment_embed', ['remoteurl_id' => $remote_url->getId()]); + $attachment_embed = DB::find('attachment_embed', ['link_id' => $link->getId()]); if (!is_null($attachment_embed)) { return Event::next; } // If an attachment already exist, do not create an Embed for it. Some other plugin must have done things - $remote_url_to_attachment = DB::find('remoteurl_to_attachment', ['remoteurl_id' => $remote_url->getId()]); - if (!is_null($remote_url_to_attachment)) { - $attachment_id = $remote_url_to_attachment->getAttachmentId(); + $link_to_attachment = DB::find('link_to_attachment', ['link_id' => $link->getId()]); + if (!is_null($link_to_attachment)) { + $attachment_id = $link_to_attachment->getAttachmentId(); try { $attachment = DB::findOneBy('attachment', ['id' => $attachment_id]); $attachment->livesIncrementAndGet(); @@ -194,15 +195,15 @@ class Embed extends Plugin } // Create an Embed representation for this URL - $embed_data = $this->getEmbedLibMetadata($remote_url->getRemoteUrl()); - $embed_data['remoteurl_id'] = $remote_url->getId(); - $img_data = $this->downloadThumbnail($embed_data['thumbnail_url']); + $embed_data = $this->getEmbedLibMetadata($link->getUrl()); + $embed_data['link_id'] = $link->getId(); + $img_data = $this->downloadThumbnail($embed_data['thumbnail_url']); switch ($img_data) { case null: // URL isn't usable $embed_data['thumbnail_url'] = null; // no break case false: // Thumbnail isn't acceptable - DB::persist($attachment = Attachment::create(['mimetype' => $remote_url->getMimetype()])); + DB::persist($attachment = Attachment::create(['mimetype' => $link->getMimetype()])); Event::handle('AttachmentStoreNew', [&$attachment]); break; default: // String is valid image data @@ -286,7 +287,7 @@ class Embed extends Plugin * * @return bool true if allowed by the lists, false otherwise */ - private function allowedRemoteUrl(string $url): bool + private function allowedLink(string $url): bool { return true; if ($this->check_whitelist ?? false) { @@ -309,30 +310,30 @@ class Embed extends Plugin * - checks if respects file quota and whitelist/blacklist, returns false if not; * - downloads the thumbnail, returns a string if successful. * - * @param string $remote_url URL to the remote thumbnail + * @param string $url URL to the remote thumbnail * * @return null|bool|string */ - private function downloadThumbnail(string $remote_url): bool|string|null + private function downloadThumbnail(string $url): bool|string|null { // Is this a valid URL? - if (!Common::isValidHttpUrl($remote_url)) { - Log::debug("Invalid URL ({$remote_url}) in Embed->downloadThumbnail."); + if (!Common::isValidHttpUrl($url)) { + Log::debug("Invalid URL ({$url}) in Embed->downloadThumbnail."); return null; } // Is this URL trusted? - if (!$this->allowedRemoteUrl($remote_url)) { - Log::info("Blocked URL ({$remote_url}) in Embed->downloadThumbnail."); + if (!$this->allowedLink($url)) { + Log::info("Blocked URL ({$url}) in Embed->downloadThumbnail."); return false; } // Validate if the URL really does point to a remote image - $head = HTTPClient::head($remote_url); + $head = HTTPClient::head($url); $headers = $head->getHeaders(); $headers = array_change_key_case($headers, CASE_LOWER); if (empty($headers['content-type']) || GSFile::mimetypeMajor($headers['content-type'][0]) !== 'image') { - Log::debug("URL ({$remote_url}) doesn't point to an image (content-type: " . (!empty($headers['content-type'][0]) ? $headers['content-type'][0] : 'not available') . ') in Embed->downloadThumbnail.'); + Log::debug("URL ({$url}) doesn't point to an image (content-type: " . (!empty($headers['content-type'][0]) ? $headers['content-type'][0] : 'not available') . ') in Embed->downloadThumbnail.'); return null; } @@ -345,8 +346,8 @@ class Embed extends Plugin } // Download and return the file - Log::debug("Downloading remote thumbnail from URL: {$remote_url} in Embed->downloadThumbnail."); - return HTTPClient::get($remote_url)->getContent(); + Log::debug("Downloading remote thumbnail from URL: {$url} in Embed->downloadThumbnail."); + return HTTPClient::get($url)->getContent(); } /** diff --git a/plugins/Embed/Entity/AttachmentEmbed.php b/plugins/Embed/Entity/AttachmentEmbed.php index 9428ba506d..7f256263b3 100644 --- a/plugins/Embed/Entity/AttachmentEmbed.php +++ b/plugins/Embed/Entity/AttachmentEmbed.php @@ -46,7 +46,7 @@ class AttachmentEmbed extends Entity { // {{{ Autocode // @codeCoverageIgnoreStart - private int $remoteurl_id; + private int $link_id; private int $attachment_id; private ?string $title; private ?string $description; @@ -57,15 +57,15 @@ class AttachmentEmbed extends Entity private ?string $thumbnail_url; private \DateTimeInterface $modified; - public function setRemoteUrlId(int $remoteurl_id): self + public function setLinkId(int $link_id): self { - $this->remoteurl_id = $remoteurl_id; + $this->link_id = $link_id; return $this; } - public function getRemoteUrlId(): int + public function getLinkId(): int { - return $this->remoteurl_id; + return $this->link_id; } /** @@ -180,7 +180,7 @@ class AttachmentEmbed extends Entity return [ 'name' => 'attachment_embed', 'fields' => [ - 'remoteurl_id' => ['type' => 'int', 'not null' => true, 'description' => 'Embed for that URL/file'], + 'link_id' => ['type' => 'int', 'not null' => true, 'description' => 'Embed for that URL/file'], 'attachment_id' => ['type' => 'int', 'not null' => true, 'description' => 'Attachment relation, used to show previews'], 'provider_name' => ['type' => 'text', 'description' => 'name of this Embed provider'], 'provider_url' => ['type' => 'text', 'description' => 'URL of this Embed provider'], @@ -190,9 +190,9 @@ class AttachmentEmbed extends Entity 'thumbnail_url' => ['type' => 'text', 'description' => 'URL for this Embed resource when applicable (photo, link)'], 'modified' => ['type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'], ], - 'primary key' => ['remoteurl_id'], + 'primary key' => ['link_id'], 'foreign keys' => [ - 'attachment_embed_remoteurl_id_fkey' => ['remoteurl', ['remoteurl_id' => 'id']], + 'attachment_embed_link_id_fkey' => ['link', ['link_id' => 'id']], 'attachment_embed_attachment_id_fkey' => ['attachment', ['attachment_id' => 'id']], ], ]; diff --git a/plugins/Embed/templates/embed/embedView.html.twig b/plugins/Embed/templates/embed/embedView.html.twig index 8799695ef2..c1226ac439 100644 --- a/plugins/Embed/templates/embed/embedView.html.twig +++ b/plugins/Embed/templates/embed/embedView.html.twig @@ -4,7 +4,7 @@ {% endif %}
- {{embed.getTitle() | escape}} + {{embed.getTitle() | escape}}
{% if embed.getAuthorName() is not null %} diff --git a/plugins/StoreRemoteMedia/StoreRemoteMedia.php b/plugins/StoreRemoteMedia/StoreRemoteMedia.php index cce8e88d4f..c8d0cfe29d 100644 --- a/plugins/StoreRemoteMedia/StoreRemoteMedia.php +++ b/plugins/StoreRemoteMedia/StoreRemoteMedia.php @@ -24,11 +24,14 @@ use App\Core\GSFile; use App\Core\HTTPClient; use App\Core\Modules\Plugin; use App\Entity\AttachmentThumbnail; +use App\Entity\AttachmentToLink; use App\Entity\AttachmentToNote; +use App\Entity\Link; use App\Entity\Note; -use App\Entity\RemoteURL; -use App\Entity\RemoteURLToAttachment; use App\Util\Common; +use App\Util\Exception\DuplicateFoundException; +use App\Util\Exception\ServerException; +use App\Util\Exception\TemporaryFileException; use App\Util\TemporaryFile; /** @@ -82,43 +85,48 @@ class StoreRemoteMedia extends Plugin } /** - * @param RemoteURL $remote_url + * @param Link $link + * @param Note $note + * + * @throws DuplicateFoundException + * @throws ServerException + * @throws TemporaryFileException * * @return bool */ - public function onNewRemoteURLFromNote(RemoteURL $remote_url, Note $note): bool + public function onNewLinkFromNote(Link $link, Note $note): bool { // Embed is the plugin to handle these - if ($remote_url->getMimetypeMajor() === 'text') { + if ($link->getMimetypeMajor() === 'text') { return Event::next; } // Have we handled it already? - $remoteurl_to_attachment = DB::find('remoteurl_to_attachment', - ['remoteurl_id' => $remote_url->getId()]); + $attachment_to_link = DB::find('attachment_to_link', + ['link_id' => $link->getId()]); // If it was handled already - if (!is_null($remoteurl_to_attachment)) { + if (!is_null($attachment_to_link)) { // Relate the note with the existing attachment DB::persist(AttachmentToNote::create([ - 'attachment_id' => $remoteurl_to_attachment->getAttachmentId(), + 'attachment_id' => $attachment_to_link->getAttachmentId(), 'note_id' => $note->getId(), ])); DB::flush(); return Event::stop; } else { // Retrieve media - $get_response = HTTPClient::get($remote_url->getRemoteUrl()); + $get_response = HTTPClient::get($link->getUrl()); $media = $get_response->getContent(); $mimetype = $get_response->getHeaders()['content-type'][0]; unset($get_response); // Ensure we still want to handle it - if ($mimetype != $remote_url->getMimetype()) { - $remote_url->setMimetype($mimetype); - DB::persist($remote_url); + if ($mimetype != $link->getMimetype()) { + $link->setMimetype($mimetype); + DB::persist($link); DB::flush(); - if ($remote_url->getMimetypeMajor() === 'text') { + if ($link->getMimetypeMajor() === 'text') { return Event::next; } } @@ -128,9 +136,9 @@ class StoreRemoteMedia extends Plugin $temp_file->write($media); $attachment = GSFile::sanitizeAndStoreFileAsAttachment($temp_file); - // Relate the remoteurl with the attachment - DB::persist(RemoteURLToAttachment::create([ - 'remoteurl_id' => $remote_url->getId(), + // Relate the link with the attachment + DB::persist(AttachmentToLink::create([ + 'link_id' => $link->getId(), 'attachment_id' => $attachment->getId(), ])); diff --git a/src/Entity/RemoteURLToAttachment.php b/src/Entity/AttachmentToLink.php similarity index 78% rename from src/Entity/RemoteURLToAttachment.php rename to src/Entity/AttachmentToLink.php index 329202ddd3..ebe8c5b8da 100644 --- a/src/Entity/RemoteURLToAttachment.php +++ b/src/Entity/AttachmentToLink.php @@ -32,12 +32,12 @@ use DateTimeInterface; * @copyright 2021 Free Software Foundation, Inc http://www.fsf.org * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -class RemoteURLToAttachment extends Entity +class AttachmentToLink extends Entity { // {{{ Autocode // @codeCoverageIgnoreStart private int $attachment_id; - private int $remoteurl_id; + private int $link_id; private \DateTimeInterface $modified; public function setAttachmentId(int $attachment_id): self @@ -51,15 +51,15 @@ class RemoteURLToAttachment extends Entity return $this->attachment_id; } - public function setRemoteURLId(int $remoteurl_id): self + public function setLinkId(int $link_id): self { - $this->remoteurl_id = $remoteurl_id; + $this->link_id = $link_id; return $this; } - public function getRemoteURLId(): int + public function getLinkId(): int { - return $this->remoteurl_id; + return $this->link_id; } public function setModified(DateTimeInterface $modified): self @@ -79,15 +79,15 @@ class RemoteURLToAttachment extends Entity public static function schemaDef(): array { return [ - 'name' => 'remoteurl_to_attachment', + 'name' => 'attachment_to_link', 'fields' => [ - 'remoteurl_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'RemoteURL.id', 'multiplicity' => 'one to one', 'name' => 'attachment_to_note_note_id_fkey', 'not null' => true, 'description' => 'id of the note it belongs to'], + 'link_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'Link.id', 'multiplicity' => 'one to one', 'name' => 'attachment_to_note_note_id_fkey', 'not null' => true, 'description' => 'id of the note it belongs to'], 'attachment_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'Attachment.id', 'multiplicity' => 'one to one', 'name' => 'attachment_to_note_attachment_id_fkey', 'not null' => true, 'description' => 'id of attachment'], 'modified' => ['type' => 'timestamp', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'], ], - 'primary key' => ['remoteurl_id'], + 'primary key' => ['link_id'], 'indexes' => [ - 'remoteurl_id_idx' => ['remoteurl_id'], + 'link_id_idx' => ['link_id'], 'attachment_id_idx' => ['attachment_id'], ], ]; diff --git a/src/Entity/RemoteURL.php b/src/Entity/Link.php similarity index 66% rename from src/Entity/RemoteURL.php rename to src/Entity/Link.php index 11e9c0ad1c..30f749cce6 100644 --- a/src/Entity/RemoteURL.php +++ b/src/Entity/Link.php @@ -31,7 +31,7 @@ use DateTimeInterface; use InvalidArgumentException; /** - * Entity for representing a RemoteURL + * Entity for representing a Link * * @category DB * @package GNUsocial @@ -40,13 +40,13 @@ use InvalidArgumentException; * @copyright 2021 Free Software Foundation, Inc http://www.fsf.org * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -class RemoteURL extends Entity +class Link extends Entity { // {{{ Autocode // @codeCoverageIgnoreStart private int $id; - private ?string $remote_url; - private ?string $remote_url_hash; + private ?string $url; + private ?string $url_hash; private ?string $mimetype; private DateTimeInterface $modified; @@ -61,26 +61,26 @@ class RemoteURL extends Entity return $this->id; } - public function getRemoteUrl(): ?string + public function getUrl(): ?string { - return $this->remote_url; + return $this->url; } - public function setRemoteUrl(?string $remote_url): self + public function setUrl(?string $url): self { - $this->remote_url = $remote_url; + $this->url = $url; return $this; } - public function setRemoteUrlHash(?string $remote_url_hash): self + public function setUrlHash(?string $url_hash): self { - $this->remote_url_hash = $remote_url_hash; + $this->url_hash = $url_hash; return $this; } - public function getRemoteUrlHash(): ?string + public function getUrlHash(): ?string { - return $this->remote_url_hash; + return $this->url_hash; } public function setMimetype(?string $mimetype): self @@ -127,10 +127,11 @@ class RemoteURL extends Entity * * @param string $url * + *@throws InvalidArgumentException * @throws DuplicateFoundException - * @throws InvalidArgumentException * - * @return RemoteURL + * @return Link + * */ public static function getOrCreate(string $url): self { @@ -141,17 +142,17 @@ class RemoteURL extends Entity $url = $head->getInfo('url'); // The last effective url (after getHeaders, so it follows redirects) $url_hash = hash(self::URLHASH_ALGO, $url); try { - return DB::findOneBy('remoteurl', ['remote_url_hash' => $url_hash]); + return DB::findOneBy('link', ['url_hash' => $url_hash]); } catch (NotFoundException) { - $headers = array_change_key_case($headers, CASE_LOWER); - $remoteurl = self::create([ - 'remote_url' => $url, - 'remote_url_hash' => $url_hash, - 'mimetype' => $headers['content-type'][0], + $headers = array_change_key_case($headers, CASE_LOWER); + $link = self::create([ + 'url' => $url, + 'url_hash' => $url_hash, + 'mimetype' => $headers['content-type'][0], ]); - DB::persist($remoteurl); - Event::handle('RemoteURLStoredNew', [&$remoteurl]); - return $remoteurl; + DB::persist($link); + Event::handle('LinkStoredNew', [&$link]); + return $link; } } else { throw new InvalidArgumentException(); @@ -161,17 +162,17 @@ class RemoteURL extends Entity public static function schemaDef(): array { return [ - 'name' => 'remoteurl', + 'name' => 'link', 'fields' => [ - 'id' => ['type' => 'serial', 'not null' => true], - 'remote_url' => ['type' => 'text', 'description' => 'URL after following possible redirections'], - 'remote_url_hash' => ['type' => 'varchar', 'length' => 64, 'description' => 'sha256 of destination URL (url field)'], - 'mimetype' => ['type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'], - 'modified' => ['type' => 'timestamp', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'], + 'id' => ['type' => 'serial', 'not null' => true], + 'url' => ['type' => 'text', 'description' => 'URL after following possible redirections'], + 'url_hash' => ['type' => 'varchar', 'length' => 64, 'description' => 'sha256 of destination URL (url field)'], + 'mimetype' => ['type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'], + 'modified' => ['type' => 'timestamp', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'], ], 'primary key' => ['id'], 'indexes' => [ - 'gsactor_remote_url_hash_idx' => ['remote_url_hash'], + 'gsactor_url_hash_idx' => ['url_hash'], ], ]; } diff --git a/src/Entity/RemoteURLToNote.php b/src/Entity/NoteToLink.php similarity index 61% rename from src/Entity/RemoteURLToNote.php rename to src/Entity/NoteToLink.php index ad2c750c00..cdebaf2e93 100644 --- a/src/Entity/RemoteURLToNote.php +++ b/src/Entity/NoteToLink.php @@ -25,7 +25,7 @@ use App\Core\Event; use DateTimeInterface; /** - * Entity for relating a RemoteURL to a post + * Entity for relating a Link to a post * * @category DB * @package GNUsocial @@ -34,23 +34,23 @@ use DateTimeInterface; * @copyright 2021 Free Software Foundation, Inc http://www.fsf.org * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -class RemoteURLToNote extends Entity +class NoteToLink extends Entity { // {{{ Autocode // @codeCoverageIgnoreStart - private int $remoteurl_id; + private int $link_id; private int $note_id; private \DateTimeInterface $modified; - public function setRemoteURLId(int $remoteurl_id): self + public function setLinkId(int $link_id): self { - $this->remoteurl_id = $remoteurl_id; + $this->link_id = $link_id; return $this; } - public function getRemoteURLId(): int + public function getLinkId(): int { - return $this->remoteurl_id; + return $this->link_id; } public function setNoteId(int $note_id): self @@ -76,7 +76,7 @@ class RemoteURLToNote extends Entity } /** - * Create an instance of RemoteURLToNote or fill in the + * Create an instance of NoteToLink or fill in the * properties of $obj with the associative array $args. Doesn't * persist the result * @@ -84,9 +84,9 @@ class RemoteURLToNote extends Entity */ public static function create(array $args, $obj = null) { - $remoteURL = DB::find('remoteurl', ['id' => $args['remoteurl_id']]); - $note = DB::find('note', ['id' => $args['note_id']]); - Event::handle('NewRemoteURLFromNote', [$remoteURL, $note]); + $link = DB::find('link', ['id' => $args['link_id']]); + $note = DB::find('note', ['id' => $args['note_id']]); + Event::handle('NewLinkFromNote', [$link, $note]); $obj = new self(); return parent::create($args, $obj); } @@ -97,16 +97,16 @@ class RemoteURLToNote extends Entity public static function schemaDef(): array { return [ - 'name' => 'remoteurl_to_note', + 'name' => 'note_to_link', 'fields' => [ - 'remoteurl_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'remoteurl.id', 'multiplicity' => 'one to one', 'name' => 'remoteurl_to_note_remoteurl_id_fkey', 'not null' => true, 'description' => 'id of remoteurl'], - 'note_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'Note.id', 'multiplicity' => 'one to one', 'name' => 'remoteurl_to_note_note_id_fkey', 'not null' => true, 'description' => 'id of the note it belongs to'], - 'modified' => ['type' => 'timestamp', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'], + 'link_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'link.id', 'multiplicity' => 'one to one', 'name' => 'note_to_link_link_id_fkey', 'not null' => true, 'description' => 'id of link'], + 'note_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'Note.id', 'multiplicity' => 'one to one', 'name' => 'note_to_link_note_id_fkey', 'not null' => true, 'description' => 'id of the note it belongs to'], + 'modified' => ['type' => 'timestamp', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'], ], - 'primary key' => ['remoteurl_id', 'note_id'], + 'primary key' => ['link_id', 'note_id'], 'indexes' => [ - 'remoteurl_id_idx' => ['remoteurl_id'], - 'note_id_idx' => ['note_id'], + 'link_id_idx' => ['link_id'], + 'note_id_idx' => ['note_id'], ], ]; }