Test Failed
Pull Request — feature/unit-tests (#37)
by Daniel
11:03
created

SilverbackApiComponentExtension::prepend()   A

Complexity

Conditions 5
Paths 12

Size

Total Lines 50
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 5.0031

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 34
c 2
b 0
f 0
dl 0
loc 50
ccs 19
cts 20
cp 0.95
rs 9.0648
cc 5
nc 12
nop 1
crap 5.0031
1
<?php
2
3
/*
4
 * This file is part of the Silverback API Component Bundle Project
5
 *
6
 * (c) Daniel West <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
declare(strict_types=1);
13
14
namespace Silverback\ApiComponentBundle\DependencyInjection;
15
16
use Exception;
17
use RuntimeException;
18
use Silverback\ApiComponentBundle\Doctrine\Extension\TablePrefixExtension;
19
use Silverback\ApiComponentBundle\Entity\Core\ComponentInterface;
20
use Silverback\ApiComponentBundle\EventListener\Doctrine\UserListener;
21
use Silverback\ApiComponentBundle\Factory\Mailer\User\ChangeEmailVerificationEmailFactory;
22
use Silverback\ApiComponentBundle\Factory\Mailer\User\PasswordChangedEmailFactory;
23
use Silverback\ApiComponentBundle\Factory\Mailer\User\PasswordResetEmailFactory;
24
use Silverback\ApiComponentBundle\Factory\Mailer\User\UserEnabledEmailFactory;
25
use Silverback\ApiComponentBundle\Factory\Mailer\User\UsernameChangedEmailFactory;
26
use Silverback\ApiComponentBundle\Factory\Mailer\User\WelcomeEmailFactory;
27
use Silverback\ApiComponentBundle\Factory\User\UserFactory;
28
use Silverback\ApiComponentBundle\Form\FormTypeInterface;
29
use Silverback\ApiComponentBundle\Form\Type\User\ChangePasswordType;
30
use Silverback\ApiComponentBundle\Form\Type\User\NewEmailAddressType;
31
use Silverback\ApiComponentBundle\Form\Type\User\UserRegisterType;
32
use Silverback\ApiComponentBundle\Mailer\UserMailer;
33
use Silverback\ApiComponentBundle\Manager\User\PasswordManager;
34
use Silverback\ApiComponentBundle\Repository\User\UserRepository;
35
use Silverback\ApiComponentBundle\Security\TokenAuthenticator;
36
use Silverback\ApiComponentBundle\Security\UserChecker;
37
use Symfony\Component\Config\FileLocator;
38
use Symfony\Component\DependencyInjection\ContainerBuilder;
39
use Symfony\Component\DependencyInjection\Extension\Extension;
40
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
41
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
42
43
/**
44
 * @author Daniel West <[email protected]>
45 1
 */
46
class SilverbackApiComponentExtension extends Extension implements PrependExtensionInterface
47 1
{
48 1
    /**
49
     * @throws Exception
50 1
     */
51
    public function load(array $configs, ContainerBuilder $container): void
52 1
    {
53 1
        $configuration = new Configuration();
54 1
        $config = $this->processConfiguration($configuration, $configs);
55
56 1
        $this->loadServiceConfig($container);
57 1
58
        $definition = $container->getDefinition(TablePrefixExtension::class);
59 1
        $definition->setArgument('$prefix', $config['table_prefix']);
60 1
61
        $definition = $container->getDefinition(TokenAuthenticator::class);
62 1
        $definition->setArgument('$tokens', $config['security']['tokens']);
63 1
64
        $definition = $container->getDefinition(PasswordManager::class);
65 1
        $definition->setArgument('$tokenTtl', $config['user']['password_reset']['repeat_ttl_seconds']);
66 1
67
        $definition = $container->getDefinition(UserRepository::class);
68 1
        $definition->setArgument('$passwordRequestTimeout', $config['user']['password_reset']['request_timeout_seconds']);
69 1
        $definition->setArgument('$entityClass', $config['user']['class_name']);
70
71 1
        $this->setEmailVerificationArguments($container, $config['user']['email_verification']);
72 1
        $this->setUserClassArguments($container, $config['user']['class_name']);
73
        $this->setMailerServiceArguments($container, $config);
74 1
    }
75 1
76
    private function setEmailVerificationArguments(ContainerBuilder $container, array $emailVerificationConfig): void
77 1
    {
78 1
        $definition = $container->getDefinition(UserChecker::class);
79 1
        $definition->setArgument('$denyUnverifiedLogin', $emailVerificationConfig['deny_unverified_login']);
80
81 1
        $definition = $container->getDefinition(UserListener::class);
82 1
        $definition->setArgument('$initialEmailVerifiedState', $emailVerificationConfig['default_value']);
83 1
        $definition->setArgument('$verifyEmailOnRegister', $emailVerificationConfig['verify_on_register']);
84 1
        $definition->setArgument('$verifyEmailOnChange', $emailVerificationConfig['verify_on_change']);
85 1
    }
86 1
87 1
    private function setUserClassArguments(ContainerBuilder $container, string $userClass): void
88 1
    {
89
        $definition = $container->getDefinition(UserFactory::class);
90 1
        $definition->setArgument('$userClass', $userClass);
91 1
92
        $definition = $container->getDefinition(ChangePasswordType::class);
93 1
        $definition->setArgument('$userClass', $userClass);
94 1
95 1
        $definition = $container->getDefinition(NewEmailAddressType::class);
96 1
        $definition->setArgument('$userClass', $userClass);
97
98
        $definition = $container->getDefinition(UserRegisterType::class);
99
        $definition->setArgument('$userClass', $userClass);
100
    }
101 1
102
    private function setMailerServiceArguments(ContainerBuilder $container, array $config): void
103 1
    {
104 1
        $definition = $container->getDefinition(UserMailer::class);
105
        $definition->setArgument('$context', [
106 1
            'website_name' => $config['website_name'],
107 1
        ]);
108
109 1
        $mapping = [
110 1
            PasswordChangedEmailFactory::class => 'password_changed',
111 1
            UserEnabledEmailFactory::class => 'user_enabled',
112
            UsernameChangedEmailFactory::class => 'username_changed',
113 1
            WelcomeEmailFactory::class => 'welcome',
114 1
        ];
115
        foreach ($mapping as $class => $key) {
116 1
            $definition = $container->getDefinition($class);
117
            $definition->setArgument('$subject', $config['user']['emails'][$key]['subject']);
118 1
            $definition->setArgument('$enabled', $config['user']['emails'][$key]['enabled']);
119 1
        }
120 1
121 1
        $mapping = [
122 1
            ChangeEmailVerificationEmailFactory::class => 'email_verification',
123 1
            PasswordResetEmailFactory::class => 'password_reset',
124 1
        ];
125 1
        foreach ($mapping as $class => $key) {
126 1
            $definition = $container->getDefinition($class);
127
            $definition->setArgument('$subject', $config['user'][$key]['email']['subject']);
128
            $definition->setArgument('$enabled', true);
129 1
            $definition->setArgument('$defaultRedirectPath', $config['user'][$key]['email']['default_redirect_path']);
130 1
            $definition->setArgument('$redirectPathQueryKey', $config['user'][$key]['email']['redirect_path_query']);
131 1
        }
132
    }
133 1
134 1
    /**
135
     * @throws Exception
136
     */
137
    private function loadServiceConfig(ContainerBuilder $container): void
138
    {
139
        $container->registerForAutoconfiguration(FormTypeInterface::class)
140
            ->addTag('silverback_api_component.form_type');
141
142
        $container->registerForAutoconfiguration(ComponentInterface::class)
143 1
            ->addTag('silverback_api_component.entity.component');
144
145
        $loader = new PhpFileLoader(
146
            $container,
147
            new FileLocator(__DIR__ . '/../Resources/config')
148
        );
149
        $loader->load('services.php');
150
    }
151
152
    public function prepend(ContainerBuilder $container): void
153
    {
154
        $configs = $container->getExtensionConfig($this->getAlias());
155
        $configuration = new Configuration();
156
        $config = $this->processConfiguration($configuration, $configs);
157
        $srcBase = __DIR__ . '/..';
158
        $configBasePath = $srcBase . '/Resources/config/api_platform';
159
        $mappingPaths = [$srcBase . '/Entity/Core'];
160 1
        foreach ($config['enabled_components'] as $key => $enabled_component) {
161 1
            if (true === $enabled_component) {
162 1
                $mappingPaths[] = sprintf('%s/%s.yaml', $configBasePath, $key);
163
            }
164 1
        }
165 1
        $websiteName = $config['website_name'];
166
        $container->prependExtensionConfig(
167 1
            'api_platform',
168
            [
169 1
                'title' => $websiteName,
170
                'description' => sprintf('API for %s', $websiteName),
171 1
                'collection' => [
172 1
                    'pagination' => [
173
                        'client_items_per_page' => true,
174
                        'items_per_page_parameter_name' => 'perPage',
175
                        'maximum_items_per_page' => 100,
176
                    ],
177
                ],
178
                'mapping' => [
179
                    'paths' => $mappingPaths,
180
                ],
181
                'swagger' => [
182 1
                    'api_keys' => [
183
                        'API Token' => [
184 1
                            'name' => 'X-AUTH-TOKEN',
185
                            'type' => 'header',
186 1
                        ],
187
                        'JWT (use prefix `Bearer`)' => [
188 1
                            'name' => 'Authorization',
189 1
                            'type' => 'header',
190 1
                        ],
191
                    ],
192
                ],
193 1
            ]
194 1
        );
195
196
        $bundles = $container->getParameter('kernel.bundles');
197
        if (isset($bundles['DoctrineBundle'])) {
198
            $this->prependDoctrineConfig($container);
199
        }
200 1
        if (isset($bundles['LiipImagineBundle'])) {
201 1
            $this->prependLiipConfig($container);
202
        }
203
    }
204
205
    private function prependDoctrineConfig(ContainerBuilder $container)
206
    {
207
        $container->prependExtensionConfig(
208
            'doctrine',
209
            [
210
                //                'orm' => [
211
                //                    'filters' => [
212
                //                        'publishable' => [
213
                //                            'class' => PublishableFilter::class,
214
                //                            'enabled' => false
215
                //                        ]
216
                //                    ]
217
                //                ]
218
            ]
219
        );
220
    }
221
222
    private function prependLiipConfig(ContainerBuilder $container)
223
    {
224
        $projectDir = $container->getParameter('kernel.project_dir');
225
        $uploadsDir = $projectDir . '/var/uploads';
226
        if (!@mkdir($uploadsDir) && !is_dir($uploadsDir)) {
227
            throw new RuntimeException(sprintf('Directory "%s" was not created', $uploadsDir));
228
        }
229
        $container->prependExtensionConfig(
230
            'liip_imagine',
231
            [
232
                'loaders' => [
233
                    'default' => [
234
                        'filesystem' => [
235
                            'data_root' => [
236
                                'uploads' => $uploadsDir,
237
                                'default' => $projectDir . '/public',
238
                            ],
239
                        ],
240
                    ],
241
                ],
242
                'filter_sets' => [
243
                    'placeholder_square' => [
244 1
                        'jpeg_quality' => 10,
245
                        'png_compression_level' => 9,
246
                        'filters' => [
247
                            'thumbnail' => [
248
                                'size' => [80, 80],
249
                                'mode' => 'outbound',
250
                            ],
251
                        ],
252
                    ],
253
                    'placeholder' => [
254
                        'jpeg_quality' => 10,
255
                        'png_compression_level' => 9,
256
                        'filters' => [
257
                            'thumbnail' => [
258
                                'size' => [100, 100],
259
                                'mode' => 'inset',
260
                            ],
261
                        ],
262
                    ],
263
                    'thumbnail' => [
264
                        'jpeg_quality' => 100,
265
                        'png_compression_level' => 0,
266
                        'filters' => [
267
                            'upscale' => [
268
                                'min' => [636, 636],
269
                            ],
270
                            'thumbnail' => [
271
                                'size' => [636, 636],
272
                                'mode' => 'inset',
273
                                'allow_upscale' => true,
274
                            ],
275
                        ],
276
                    ],
277
                ],
278
            ]
279
        );
280
    }
281
}
282