MigrateUserFieldsTask   A
last analyzed

Complexity

Total Complexity 21

Size/Duplication

Total Lines 158
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 11

Importance

Changes 0
Metric Value
wmc 21
lcom 1
cbo 11
dl 0
loc 158
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A run() 0 16 3
A migrateFields() 0 8 3
A findOrMakeUserFieldFor() 0 31 5
A findOrMakeUserOptionFor() 0 12 2
A mapFieldType() 0 17 3
A migrateValues() 0 9 1
A getUserFields() 0 4 2
A getUserFieldOption() 0 4 2
1
<?php
2
/**
3
 * MigrateUserFieldsTask.php
4
 *
5
 * @author Bram de Leeuw
6
 * Date: 22/06/17
7
 */
8
9
namespace Broarm\EventTickets;
10
11
use BuildTask;
12
use DB;
13
use Director;
14
15
/**
16
 * Class MigrateUserFieldsTask
17
 * Migrate the attendee fields to new user fields
18
 *
19
 * @package Broarm\EventTickets
20
 */
21
class MigrateUserFieldsTask extends BuildTask
22
{
23
    protected $title = 'Migrate user fields task';
24
25
    protected $description = 'Migrate the AttendeeExtraFields to the new UserFields';
26
27
    protected $userFields;
28
    protected $userFieldOption;
29
30
    /**
31
     * @param \SS_HTTPRequest $request
32
     */
33
    public function run($request)
34
    {
35
        if (!Director::is_cli()) {
36
            echo '<pre>';
37
        }
38
39
        echo "Start user field migration\n\n";
40
41
        $this->migrateValues();
42
        $this->migrateFields();
43
44
        echo "Finished user field migration task \n";
45
        if (!Director::is_cli()) {
46
            echo '</pre>';
47
        }
48
    }
49
50
    /**
51
     * Migrate the AttendeeExtraFields to UserFields
52
     */
53
    private function migrateFields()
54
    {
55
        if ($attendeeFields = AttendeeExtraField::get()) {
56
            foreach ($attendeeFields as $attendeeField) {
57
                $this->findOrMakeUserFieldFor($attendeeField);
58
            }
59
        }
60
    }
61
62
    /**
63
     * Make a new UserField based on the given AttendeeExtraField
64
     *
65
     * @param AttendeeExtraField $attendeeField
66
     */
67
    private function findOrMakeUserFieldFor(AttendeeExtraField $attendeeField)
68
    {
69
        if (!$field = $this->getUserFields()->byID($attendeeField->ID)) {
70
            /** @var UserField $field */
71
            $class = self::mapFieldType($attendeeField->FieldType, $attendeeField->FieldName);
72
            $field = $class::create();
73
        }
74
75
        $field->ClassName = self::mapFieldType($attendeeField->FieldType, $attendeeField->FieldName);
76
        $field->ID = $attendeeField->ID;
77
        $field->Name = $attendeeField->FieldName;
78
        $field->Title = $attendeeField->Title;
79
        $field->Default = $attendeeField->DefaultValue;
80
        $field->ExtraClass = $attendeeField->ExtraClass;
81
        $field->Required = $attendeeField->Required;
82
        $field->Editable = $attendeeField->Editable;
83
        $field->EventID = $attendeeField->EventID;
84
        $field->Sort = $attendeeField->Sort;
85
86
        if ($attendeeField->Options()->exists() && $field->ClassName === 'UserOptionSetField') {
87
            /** @var \UserOptionSetField $field */
88
            /** @var AttendeeExtraFieldOption $attendeeOption */
89
            foreach ($attendeeField->Options() as $option) {
90
                $field->Options()->add($this->findOrMakeUserOptionFor($option));
91
                echo "[{$field->ID}] Added AttendeeExtraFieldOption as UserFieldOption\n";
92
            }
93
        }
94
95
        $field->write();
96
        echo "[{$field->ID}] Migrated AttendeeExtraField to $field->ClassName\n";
97
    }
98
99
    /**
100
     * Find or make an option based on the given AttendeeExtraFieldOption
101
     *
102
     * @param AttendeeExtraFieldOption $attendeeOption
103
     *
104
     * @return \DataObject|UserFieldOption
105
     */
106
    private function findOrMakeUserOptionFor(AttendeeExtraFieldOption $attendeeOption)
107
    {
108
        if (!$option = $this->getUserFieldOption()->byID($attendeeOption->ID)) {
109
            $option = UserFieldOption::create();
110
        }
111
112
        $option->ID = $attendeeOption->ID;
113
        $option->Title = $attendeeOption->Title;
114
        $option->Default = $attendeeOption->Default;
115
        $option->Sort = $attendeeOption->Sort;
116
        return $option;
117
    }
118
119
    /**
120
     * Map the given field type to one of the available class names
121
     * Also looks into the current mapping if the field has a new type
122
     *
123
     * @param      $type
124
     * @param null $name
125
     *
126
     * @return string
127
     */
128
    private static function mapFieldType($type, $name = null)
129
    {
130
        $types = array(
131
            'TextField' => 'UserTextField',
132
            'EmailField' => 'UserEmailField',
133
            'CheckboxField' => 'UserCheckboxField',
134
            'OptionsetField' => 'UserOptionSetField'
135
        );
136
137
        $currentDefaults = Attendee::config()->get('default_fields');
138
        if ($currentDefaults && key_exists($name, $currentDefaults)) {
139
            return $currentDefaults[$name]['FieldType'];
140
        } else {
141
            return $types[$type];
142
        }
143
144
    }
145
146
    /**
147
     * Migrate the set values
148
     */
149
    public function migrateValues()
150
    {
151
        DB::query("
152
           UPDATE `Broarm\EventTickets\Attendee_Fields`
153
            SET `Broarm\EventTickets\UserFieldID` = `Broarm\EventTickets\AttendeeExtraFieldID`
154
        ");
155
156
        echo "\nMigrated the set values\n\n";
157
    }
158
159
    /**
160
     * Get and store the user fields list
161
     *
162
     * @return \DataList
163
     */
164
    private function getUserFields()
165
    {
166
        return $this->userFields ? $this->userFields : UserField::get();
167
    }
168
169
    /**
170
     * Get and store the User field options
171
     *
172
     * @return \DataList
173
     */
174
    private function getUserFieldOption()
175
    {
176
        return $this->userFieldOption ? $this->userFieldOption : UserFieldOption::get();
177
    }
178
}
179