Skip to content

Commit 8bafbae

Browse files
committed
BUGFIX: Prevent error when viewing content releases with no Redis metadata
1 parent 7ce1709 commit 8bafbae

4 files changed

Lines changed: 51 additions & 39 deletions

File tree

Classes/BackendUi/BackendUiDataService.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,14 @@ private function calculateReleaseSize(RedisInstanceIdentifier $redisInstanceIden
114114
return round($size / 1000000, 2);
115115
}
116116

117-
public function loadDetailsData(ContentReleaseIdentifier $contentReleaseIdentifier, RedisInstanceIdentifier $redisInstanceIdentifier): ContentReleaseDetails
117+
public function loadDetailsData(ContentReleaseIdentifier $contentReleaseIdentifier, RedisInstanceIdentifier $redisInstanceIdentifier): ?ContentReleaseDetails
118118
{
119119
$contentReleaseMetadata = $this->redisContentReleaseService->fetchMetadataForContentRelease($contentReleaseIdentifier, $redisInstanceIdentifier);
120+
121+
if (!$contentReleaseMetadata) {
122+
return null;
123+
}
124+
120125
$contentReleaseJob = $this->prunnerApiService->loadJobDetail($contentReleaseMetadata->getPrunnerJobId()->toJobId());
121126

122127
$manualTransferJobs = count($contentReleaseMetadata->getManualTransferJobIds()) ? array_map(function (PrunnerJobId $item) {

Classes/Controller/BackendController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public function detailsAction(string $contentReleaseIdentifier, ?string $content
114114
$contentReleaseIdentifier = ContentReleaseIdentifier::fromString($contentReleaseIdentifier);
115115
$contentStore = $contentStore ? RedisInstanceIdentifier::fromString($contentStore) : RedisInstanceIdentifier::primary();
116116

117+
$this->view->assign('contentReleaseIdentifier', $contentReleaseIdentifier);
117118
$this->view->assign('contentStore', $contentStore->getIdentifier());
118119

119120
$detailsData = $this->backendUiDataService->loadDetailsData($contentReleaseIdentifier, $contentStore);

Classes/PrepareContentRelease/Infrastructure/RedisContentReleaseService.php

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,6 @@ class RedisContentReleaseService
3232
*/
3333
protected $redisKeyService;
3434

35-
/**
36-
* @Flow\Inject
37-
* @var RedisContentReleaseService
38-
*/
39-
protected $redisContentReleaseService;
40-
4135
public function createContentRelease(ContentReleaseIdentifier $contentReleaseIdentifier, PrunnerJobId $prunnerJobId, ContentReleaseLogger $contentReleaseLogger, string $workspaceName = 'live'): void
4236
{
4337
$redis = $this->redisClientManager->getPrimaryRedis();
@@ -71,8 +65,8 @@ public function setContentReleaseMetadata(ContentReleaseIdentifier $contentRelea
7165

7266
public function registerManualTransferJob(ContentReleaseIdentifier $contentReleaseIdentifier, PrunnerJobId $prunnerJobId, ContentReleaseLogger $contentReleaseLogger): void
7367
{
74-
$releaseMetadata = $this->redisContentReleaseService->fetchMetadataForContentRelease($contentReleaseIdentifier);
75-
$this->redisContentReleaseService->setContentReleaseMetadata($contentReleaseIdentifier, $releaseMetadata->withAdditionalManualTransferJobId($prunnerJobId), RedisInstanceIdentifier::primary());
68+
$releaseMetadata = $this->fetchMetadataForContentRelease($contentReleaseIdentifier);
69+
$this->setContentReleaseMetadata($contentReleaseIdentifier, $releaseMetadata->withAdditionalManualTransferJobId($prunnerJobId), RedisInstanceIdentifier::primary());
7670

7771
$contentReleaseLogger->info(sprintf('Register new pipeline for release %s', $contentReleaseIdentifier->getIdentifier()));
7872
}
@@ -93,11 +87,14 @@ public function fetchAllReleaseIds(RedisInstanceIdentifier $redisInstanceIdentif
9387
return $result;
9488
}
9589

96-
public function fetchMetadataForContentRelease(ContentReleaseIdentifier $contentReleaseIdentifier, ?RedisInstanceIdentifier $redisInstanceIdentifier = null): ContentReleaseMetadata
90+
public function fetchMetadataForContentRelease(ContentReleaseIdentifier $contentReleaseIdentifier, ?RedisInstanceIdentifier $redisInstanceIdentifier = null): ?ContentReleaseMetadata
9791
{
9892
$redisInstanceIdentifier = $redisInstanceIdentifier ?: RedisInstanceIdentifier::primary();
9993
$redis = $this->redisClientManager->getRedis($redisInstanceIdentifier);
10094
$metadataEncoded = $redis->get($this->redisKeyService->getRedisKeyForPostfix($contentReleaseIdentifier, 'meta:info'));
95+
if (!$metadataEncoded) {
96+
return null;
97+
}
10198
return ContentReleaseMetadata::fromJsonString($metadataEncoded, $contentReleaseIdentifier);
10299
}
103100

Resources/Private/BackendFusion/Integration/Backend.Details.fusion

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,44 @@ Flowpack.DecoupledContentStore.BackendController.details = Neos.Fusion:Component
1111
renderer = afx`
1212
<div id="app">
1313
<form id="postHelper" method="post">
14-
<input
15-
type="hidden"
16-
name="__csrfToken"
17-
value={Security.csrfToken()}
18-
/>
14+
<input
15+
type="hidden"
16+
name="__csrfToken"
17+
value={Security.csrfToken()}
18+
/>
1919
</form>
2020
<Flowpack.DecoupledContentStore:Integration.StylesAndScripts/>
2121
<h1 class="text-3xl py-5 inline">
22-
Content Release {detailsData.contentReleaseIdentifier.identifier}
22+
Content Release {contentReleaseIdentifier.identifier}
2323
</h1>
24-
{" "}
25-
<span class="neos-badge" style="vertical-align: super;" title="content store" data-neos-toggle="tooltip">{contentStore}</span>
26-
<Flowpack.DecoupledContentStore:ContentReleaseSteps
27-
_taskResults={detailsData.job.taskResults}
28-
prunnerStart={detailsData.job.created}
29-
/>
30-
<Neos.Fusion:Loop items={detailsData.manualTransferJobs}>
31-
<Flowpack.DecoupledContentStore:ContentReleaseSteps
32-
_taskResults={item.taskResults}
33-
isManualTransferPipeline={true}
34-
prunnerJobId={item.id.id}
35-
prunnerStart={item.created}
36-
manualSwitchTarget={item.variables.redisInstanceId}
37-
/>
38-
</Neos.Fusion:Loop>
39-
40-
<h2 @if.isTrue={detailTaskName} class="text-3xl py-5">Log Output for {detailTaskName}</h2>
41-
<pre>
42-
{jobLogs.stderr}
43-
</pre>
44-
<pre>
45-
{jobLogs.stdout}
46-
</pre>
24+
<Neos.Fusion:Fragment @if.hasData={detailsData}>
25+
{" "}
26+
<span class="neos-badge" style="vertical-align: super;" title="content store" data-neos-toggle="tooltip">{contentStore}</span>
27+
<Flowpack.DecoupledContentStore:ContentReleaseSteps
28+
_taskResults={detailsData.job.taskResults}
29+
prunnerStart={detailsData.job.created}
30+
/>
31+
<Neos.Fusion:Loop items={detailsData.manualTransferJobs}>
32+
<Flowpack.DecoupledContentStore:ContentReleaseSteps
33+
_taskResults={item.taskResults}
34+
isManualTransferPipeline={true}
35+
prunnerJobId={item.id.id}
36+
prunnerStart={item.created}
37+
manualSwitchTarget={item.variables.redisInstanceId}
38+
/>
39+
</Neos.Fusion:Loop>
40+
41+
<h2 @if.isTrue={detailTaskName} class="text-3xl py-5">Log Output for {detailTaskName}</h2>
42+
<pre>
43+
{jobLogs.stderr}
44+
</pre>
45+
<pre>
46+
{jobLogs.stdout}
47+
</pre>
48+
</Neos.Fusion:Fragment>
49+
<p @if.notData={!detailsData}>
50+
No data exists for this release in Redis.
51+
</p>
4752
</div>
4853
<Flowpack.DecoupledContentStore:DetailsFooter />
4954
`
@@ -403,6 +408,10 @@ prototype(Flowpack.DecoupledContentStore:DetailsFooter) < prototype(Neos.Fusion:
403408

404409
renderer = afx`
405410
<div class="neos-footer">
411+
<Neos.Fusion:Link.Action href.action="index" class="neos-button">
412+
Back
413+
</Neos.Fusion:Link.Action>
414+
406415
<Neos.Fusion:Link.Action href.action="details" href.arguments={{contentReleaseIdentifier: detailsData.contentReleaseIdentifier.identifier}} class="neos-button">
407416
<i class="fa fa-sync"></i> Reload
408417
</Neos.Fusion:Link.Action>

0 commit comments

Comments
 (0)