aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Wallabag/CoreBundle
diff options
context:
space:
mode:
authorJeremy Benoist <jeremy.benoist@gmail.com>2017-06-30 16:54:26 +0200
committerJeremy Benoist <jeremy.benoist@gmail.com>2017-07-03 13:45:04 +0200
commita05b61159e147776f63baee731b5026796e5f7ae (patch)
tree80dae1ea169f3fb072a7aa2072f24507e10e91ed /src/Wallabag/CoreBundle
parent71e1cbc8eb5928d393b0772055d6b711e90a09b3 (diff)
downloadwallabag-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.php16
-rw-r--r--src/Wallabag/CoreBundle/Helper/ContentProxy.php89
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}