Completed
Push — master ( bb050e...36e41a )
by Paweł
11:10
created

FakeArticlesGenerator   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 195
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 16

Importance

Changes 0
Metric Value
wmc 6
lcom 1
cbo 16
dl 0
loc 195
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 17 1
B generate() 0 62 2
A createArticleStatistics() 0 10 1
A createArticleMedia() 0 41 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Superdesk Web Publisher Core Bundle.
7
 *
8
 * Copyright 2017 Sourcefabric z.ú. and contributors.
9
 *
10
 * For the full copyright and license information, please see the
11
 * AUTHORS and LICENSE files distributed with this source code.
12
 *
13
 * @copyright 2017 Sourcefabric z.ú
14
 * @license http://www.superdesk.org/license
15
 */
16
17
namespace SWP\Bundle\CoreBundle\Theme\Generator;
18
19
use Doctrine\Common\Collections\ArrayCollection;
20
use Doctrine\Common\Collections\Collection;
21
use SWP\Bundle\ContentBundle\Factory\ArticleFactoryInterface;
22
use SWP\Bundle\ContentBundle\Factory\MediaFactoryInterface;
23
use SWP\Bundle\ContentBundle\Manager\MediaManagerInterface;
24
use SWP\Bundle\ContentBundle\Model\ArticleAuthor;
25
use SWP\Bundle\ContentBundle\Model\ImageRendition;
26
use SWP\Bundle\CoreBundle\Model\ArticleInterface;
27
use SWP\Bundle\CoreBundle\Model\ArticleMediaInterface;
28
use SWP\Bundle\CoreBundle\Model\ArticleStatisticsInterface;
29
use SWP\Bundle\CoreBundle\Model\Image;
30
use SWP\Bundle\CoreBundle\Model\PackageInterface;
31
use SWP\Bundle\CoreBundle\Repository\ArticleRepositoryInterface;
32
use Faker;
33
use SWP\Component\Bridge\Model\ContentInterface;
34
use SWP\Component\Bridge\Model\ItemInterface;
35
use SWP\Component\Storage\Factory\FactoryInterface;
36
use Symfony\Component\HttpFoundation\File\UploadedFile;
37
38
class FakeArticlesGenerator implements FakeArticlesGeneratorInterface
39
{
40
    /**
41
     * @var ArticleFactoryInterface
42
     */
43
    protected $articleFactory;
44
45
    /**
46
     * @var MediaManagerInterface
47
     */
48
    protected $mediaManager;
49
50
    /**
51
     * @var MediaFactoryInterface
52
     */
53
    protected $articleMediaFactory;
54
55
    /**
56
     * @var ArticleRepositoryInterface
57
     */
58
    protected $articleRepository;
59
60
    /**
61
     * @var FactoryInterface
62
     */
63
    protected $articleStatisticsFactory;
64
65
    /**
66
     * @var FactoryInterface
67
     */
68
    protected $packageFactory;
69
70
    /**
71
     * @var FactoryInterface
72
     */
73
    protected $itemFactory;
74
75
    /**
76
     * FakeArticlesGenerator constructor.
77
     *
78
     * @param ArticleFactoryInterface    $articleFactory
79
     * @param MediaManagerInterface      $mediaManager
80
     * @param MediaFactoryInterface      $articleMediaFactory
81
     * @param ArticleRepositoryInterface $articleRepository
82
     * @param FactoryInterface           $articleStatisticsFactory
83
     * @param FactoryInterface           $packageFactory
84
     * @param FactoryInterface           $itemFactory
85
     */
86
    public function __construct(
87
        ArticleFactoryInterface $articleFactory,
88
        MediaManagerInterface $mediaManager,
89
        MediaFactoryInterface $articleMediaFactory,
90
        ArticleRepositoryInterface $articleRepository,
91
        FactoryInterface $articleStatisticsFactory,
92
        FactoryInterface $packageFactory,
93
        FactoryInterface $itemFactory
94
    ) {
95
        $this->articleFactory = $articleFactory;
96
        $this->mediaManager = $mediaManager;
97
        $this->articleMediaFactory = $articleMediaFactory;
98
        $this->articleRepository = $articleRepository;
99
        $this->articleStatisticsFactory = $articleStatisticsFactory;
100
        $this->packageFactory = $packageFactory;
101
        $this->itemFactory = $itemFactory;
102
    }
103
104
    /**
105
     * {@inheritdoc}
106
     */
107
    public function generate(int $numberOfArticles): array
108
    {
109
        $articles = [];
110
        for (; $numberOfArticles > 0; --$numberOfArticles) {
111
            /** @var ArticleInterface $article */
112
            $article = $this->articleFactory->create();
113
            $faker = Faker\Factory::create();
114
            $code = $faker->uuid;
115
            $title = $faker->catchPhrase();
116
            $body = $faker->paragraph(20);
117
            $article->setTitle($title);
118
            $article->setBody($body);
119
            $article->setLead($faker->paragraph(3));
120
            $article->setLocale('en');
121
            $article->setMetadata(['located' => 'Porto']);
122
            $article->setStatus(ArticleInterface::STATUS_PUBLISHED);
123
            $article->setPublishedAt(new \DateTime());
124
            $article->setPublishable(true);
125
            $article->setCode($code);
126
            $this->articleRepository->persist($article);
127
            $this->articleRepository->flush();
128
            $article->setMedia($this->createArticleMedia($article));
129
            $article->setArticleStatistics($this->createArticleStatistics($article));
130
            $author = new ArticleAuthor();
131
            $author->setRole('editor');
132
            $author->setName('John Doe');
133
            $article->setAuthors(new ArrayCollection([$author]));
134
135
            /** @var PackageInterface $package */
136
            $package = $this->packageFactory->create();
137
            $package->setStatus(PackageInterface::STATUS_PUBLISHED);
138
            $package->setType('composite');
139
            $package->setGuid($code);
140
            $package->setLocated('Porto');
141
            $package->setHeadline($title);
142
            $package->setLanguage('en');
143
            $package->setPriority(1);
144
            $package->setVersion(1);
145
146
            /** @var ItemInterface $item */
147
            $item = $this->itemFactory->create();
148
            $item->setPubStatus(ContentInterface::STATUS_USABLE);
149
            $item->setType('text');
150
            $item->setGuid($code);
151
            $item->setLocated('Porto');
152
            $item->setHeadline($title);
153
            $item->setLanguage('en');
154
            $item->setPriority(1);
155
            $item->setVersion(1);
156
            $item->setBody($body);
157
            $item->setAuthors(new ArrayCollection([$author]));
158
            $package->setItems(new ArrayCollection([$item]));
159
            $this->articleRepository->persist($package);
160
            $article->setPackage($package);
161
162
            $this->articleRepository->flush();
163
164
            $articles[] = $article;
165
        }
166
167
        return $articles;
168
    }
169
170
    /**
171
     * @param ArticleInterface $article
172
     *
173
     * @return ArticleStatisticsInterface
174
     */
175
    protected function createArticleStatistics(ArticleInterface $article): ArticleStatisticsInterface
176
    {
177
        /** @var ArticleStatisticsInterface $articleStatistics */
178
        $articleStatistics = $this->articleStatisticsFactory->create();
179
        $articleStatistics->setArticle($article);
180
        $articleStatistics->setPageViewsNumber(0);
181
        $this->articleRepository->persist($articleStatistics);
182
183
        return $articleStatistics;
184
    }
185
186
    /**
187
     * @param ArticleInterface $article
188
     *
189
     * @return Collection
190
     */
191
    protected function createArticleMedia(ArticleInterface $article): Collection
192
    {
193
        $mediaId = \uniqid('', false);
194
        $faker = Faker\Factory::create();
195
        $fakeImage = $faker->image(sys_get_temp_dir(), 800, 800, 'cats', true, true, $article->getSlug());
196
        if (!is_string($fakeImage)) {
197
            $im = imagecreatetruecolor(800, 800);
198
            $textColor = imagecolorallocate($im, 233, 14, 91);
199
            imagestring($im, 1, 5, 5, $article->getTitle(), $textColor);
200
            $fakeImage = sys_get_temp_dir().'/'.$article->getSlug().'.jpg';
201
            imagejpeg($im, $fakeImage);
202
            imagedestroy($im);
203
        }
204
        $uploadedFile = new UploadedFile($fakeImage, $mediaId, 'image/jpeg', filesize($fakeImage), null, true);
205
        /** @var Image $image */
206
        $image = $this->mediaManager->handleUploadedFile($uploadedFile, $mediaId);
207
        /** @var ArticleMediaInterface $articleMedia */
208
        $articleMedia = $this->articleMediaFactory->createEmpty();
209
        $articleMedia->setImage($image);
210
        $articleMedia->setArticle($article);
211
        $articleMedia->setKey('embedded'.uniqid());
212
        $articleMedia->setBody('This is very nice image caption...');
213
        $articleMedia->setByLine('By Best Editor');
214
        $articleMedia->setLocated('Porto');
215
        $articleMedia->setDescription('Media description');
216
        $articleMedia->setUsageTerms('Some super open terms');
217
        $articleMedia->setMimetype('image/jpeg');
218
        $article->setFeatureMedia($articleMedia);
219
        $this->articleRepository->persist($articleMedia);
220
221
        $imageRendition = new ImageRendition();
222
        $imageRendition->setImage($image);
223
        $imageRendition->setHeight(800);
224
        $imageRendition->setWidth(800);
225
        $imageRendition->setName('original');
226
        $imageRendition->setMedia($articleMedia);
227
        $articleMedia->addRendition($imageRendition);
228
        $this->articleRepository->persist($imageRendition);
229
230
        return new ArrayCollection([$articleMedia]);
231
    }
232
}
233