]> git.immae.eu Git - github/wallabag/wallabag.git/blob - src/Wallabag/ImportBundle/Import/WallabagImport.php
Use scheduled entity insertions to avoid tag duplicate
[github/wallabag/wallabag.git] / src / Wallabag / ImportBundle / Import / WallabagImport.php
1 <?php
2
3 namespace Wallabag\ImportBundle\Import;
4
5 use Wallabag\CoreBundle\Entity\Entry;
6
7 abstract class WallabagImport extends AbstractImport
8 {
9 protected $filepath;
10 // untitled in all languages from v1
11 protected $untitled = [
12 'Untitled',
13 'Sans titre',
14 'podle nadpisu',
15 'Sin título',
16 'با عنوان',
17 'per titolo',
18 'Sem título',
19 'Без названия',
20 'po naslovu',
21 'Без назви',
22 'No title found',
23 '',
24 ];
25
26 /**
27 * {@inheritdoc}
28 */
29 abstract public function getName();
30
31 /**
32 * {@inheritdoc}
33 */
34 abstract public function getUrl();
35
36 /**
37 * {@inheritdoc}
38 */
39 abstract public function getDescription();
40
41 /**
42 * {@inheritdoc}
43 */
44 public function import()
45 {
46 if (!$this->user) {
47 $this->logger->error('WallabagImport: user is not defined');
48
49 return false;
50 }
51
52 if (!file_exists($this->filepath) || !is_readable($this->filepath)) {
53 $this->logger->error('WallabagImport: unable to read file', ['filepath' => $this->filepath]);
54
55 return false;
56 }
57
58 $data = json_decode(file_get_contents($this->filepath), true);
59
60 if (empty($data)) {
61 return false;
62 }
63
64 if ($this->producer) {
65 $this->parseEntriesForProducer($data);
66
67 return true;
68 }
69
70 $this->parseEntries($data);
71
72 return true;
73 }
74
75 /**
76 * Set file path to the json file.
77 *
78 * @param string $filepath
79 */
80 public function setFilepath($filepath)
81 {
82 $this->filepath = $filepath;
83
84 return $this;
85 }
86
87 /**
88 * {@inheritdoc}
89 */
90 public function parseEntry(array $importedEntry)
91 {
92 $existingEntry = $this->em
93 ->getRepository('WallabagCoreBundle:Entry')
94 ->findByUrlAndUserId($importedEntry['url'], $this->user->getId());
95
96 if (false !== $existingEntry) {
97 ++$this->skippedEntries;
98
99 return;
100 }
101
102 $data = $this->prepareEntry($importedEntry);
103
104 $entry = new Entry($this->user);
105 $entry->setUrl($data['url']);
106 $entry->setTitle($data['title']);
107
108 // update entry with content (in case fetching failed, the given entry will be return)
109 $entry = $this->fetchContent($entry, $data['url'], $data);
110
111 if (array_key_exists('tags', $data)) {
112 $this->contentProxy->assignTagsToEntry(
113 $entry,
114 $data['tags'],
115 $this->em->getUnitOfWork()->getScheduledEntityInsertions()
116 );
117 }
118
119 if (isset($importedEntry['preview_picture'])) {
120 $entry->setPreviewPicture($importedEntry['preview_picture']);
121 }
122
123 $entry->setArchived($data['is_archived']);
124 $entry->setStarred($data['is_starred']);
125
126 if (!empty($data['created_at'])) {
127 $entry->setCreatedAt(new \DateTime($data['created_at']));
128 }
129
130 $this->em->persist($entry);
131 ++$this->importedEntries;
132
133 return $entry;
134 }
135
136 /**
137 * This should return a cleaned array for a given entry to be given to `updateEntry`.
138 *
139 * @param array $entry Data from the imported file
140 *
141 * @return array
142 */
143 abstract protected function prepareEntry($entry = []);
144 }