Passed
Push — master ( 59e25d...ea3d0c )
by
unknown
02:54
created

ApieConfigResolver::getResolver()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 40
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 32
c 1
b 0
f 0
nc 2
nop 0
dl 0
loc 40
rs 9.408
1
<?php
2
namespace W2w\Laravel\Apie\Providers;
3
4
use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
5
use Symfony\Component\OptionsResolver\Options;
6
use Symfony\Component\OptionsResolver\OptionsResolver;
7
use W2w\Lib\Apie\Annotations\ApiResource;
8
use W2w\Lib\Apie\Resources\ApiResourcesInterface;
9
10
class ApieConfigResolver
11
{
12
    private static $configResolver;
13
14
    public static function resolveConfig(array $config)
15
    {
16
        $resolver = self::getResolver();
17
        return $resolver->resolve($config);
18
    }
19
20
    private static function getResolver(): OptionsResolver
21
    {
22
        if (!self::$configResolver) {
23
            $resolver = new OptionsResolver();
24
            $defaults = require __DIR__ . '/../../config/apie.php';
25
            $resolver->setDefaults($defaults)
26
                ->setAllowedTypes('resources', ['string[]', ApiResourcesInterface::class])
27
                ->setAllowedTypes('resources-service', ['null', 'string'])
28
                ->setAllowedTypes('mock', ['null', 'bool'])
29
                ->setAllowedTypes('mock-skipped-resources', ['string[]'])
30
                ->setAllowedTypes('base-url', 'string')
31
                ->setAllowedTypes('api-url', 'string')
32
                ->setAllowedTypes('disable-routes', ['null', 'bool'])
33
                ->setAllowedTypes('swagger-ui-test-page', ['null', 'string'])
34
                ->setAllowedTypes('apie-middleware', 'string[]')
35
                ->setAllowedTypes('swagger-ui-test-page-middleware', 'string[]')
36
                ->setAllowedTypes('bind-api-resource-facade-response', 'bool')
37
                ->setAllowedTypes('metadata', 'string[]')
38
                ->setAllowedTypes('resource-config', [ApiResource::class . '[]', 'array[]']);
39
            $resolver->setDefault('metadata', function (OptionsResolver $metadataResolver) use (&$defaults) {
40
                $metadataResolver->setDefaults($defaults['metadata']);
41
42
                $urlNormalizer = function (Options $options, $value) {
43
                    if (empty($value)) {
44
                        return '';
45
                    }
46
                    return self::urlNormalize($value);
47
                };
48
                $metadataResolver->setNormalizer('terms-of-service', $urlNormalizer);
49
                $metadataResolver->setNormalizer('license-url', $urlNormalizer);
50
                $metadataResolver->setNormalizer('contact-url', $urlNormalizer);
51
            });
52
            $resolver->setNormalizer('resource-config', function (Options $options, $value) {
53
                return array_map(function ($field) {
54
                    return $field instanceof ApiResource ? $field : ApiResource::createFromArray($field);
55
                }, $value);
56
            });
57
            self::$configResolver = $resolver;
58
        }
59
        return self::$configResolver;
60
    }
61
62
    private static function urlNormalize($value)
63
    {
64
        if ('http://' !== substr($value, 0, 7) && 'https://' !== substr($value, 0, 8)) {
65
            $value = 'https://'.$value;
66
        }
67
        $parsedUrl = parse_url($value);
68
        if (empty($parsedUrl) || !in_array($parsedUrl['scheme'], ['http', 'https']) || !filter_var($value, FILTER_VALIDATE_URL)) {
69
            throw new InvalidOptionsException('"' . $value . '" is not a valid url');
70
        }
71
72
        return $value;
73
    }
74
}
75