Skip to content

Commit 848efae

Browse files
committed
ISSUE-345: config manager
1 parent a862f61 commit 848efae

File tree

7 files changed

+244
-6
lines changed

7 files changed

+244
-6
lines changed

config/services/managers.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,7 @@ services:
6767
autoconfigure: true
6868
arguments:
6969
$defaultFromEmail: '%app.mailer_from%'
70+
71+
PhpList\Core\Domain\Configuration\Service\Manager\ConfigManager:
72+
autowire: true
73+
autoconfigure: true

config/services/parameters.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ parameters:
88
notify_start_default: '[email protected]'
99
notify_end_default: '[email protected]'
1010
always_add_google_tracking: true
11+
click_track: true

config/services/repositories.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,8 @@ services:
6060
parent: PhpList\Core\Domain\Common\Repository\AbstractRepository
6161
arguments:
6262
- PhpList\Core\Domain\Messaging\Model\TemplateImage
63+
64+
PhpList\Core\Domain\Configuration\Repository\ConfigRepository:
65+
parent: PhpList\Core\Domain\Common\Repository\AbstractRepository
66+
arguments:
67+
- PhpList\Core\Domain\Configuration\Model\Config
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Domain\Configuration\Exception;
6+
7+
use Exception;
8+
9+
class ConfigNotEditableException extends Exception
10+
{
11+
public function __construct(string $configKey)
12+
{
13+
parent::__construct(sprintf('Configuration item "%s" is not editable.', $configKey));
14+
}
15+
}

src/Domain/Configuration/Model/Config.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
class Config implements DomainModel
1414
{
1515
#[ORM\Id]
16-
#[ORM\Column(type: 'string', length: 35)]
17-
private string $item;
16+
#[ORM\Column(name: 'item', type: 'string', length: 35)]
17+
private string $key;
1818

1919
#[ORM\Column(type: 'text', nullable: true)]
2020
private ?string $value = null;
@@ -25,14 +25,14 @@ class Config implements DomainModel
2525
#[ORM\Column(type: 'string', length: 25, nullable: true)]
2626
private ?string $type = null;
2727

28-
public function getItem(): string
28+
public function getKey(): string
2929
{
30-
return $this->item;
30+
return $this->key;
3131
}
3232

33-
public function setItem(string $item): self
33+
public function setKey(string $key): self
3434
{
35-
$this->item = $item;
35+
$this->key = $key;
3636
return $this;
3737
}
3838

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Domain\Configuration\Service\Manager;
6+
7+
use PhpList\Core\Domain\Configuration\Model\Config;
8+
use PhpList\Core\Domain\Configuration\Repository\ConfigRepository;
9+
use PhpList\Core\Domain\Configuration\Exception\ConfigNotEditableException;
10+
11+
class ConfigManager
12+
{
13+
private ConfigRepository $configRepository;
14+
15+
public function __construct(ConfigRepository $configRepository)
16+
{
17+
$this->configRepository = $configRepository;
18+
}
19+
20+
/**
21+
* Get a configuration item by its key
22+
*/
23+
public function getByItem(string $item): ?Config
24+
{
25+
return $this->configRepository->findOneBy(['item' => $item]);
26+
}
27+
28+
/**
29+
* Get all configuration items
30+
*
31+
* @return Config[]
32+
*/
33+
public function getAll(): array
34+
{
35+
return $this->configRepository->findAll();
36+
}
37+
38+
/**
39+
* Update a configuration item
40+
* @throws ConfigNotEditableException
41+
*/
42+
public function update(Config $config, string $value): void
43+
{
44+
if (!$config->isEditable()) {
45+
throw new ConfigNotEditableException($config->getKey());
46+
}
47+
$config->setValue($value);
48+
49+
$this->configRepository->save($config);
50+
}
51+
52+
public function create(string $key, string $value, bool $editable, ?string $type = null): void
53+
{
54+
$config = (new Config())
55+
->setKey($key)
56+
->setValue($value)
57+
->setEditable($editable)
58+
->setType($type);
59+
60+
$this->configRepository->save($config);
61+
}
62+
63+
public function delete(Config $config): void
64+
{
65+
$this->configRepository->remove($config);
66+
}
67+
}
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Tests\Unit\Domain\Configuration\Service\Manager;
6+
7+
use PhpList\Core\Domain\Configuration\Model\Config;
8+
use PhpList\Core\Domain\Configuration\Repository\ConfigRepository;
9+
use PhpList\Core\Domain\Configuration\Service\Manager\ConfigManager;
10+
use PHPUnit\Framework\TestCase;
11+
12+
class ConfigManagerTest extends TestCase
13+
{
14+
public function testGetByItemReturnsConfigFromRepository(): void
15+
{
16+
$configRepository = $this->createMock(ConfigRepository::class);
17+
$manager = new ConfigManager($configRepository);
18+
19+
$config = new Config();
20+
$config->setKey('test_item');
21+
$config->setValue('test_value');
22+
23+
$configRepository->expects($this->once())
24+
->method('findOneBy')
25+
->with(['item' => 'test_item'])
26+
->willReturn($config);
27+
28+
$result = $manager->getByItem('test_item');
29+
30+
$this->assertSame($config, $result);
31+
$this->assertSame('test_item', $result->getKey());
32+
$this->assertSame('test_value', $result->getValue());
33+
}
34+
35+
public function testGetAllReturnsAllConfigsFromRepository(): void
36+
{
37+
$configRepository = $this->createMock(ConfigRepository::class);
38+
$manager = new ConfigManager($configRepository);
39+
40+
$config1 = new Config();
41+
$config1->setKey('item1');
42+
$config1->setValue('value1');
43+
44+
$config2 = new Config();
45+
$config2->setKey('item2');
46+
$config2->setValue('value2');
47+
48+
$configs = [$config1, $config2];
49+
50+
$configRepository->expects($this->once())
51+
->method('findAll')
52+
->willReturn($configs);
53+
54+
$result = $manager->getAll();
55+
56+
$this->assertSame($configs, $result);
57+
$this->assertCount(2, $result);
58+
$this->assertSame('item1', $result[0]->getKey());
59+
$this->assertSame('value1', $result[0]->getValue());
60+
$this->assertSame('item2', $result[1]->getKey());
61+
$this->assertSame('value2', $result[1]->getValue());
62+
}
63+
64+
public function testUpdateSavesConfigToRepository(): void
65+
{
66+
$configRepository = $this->createMock(ConfigRepository::class);
67+
$manager = new ConfigManager($configRepository);
68+
69+
$config = new Config();
70+
$config->setKey('test_item');
71+
$config->setValue('test_value');
72+
$config->setEditable(true);
73+
74+
$configRepository->expects($this->once())
75+
->method('save')
76+
->with($config);
77+
78+
$manager->update($config, 'new_value');
79+
}
80+
81+
public function testCreateSavesNewConfigToRepository(): void
82+
{
83+
$configRepository = $this->createMock(ConfigRepository::class);
84+
$manager = new ConfigManager($configRepository);
85+
86+
$configRepository->expects($this->once())
87+
->method('save')
88+
->with($this->callback(function (Config $config) {
89+
return $config->getKey() === 'test_key' &&
90+
$config->getValue() === 'test_value' &&
91+
$config->isEditable() === true &&
92+
$config->getType() === 'test_type';
93+
}));
94+
95+
$manager->create('test_key', 'test_value', true, 'test_type');
96+
}
97+
public function testGetByItemReturnsNullWhenItemDoesNotExist(): void
98+
{
99+
$configRepository = $this->createMock(ConfigRepository::class);
100+
$manager = new ConfigManager($configRepository);
101+
102+
$configRepository->expects($this->once())
103+
->method('findOneBy')
104+
->with(['item' => 'non_existent_item'])
105+
->willReturn(null);
106+
107+
$result = $manager->getByItem('non_existent_item');
108+
109+
$this->assertNull($result);
110+
}
111+
112+
public function testUpdateThrowsExceptionWhenConfigIsNotEditable(): void
113+
{
114+
$configRepository = $this->createMock(ConfigRepository::class);
115+
$manager = new ConfigManager($configRepository);
116+
117+
$config = new Config();
118+
$config->setKey('test_item');
119+
$config->setValue('test_value');
120+
$config->setEditable(false);
121+
122+
$configRepository->expects($this->never())
123+
->method('save');
124+
125+
$this->expectException(\PhpList\Core\Domain\Configuration\Exception\ConfigNotEditableException::class);
126+
$this->expectExceptionMessage('Configuration item "test_item" is not editable.');
127+
128+
$manager->update($config, 'new_value');
129+
}
130+
131+
public function testDeleteRemovesConfigFromRepository(): void
132+
{
133+
$configRepository = $this->createMock(ConfigRepository::class);
134+
$manager = new ConfigManager($configRepository);
135+
136+
$config = new Config();
137+
$config->setKey('test_item');
138+
$config->setValue('test_value');
139+
140+
$configRepository->expects($this->once())
141+
->method('remove')
142+
->with($config);
143+
144+
$manager->delete($config);
145+
}
146+
}

0 commit comments

Comments
 (0)