]> git.immae.eu Git - github/wallabag/wallabag.git/blob - src/Wallabag/CoreBundle/Entity/Entry.php
Merge remote-tracking branch 'origin/master' into 2.1
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Entity / Entry.php
1 <?php
2
3 namespace Wallabag\CoreBundle\Entity;
4
5 use Doctrine\Common\Collections\ArrayCollection;
6 use Doctrine\ORM\Mapping as ORM;
7 use Hateoas\Configuration\Annotation as Hateoas;
8 use JMS\Serializer\Annotation\Groups;
9 use JMS\Serializer\Annotation\XmlRoot;
10 use JMS\Serializer\Annotation\Exclude;
11 use JMS\Serializer\Annotation\VirtualProperty;
12 use JMS\Serializer\Annotation\SerializedName;
13 use Symfony\Component\Validator\Constraints as Assert;
14 use Wallabag\UserBundle\Entity\User;
15 use Wallabag\AnnotationBundle\Entity\Annotation;
16
17 /**
18 * Entry.
19 *
20 * @XmlRoot("entry")
21 * @ORM\Entity(repositoryClass="Wallabag\CoreBundle\Repository\EntryRepository")
22 * @ORM\Table(name="`entry`")
23 * @ORM\HasLifecycleCallbacks()
24 * @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())")
25 */
26 class Entry
27 {
28 /** @Serializer\XmlAttribute */
29 /**
30 * @var int
31 *
32 * @ORM\Column(name="id", type="integer")
33 * @ORM\Id
34 * @ORM\GeneratedValue(strategy="AUTO")
35 *
36 * @Groups({"entries_for_user", "export_all"})
37 */
38 private $id;
39
40 /**
41 * @var string
42 *
43 * @ORM\Column(name="uuid", type="text", nullable=true)
44 *
45 * @Groups({"entries_for_user", "export_all"})
46 */
47 private $uuid;
48
49 /**
50 * @var string
51 *
52 * @ORM\Column(name="title", type="text", nullable=true)
53 *
54 * @Groups({"entries_for_user", "export_all"})
55 */
56 private $title;
57
58 /**
59 * @var string
60 *
61 * @Assert\NotBlank()
62 * @ORM\Column(name="url", type="text", nullable=true)
63 *
64 * @Groups({"entries_for_user", "export_all"})
65 */
66 private $url;
67
68 /**
69 * @var bool
70 *
71 * @Exclude
72 *
73 * @ORM\Column(name="is_archived", type="boolean")
74 *
75 * @Groups({"entries_for_user", "export_all"})
76 */
77 private $isArchived = false;
78
79 /**
80 * @var bool
81 *
82 * @Exclude
83 *
84 * @ORM\Column(name="is_starred", type="boolean")
85 *
86 * @Groups({"entries_for_user", "export_all"})
87 */
88 private $isStarred = false;
89
90 /**
91 * @var string
92 *
93 * @ORM\Column(name="content", type="text", nullable=true)
94 *
95 * @Groups({"entries_for_user", "export_all"})
96 */
97 private $content;
98
99 /**
100 * @var date
101 *
102 * @ORM\Column(name="created_at", type="datetime")
103 *
104 * @Groups({"export_all"})
105 */
106 private $createdAt;
107
108 /**
109 * @var date
110 *
111 * @ORM\Column(name="updated_at", type="datetime")
112 *
113 * @Groups({"export_all"})
114 */
115 private $updatedAt;
116
117 /**
118 * @ORM\OneToMany(targetEntity="Wallabag\AnnotationBundle\Entity\Annotation", mappedBy="entry", cascade={"persist", "remove"})
119 * @ORM\JoinTable
120 *
121 * @Groups({"entries_for_user", "export_all"})
122 */
123 private $annotations;
124
125 /**
126 * @var string
127 *
128 * @ORM\Column(name="mimetype", type="text", nullable=true)
129 *
130 * @Groups({"entries_for_user", "export_all"})
131 */
132 private $mimetype;
133
134 /**
135 * @var string
136 *
137 * @ORM\Column(name="language", type="text", nullable=true)
138 *
139 * @Groups({"entries_for_user", "export_all"})
140 */
141 private $language;
142
143 /**
144 * @var int
145 *
146 * @ORM\Column(name="reading_time", type="integer", nullable=true)
147 *
148 * @Groups({"entries_for_user", "export_all"})
149 */
150 private $readingTime;
151
152 /**
153 * @var string
154 *
155 * @ORM\Column(name="domain_name", type="text", nullable=true)
156 *
157 * @Groups({"entries_for_user", "export_all"})
158 */
159 private $domainName;
160
161 /**
162 * @var string
163 *
164 * @ORM\Column(name="preview_picture", type="text", nullable=true)
165 *
166 * @Groups({"entries_for_user", "export_all"})
167 */
168 private $previewPicture;
169
170 /**
171 * @var bool
172 *
173 * @ORM\Column(name="is_public", type="boolean", nullable=true, options={"default" = false})
174 *
175 * @Groups({"export_all"})
176 */
177 private $isPublic;
178
179 /**
180 * @Exclude
181 *
182 * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="entries")
183 *
184 * @Groups({"export_all"})
185 */
186 private $user;
187
188 /**
189 * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist"})
190 * @ORM\JoinTable(
191 * name="entry_tag",
192 * joinColumns={
193 * @ORM\JoinColumn(name="entry_id", referencedColumnName="id")
194 * },
195 * inverseJoinColumns={
196 * @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
197 * }
198 * )
199 *
200 * @Groups({"entries_for_user", "export_all"})
201 */
202 private $tags;
203
204 /*
205 * @param User $user
206 */
207 public function __construct(User $user)
208 {
209 $this->user = $user;
210 $this->tags = new ArrayCollection();
211 }
212
213 /**
214 * Get id.
215 *
216 * @return int
217 */
218 public function getId()
219 {
220 return $this->id;
221 }
222
223 /**
224 * Set title.
225 *
226 * @param string $title
227 *
228 * @return Entry
229 */
230 public function setTitle($title)
231 {
232 $this->title = $title;
233
234 return $this;
235 }
236
237 /**
238 * Get title.
239 *
240 * @return string
241 */
242 public function getTitle()
243 {
244 return $this->title;
245 }
246
247 /**
248 * Set url.
249 *
250 * @param string $url
251 *
252 * @return Entry
253 */
254 public function setUrl($url)
255 {
256 $this->url = $url;
257
258 return $this;
259 }
260
261 /**
262 * Get url.
263 *
264 * @return string
265 */
266 public function getUrl()
267 {
268 return $this->url;
269 }
270
271 /**
272 * Set isArchived.
273 *
274 * @param bool $isArchived
275 *
276 * @return Entry
277 */
278 public function setArchived($isArchived)
279 {
280 $this->isArchived = $isArchived;
281
282 return $this;
283 }
284
285 /**
286 * Get isArchived.
287 *
288 * @return bool
289 */
290 public function isArchived()
291 {
292 return $this->isArchived;
293 }
294
295 /**
296 * @VirtualProperty
297 * @SerializedName("is_archived")
298 * @Groups({"entries_for_user", "export_all"})
299 */
300 public function is_Archived()
301 {
302 return (int) $this->isArchived();
303 }
304
305 public function toggleArchive()
306 {
307 $this->isArchived = $this->isArchived() ^ 1;
308
309 return $this;
310 }
311
312 /**
313 * Set isStarred.
314 *
315 * @param bool $isStarred
316 *
317 * @return Entry
318 */
319 public function setStarred($isStarred)
320 {
321 $this->isStarred = $isStarred;
322
323 return $this;
324 }
325
326 /**
327 * Get isStarred.
328 *
329 * @return bool
330 */
331 public function isStarred()
332 {
333 return $this->isStarred;
334 }
335
336 /**
337 * @VirtualProperty
338 * @SerializedName("is_starred")
339 * @Groups({"entries_for_user", "export_all"})
340 */
341 public function is_Starred()
342 {
343 return (int) $this->isStarred();
344 }
345
346 public function toggleStar()
347 {
348 $this->isStarred = $this->isStarred() ^ 1;
349
350 return $this;
351 }
352
353 /**
354 * Set content.
355 *
356 * @param string $content
357 *
358 * @return Entry
359 */
360 public function setContent($content)
361 {
362 $this->content = $content;
363
364 return $this;
365 }
366
367 /**
368 * Get content.
369 *
370 * @return string
371 */
372 public function getContent()
373 {
374 return $this->content;
375 }
376
377 /**
378 * @return User
379 */
380 public function getUser()
381 {
382 return $this->user;
383 }
384
385 /**
386 * @VirtualProperty
387 * @SerializedName("user_name")
388 */
389 public function getUserName()
390 {
391 return $this->user->getUserName();
392 }
393
394 /**
395 * @VirtualProperty
396 * @SerializedName("user_email")
397 */
398 public function getUserEmail()
399 {
400 return $this->user->getEmail();
401 }
402
403 /**
404 * @VirtualProperty
405 * @SerializedName("user_id")
406 */
407 public function getUserId()
408 {
409 return $this->user->getId();
410 }
411
412 /**
413 * @return string
414 */
415 public function getCreatedAt()
416 {
417 return $this->createdAt;
418 }
419
420 /**
421 * @return string
422 */
423 public function getUpdatedAt()
424 {
425 return $this->updatedAt;
426 }
427
428 /**
429 * @ORM\PrePersist
430 * @ORM\PreUpdate
431 */
432 public function timestamps()
433 {
434 if (is_null($this->createdAt)) {
435 $this->createdAt = new \DateTime();
436 }
437
438 $this->updatedAt = new \DateTime();
439 }
440
441 /**
442 * @return ArrayCollection<Annotation>
443 */
444 public function getAnnotations()
445 {
446 return $this->annotations;
447 }
448
449 /**
450 * @param Annotation $annotation
451 */
452 public function setAnnotation(Annotation $annotation)
453 {
454 $this->annotations[] = $annotation;
455 }
456
457 /**
458 * @return string
459 */
460 public function getMimetype()
461 {
462 return $this->mimetype;
463 }
464
465 /**
466 * @param string $mimetype
467 */
468 public function setMimetype($mimetype)
469 {
470 $this->mimetype = $mimetype;
471 }
472
473 /**
474 * @return int
475 */
476 public function getReadingTime()
477 {
478 return $this->readingTime;
479 }
480
481 /**
482 * @param int $readingTime
483 */
484 public function setReadingTime($readingTime)
485 {
486 $this->readingTime = $readingTime;
487 }
488
489 /**
490 * @return string
491 */
492 public function getDomainName()
493 {
494 return $this->domainName;
495 }
496
497 /**
498 * @param string $domainName
499 */
500 public function setDomainName($domainName)
501 {
502 $this->domainName = $domainName;
503 }
504
505 /**
506 * @return bool
507 */
508 public function isPublic()
509 {
510 return $this->isPublic;
511 }
512
513 /**
514 * @param bool $isPublic
515 */
516 public function setIsPublic($isPublic)
517 {
518 $this->isPublic = $isPublic;
519 }
520
521 /**
522 * @return ArrayCollection<Tag>
523 */
524 public function getTags()
525 {
526 return $this->tags;
527 }
528
529 /**
530 * @param Tag $tag
531 */
532 public function addTag(Tag $tag)
533 {
534 if ($this->tags->contains($tag)) {
535 return;
536 }
537
538 // check if tag already exist but has not yet be persisted
539 // it seems that the previous condition with `contains()` doesn't check that case
540 foreach ($this->tags as $existingTag) {
541 if ($existingTag->getLabel() === $tag->getLabel()) {
542 return;
543 }
544 }
545
546 $this->tags->add($tag);
547 $tag->addEntry($this);
548 }
549
550 public function removeTag(Tag $tag)
551 {
552 if (!$this->tags->contains($tag)) {
553 return;
554 }
555
556 $this->tags->removeElement($tag);
557 $tag->removeEntry($this);
558 }
559
560 /**
561 * Set previewPicture.
562 *
563 * @param string $previewPicture
564 *
565 * @return Entry
566 */
567 public function setPreviewPicture($previewPicture)
568 {
569 $this->previewPicture = $previewPicture;
570
571 return $this;
572 }
573
574 /**
575 * Get previewPicture.
576 *
577 * @return string
578 */
579 public function getPreviewPicture()
580 {
581 return $this->previewPicture;
582 }
583
584 /**
585 * Set language.
586 *
587 * @param string $language
588 *
589 * @return Entry
590 */
591 public function setLanguage($language)
592 {
593 $this->language = $language;
594
595 return $this;
596 }
597
598 /**
599 * Get language.
600 *
601 * @return string
602 */
603 public function getLanguage()
604 {
605 return $this->language;
606 }
607
608 /**
609 * @return string
610 */
611 public function getUuid()
612 {
613 return $this->uuid;
614 }
615
616 /**
617 * @param string $uuid
618 *
619 * @return Entry
620 */
621 public function setUuid($uuid)
622 {
623 $this->uuid = $uuid;
624
625 return $this;
626 }
627
628 public function generateUuid()
629 {
630 if (null === $this->uuid) {
631 // @see http://blog.kevingomez.fr/til/2015/07/26/why-is-uniqid-slow/ for true parameter
632 $this->uuid = uniqid('', true);
633 }
634 }
635
636 public function cleanUuid()
637 {
638 $this->uuid = null;
639 }
640 }