diff options
author | Jeremy Benoist <jeremy.benoist@gmail.com> | 2017-06-30 16:54:26 +0200 |
---|---|---|
committer | Jeremy Benoist <jeremy.benoist@gmail.com> | 2017-07-03 13:45:04 +0200 |
commit | a05b61159e147776f63baee731b5026796e5f7ae (patch) | |
tree | 80dae1ea169f3fb072a7aa2072f24507e10e91ed /src/Wallabag/CoreBundle | |
parent | 71e1cbc8eb5928d393b0772055d6b711e90a09b3 (diff) | |
download | wallabag-a05b61159e147776f63baee731b5026796e5f7ae.tar.gz wallabag-a05b61159e147776f63baee731b5026796e5f7ae.tar.zst wallabag-a05b61159e147776f63baee731b5026796e5f7ae.zip |
Fix PATCH method
The PATCH method for the entry should only update what user sent to us and not the whole entry as it was before.
Also, sending tags when patching an entry will now remove all current tags & assocatied new ones.
Diffstat (limited to 'src/Wallabag/CoreBundle')
-rw-r--r-- | src/Wallabag/CoreBundle/Entity/Entry.php | 16 | ||||
-rw-r--r-- | src/Wallabag/CoreBundle/Helper/ContentProxy.php | 89 |
2 files changed, 68 insertions, 37 deletions
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php index 581e8906..cba72d31 100644 --- a/src/Wallabag/CoreBundle/Entity/Entry.php +++ b/src/Wallabag/CoreBundle/Entity/Entry.php | |||
@@ -593,6 +593,11 @@ class Entry | |||
593 | $tag->addEntry($this); | 593 | $tag->addEntry($this); |
594 | } | 594 | } |
595 | 595 | ||
596 | /** | ||
597 | * Remove the given tag from the entry (if the tag is associated). | ||
598 | * | ||
599 | * @param Tag $tag | ||
600 | */ | ||
596 | public function removeTag(Tag $tag) | 601 | public function removeTag(Tag $tag) |
597 | { | 602 | { |
598 | if (!$this->tags->contains($tag)) { | 603 | if (!$this->tags->contains($tag)) { |
@@ -604,6 +609,17 @@ class Entry | |||
604 | } | 609 | } |
605 | 610 | ||
606 | /** | 611 | /** |
612 | * Remove all assigned tags from the entry. | ||
613 | */ | ||
614 | public function removeAllTags() | ||
615 | { | ||
616 | foreach ($this->tags as $tag) { | ||
617 | $this->tags->removeElement($tag); | ||
618 | $tag->removeEntry($this); | ||
619 | } | ||
620 | } | ||
621 | |||
622 | /** | ||
607 | * Set previewPicture. | 623 | * Set previewPicture. |
608 | * | 624 | * |
609 | * @param string $previewPicture | 625 | * @param string $previewPicture |
diff --git a/src/Wallabag/CoreBundle/Helper/ContentProxy.php b/src/Wallabag/CoreBundle/Helper/ContentProxy.php index ddecd6f4..2a650e97 100644 --- a/src/Wallabag/CoreBundle/Helper/ContentProxy.php +++ b/src/Wallabag/CoreBundle/Helper/ContentProxy.php | |||
@@ -75,9 +75,17 @@ class ContentProxy | |||
75 | */ | 75 | */ |
76 | private function stockEntry(Entry $entry, array $content) | 76 | private function stockEntry(Entry $entry, array $content) |
77 | { | 77 | { |
78 | $title = $content['title']; | 78 | $entry->setUrl($content['url']); |
79 | if (!$title && !empty($content['open_graph']['og_title'])) { | 79 | |
80 | $title = $content['open_graph']['og_title']; | 80 | $domainName = parse_url($entry->getUrl(), PHP_URL_HOST); |
81 | if (false !== $domainName) { | ||
82 | $entry->setDomainName($domainName); | ||
83 | } | ||
84 | |||
85 | if (!empty($content['title'])) { | ||
86 | $entry->setTitle($content['title']); | ||
87 | } elseif (!empty($content['open_graph']['og_title'])) { | ||
88 | $entry->setTitle($content['open_graph']['og_title']); | ||
81 | } | 89 | } |
82 | 90 | ||
83 | $html = $content['html']; | 91 | $html = $content['html']; |
@@ -90,24 +98,11 @@ class ContentProxy | |||
90 | } | 98 | } |
91 | } | 99 | } |
92 | 100 | ||
93 | $entry->setUrl($content['url']); | ||
94 | $entry->setTitle($title); | ||
95 | $entry->setContent($html); | 101 | $entry->setContent($html); |
96 | $entry->setHttpStatus(isset($content['status']) ? $content['status'] : ''); | 102 | $entry->setReadingTime(Utils::getReadingTime($html)); |
97 | |||
98 | if (!empty($content['date'])) { | ||
99 | $date = $content['date']; | ||
100 | |||
101 | // is it a timestamp? | ||
102 | if (filter_var($date, FILTER_VALIDATE_INT) !== false) { | ||
103 | $date = '@' . $content['date']; | ||
104 | } | ||
105 | 103 | ||
106 | try { | 104 | if (!empty($content['status'])) { |
107 | $entry->setPublishedAt(new \DateTime($date)); | 105 | $entry->setHttpStatus($content['status']); |
108 | } catch (\Exception $e) { | ||
109 | $this->logger->warning('Error while defining date', ['e' => $e, 'url' => $content['url'], 'date' => $content['date']]); | ||
110 | } | ||
111 | } | 106 | } |
112 | 107 | ||
113 | if (!empty($content['authors']) && is_array($content['authors'])) { | 108 | if (!empty($content['authors']) && is_array($content['authors'])) { |
@@ -118,15 +113,17 @@ class ContentProxy | |||
118 | $entry->setHeaders($content['all_headers']); | 113 | $entry->setHeaders($content['all_headers']); |
119 | } | 114 | } |
120 | 115 | ||
121 | $this->validateAndSetLanguage( | 116 | if (!empty($content['date'])) { |
122 | $entry, | 117 | $this->updatePublishedAt($entry, $content['date']); |
123 | isset($content['language']) ? $content['language'] : null | 118 | } |
124 | ); | ||
125 | 119 | ||
126 | $this->validateAndSetPreviewPicture( | 120 | if (!empty($content['language'])) { |
127 | $entry, | 121 | $this->updateLanguage($entry, $content['language']); |
128 | isset($content['open_graph']['og_image']) ? $content['open_graph']['og_image'] : null | 122 | } |
129 | ); | 123 | |
124 | if (!empty($content['open_graph']['og_image'])) { | ||
125 | $this->updatePreviewPicture($entry, $content['open_graph']['og_image']); | ||
126 | } | ||
130 | 127 | ||
131 | // if content is an image, define it as a preview too | 128 | // if content is an image, define it as a preview too |
132 | if (!empty($content['content_type']) && in_array($this->mimeGuesser->guess($content['content_type']), ['jpeg', 'jpg', 'gif', 'png'], true)) { | 129 | if (!empty($content['content_type']) && in_array($this->mimeGuesser->guess($content['content_type']), ['jpeg', 'jpg', 'gif', 'png'], true)) { |
@@ -136,12 +133,8 @@ class ContentProxy | |||
136 | ); | 133 | ); |
137 | } | 134 | } |
138 | 135 | ||
139 | $entry->setMimetype(isset($content['content_type']) ? $content['content_type'] : ''); | 136 | if (!empty($content['content_type'])) { |
140 | $entry->setReadingTime(Utils::getReadingTime($html)); | 137 | $entry->setMimetype($content['content_type']); |
141 | |||
142 | $domainName = parse_url($entry->getUrl(), PHP_URL_HOST); | ||
143 | if (false !== $domainName) { | ||
144 | $entry->setDomainName($domainName); | ||
145 | } | 138 | } |
146 | 139 | ||
147 | try { | 140 | try { |
@@ -170,9 +163,9 @@ class ContentProxy | |||
170 | * Use a Symfony validator to ensure the language is well formatted. | 163 | * Use a Symfony validator to ensure the language is well formatted. |
171 | * | 164 | * |
172 | * @param Entry $entry | 165 | * @param Entry $entry |
173 | * @param string $value Language to validate | 166 | * @param string $value Language to validate and save |
174 | */ | 167 | */ |
175 | private function validateAndSetLanguage($entry, $value) | 168 | public function updateLanguage(Entry $entry, $value) |
176 | { | 169 | { |
177 | // some lang are defined as fr-FR, es-ES. | 170 | // some lang are defined as fr-FR, es-ES. |
178 | // replacing - by _ might increase language support | 171 | // replacing - by _ might increase language support |
@@ -196,9 +189,9 @@ class ContentProxy | |||
196 | * Use a Symfony validator to ensure the preview picture is a real url. | 189 | * Use a Symfony validator to ensure the preview picture is a real url. |
197 | * | 190 | * |
198 | * @param Entry $entry | 191 | * @param Entry $entry |
199 | * @param string $value URL to validate | 192 | * @param string $value URL to validate and save |
200 | */ | 193 | */ |
201 | private function validateAndSetPreviewPicture($entry, $value) | 194 | public function updatePreviewPicture(Entry $entry, $value) |
202 | { | 195 | { |
203 | $errors = $this->validator->validate( | 196 | $errors = $this->validator->validate( |
204 | $value, | 197 | $value, |
@@ -213,4 +206,26 @@ class ContentProxy | |||
213 | 206 | ||
214 | $this->logger->warning('PreviewPicture validation failed. ' . (string) $errors); | 207 | $this->logger->warning('PreviewPicture validation failed. ' . (string) $errors); |
215 | } | 208 | } |
209 | |||
210 | /** | ||
211 | * Update date. | ||
212 | * | ||
213 | * @param Entry $entry | ||
214 | * @param string $value Date to validate and save | ||
215 | */ | ||
216 | public function updatePublishedAt(Entry $entry, $value) | ||
217 | { | ||
218 | $date = $value; | ||
219 | |||
220 | // is it a timestamp? | ||
221 | if (filter_var($date, FILTER_VALIDATE_INT) !== false) { | ||
222 | $date = '@'.$value; | ||
223 | } | ||
224 | |||
225 | try { | ||
226 | $entry->setPublishedAt(new \DateTime($date)); | ||
227 | } catch (\Exception $e) { | ||
228 | $this->logger->warning('Error while defining date', ['e' => $e, 'url' => $entry->getUrl(), 'date' => $value]); | ||
229 | } | ||
230 | } | ||
216 | } | 231 | } |