Skip to content

Commit fde17ac

Browse files
committed
feat: Support toggling of media manager
Media Manager versions can be toggled on/off via config.
1 parent 5ee228e commit fde17ac

7 files changed

Lines changed: 162 additions & 29 deletions

File tree

admin/controllers/MediaManager.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
use Nails\Cdn\Constants;
1616
use Nails\Cdn\Controller\BaseAdmin;
17+
use Nails\Cdn\Exception\CdnException;
1718
use Nails\Common\Exception\FactoryException;
1819
use Nails\Common\Service\Input;
1920
use Nails\Factory;
@@ -48,6 +49,7 @@ public static function permissions(): array
4849

4950
/**
5051
* @throws FactoryException
52+
* @throws CdnException
5153
*/
5254
public function index(): void
5355
{

admin/controllers/MediaManagerV1.php

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Nails\Admin\Helper;
1717
use Nails\Cdn\Constants;
1818
use Nails\Cdn\Controller\BaseAdmin;
19+
use Nails\Cdn\Exception\CdnException;
1920
use Nails\Cdn\Service\MediaManager;
2021
use Nails\Common\Exception\AssetException;
2122
use Nails\Common\Exception\FactoryException;
@@ -32,23 +33,44 @@ class MediaManagerV1 extends BaseAdmin
3233
{
3334
/**
3435
* Announces this controller's navGroups
36+
*
37+
* @throws FactoryException
3538
*/
3639
public static function announce(): Nav|array|null
3740
{
38-
if (userHasPermission('admin:cdn:manager:object:browse')) {
41+
if (userHasPermission('admin:cdn:manager:object:browse') && self::isEnabled()) {
42+
/** @var MediaManager $mediaManager */
43+
$mediaManager = Factory::service('MediaManager', Constants::MODULE_SLUG);
3944
/** @var Nav $oNavGroup */
4045
$oNavGroup = Factory::factory('Nav', \Nails\Admin\Constants::MODULE_SLUG);
4146
$oNavGroup
4247
->setLabel('Media')
4348
->setIcon('fa-images')
44-
->addAction('Media Manager V1', order: 0);
49+
->addAction(
50+
count($mediaManager->getEnabledVersions()) === 1
51+
? 'Media Manager'
52+
: 'Media Manager V1',
53+
order: 0
54+
);
4555
}
4656

4757
return $oNavGroup ?? null;
4858
}
4959

5060
// --------------------------------------------------------------------------
5161

62+
/**
63+
* @throws FactoryException
64+
*/
65+
protected static function isEnabled(): bool
66+
{
67+
/** @var MediaManager $mediaManager */
68+
$mediaManager = Factory::service('MediaManager', Constants::MODULE_SLUG);
69+
return $mediaManager->isVersionEnabled(Constants::MEDIA_MANAGER_V1);
70+
}
71+
72+
// --------------------------------------------------------------------------
73+
5274
/**
5375
* Browse CDN Objects
5476
*
@@ -57,7 +79,7 @@ public static function announce(): Nav|array|null
5779
*/
5880
public function index(): void
5981
{
60-
if (!userHasPermission('admin:cdn:manager:object:browse')) {
82+
if (!userHasPermission('admin:cdn:manager:object:browse') || !self::isEnabled()) {
6183
unauthorised();
6284
}
6385

@@ -99,10 +121,11 @@ public function index(): void
99121

100122
/**
101123
* @throws FactoryException
124+
* @throws CdnException
102125
*/
103126
public function set_default(): void
104127
{
105-
if (!userHasPermission('admin:cdn:manager:object:browse')) {
128+
if (!userHasPermission('admin:cdn:manager:object:browse') || !self::isEnabled()) {
106129
unauthorised();
107130
}
108131

admin/controllers/MediaManagerV2.php

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Nails\Admin\Helper;
1717
use Nails\Cdn\Constants;
1818
use Nails\Cdn\Controller\BaseAdmin;
19+
use Nails\Cdn\Exception\CdnException;
1920
use Nails\Cdn\Service\MediaManager;
2021
use Nails\Common\Exception\AssetException;
2122
use Nails\Common\Exception\FactoryException;
@@ -37,26 +38,43 @@ class MediaManagerV2 extends BaseAdmin
3738
*/
3839
public static function announce(): Nav|array|null
3940
{
40-
if (userHasPermission('admin:cdn:manager:object:browse')) {
41+
if (userHasPermission('admin:cdn:manager:object:browse') && self::isEnabled()) {
42+
/** @var MediaManager $mediaManager */
43+
$mediaManager = Factory::service('MediaManager', Constants::MODULE_SLUG);
4144
/** @var Nav $oNavGroup */
4245
$oNavGroup = Factory::factory('Nav', \Nails\Admin\Constants::MODULE_SLUG);
4346
$oNavGroup
4447
->setLabel('Media')
4548
->setIcon('fa-images')
46-
->addAction('Media Manager V2', order: 0);
49+
->addAction(
50+
count($mediaManager->getEnabledVersions()) === 1
51+
? 'Media Manager'
52+
: 'Media Manager V2',
53+
order: 0
54+
);
4755
}
4856

4957
return $oNavGroup ?? null;
5058
}
5159

60+
/**
61+
* @throws FactoryException
62+
*/
63+
protected static function isEnabled(): bool
64+
{
65+
/** @var MediaManager $mediaManager */
66+
$mediaManager = Factory::service('MediaManager', Constants::MODULE_SLUG);
67+
return $mediaManager->isVersionEnabled(Constants::MEDIA_MANAGER_V2);
68+
}
69+
5270
/**
5371
* @return void
5472
* @throws AssetException
5573
* @throws FactoryException
5674
*/
5775
public function index(): void
5876
{
59-
if (!userHasPermission('admin:cdn:manager:object:browse')) {
77+
if (!userHasPermission('admin:cdn:manager:object:browse') || !self::isEnabled()) {
6078
unauthorised();
6179
}
6280

@@ -69,10 +87,11 @@ public function index(): void
6987

7088
/**
7189
* @throws FactoryException
90+
* @throws CdnException
7291
*/
7392
public function set_default(): void
7493
{
75-
if (!userHasPermission('admin:cdn:manager:object:browse')) {
94+
if (!userHasPermission('admin:cdn:manager:object:browse') || !self::isEnabled()) {
7695
unauthorised();
7796
}
7897

admin/views/MediaManagerV1/index.php

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
<?php
22

3-
/** @var \Nails\Common\Service\Input $oInput */
4-
$oInput = \Nails\Factory::service('Input');
3+
use Nails\Cdn\Constants;
4+
use Nails\Cdn\Service\MediaManager;
5+
use Nails\Common\Service\Input;
6+
use Nails\Factory;
57

6-
if ($oInput::get('isModal')) {
8+
/** @var Input $input */
9+
$input = Factory::service('Input');
10+
/** @var MediaManager $mediaManager */
11+
$mediaManager = Factory::service('MediaManager', Constants::MODULE_SLUG);
712

8-
$switchUrl = siteUrl(\Nails\Cdn\Constants::MEDIA_MANAGER_V2_URL . '/set_default');
13+
if ($input::get('isModal') && $mediaManager->isVersionEnabled(Constants::MEDIA_MANAGER_V2)) {
914

10-
if ($oInput::get()) {
11-
$switchUrl .= '?' . http_build_query($oInput::get());
12-
}
15+
$switchUrl = $mediaManager->getUrl(
16+
query: $input::get(),
17+
path: '/set_default',
18+
version: Constants::MEDIA_MANAGER_V2
19+
);
1320

1421
?>
1522
<p class="try-new-manager">
@@ -34,7 +41,7 @@
3441
<!-- /ko -->
3542
<div class="manager-feedback__error"></div>
3643
<div class="manager-feedback__success"></div>
37-
<div class="module-cdn manager <?=$oInput::get('isModal') ? 'is-modal' : ''?> hidden" data-bind="css: {hidden: !ready()}">
44+
<div class="module-cdn manager <?=$input::get('isModal') ? 'is-modal' : ''?> hidden" data-bind="css: {hidden: !ready()}">
3845
<div class="manager__browse">
3946
<div class="manager__browse__buckets">
4047
<ul class="manager__browse__buckets__list">

admin/views/MediaManagerV2/index.php

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
<?php
22

3-
/** @var \Nails\Common\Service\Input $oInput */
4-
$oInput = \Nails\Factory::service('Input');
3+
use Nails\Cdn\Constants;
4+
use Nails\Cdn\Service\MediaManager;
5+
use Nails\Common\Service\Input;
6+
use Nails\Factory;
57

6-
if ($oInput::get('isModal')) {
8+
/** @var Input $input */
9+
$input = Factory::service('Input');
10+
/** @var MediaManager $mediaManager */
11+
$mediaManager = Factory::service('MediaManager', Constants::MODULE_SLUG);
712

8-
$switchUrl = siteUrl(\Nails\Cdn\Constants::MEDIA_MANAGER_V1_URL . '/set_default');
9-
10-
if ($oInput::get()) {
11-
$switchUrl .= '?' . http_build_query($oInput::get());
12-
}
13+
if ($input::get('isModal') && $mediaManager->isVersionEnabled(Constants::MEDIA_MANAGER_V1)) {
14+
$switchUrl = $mediaManager->getUrl(
15+
query: $input::get(),
16+
path: '/set_default',
17+
version: Constants::MEDIA_MANAGER_V1
18+
);
1319
}
1420

1521
?>

src/Api/Controller/MediaManager.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
use Nails\Api;
1616
use Nails\Cdn\Constants;
17+
use Nails\Cdn\Exception\CdnException;
1718
use Nails\Common\Exception\FactoryException;
1819
use Nails\Common\Exception\ModelException;
1920
use Nails\Common\Service\HttpCodes;
@@ -40,6 +41,7 @@ class MediaManager extends Api\Controller\Base
4041
* @throws Api\Exception\ApiException
4142
* @throws FactoryException
4243
* @throws ModelException
44+
* @throws CdnException
4345
*/
4446
public function getUrl(): Api\Factory\ApiResponse
4547
{

src/Service/MediaManager.php

Lines changed: 79 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
namespace Nails\Cdn\Service;
44

55
use Nails\Cdn\Constants;
6+
use Nails\Cdn\Exception\CdnException;
67
use Nails\Common\Service\Session;
8+
use Nails\Config;
79

810
class MediaManager
911
{
@@ -14,24 +16,96 @@ public function __construct(
1416
) {
1517
}
1618

19+
public function getVersions(): array
20+
{
21+
return [
22+
Constants::MEDIA_MANAGER_V1,
23+
Constants::MEDIA_MANAGER_V2,
24+
];
25+
}
26+
27+
public function isValidVersion(int $version): bool
28+
{
29+
return in_array($version, $this->getVersions(), true);
30+
}
31+
32+
public function getEnabledVersions(): array
33+
{
34+
$enabled = Config::get('CDN_MEDIA_MANAGER_ENABLE');
35+
if (!is_array($enabled)) {
36+
$enabled = [$enabled];
37+
}
38+
39+
$enabled = array_values(
40+
array_filter(
41+
$enabled,
42+
fn(int $version) => $this->isValidVersion($version)
43+
)
44+
);
45+
46+
return empty($enabled)
47+
? $this->getVersions()
48+
: $enabled;
49+
}
50+
51+
public function isVersionEnabled(int $version): bool
52+
{
53+
return in_array($version, $this->getEnabledVersions(), true);
54+
}
55+
56+
/**
57+
* @throws CdnException
58+
*/
1759
public function setDefault(int $version): static
1860
{
61+
if (!$this->isValidVersion($version)) {
62+
throw new CdnException('Invalid version provided');
63+
} elseif (!$this->isVersionEnabled($version)) {
64+
throw new CdnException(sprintf('Version %d is not enabled', $version));
65+
}
66+
1967
$this->session->setUserData(static::SESSION_KEY_DEFAULT, $version);
2068
return $this;
2169
}
2270

23-
public function getUrl(array $query = [], ?int $version = null): string
71+
/**
72+
* @throws CdnException
73+
*/
74+
public function getUrl(array $query = [], string $path = '', ?int $version = null): string
2475
{
76+
// If an explicitly passed version is not enabled, complain
77+
if ($version && !$this->isVersionEnabled($version)) {
78+
throw new CdnException(sprintf('Version %d is not enabled', $version));
79+
}
2580

26-
$sBaseUrl = match ($version ?? $this->session->getUserData(static::SESSION_KEY_DEFAULT)) {
81+
if (!$version && $this->session->getUserData(static::SESSION_KEY_DEFAULT)) {
82+
$version = $this->session->getUserData(static::SESSION_KEY_DEFAULT);
83+
if (!$this->isVersionEnabled($version)) {
84+
// Version stored in session is no longer valid, default to the first enabled manager
85+
$enabledVersions = $this->getEnabledVersions();
86+
$version = reset($enabledVersions);
87+
$this->setDefault($version);
88+
}
89+
}
90+
91+
$managerUrl = match ($version) {
92+
Constants::MEDIA_MANAGER_V1 => Constants::MEDIA_MANAGER_V1_URL,
2793
Constants::MEDIA_MANAGER_V2 => Constants::MEDIA_MANAGER_V2_URL,
28-
default => Constants::MEDIA_MANAGER_V1_URL
94+
default => null,
2995
};
3096

97+
if (!$managerUrl) {
98+
throw new CdnException('Unable to determine media manager url');
99+
}
100+
101+
if (trim($path)) {
102+
$managerUrl .= '/' . ltrim($path, '/');
103+
}
104+
31105
if ($query) {
32-
$sBaseUrl .= '?' . http_build_query($query);
106+
$managerUrl .= '?' . http_build_query($query);
33107
}
34108

35-
return siteUrl($sBaseUrl);
109+
return siteUrl($managerUrl);
36110
}
37111
}

0 commit comments

Comments
 (0)