diff options
Diffstat (limited to 'application/helper')
-rw-r--r-- | application/helper/ApplicationUtils.php | 16 | ||||
-rw-r--r-- | application/helper/DailyPageHelper.php | 84 |
2 files changed, 72 insertions, 28 deletions
diff --git a/application/helper/ApplicationUtils.php b/application/helper/ApplicationUtils.php index 212dd8e2..a6c03aae 100644 --- a/application/helper/ApplicationUtils.php +++ b/application/helper/ApplicationUtils.php | |||
@@ -3,6 +3,8 @@ | |||
3 | namespace Shaarli\Helper; | 3 | namespace Shaarli\Helper; |
4 | 4 | ||
5 | use Exception; | 5 | use Exception; |
6 | use malkusch\lock\exception\LockAcquireException; | ||
7 | use malkusch\lock\mutex\FlockMutex; | ||
6 | use Shaarli\Config\ConfigManager; | 8 | use Shaarli\Config\ConfigManager; |
7 | 9 | ||
8 | /** | 10 | /** |
@@ -252,6 +254,20 @@ class ApplicationUtils | |||
252 | return $errors; | 254 | return $errors; |
253 | } | 255 | } |
254 | 256 | ||
257 | public static function checkDatastoreMutex(): array | ||
258 | { | ||
259 | $mutex = new FlockMutex(fopen(SHAARLI_MUTEX_FILE, 'r'), 2); | ||
260 | try { | ||
261 | $mutex->synchronized(function () { | ||
262 | return true; | ||
263 | }); | ||
264 | } catch (LockAcquireException $e) { | ||
265 | $errors[] = t('Lock can not be acquired on the datastore. You might encounter concurrent access issues.'); | ||
266 | } | ||
267 | |||
268 | return $errors ?? []; | ||
269 | } | ||
270 | |||
255 | /** | 271 | /** |
256 | * Returns a salted hash representing the current Shaarli version. | 272 | * Returns a salted hash representing the current Shaarli version. |
257 | * | 273 | * |
diff --git a/application/helper/DailyPageHelper.php b/application/helper/DailyPageHelper.php index 5fabc907..05f95812 100644 --- a/application/helper/DailyPageHelper.php +++ b/application/helper/DailyPageHelper.php | |||
@@ -4,6 +4,9 @@ declare(strict_types=1); | |||
4 | 4 | ||
5 | namespace Shaarli\Helper; | 5 | namespace Shaarli\Helper; |
6 | 6 | ||
7 | use DatePeriod; | ||
8 | use DateTimeImmutable; | ||
9 | use Exception; | ||
7 | use Shaarli\Bookmark\Bookmark; | 10 | use Shaarli\Bookmark\Bookmark; |
8 | use Slim\Http\Request; | 11 | use Slim\Http\Request; |
9 | 12 | ||
@@ -40,31 +43,31 @@ class DailyPageHelper | |||
40 | * @param string|null $requestedDate Input string extracted from the request | 43 | * @param string|null $requestedDate Input string extracted from the request |
41 | * @param Bookmark|null $latestBookmark Latest bookmark found in the datastore (by date) | 44 | * @param Bookmark|null $latestBookmark Latest bookmark found in the datastore (by date) |
42 | * | 45 | * |
43 | * @return \DateTimeImmutable from input or latest bookmark. | 46 | * @return DateTimeImmutable from input or latest bookmark. |
44 | * | 47 | * |
45 | * @throws \Exception Type not supported. | 48 | * @throws Exception Type not supported. |
46 | */ | 49 | */ |
47 | public static function extractRequestedDateTime( | 50 | public static function extractRequestedDateTime( |
48 | string $type, | 51 | string $type, |
49 | ?string $requestedDate, | 52 | ?string $requestedDate, |
50 | Bookmark $latestBookmark = null | 53 | Bookmark $latestBookmark = null |
51 | ): \DateTimeImmutable { | 54 | ): DateTimeImmutable { |
52 | $format = static::getFormatByType($type); | 55 | $format = static::getFormatByType($type); |
53 | if (empty($requestedDate)) { | 56 | if (empty($requestedDate)) { |
54 | return $latestBookmark instanceof Bookmark | 57 | return $latestBookmark instanceof Bookmark |
55 | ? new \DateTimeImmutable($latestBookmark->getCreated()->format(\DateTime::ATOM)) | 58 | ? new DateTimeImmutable($latestBookmark->getCreated()->format(\DateTime::ATOM)) |
56 | : new \DateTimeImmutable() | 59 | : new DateTimeImmutable() |
57 | ; | 60 | ; |
58 | } | 61 | } |
59 | 62 | ||
60 | // W is not supported by createFromFormat... | 63 | // W is not supported by createFromFormat... |
61 | if ($type === static::WEEK) { | 64 | if ($type === static::WEEK) { |
62 | return (new \DateTimeImmutable()) | 65 | return (new DateTimeImmutable()) |
63 | ->setISODate((int) substr($requestedDate, 0, 4), (int) substr($requestedDate, 4, 2)) | 66 | ->setISODate((int) substr($requestedDate, 0, 4), (int) substr($requestedDate, 4, 2)) |
64 | ; | 67 | ; |
65 | } | 68 | } |
66 | 69 | ||
67 | return \DateTimeImmutable::createFromFormat($format, $requestedDate); | 70 | return DateTimeImmutable::createFromFormat($format, $requestedDate); |
68 | } | 71 | } |
69 | 72 | ||
70 | /** | 73 | /** |
@@ -80,7 +83,7 @@ class DailyPageHelper | |||
80 | * | 83 | * |
81 | * @see https://www.php.net/manual/en/datetime.format.php | 84 | * @see https://www.php.net/manual/en/datetime.format.php |
82 | * | 85 | * |
83 | * @throws \Exception Type not supported. | 86 | * @throws Exception Type not supported. |
84 | */ | 87 | */ |
85 | public static function getFormatByType(string $type): string | 88 | public static function getFormatByType(string $type): string |
86 | { | 89 | { |
@@ -92,7 +95,7 @@ class DailyPageHelper | |||
92 | case static::DAY: | 95 | case static::DAY: |
93 | return 'Ymd'; | 96 | return 'Ymd'; |
94 | default: | 97 | default: |
95 | throw new \Exception('Unsupported daily format type'); | 98 | throw new Exception('Unsupported daily format type'); |
96 | } | 99 | } |
97 | } | 100 | } |
98 | 101 | ||
@@ -102,14 +105,14 @@ class DailyPageHelper | |||
102 | * and we don't want to alter original datetime. | 105 | * and we don't want to alter original datetime. |
103 | * | 106 | * |
104 | * @param string $type month/week/day | 107 | * @param string $type month/week/day |
105 | * @param \DateTimeImmutable $requested DateTime extracted from request input | 108 | * @param DateTimeImmutable $requested DateTime extracted from request input |
106 | * (should come from extractRequestedDateTime) | 109 | * (should come from extractRequestedDateTime) |
107 | * | 110 | * |
108 | * @return \DateTimeInterface First DateTime of the time period | 111 | * @return \DateTimeInterface First DateTime of the time period |
109 | * | 112 | * |
110 | * @throws \Exception Type not supported. | 113 | * @throws Exception Type not supported. |
111 | */ | 114 | */ |
112 | public static function getStartDateTimeByType(string $type, \DateTimeImmutable $requested): \DateTimeInterface | 115 | public static function getStartDateTimeByType(string $type, DateTimeImmutable $requested): \DateTimeInterface |
113 | { | 116 | { |
114 | switch ($type) { | 117 | switch ($type) { |
115 | case static::MONTH: | 118 | case static::MONTH: |
@@ -119,7 +122,7 @@ class DailyPageHelper | |||
119 | case static::DAY: | 122 | case static::DAY: |
120 | return $requested->modify('Today midnight'); | 123 | return $requested->modify('Today midnight'); |
121 | default: | 124 | default: |
122 | throw new \Exception('Unsupported daily format type'); | 125 | throw new Exception('Unsupported daily format type'); |
123 | } | 126 | } |
124 | } | 127 | } |
125 | 128 | ||
@@ -129,14 +132,14 @@ class DailyPageHelper | |||
129 | * and we don't want to alter original datetime. | 132 | * and we don't want to alter original datetime. |
130 | * | 133 | * |
131 | * @param string $type month/week/day | 134 | * @param string $type month/week/day |
132 | * @param \DateTimeImmutable $requested DateTime extracted from request input | 135 | * @param DateTimeImmutable $requested DateTime extracted from request input |
133 | * (should come from extractRequestedDateTime) | 136 | * (should come from extractRequestedDateTime) |
134 | * | 137 | * |
135 | * @return \DateTimeInterface Last DateTime of the time period | 138 | * @return \DateTimeInterface Last DateTime of the time period |
136 | * | 139 | * |
137 | * @throws \Exception Type not supported. | 140 | * @throws Exception Type not supported. |
138 | */ | 141 | */ |
139 | public static function getEndDateTimeByType(string $type, \DateTimeImmutable $requested): \DateTimeInterface | 142 | public static function getEndDateTimeByType(string $type, DateTimeImmutable $requested): \DateTimeInterface |
140 | { | 143 | { |
141 | switch ($type) { | 144 | switch ($type) { |
142 | case static::MONTH: | 145 | case static::MONTH: |
@@ -146,7 +149,7 @@ class DailyPageHelper | |||
146 | case static::DAY: | 149 | case static::DAY: |
147 | return $requested->modify('Today 23:59:59'); | 150 | return $requested->modify('Today 23:59:59'); |
148 | default: | 151 | default: |
149 | throw new \Exception('Unsupported daily format type'); | 152 | throw new Exception('Unsupported daily format type'); |
150 | } | 153 | } |
151 | } | 154 | } |
152 | 155 | ||
@@ -154,16 +157,20 @@ class DailyPageHelper | |||
154 | * Get localized description of the time period depending on given datetime and type. | 157 | * Get localized description of the time period depending on given datetime and type. |
155 | * Example: for a month period, it returns `October, 2020`. | 158 | * Example: for a month period, it returns `October, 2020`. |
156 | * | 159 | * |
157 | * @param string $type month/week/day | 160 | * @param string $type month/week/day |
158 | * @param \DateTimeImmutable $requested DateTime extracted from request input | 161 | * @param \DateTimeImmutable $requested DateTime extracted from request input |
159 | * (should come from extractRequestedDateTime) | 162 | * (should come from extractRequestedDateTime) |
163 | * @param bool $includeRelative Include relative date description (today, yesterday, etc.) | ||
160 | * | 164 | * |
161 | * @return string Localized time period description | 165 | * @return string Localized time period description |
162 | * | 166 | * |
163 | * @throws \Exception Type not supported. | 167 | * @throws Exception Type not supported. |
164 | */ | 168 | */ |
165 | public static function getDescriptionByType(string $type, \DateTimeImmutable $requested): string | 169 | public static function getDescriptionByType( |
166 | { | 170 | string $type, |
171 | \DateTimeImmutable $requested, | ||
172 | bool $includeRelative = true | ||
173 | ): string { | ||
167 | switch ($type) { | 174 | switch ($type) { |
168 | case static::MONTH: | 175 | case static::MONTH: |
169 | return $requested->format('F') . ', ' . $requested->format('Y'); | 176 | return $requested->format('F') . ', ' . $requested->format('Y'); |
@@ -172,14 +179,14 @@ class DailyPageHelper | |||
172 | return t('Week') . ' ' . $requested->format('W') . ' (' . format_date($requested, false) . ')'; | 179 | return t('Week') . ' ' . $requested->format('W') . ' (' . format_date($requested, false) . ')'; |
173 | case static::DAY: | 180 | case static::DAY: |
174 | $out = ''; | 181 | $out = ''; |
175 | if ($requested->format('Ymd') === date('Ymd')) { | 182 | if ($includeRelative && $requested->format('Ymd') === date('Ymd')) { |
176 | $out = t('Today') . ' - '; | 183 | $out = t('Today') . ' - '; |
177 | } elseif ($requested->format('Ymd') === date('Ymd', strtotime('-1 days'))) { | 184 | } elseif ($includeRelative && $requested->format('Ymd') === date('Ymd', strtotime('-1 days'))) { |
178 | $out = t('Yesterday') . ' - '; | 185 | $out = t('Yesterday') . ' - '; |
179 | } | 186 | } |
180 | return $out . format_date($requested, false); | 187 | return $out . format_date($requested, false); |
181 | default: | 188 | default: |
182 | throw new \Exception('Unsupported daily format type'); | 189 | throw new Exception('Unsupported daily format type'); |
183 | } | 190 | } |
184 | } | 191 | } |
185 | 192 | ||
@@ -190,7 +197,7 @@ class DailyPageHelper | |||
190 | * | 197 | * |
191 | * @return int number of elements | 198 | * @return int number of elements |
192 | * | 199 | * |
193 | * @throws \Exception Type not supported. | 200 | * @throws Exception Type not supported. |
194 | */ | 201 | */ |
195 | public static function getRssLengthByType(string $type): int | 202 | public static function getRssLengthByType(string $type): int |
196 | { | 203 | { |
@@ -202,7 +209,28 @@ class DailyPageHelper | |||
202 | case static::DAY: | 209 | case static::DAY: |
203 | return 30; // ~1 month | 210 | return 30; // ~1 month |
204 | default: | 211 | default: |
205 | throw new \Exception('Unsupported daily format type'); | 212 | throw new Exception('Unsupported daily format type'); |
206 | } | 213 | } |
207 | } | 214 | } |
215 | |||
216 | /** | ||
217 | * Get the number of items to display in the RSS feed depending on the given type. | ||
218 | * | ||
219 | * @param string $type month/week/day | ||
220 | * @param ?DateTimeImmutable $requested Currently only used for UT | ||
221 | * | ||
222 | * @return DatePeriod number of elements | ||
223 | * | ||
224 | * @throws Exception Type not supported. | ||
225 | */ | ||
226 | public static function getCacheDatePeriodByType(string $type, DateTimeImmutable $requested = null): DatePeriod | ||
227 | { | ||
228 | $requested = $requested ?? new DateTimeImmutable(); | ||
229 | |||
230 | return new DatePeriod( | ||
231 | static::getStartDateTimeByType($type, $requested), | ||
232 | new \DateInterval('P1D'), | ||
233 | static::getEndDateTimeByType($type, $requested) | ||
234 | ); | ||
235 | } | ||
208 | } | 236 | } |