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