Issues (2)

src/Extensions/UUIDExtension.php (2 issues)

1
<?php
2
3
namespace Sunnysideup\UUDI\Extensions;
4
5
use SilverStripe\CMS\Model\SiteTree;
0 ignored issues
show
The type SilverStripe\CMS\Model\SiteTree was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
6
use SilverStripe\Core\Config\Config;
7
use SilverStripe\Forms\CheckboxField;
8
use SilverStripe\Forms\FieldList;
9
use SilverStripe\Forms\ReadonlyField;
10
use SilverStripe\ORM\DataExtension;
11
use SilverStripe\ORM\DataObject;
12
use Sunnysideup\UUDI\Api\HashCreator;
13
14
/**
15
 * Class \Sunnysideup\UUDI\Extensions\UUIDExtension.
16
 *
17
 * @property string $UUID
18
 * @property string $PublicUUID
19
 */
20
class UUIDExtension extends DataExtension
21
{
22
    private static $db = [
23
        'RequiresUUID' => 'Boolean(0)',
24
        'UUID' => 'Varchar(65)', //32 + 1 + 32
25
        'PublicUUID' => 'Varchar(12)',
26
    ];
27
28
    private static $indexes = [
29
        'RequiresUUID' => true,
30
        'UUID' => false,
31
        'PublicUUID' => true,
32
    ];
33
34
    private $UUIDNeverAgainRaceCondition = false;
35
36
    public function onBeforeWrite()
37
    {
38
        $owner = $this->getOwner();
39
        if ($this->requiresUUID()) {
40
            if (! $owner->UUID) {
41
                $owner->UUID = $this->getHashID();
42
            }
43
        } else {
44
            $this->UUIDNeverAgainRaceCondition = true;
45
            $owner->UUID = '';
46
        }
47
        if (! $owner->PublicUUID || 'ERROR' === $owner->PublicUUID) {
48
            $owner->PublicUUID = $this->calculatePublicUUID();
49
        }
50
    }
51
52
    public function onAfterWrite()
53
    {
54
        $owner = $this->getOwner();
55
        if (! $owner->PublicUUID && false === $this->UUIDNeverAgainRaceCondition) {
56
            $this->UUIDNeverAgainRaceCondition = true;
57
            $owner->write();
58
        }
59
    }
60
61
    public function calculatePublicUUID(?int $length = 12): string
62
    {
63
        return HashCreator::generate_hash($length);
0 ignored issues
show
It seems like $length can also be of type null; however, parameter $length of Sunnysideup\UUDI\Api\HashCreator::generate_hash() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

63
        return HashCreator::generate_hash(/** @scrutinizer ignore-type */ $length);
Loading history...
64
    }
65
66
    public function updateCMSFields(FieldList $fields)
67
    {
68
        $owner = $this->owner;
69
        if (! ($owner instanceof SiteTree)) {
70
            $this->updateCMSFieldsForHashId($fields);
71
        }
72
    }
73
74
    public function updateSettingsFields(FieldList $fields)
75
    {
76
        $owner = $this->owner;
77
        if ($owner instanceof SiteTree) {
78
            $this->updateCMSFieldsForHashId($fields);
79
        }
80
    }
81
82
    public function updateCMSFieldsForHashId(FieldList $fields)
83
    {
84
        /** @var DataObject $owner */
85
        $owner = $this->owner;
86
        $fields->removeByName(
87
            [
88
                'RequiresUUID',
89
                'UUID',
90
                'PublicUUID',
91
            ]
92
        );
93
        if ($owner->hasMethod('ShowUUIDInCMS')) {
94
            $tab = 'Root.UUID';
95
            if ($owner->hasMethod('UUIDTabInCMS')) {
96
                $tab = $owner->UUIDTabInCMS();
97
            }
98
99
            $fields->addFieldsToTab(
100
                $tab,
101
                [
102
                    // ReadonlyField::create('MyUUID', 'Private UUID', $owner->UUID),
103
                    CheckboxField::create('RequiresUUID', _t('UUIDExtension.RequiresUUID', 'Hash Public UUID'), $owner->PublicUUID)->performDisabledTransformation,
104
                    ReadonlyField::create('MyPublicUUID', _t('UUIDExtension.PublicUUID', 'Public UUID'), $owner->PublicUUID),
105
                ]
106
            );
107
        }
108
    }
109
110
    /**
111
     * Gets a truly unique identifier to the classname and ID.
112
     */
113
    protected function getHashID(): ?string
114
    {
115
116
        $owner = $this->getOwner();
117
        if ($owner->ID) {
118
            return HashCreator::create_hash_id($owner->ClassName, $owner->ID) . '_' . HashCreator::generate_hash(32);
119
        }
120
121
        return '';
122
    }
123
124
    protected function requiresUUID(): bool
125
    {
126
        $owner = $this->getOwner();
127
        return $owner->RequiresUUID ||
128
            Config::inst()->get(HashCreator::class, 'always_require_uuid') ||
129
            Config::inst()->get($owner->ClassName, 'always_require_uuid');
130
    }
131
}
132