xref: /plugin/combo/ComboStrap/Meta/Api/MetadataDateTime.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau
4*04fd306cSNickeaunamespace ComboStrap\Meta\Api;
5*04fd306cSNickeau
6*04fd306cSNickeau
7*04fd306cSNickeauuse ComboStrap\DataType;
8*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
9*04fd306cSNickeauuse ComboStrap\ExceptionBadSyntax;
10*04fd306cSNickeauuse ComboStrap\ExceptionCompile;
11*04fd306cSNickeauuse ComboStrap\ExceptionNotFound;
12*04fd306cSNickeauuse ComboStrap\ExceptionRuntime;
13*04fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal;
14*04fd306cSNickeauuse ComboStrap\Iso8601Date;
15*04fd306cSNickeauuse ComboStrap\LogUtility;
16*04fd306cSNickeauuse DateTime;
17*04fd306cSNickeau
18*04fd306cSNickeauabstract class MetadataDateTime extends Metadata
19*04fd306cSNickeau{
20*04fd306cSNickeau
21*04fd306cSNickeau    /**
22*04fd306cSNickeau     * @var DateTime|null
23*04fd306cSNickeau     * may be null as this is a stored value
24*04fd306cSNickeau     * but throw a not found exception when the value is null
25*04fd306cSNickeau     */
26*04fd306cSNickeau    protected ?DateTime $dateTimeValue = null;
27*04fd306cSNickeau
28*04fd306cSNickeau
29*04fd306cSNickeau    /**
30*04fd306cSNickeau     * Helper function for date metadata
31*04fd306cSNickeau     * @return string|array (may be an array for dokuwiki ie {@link CreationDate::toStoreValue()} for instance
32*04fd306cSNickeau     */
33*04fd306cSNickeau    public function toStoreValue()
34*04fd306cSNickeau    {
35*04fd306cSNickeau
36*04fd306cSNickeau        $this->buildCheck();
37*04fd306cSNickeau        try {
38*04fd306cSNickeau            $value = $this->getValue();
39*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
40*04fd306cSNickeau            return null;
41*04fd306cSNickeau        }
42*04fd306cSNickeau        try {
43*04fd306cSNickeau            return $this->toPersistentDateTimeUtility($value);
44*04fd306cSNickeau        } catch (ExceptionBadArgument $e) {
45*04fd306cSNickeau            throw ExceptionRuntimeInternal::withMessageAndError("The date time should have been checked on set. This error should not happen", $e);
46*04fd306cSNickeau        }
47*04fd306cSNickeau
48*04fd306cSNickeau    }
49*04fd306cSNickeau
50*04fd306cSNickeau    /**
51*04fd306cSNickeau     * @param DateTime|null $value
52*04fd306cSNickeau     * @return $this
53*04fd306cSNickeau     */
54*04fd306cSNickeau    public function setValue($value): Metadata
55*04fd306cSNickeau    {
56*04fd306cSNickeau        if ($value === null) {
57*04fd306cSNickeau            $this->dateTimeValue = null;
58*04fd306cSNickeau            return $this;
59*04fd306cSNickeau        }
60*04fd306cSNickeau        if (!($value instanceof DateTime)) {
61*04fd306cSNickeau            throw new ExceptionRuntime("The value is not a date time. Value: " . var_export($value, true));
62*04fd306cSNickeau        }
63*04fd306cSNickeau        $this->dateTimeValue = $value;
64*04fd306cSNickeau        return $this;
65*04fd306cSNickeau    }
66*04fd306cSNickeau
67*04fd306cSNickeau    /**
68*04fd306cSNickeau     * @throws ExceptionCompile
69*04fd306cSNickeau     */
70*04fd306cSNickeau    public function setFromStoreValue($value): Metadata
71*04fd306cSNickeau    {
72*04fd306cSNickeau        return $this->setValue($this->fromPersistentDateTimeUtility($value));
73*04fd306cSNickeau    }
74*04fd306cSNickeau
75*04fd306cSNickeau
76*04fd306cSNickeau    public function toStoreDefaultValue(): ?string
77*04fd306cSNickeau    {
78*04fd306cSNickeau
79*04fd306cSNickeau        try {
80*04fd306cSNickeau            $defaultValue = $this->getDefaultValue();
81*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
82*04fd306cSNickeau            return null;
83*04fd306cSNickeau        }
84*04fd306cSNickeau        try {
85*04fd306cSNickeau            return $this->toPersistentDateTimeUtility($defaultValue);
86*04fd306cSNickeau        } catch (ExceptionBadArgument $e) {
87*04fd306cSNickeau            $message = "The date time ($this) has a default value ($defaultValue) that is not valid. Error: {$e->getMessage()}";
88*04fd306cSNickeau            LogUtility::internalError($message);
89*04fd306cSNickeau            return null;
90*04fd306cSNickeau        }
91*04fd306cSNickeau
92*04fd306cSNickeau    }
93*04fd306cSNickeau
94*04fd306cSNickeau    public static function getDataType(): string
95*04fd306cSNickeau    {
96*04fd306cSNickeau        return DataType::DATETIME_TYPE_VALUE;
97*04fd306cSNickeau    }
98*04fd306cSNickeau
99*04fd306cSNickeau
100*04fd306cSNickeau    public function buildFromReadStore(): MetadataDateTime
101*04fd306cSNickeau    {
102*04fd306cSNickeau        $value = $this->getReadStore()->get($this);
103*04fd306cSNickeau        try {
104*04fd306cSNickeau            $this->dateTimeValue = $this->fromPersistentDateTimeUtility($value);
105*04fd306cSNickeau        } catch (ExceptionCompile $e) {
106*04fd306cSNickeau            LogUtility::msg($e->getMessage(), $this->getCanonical());
107*04fd306cSNickeau        }
108*04fd306cSNickeau        return $this;
109*04fd306cSNickeau    }
110*04fd306cSNickeau
111*04fd306cSNickeau    /**
112*04fd306cSNickeau     * @throws ExceptionBadSyntax - if the string is not a date string
113*04fd306cSNickeau     * @throws ExceptionBadArgument - if this is not a string
114*04fd306cSNickeau     */
115*04fd306cSNickeau    protected function fromPersistentDateTimeUtility($value)
116*04fd306cSNickeau    {
117*04fd306cSNickeau        if ($value === null || $value === "") {
118*04fd306cSNickeau            return null;
119*04fd306cSNickeau        }
120*04fd306cSNickeau        if (!is_string($value)) {
121*04fd306cSNickeau            throw new ExceptionBadArgument("This is not a string value");
122*04fd306cSNickeau        }
123*04fd306cSNickeau        return Iso8601Date::createFromString($value)->getDateTime();
124*04fd306cSNickeau    }
125*04fd306cSNickeau
126*04fd306cSNickeau    /**
127*04fd306cSNickeau     * @throws ExceptionNotFound
128*04fd306cSNickeau     */
129*04fd306cSNickeau    public function getValue(): DateTime
130*04fd306cSNickeau    {
131*04fd306cSNickeau        $this->buildCheck();
132*04fd306cSNickeau        if ($this->dateTimeValue === null) {
133*04fd306cSNickeau            throw new ExceptionNotFound("The resource does not have this date time ($this)");
134*04fd306cSNickeau        }
135*04fd306cSNickeau        return $this->dateTimeValue;
136*04fd306cSNickeau    }
137*04fd306cSNickeau
138*04fd306cSNickeau
139*04fd306cSNickeau    /**
140*04fd306cSNickeau     * @throws ExceptionBadArgument - if the value is not valid
141*04fd306cSNickeau     */
142*04fd306cSNickeau    private function toPersistentDateTimeUtility($value): string
143*04fd306cSNickeau    {
144*04fd306cSNickeau        if ($value === null) {
145*04fd306cSNickeau            throw new ExceptionBadArgument("The passed value is null");
146*04fd306cSNickeau        }
147*04fd306cSNickeau        if (!($value instanceof DateTime)) {
148*04fd306cSNickeau            throw new ExceptionBadArgument("This is not a date time");
149*04fd306cSNickeau        }
150*04fd306cSNickeau        return Iso8601Date::createFromDateTime($value)->toString();
151*04fd306cSNickeau    }
152*04fd306cSNickeau
153*04fd306cSNickeau    public static function getCanonical(): string
154*04fd306cSNickeau    {
155*04fd306cSNickeau        return "date";
156*04fd306cSNickeau    }
157*04fd306cSNickeau
158*04fd306cSNickeau    public function valueIsNotNull(): bool
159*04fd306cSNickeau    {
160*04fd306cSNickeau        return $this->dateTimeValue !== null;
161*04fd306cSNickeau    }
162*04fd306cSNickeau
163*04fd306cSNickeau    public function setFromStoreValueWithoutException($value): Metadata
164*04fd306cSNickeau    {
165*04fd306cSNickeau        try {
166*04fd306cSNickeau            $this->dateTimeValue = $this->fromPersistentDateTimeUtility($value);
167*04fd306cSNickeau        } catch (ExceptionCompile $e) {
168*04fd306cSNickeau            LogUtility::msg($e->getMessage(), LogUtility::LVL_MSG_ERROR, $e->getCanonical());
169*04fd306cSNickeau        }
170*04fd306cSNickeau        return $this;
171*04fd306cSNickeau    }
172*04fd306cSNickeau
173*04fd306cSNickeau
174*04fd306cSNickeau}
175