55use Flowpack \DecoupledContentStore \Core \Domain \ValueObject \ContentReleaseIdentifier ;
66use Flowpack \DecoupledContentStore \Core \Domain \ValueObject \RedisInstanceIdentifier ;
77use Flowpack \DecoupledContentStore \Core \Infrastructure \ContentReleaseLogger ;
8+ use Flowpack \DecoupledContentStore \Core \RedisKeyService ;
89use Flowpack \DecoupledContentStore \PrepareContentRelease \Infrastructure \RedisContentReleaseService ;
10+ use Flowpack \DecoupledContentStore \Transfer \Dto \RedisKeyPostfixesForEachRelease ;
911use Neos \Flow \Annotations as Flow ;
1012use Flowpack \DecoupledContentStore \Core \Infrastructure \RedisClientManager ;
1113
@@ -27,10 +29,39 @@ class RedisReleaseSwitchService
2729 */
2830 protected $ redisContentReleaseService ;
2931
32+ /**
33+ * @Flow\Inject
34+ * @var RedisKeyService
35+ */
36+ protected $ redisKeyService ;
37+
38+ /**
39+ * @Flow\InjectConfiguration("redisKeyPostfixesForEachRelease")
40+ * @var array
41+ */
42+ protected $ redisKeyPostfixesForEachReleaseConfiguration ;
43+
3044 public function switchContentRelease (RedisInstanceIdentifier $ redisInstanceIdentifier , ContentReleaseIdentifier $ contentReleaseIdentifier , ContentReleaseLogger $ contentReleaseLogger )
3145 {
3246 $ redis = $ this ->redisClient ->getRedis ($ redisInstanceIdentifier );
3347 $ current = $ redis ->get ('contentStore:current ' );
48+
49+ // validation checks
50+ // we don't check for errors here (again) as we do not reach this stage if there were errors before
51+ if (!in_array ($ contentReleaseIdentifier ->getIdentifier (), $ redis ->zRevRangeByLex ('contentStore:registeredReleases ' , '+ ' , '- ' ))) {
52+ $ contentReleaseLogger ->error ('Content release identifier ' . $ contentReleaseIdentifier ->getIdentifier () . ' is not listed in current releases thus we do not switch. ' );
53+ return ;
54+ }
55+
56+ $ redisKeyPostfixesForEachRelease = RedisKeyPostfixesForEachRelease::fromArray ($ this ->redisKeyPostfixesForEachReleaseConfiguration );
57+ foreach ($ redisKeyPostfixesForEachRelease ->getRequiredKeys () as $ requiredPostfix ) {
58+ $ key = $ this ->redisKeyService ->getRedisKeyForPostfix ($ contentReleaseIdentifier , $ requiredPostfix ->getRedisKeyPostfix ());
59+ if (!$ redis ->exists ($ key )) {
60+ $ contentReleaseLogger ->error ('Required redis key ' . $ key . ' does not exist for release thus we do not switch. ' );
61+ return ;
62+ }
63+ }
64+
3465 $ redis ->set ('contentStore:current ' , $ contentReleaseIdentifier ->getIdentifier ());
3566 $ releaseMetadata = $ this ->redisContentReleaseService ->fetchMetadataForContentRelease ($ contentReleaseIdentifier );
3667 $ this ->redisContentReleaseService ->setContentReleaseMetadata ($ contentReleaseIdentifier , $ releaseMetadata ->withSwitchTime (new \DateTimeImmutable ()), $ redisInstanceIdentifier );
0 commit comments