Completed
Push — master ( 1ad7db...177e73 )
by Joschi
02:33
created

SystemProperties::getId()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
/**
4
 * apparat-object
5
 *
6
 * @category    Apparat
7
 * @package     Apparat\Object
8
 * @subpackage  Apparat\Object\Application
9
 * @author      Joschi Kuphal <[email protected]> / @jkphl
10
 * @copyright   Copyright © 2016 Joschi Kuphal <[email protected]> / @jkphl
11
 * @license     http://opensource.org/licenses/MIT The MIT License (MIT)
12
 */
13
14
/***********************************************************************************
15
 *  The MIT License (MIT)
16
 *
17
 *  Copyright © 2016 Joschi Kuphal <[email protected]> / @jkphl
18
 *
19
 *  Permission is hereby granted, free of charge, to any person obtaining a copy of
20
 *  this software and associated documentation files (the "Software"), to deal in
21
 *  the Software without restriction, including without limitation the rights to
22
 *  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
23
 *  the Software, and to permit persons to whom the Software is furnished to do so,
24
 *  subject to the following conditions:
25
 *
26
 *  The above copyright notice and this permission notice shall be included in all
27
 *  copies or substantial portions of the Software.
28
 *
29
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
31
 *  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
32
 *  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
33
 *  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
34
 *  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35
 ***********************************************************************************/
36
37
namespace Apparat\Object\Domain\Model\Properties;
38
39
use Apparat\Object\Domain\Model\Object\Id;
40
use Apparat\Object\Domain\Model\Object\ObjectInterface;
41
use Apparat\Object\Domain\Model\Object\Revision;
42
use Apparat\Object\Domain\Model\Object\RuntimeException;
43
use Apparat\Object\Domain\Model\Object\Type;
44
45
/**
46
 * Object system properties collection
47
 *
48
 * In general, the system properties are used as read-only collection, with one exception: Draft objects don't have the
49
 * `published` property set, so there's a {@link publish()} method for advancing an object's state.
50
 *
51
 * @package Apparat\Object
52
 * @subpackage Apparat\Object\Application
53
 */
54
class SystemProperties extends AbstractProperties
55
{
56
    /**
57
     * Collection name
58
     *
59
     * @var string
60
     */
61
    const COLLECTION = 'system';
62
    /**
63
     * ID property
64
     *
65
     * @var string
66
     */
67
    const PROPERTY_ID = 'id';
68
    /**
69
     * Type property
70
     *
71
     * @var string
72
     */
73
    const PROPERTY_TYPE = 'type';
74
    /**
75
     * Revision property
76
     *
77
     * @var string
78
     */
79
    const PROPERTY_REVISION = 'revision';
80
    /**
81
     * Created property
82
     *
83
     * @var string
84
     */
85
    const PROPERTY_CREATED = 'created';
86
    /**
87
     * Published property
88
     *
89
     * @var string
90
     */
91
    const PROPERTY_PUBLISHED = 'published';
92
    /**
93
     * Hash property
94
     *
95
     * @var string
96
     */
97
    const PROPERTY_HASH = 'hash';
98
    /**
99
     * Object ID (constant throughout revisions)
100
     *
101
     * @var Id
102
     */
103
    protected $uid = null;
104
    /**
105
     * Object type (constant throughout revisions)
106
     *
107
     * @var Type
108
     */
109
    protected $type = null;
110
    /**
111
     * Object revision
112
     *
113
     * @var Revision
114
     */
115
    protected $revision = null;
116
    /**
117
     * Creation date of this revision
118
     *
119
     * @var \DateTimeImmutable
120
     */
121
    protected $created = null;
122
    /**
123
     * Publication date of this revision
124
     *
125
     * @var \DateTimeImmutable
126
     */
127
    protected $published = null;
128
    /**
129
     * Object hash of this revision
130
     *
131
     * @var string
132
     */
133
    protected $hash = '';
134
135
    /*******************************************************************************
136
     * PUBLIC METHODS
137
     *******************************************************************************/
138
139
    /**
140
     * System properties constructor
141
     *
142
     * @param array $data Property data
143
     * @param ObjectInterface $object Owner object
144
     */
145 9
    public function __construct(array $data, ObjectInterface $object)
146
    {
147 9
        parent::__construct($data, $object);
148
149
        // Initialize the object ID
150 9
        if (array_key_exists(self::PROPERTY_ID, $data)) {
151 7
            $this->uid = Id::unserialize($data[self::PROPERTY_ID]);
152 7
        }
153
154
        // Initialize the object type
155 9
        if (array_key_exists(self::PROPERTY_TYPE, $data)) {
156 8
            $this->type = Type::unserialize($data[self::PROPERTY_TYPE]);
157 7
        }
158
159
        // Initialize the object revision
160 8
        if (array_key_exists(self::PROPERTY_REVISION, $data)) {
161 7
            $this->revision = Revision::unserialize($data[self::PROPERTY_REVISION]);
162 7
        }
163
164
        // Initialize the object creation date
165 8
        if (array_key_exists(self::PROPERTY_CREATED, $data)) {
166 7
            $this->created = new \DateTimeImmutable('@'.$data[self::PROPERTY_CREATED]);
167 7
        }
168
169
        // Initialize the object publication date
170 8
        if (array_key_exists(self::PROPERTY_PUBLISHED, $data)) {
171 2
            $this->published = new \DateTimeImmutable('@'.$data[self::PROPERTY_PUBLISHED]);
172 2
        }
173
174
        // Initialize the object hash
175 8
        if (array_key_exists(self::PROPERTY_HASH, $data)) {
176 6
            $this->hash = $data[self::PROPERTY_HASH];
177 6
        }
178
179
        // Test if all mandatory properties are set
180
        if (
181 8
            !($this->uid instanceof Id)
182 8
            || !($this->type instanceof Type)
183 7
            || !($this->revision instanceof Revision)
184 7
            || !($this->created instanceof \DateTimeImmutable)
185
//            || !$this->hasValidHash()
186 8
        ) {
187 1
            throw new InvalidArgumentException(
188 1
                'Invalid system properties',
189
                InvalidArgumentException::INVALID_SYSTEM_PROPERTIES
190 1
            );
191
        }
192 7
    }
193
194
    /**
195
     * Test if the object hash is a valid sha1 value
196
     *
197
     * @return bool The object hash is a valid sha1 value
198
     */
199
    protected function hasValidHash()
200
    {
201
        return preg_match('%[a-fA-F0-9]{40}%', $this->hash);
202
    }
203
204
    /**
205
     * Return the object ID
206
     *
207
     * @return Id Object ID
208
     */
209 5
    public function getId()
210
    {
211 5
        return $this->uid;
212
    }
213
214
    /**
215
     * Return the object type
216
     *
217
     * @return Type Object type
218
     */
219 1
    public function getType()
220
    {
221 1
        return $this->type;
222
    }
223
224
    /**
225
     * Return the object revision
226
     *
227
     * @return Revision Object revision
228
     */
229 1
    public function getRevision()
230
    {
231 1
        return $this->revision;
232
    }
233
234
    /**
235
     * Return the creation date & time of this revision
236
     *
237
     * @return \DateTimeImmutable Creation date & time
238
     */
239 1
    public function getCreated()
240
    {
241 1
        return $this->created;
242
    }
243
244
    /**
245
     * Return the publication date & time of this revision
246
     *
247
     * @return \DateTimeImmutable Publication date & time
248
     */
249 1
    public function getPublished()
250
    {
251 1
        return $this->published;
252
    }
253
254
    /**
255
     * Return the object hash of this revision
256
     *
257
     * @return string Object hash
258
     */
259 1
    public function getHash()
260
    {
261 1
        return $this->hash;
262
    }
263
264
    /**
265
     * Indicate that the object got published
266
     *
267
     * @return SystemProperties System properties
268
     * @throws RuntimeException If the object is already published
269
     */
270 1
    public function publish()
271
    {
272
273
        // If the object is already published
274 1
        if ($this->published instanceof \DateTimeImmutable) {
275 1
            throw new RuntimeException(
276 1
                'Cannot republish object previously published at '.$this->published->format('c'),
277
                RuntimeException::CANNOT_REPUBLISH_OBJECT
278 1
            );
279
        }
280
281 1
        $systemProperties = clone $this;
282 1
        $systemProperties->published = new \DateTimeImmutable();
283 1
        return $systemProperties;
284
    }
285
286
    /*******************************************************************************
287
     * PRIVATE METHODS
288
     *******************************************************************************/
289
290
    /**
291
     * Return the property values as array
292
     *
293
     * @return array Property values
294
     */
295 1
    public function toArray()
296
    {
297 1
        return array_filter([
298 1
            self::PROPERTY_ID => $this->uid->getId(),
299 1
            self::PROPERTY_TYPE => $this->type->getType(),
300 1
            self::PROPERTY_REVISION => $this->revision->getRevision(),
301 1
            self::PROPERTY_CREATED => $this->created->format('c'),
302 1
            self::PROPERTY_PUBLISHED => $this->published->format('c'),
303 1
            self::PROPERTY_HASH => $this->hash,
304 1
        ]);
305
    }
306
}
307