Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.45% covered (success)
95.45%
21 / 22
75.00% covered (warning)
75.00%
3 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
DocMdpFilePolicyApplier
95.45% covered (success)
95.45%
21 / 22
75.00% covered (warning)
75.00%
3 / 4
9
0.00% covered (danger)
0.00%
0 / 1
 apply
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 sync
91.67% covered (success)
91.67%
11 / 12
0.00% covered (danger)
0.00%
0 / 1
4.01
 supportsCoreFlowSync
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getOverrides
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4/**
5 * SPDX-FileCopyrightText: 2026 LibreCode coop and contributors
6 * SPDX-License-Identifier: AGPL-3.0-or-later
7 */
8
9namespace OCA\Libresign\Service\Policy\Provider\DocMdp\FilePolicy;
10
11use OCA\Libresign\Db\File as FileEntity;
12use OCA\Libresign\Enum\DocMdpLevel;
13use OCA\Libresign\Service\Policy\AbstractFilePolicyApplier;
14use OCA\Libresign\Service\Policy\Provider\DocMdp\DocMdpPolicy;
15use OCP\IUser;
16
17class DocMdpFilePolicyApplier extends AbstractFilePolicyApplier {
18
19    #[\Override]
20    public function apply(FileEntity $file, array $data): void {
21        $user = ($data['userManager'] ?? null) instanceof IUser ? $data['userManager'] : null;
22        $requestOverrides = $this->getOverrides($data);
23        $activeContext = $this->extractActiveContext($data);
24        $resolvedPolicy = $activeContext === null
25            ? $this->policyService->resolveForUser(DocMdpPolicy::KEY, $user, $requestOverrides)
26            : $this->policyService->resolveForUser(DocMdpPolicy::KEY, $user, $requestOverrides, $activeContext);
27        $file->setDocmdpLevelEnum(DocMdpLevel::tryFrom((int)$resolvedPolicy->getEffectiveValue()) ?? DocMdpLevel::NOT_CERTIFIED);
28        $this->storePolicySnapshot($file, $resolvedPolicy);
29    }
30
31    #[\Override]
32    public function sync(FileEntity $file, array $data): void {
33        $requestOverrides = $this->getOverrides($data);
34        $activeContext = $this->extractActiveContext($data);
35        $resolvedPolicy = $activeContext === null
36            ? $this->policyService->resolveForUserId(DocMdpPolicy::KEY, $file->getUserId(), $requestOverrides)
37            : $this->policyService->resolveForUserId(DocMdpPolicy::KEY, $file->getUserId(), $requestOverrides, $activeContext);
38        $newLevel = DocMdpLevel::tryFrom((int)$resolvedPolicy->getEffectiveValue()) ?? DocMdpLevel::NOT_CERTIFIED;
39        $metadataBeforeUpdate = $file->getMetadata() ?? [];
40        $this->storePolicySnapshot($file, $resolvedPolicy);
41        $metadataChanged = ($file->getMetadata() ?? []) !== $metadataBeforeUpdate;
42
43        if ($file->getDocmdpLevelEnum() !== $newLevel || $metadataChanged) {
44            $file->setDocmdpLevelEnum($newLevel);
45            $this->fileService->update($file);
46        }
47    }
48
49    #[\Override]
50    public function supportsCoreFlowSync(): bool {
51        return true;
52    }
53
54    /** @return array<string, int> */
55    private function getOverrides(array $data): array {
56        return $this->extractSinglePolicyOverride($data, DocMdpPolicy::KEY);
57    }
58}