Skip to content

Commit 3f270a2

Browse files
committed
Moved the supervisors data save requests to the patch endpoints to avoid any collisions.
1 parent cca8f8c commit 3f270a2

7 files changed

Lines changed: 141 additions & 36 deletions

File tree

composer.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@
5858
"laminas/laminas-inputfilter": "^2.10",
5959
"laminas/laminas-dependency-plugin": "^2.0",
6060
"symfony/console": "^5.0",
61-
"guzzlehttp/guzzle": "^6.5",
61+
"guzzlehttp/guzzle": "^7.11",
6262
"phpoffice/phpword": "^0.18.1",
6363
"laminas/laminas-mvc-middleware": "^2.2",
64-
"laminas/laminas-captcha": "^2.18"
64+
"laminas/laminas-captcha": "^2.18",
65+
"guzzlehttp/psr7": "^2.11"
6566
},
6667
"require-dev": {
6768
"roave/security-advisories": "dev-latest"

config/module.config.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1798,10 +1798,14 @@
17981798
ReflectionBasedAbstractFactory::class,
17991799
InputValidator\InstanceRisk\UpdateInstanceRiskDataInputValidator::class =>
18001800
ReflectionBasedAbstractFactory::class,
1801+
InputValidator\InstanceRisk\PatchDelegatedInstanceRiskDataInputValidator::class =>
1802+
ReflectionBasedAbstractFactory::class,
18011803
InputValidator\InstanceRiskOp\PostSpecificInstanceRiskOpDataInputValidator::class =>
18021804
ReflectionBasedAbstractFactory::class,
18031805
InputValidator\InstanceRiskOp\UpdateInstanceRiskOpDataInputValidator::class =>
18041806
ReflectionBasedAbstractFactory::class,
1807+
InputValidator\InstanceRiskOp\PatchDelegatedInstanceRiskOpDataInputValidator::class =>
1808+
ReflectionBasedAbstractFactory::class,
18051809
InputValidator\Threat\PostThreatDataInputValidator::class => static function (
18061810
Containerinterface $container
18071811
) {

src/Controller/ApiAnrInstancesRisksController.php

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Monarc\FrontOffice\Entity\Anr;
1313
use Monarc\FrontOffice\Service\AnrInstanceRiskService;
1414
use Monarc\FrontOffice\Service\AnrSupervisorService;
15+
use Monarc\FrontOffice\Validator\InputValidator\InstanceRisk\PatchDelegatedInstanceRiskDataInputValidator;
1516
use Monarc\FrontOffice\Validator\InputValidator\InstanceRisk\PostSpecificInstanceRiskDataInputValidator;
1617
use Monarc\FrontOffice\Validator\InputValidator\InstanceRisk\UpdateInstanceRiskDataInputValidator;
1718

@@ -23,7 +24,8 @@ public function __construct(
2324
private AnrInstanceRiskService $anrInstanceRiskService,
2425
private AnrSupervisorService $anrSupervisorService,
2526
private PostSpecificInstanceRiskDataInputValidator $postSpecificInstanceRiskDataInputValidator,
26-
private UpdateInstanceRiskDataInputValidator $updateInstanceRiskDataInputValidator
27+
private UpdateInstanceRiskDataInputValidator $updateInstanceRiskDataInputValidator,
28+
private PatchDelegatedInstanceRiskDataInputValidator $patchDelegatedInstanceRiskDataInputValidator
2729
) {
2830
}
2931

@@ -59,7 +61,25 @@ public function update($id, $data)
5961
$instanceRisk = $this->anrInstanceRiskService
6062
->update($anr, (int)$id, $validatedData);
6163

62-
return $this->getPreparedJsonResponse([
64+
return $this->getPreparedJsonResponse($this->prepareInstanceRiskResponse($instanceRisk));
65+
}
66+
67+
public function patch($id, $data)
68+
{
69+
/** @var Anr $anr */
70+
$anr = $this->getRequest()->getAttribute('anr');
71+
/** @var array $data */
72+
$this->validatePostParams($this->patchDelegatedInstanceRiskDataInputValidator, $data);
73+
$validatedData = $this->filterValidatedData($data, $this->patchDelegatedInstanceRiskDataInputValidator->getValidData());
74+
75+
$instanceRisk = $this->anrInstanceRiskService->update($anr, (int)$id, $validatedData);
76+
77+
return $this->getPreparedJsonResponse($this->prepareInstanceRiskResponse($instanceRisk));
78+
}
79+
80+
private function prepareInstanceRiskResponse($instanceRisk): array
81+
{
82+
return [
6383
'id' => $instanceRisk->getId(),
6484
'riskSourceId' => $instanceRisk->getRiskSource()?->getId(),
6585
'riskSourceLabel' => $instanceRisk->getRiskSource()?->getLabel() ?? '',
@@ -96,12 +116,7 @@ public function update($id, $data)
96116
'riskAvailability' => $instanceRisk->getRiskAvailability(),
97117
'cacheMaxRisk' => $instanceRisk->getCacheMaxRisk(),
98118
'cacheTargetedRisk' => $instanceRisk->getCacheTargetedRisk(),
99-
]);
100-
}
101-
102-
private function filterValidatedData(array $sourceData, array $validatedData): array
103-
{
104-
return array_intersect_key($validatedData, $sourceData);
119+
];
105120
}
106121

107122
public function delete($id)
@@ -112,4 +127,9 @@ public function delete($id)
112127

113128
return $this->getSuccessfulJsonResponse();
114129
}
130+
131+
private function filterValidatedData(array $sourceData, array $validatedData): array
132+
{
133+
return array_intersect_key($validatedData, $sourceData);
134+
}
115135
}

src/Controller/ApiAnrInstancesRisksOpController.php

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Monarc\FrontOffice\Entity\Anr;
1414
use Monarc\FrontOffice\Service\AnrInstanceRiskOpService;
1515
use Monarc\FrontOffice\Service\AnrSupervisorService;
16+
use Monarc\FrontOffice\Validator\InputValidator\InstanceRiskOp\PatchDelegatedInstanceRiskOpDataInputValidator;
1617
use Monarc\FrontOffice\Validator\InputValidator\InstanceRiskOp\PostSpecificInstanceRiskOpDataInputValidator;
1718
use Monarc\FrontOffice\Validator\InputValidator\InstanceRiskOp\UpdateInstanceRiskOpDataInputValidator;
1819

@@ -25,7 +26,8 @@ public function __construct(
2526
private AnrSupervisorService $anrSupervisorService,
2627
private PostSpecificInstanceRiskOpDataInputValidator $postSpecificInstanceRiskOpDataInputValidator,
2728
private UpdateInstanceRiskOpDataInputValidator $updateInstanceRiskOpDataInputValidator,
28-
private PatchInstanceRiskOpDataInputValidator $patchInstanceRiskOpDataInputValidator
29+
private PatchInstanceRiskOpDataInputValidator $patchInstanceRiskOpDataInputValidator,
30+
private PatchDelegatedInstanceRiskOpDataInputValidator $patchDelegatedInstanceRiskOpDataInputValidator
2931
) {
3032
}
3133

@@ -61,7 +63,47 @@ public function update($id, $data)
6163
$validatedData
6264
);
6365

64-
return $this->getPreparedJsonResponse([
66+
return $this->getPreparedJsonResponse($this->prepareInstanceRiskOpResponse($instanceRiskOp));
67+
}
68+
69+
/**
70+
* @param array $data
71+
*/
72+
public function patch($id, $data)
73+
{
74+
/** @var Anr $anr */
75+
$anr = $this->getRequest()->getAttribute('anr');
76+
77+
if (array_key_exists('instanceRiskScaleId', $data)) {
78+
$this->validatePostParams($this->patchInstanceRiskOpDataInputValidator, $data);
79+
$instanceRiskOp = $this->anrInstanceRiskOpService->updateScaleValue(
80+
$anr,
81+
(int)$id,
82+
$this->patchInstanceRiskOpDataInputValidator->getValidData()
83+
);
84+
85+
return $this->getPreparedJsonResponse([
86+
'cacheBrutRisk' => $instanceRiskOp->getCacheBrutRisk(),
87+
'cacheNetRisk' => $instanceRiskOp->getCacheNetRisk(),
88+
'cacheTargetedRisk' => $instanceRiskOp->getCacheTargetedRisk(),
89+
]);
90+
}
91+
92+
$this->validatePostParams($this->patchDelegatedInstanceRiskOpDataInputValidator, $data);
93+
$validatedData = $this->filterValidatedData($data, $this->patchDelegatedInstanceRiskOpDataInputValidator->getValidData());
94+
95+
$instanceRiskOp = $this->anrInstanceRiskOpService->update(
96+
$anr,
97+
(int)$id,
98+
$validatedData
99+
);
100+
101+
return $this->getPreparedJsonResponse($this->prepareInstanceRiskOpResponse($instanceRiskOp));
102+
}
103+
104+
private function prepareInstanceRiskOpResponse($instanceRiskOp): array
105+
{
106+
return [
65107
'cacheBrutRisk' => $instanceRiskOp->getCacheBrutRisk(),
66108
'cacheNetRisk' => $instanceRiskOp->getCacheNetRisk(),
67109
'cacheTargetedRisk' => $instanceRiskOp->getCacheTargetedRisk(),
@@ -92,29 +134,7 @@ public function update($id, $data)
92134
'residualRiskDecidedByName' => $instanceRiskOp->getResidualRiskDecidedBySupervisor()?->getName(),
93135
'residualRiskDecidedAt' => $instanceRiskOp->getResidualRiskDecidedAt()?->format('Y-m-d'),
94136
'residualRiskJustification' => $instanceRiskOp->getResidualRiskJustification(),
95-
]);
96-
}
97-
98-
/**
99-
* @param array $data
100-
*/
101-
public function patch($id, $data)
102-
{
103-
$this->validatePostParams($this->patchInstanceRiskOpDataInputValidator, $data);
104-
/** @var Anr $anr */
105-
$anr = $this->getRequest()->getAttribute('anr');
106-
107-
$instanceRiskOp = $this->anrInstanceRiskOpService->updateScaleValue(
108-
$anr,
109-
(int)$id,
110-
$this->patchInstanceRiskOpDataInputValidator->getValidData()
111-
);
112-
113-
return $this->getPreparedJsonResponse([
114-
'cacheBrutRisk' => $instanceRiskOp->getCacheBrutRisk(),
115-
'cacheNetRisk' => $instanceRiskOp->getCacheNetRisk(),
116-
'cacheTargetedRisk' => $instanceRiskOp->getCacheTargetedRisk(),
117-
]);
137+
];
118138
}
119139

120140
public function delete($id)

src/Middleware/AnrValidationMiddleware.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ private function isDelegatedRiskFieldUpdateAuthorized(
195195
ServerRequestInterface $request,
196196
Entity\Anr $anr
197197
): bool {
198-
if ($request->getMethod() !== Request::METHOD_PUT || $anr->isAnrSnapshot()) {
198+
if ($request->getMethod() !== Request::METHOD_PATCH || $anr->isAnrSnapshot()) {
199199
return false;
200200
}
201201

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php declare(strict_types=1);
2+
/**
3+
* @link https://github.com/monarc-project for the canonical source repository
4+
* @copyright Copyright (c) 2016-2026 Luxembourg House of Cybersecurity LHC.lu - Licensed under GNU Affero GPL v3
5+
* @license MONARC is licensed under GNU Affero General Public License version 3
6+
*/
7+
8+
namespace Monarc\FrontOffice\Validator\InputValidator\InstanceRisk;
9+
10+
class PatchDelegatedInstanceRiskDataInputValidator extends UpdateInstanceRiskDataInputValidator
11+
{
12+
private const ALLOWED_FIELDS = [
13+
'lastReviewDate',
14+
'reviewFrequency',
15+
'residualRiskDecision',
16+
'residualRiskDecidedAt',
17+
'residualAcceptancePerformedByName',
18+
'residualAcceptancePerformedByEmail',
19+
'residualAcceptancePerformedOnBehalf',
20+
'residualRiskJustification',
21+
];
22+
23+
protected function getRules(): array
24+
{
25+
return array_values(array_filter(
26+
parent::getRules(),
27+
static fn (array $rule): bool => in_array($rule['name'], self::ALLOWED_FIELDS, true)
28+
));
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php declare(strict_types=1);
2+
/**
3+
* @link https://github.com/monarc-project for the canonical source repository
4+
* @copyright Copyright (c) 2016-2026 Luxembourg House of Cybersecurity LHC.lu - Licensed under GNU Affero GPL v3
5+
* @license MONARC is licensed under GNU Affero General Public License version 3
6+
*/
7+
8+
namespace Monarc\FrontOffice\Validator\InputValidator\InstanceRiskOp;
9+
10+
class PatchDelegatedInstanceRiskOpDataInputValidator extends UpdateInstanceRiskOpDataInputValidator
11+
{
12+
private const ALLOWED_FIELDS = [
13+
'lastReviewDate',
14+
'reviewFrequency',
15+
'residualRiskDecision',
16+
'residualRiskDecidedAt',
17+
'residualAcceptancePerformedByName',
18+
'residualAcceptancePerformedByEmail',
19+
'residualAcceptancePerformedOnBehalf',
20+
'residualRiskJustification',
21+
];
22+
23+
protected function getRules(): array
24+
{
25+
return array_values(array_filter(
26+
parent::getRules(),
27+
static fn (array $rule): bool => in_array($rule['name'], self::ALLOWED_FIELDS, true)
28+
));
29+
}
30+
}

0 commit comments

Comments
 (0)