Skip to content

Commit 343c2b6

Browse files
committed
[TASK] Better handle file rename in web hook
1 parent f6c34e4 commit 343c2b6

1 file changed

Lines changed: 41 additions & 31 deletions

File tree

Classes/Controller/CloudinaryWebHookController.php

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -100,19 +100,37 @@ public function processAction(): ResponseInterface
100100

101101
foreach ($publicIds as $publicId) {
102102

103-
self::getLogger()->warning($publicId, ['asdf']);
104-
105103
if ($requestType === self::NOTIFICATION_TYPE_DELETE) {
106104
if (strpos($publicId, '_processed_') === null) {
107105
$message = sprintf('Deleted file "%s", this should not happen. A file is going to be missing.', $publicId);
106+
self::getLogger()->warning($message);
108107
} else {
109-
$message = sprintf('Processed file deleted "%s". Nothing to do, stopping here...', $publicId);
108+
$message = 'Processed file deleted. Nothing to do, stopping here...';
110109
}
111-
self::getLogger()->warning($message);
112-
continue;
113-
}
114110

115-
$cloudinaryResource = $this->getCloudinaryResource($publicId);
111+
// early return
112+
return $this->sendResponse(['result' => 'ok', 'message' => $message]);
113+
114+
} elseif ($requestType === self::NOTIFICATION_TYPE_RENAME) { // #. handle file rename
115+
116+
// Delete the old cache resource
117+
$this->cloudinaryResourceService->delete($publicId);
118+
119+
// Fetch the new cloudinary resource
120+
$nextPublicId = $payload['to_public_id'];
121+
$previousCloudinaryResource = $cloudinaryResource = $this->getCloudinaryResource($nextPublicId);
122+
123+
$previousCloudinaryResource['public_id'] = $publicId;
124+
$previousFileIdentifier = $this->cloudinaryPathService->computeFileIdentifier($previousCloudinaryResource);
125+
$nextFileIdentifier = $this->cloudinaryPathService->computeFileIdentifier($cloudinaryResource);
126+
127+
$this->handleFileRename($previousFileIdentifier, $nextFileIdentifier);
128+
} else {
129+
$cloudinaryResource = $this->getCloudinaryResource($publicId);
130+
131+
// #. flush cloudinary cdn cache only for valid publicId
132+
$this->flushCloudinaryCdn($publicId);
133+
}
116134

117135
// #. retrieve the source file
118136
$file = $this->getFile($cloudinaryResource);
@@ -125,30 +143,15 @@ public function processAction(): ResponseInterface
125143

126144
// #. flush cache pages
127145
$this->clearCachePages($file);
128-
129-
// #. flush cloudinary cdn cache
130-
$this->flushCloudinaryCdn($publicId);
131-
132-
// #. handle file rename
133-
if ($requestType === self::NOTIFICATION_TYPE_RENAME) {
134-
135-
// Delete the old cache resource
136-
$this->cloudinaryResourceService->delete($publicId);
137-
138-
// Rename the resource
139-
$nextPublicId = $payload['to_public_id'];
140-
$nextCloudinaryResource = $this->scanService->scanOne($nextPublicId);
141-
$this->handleFileRename($file, $nextCloudinaryResource);
142-
}
143146
}
144147
} catch (\Exception $e) {
145148
return $this->sendResponse([
146-
'result' => 'ko',
149+
'result' => 'exception',
147150
'message' => $e->getMessage(),
148151
]);
149152
}
150153

151-
return $this->sendResponse(['result' => 'ok', 'message' => 'Cache flushed']);
154+
return $this->sendResponse(['result' => 'ok', 'message' => 'I did my job with success!']);
152155
}
153156

154157
protected function flushCloudflareCdn(array $tags): void
@@ -166,7 +169,7 @@ protected function flushCloudflareCdn(array $tags): void
166169
$result = $cloudflareService->send(
167170
'/zones/' . $identifier . '/purge_cache',
168171
[
169-
'tags' => [$tags],
172+
'tags' => $tags,
170173
],
171174
'DELETE'
172175
);
@@ -175,8 +178,15 @@ protected function flushCloudflareCdn(array $tags): void
175178
$message = vsprintf('Cleared the cache on Cloudflare using Cache-Tag (domain: "%s")', [$zoneName, implode(LF, $result['errors'])]);
176179
self::getLogger()->info($message);
177180
} else {
178-
$message = vsprintf('Failed to clear the cache on Cloudflare using Cache-Tag (domain: "%s"): %s', [$zoneName, implode(LF, $result['errors'] ?? [])]);
179-
self::getLogger()->warning($message);
181+
if (is_array($result['errors'])) {
182+
foreach ($result['errors'] as $error) {
183+
$message = vsprintf('Failed to clear the cache on Cloudflare using Cache-Tag (domain: "%s"): code %s, %s', [$zoneName, $error['code'], $error['message']]);
184+
self::getLogger()->warning($message);
185+
}
186+
} else {
187+
$message = vsprintf('Failed to clear the cache on Cloudflare using Cache-Tag (domain: "%s")', [$zoneName]);
188+
self::getLogger()->warning($message);
189+
}
180190
}
181191
} catch (\RuntimeException $e) {
182192
self::getLogger()->error($e->getMessage());
@@ -197,16 +207,16 @@ protected function flushCloudinaryCdn($publicId): void
197207
);
198208
}
199209

200-
protected function handleFileRename(File $file, array $cloudinaryResource): void
210+
protected function handleFileRename(string $previousFileIdentifier, string $nextFileIdentifier): void
201211
{
202-
$nextFileIdentifier = $this->cloudinaryPathService->computeFileIdentifier($cloudinaryResource);
203212
$tableName = 'sys_file';
204213
$q = $this->getQueryBuilder($tableName);
205214
$q->update($tableName)
206215
->where(
207-
$q->expr()->eq('uid', $file->getUid())
216+
$q->expr()->eq('storage', $this->storage->getUid()),
217+
$q->expr()->eq('identifier', $q->expr()->literal($previousFileIdentifier))
208218
)
209-
->set('identifier', $q->quoteIdentifier($nextFileIdentifier), false)
219+
->set('identifier', $q->expr()->literal($nextFileIdentifier), false)
210220
->executeStatement();
211221
}
212222

0 commit comments

Comments
 (0)