Skip to content

Commit e85c50b

Browse files
author
Maelmin Henge
committed
fix namespaces, introduce getMultiple
1 parent feaf327 commit e85c50b

File tree

7 files changed

+85
-55
lines changed

7 files changed

+85
-55
lines changed

Controller/ApiController.php

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
namespace Hengebytes\SettingBundle\Controller;
44

55
use Hengebytes\SettingBundle\Interfaces\SettingHandlerInterface;
6+
use Symfony\Component\HttpFoundation\Exception\JsonException;
67
use Symfony\Component\HttpFoundation\JsonResponse;
78
use Symfony\Component\HttpFoundation\Request;
89
use Symfony\Component\HttpFoundation\Response;
910
use Symfony\Component\Routing\Annotation\Route;
1011

11-
#[Route('/settings', 'settings_')]
12+
#[Route('/settings', 'hengebytes_settings_api_')]
1213
readonly class ApiController
1314
{
1415
public function __construct(private SettingHandlerInterface $settingHandler)
@@ -32,7 +33,11 @@ public function getGroupedSettings(): JsonResponse
3233
#[Route('/list', 'update_list', methods: ['POST'])]
3334
public function bulkUpdateAction(Request $request): JsonResponse
3435
{
35-
$data = json_decode($request->getContent(), true);
36+
try {
37+
$data = $request->toArray();
38+
} catch (JsonException $e) {
39+
$data = $request->request->all();
40+
}
3641
$settings = $data['settings'] ?? [];
3742

3843
if (count($settings) === 0) {
@@ -55,7 +60,11 @@ public function bulkUpdateAction(Request $request): JsonResponse
5560
#[Route('/', name: 'create', methods: ['POST'])]
5661
public function setSetting(Request $request): JsonResponse
5762
{
58-
$data = json_decode($request->getContent(), true);
63+
try {
64+
$data = $request->toArray();
65+
} catch (JsonException $e) {
66+
$data = $request->request->all();
67+
}
5968

6069
$name = $data['name'] ?? null;
6170
$value = $data['value'] ?? '';
@@ -81,7 +90,11 @@ public function setSetting(Request $request): JsonResponse
8190
#[Route('/list', 'delete_list', methods: ['DELETE'])]
8291
public function bulkRemoveAction(Request $request): JsonResponse
8392
{
84-
$data = json_decode($request->getContent(), true);
93+
try {
94+
$data = $request->toArray();
95+
} catch (JsonException) {
96+
$data = $request->request->all();
97+
}
8598
$settingNames = $data['settings'] ?? [];
8699

87100
if (count($settingNames) === 0) {

Controller/SettingController.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
use Hengebytes\SettingBundle\Interfaces\SettingHandlerInterface;
66
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
7-
use Symfony\Component\HttpFoundation\{Request, Response};
7+
use Symfony\Component\HttpFoundation\Request;
8+
use Symfony\Component\HttpFoundation\Response;
89

910
class SettingController extends AbstractController
1011
{
@@ -31,7 +32,7 @@ public function indexAction(Request $request): Response
3132
$groupedSettings = $this->settingHandler->getGrouped();
3233
ksort($groupedSettings);
3334

34-
return $this->render('@Setting/setting_layout.html.twig',
35+
return $this->render('@HBSetting/setting_layout.html.twig',
3536
[
3637
'action' => 'settings',
3738
'is_production_env' => $this->settingHandler->isProductionEnvironment(),

Handler/SettingHandler.php

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,22 @@
22

33
namespace Hengebytes\SettingBundle\Handler;
44

5+
use Doctrine\ORM\EntityManagerInterface;
56
use Hengebytes\SettingBundle\Entity\Setting;
67
use Hengebytes\SettingBundle\Interfaces\SettingHandlerInterface;
78
use Hengebytes\SettingBundle\Service\CryptoService;
8-
use Doctrine\Persistence\{ManagerRegistry, ObjectManager, ObjectRepository};
99

1010
class SettingHandler implements SettingHandlerInterface
1111
{
1212
protected const string SETTING_NOT_DEFINED_INDICATOR = "\n!\t";
1313
/** setting with this prefix will be first priority */
14-
protected string $overridePrefix = '';
14+
protected ?string $overridePrefix = null;
1515

16-
protected ObjectManager $em;
17-
protected ObjectRepository $repository;
18-
protected CryptoService $cryptoService;
1916
private array $runTimeStorage = [];
2017

21-
public function __construct(ManagerRegistry $objectManager, protected string $entityClass, CryptoService $cryptoService)
22-
{
23-
$this->em = $objectManager->getManager();
24-
$this->repository = $this->em->getRepository($entityClass);
25-
$this->cryptoService = $cryptoService;
18+
public function __construct(
19+
protected EntityManagerInterface $em, protected string $entityClass, protected CryptoService $cryptoService
20+
) {
2621
}
2722

2823
public function set(string $name, string $value, bool $isSensitive = false): void
@@ -33,9 +28,9 @@ public function set(string $name, string $value, bool $isSensitive = false): voi
3328
}
3429

3530
/** @var Setting $setting */
36-
$setting = $this->repository->findOneBy(['name' => $name]);
31+
$setting = $this->em->getRepository($this->entityClass)->findOneBy(['name' => $name]);
3732

38-
if ($setting !== null) {
33+
if ($setting) {
3934
$setting->value = $value;
4035
$setting->isSensitive = $isSensitive;
4136
} else {
@@ -69,9 +64,11 @@ public function isProductionEnvironment(): bool
6964

7065
public function get(string $name, $default = null): ?string
7166
{
72-
$settingValue = $this->innerGet($this->overridePrefix . $name) ?? $this->innerGet($name);
67+
if ($this->overridePrefix !== null) {
68+
return $this->innerGet($this->overridePrefix . $name) ?? $this->innerGet($name) ?? $default;
69+
}
7370

74-
return $settingValue ?? $default;
71+
return $this->innerGet($name) ?? $default;
7572
}
7673

7774
protected function innerGet(string $name): ?string
@@ -82,9 +79,10 @@ protected function innerGet(string $name): ?string
8279
}
8380

8481
/** @var Setting $setting */
85-
$setting = $this->repository->findOneBy(['name' => $name]);
82+
$setting = $this->em->getRepository($this->entityClass)->findOneBy(['name' => $name]);
8683
if ($setting === null) {
8784
$this->setRunTime($name, self::SETTING_NOT_DEFINED_INDICATOR);
85+
8886
return null;
8987
}
9088

@@ -97,15 +95,46 @@ protected function innerGet(string $name): ?string
9795
return $value;
9896
}
9997

100-
public function getRunTime(string $name): ?string
98+
public function getMultiple(array $names): array
99+
{
100+
$result = [];
101+
foreach ($names as $key => $name) {
102+
$runTimeValue = $this->getRunTime($name);
103+
if ($runTimeValue === null) {
104+
continue;
105+
}
106+
$result[$name] = $runTimeValue !== self::SETTING_NOT_DEFINED_INDICATOR ? $runTimeValue : null;
107+
unset($names[$key]);
108+
}
109+
110+
if (!$names) {
111+
return $result;
112+
}
113+
$settings = $this->em->getRepository($this->entityClass)->findBy(['name' => $names]);
114+
115+
foreach ($settings as $setting) {
116+
$value = $setting->value;
117+
if ($setting->isSensitive) {
118+
$value = $this->cryptoService->decrypt($value);
119+
}
120+
$result[$setting->name] = $value;
121+
122+
$this->setRunTime($setting->name, $value);
123+
}
124+
125+
return $result;
126+
}
127+
128+
129+
private function getRunTime(string $name): ?string
101130
{
102131
return $this->runTimeStorage[$name] ?? null;
103132
}
104133

105134
public function getGrouped(): array
106135
{
107136
return $this->group(
108-
$this->repository->findAll()
137+
$this->em->getRepository($this->entityClass)->findAll()
109138
);
110139
}
111140

@@ -134,27 +163,28 @@ private function group(array $settings): array
134163
public function remove(string $name): void
135164
{
136165
/** @var Setting $setting */
137-
$setting = $this->repository->findOneBy(['name' => $name]);
166+
$setting = $this->em->getRepository($this->entityClass)->findOneBy(['name' => $name]);
138167
if ($setting !== null) {
139168
$this->em->remove($setting);
140169
$this->em->flush();
141170
$this->setRunTime($name, self::SETTING_NOT_DEFINED_INDICATOR);
142171
}
143172
}
144173

145-
public function setOverridePrefix(string $prefix): void
174+
public function setOverridePrefix(?string $prefix): void
146175
{
147176
$this->overridePrefix = $prefix;
148177
}
149178

150179
private function maskSensitiveString(string $input): string
151180
{
152181
$input = $this->cryptoService->decrypt($input);
182+
if (strlen($input) < 5) {
183+
return "****";
184+
}
153185

154-
$start = substr($input, 0, 2);
155-
$end = substr($input, -2);
156-
$masked = str_repeat('*', 8);
157-
158-
return strlen($input) < 5 ? "****" : $start . $masked . $end;
186+
return substr($input, 0, 2)
187+
. str_repeat('*', 8)
188+
. substr($input, -2);
159189
}
160190
}

Interfaces/SettingHandlerInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ public function getGrouped(): array;
1515
public function remove(string $name): void;
1616

1717
public function setRunTime(string $name, ?string $runtimeValue);
18+
19+
public function getMultiple(array $names): array;
1820
}

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ in the `app/config/routing.yml` file of your project:
5959
# app/config/routing.yml
6060

6161
setting_routes:
62-
resource: "@SettingBundle/Resources/config/routing.yml"
62+
resource: "@HBSettingBundle/Resources/config/routing.yml"
6363
prefix: / # some admin path prefix
6464
```
6565
@@ -79,7 +79,7 @@ Step 5: API
7979
Include the following in your `config/routes.yaml` file:
8080
```yaml
8181
setting_api:
82-
resource: "@SettingBundle/Resources/config/api_routing.yml"
82+
resource: "@HBSettingBundle/Resources/config/api_routing.yml"
8383
prefix: /api
8484
```
8585

Resources/config/api_routing.yml

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,3 @@
1-
settings_get_list:
2-
path: /settings/list
3-
controller: Hengebytes\SettingBundle\Controller\ApiController::getGroupedSettings
4-
methods: [GET]
5-
6-
settings_create:
7-
path: /settings
8-
controller: Hengebytes\SettingBundle\Controller\ApiController::setSetting
9-
methods: [POST]
10-
11-
settings_update_list:
12-
path: /settings/list
13-
controller: Hengebytes\SettingBundle\Controller\ApiController::bulkUpdateAction
14-
methods: [POST]
15-
16-
settings_delete_list:
17-
path: /settings/list
18-
controller: Hengebytes\SettingBundle\Controller\ApiController::bulkRemoveAction
19-
methods: [DELETE]
1+
settings_api_routes:
2+
resource: Hengebytes\SettingBundle\Controller\ApiController
3+
type: attribute

Resources/views/setting_layout.html.twig

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,19 @@
1010
<meta name="robots" content="noindex, nofollow"/>
1111
{% endblock %}
1212
{% block head_css %}
13-
<link href="{{ asset('bundles/setting/css/bootstrap.css') }}" rel="stylesheet"/>
14-
<link href="{{ asset('bundles/setting/css/helpers.css') }}" rel="stylesheet"/>
13+
<link href="{{ asset('bundles/hbsetting/css/bootstrap.css') }}" rel="stylesheet"/>
14+
<link href="{{ asset('bundles/hbsetting/css/helpers.css') }}" rel="stylesheet"/>
1515
{% endblock %}
1616
{% block head_js %}
1717
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
18-
<script src="{{ asset('bundles/setting/js/setting_general.js') }}"></script>
18+
<script src="{{ asset('bundles/hbsetting/js/setting_general.js') }}"></script>
1919
{% endblock %}
2020
</head>
2121
<body>
2222
<div class="container">
2323
<hr>
2424
{% block content %}
25-
{% include '@Setting/index.html.twig' %}
25+
{% include '@HBSetting/index.html.twig' %}
2626
{% endblock %}
2727
{% block footer %}
2828
<footer>

0 commit comments

Comments
 (0)