Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
96.77% covered (success)
96.77%
30 / 31
83.33% covered (warning)
83.33%
5 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
IdentificationDocumentsFilePolicyApplier
96.77% covered (success)
96.77%
30 / 31
83.33% covered (warning)
83.33%
5 / 6
10
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
90.91% covered (success)
90.91%
10 / 11
0.00% covered (danger)
0.00%
0 / 1
3.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%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 assertOverrideAllowed
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 storeIdentificationDocumentsPolicySnapshot
100.00% covered (success)
100.00%
5 / 5
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\IdentificationDocuments\FilePolicy;
10
11use OCA\Libresign\Db\File as FileEntity;
12use OCA\Libresign\Service\Policy\AbstractFilePolicyApplier;
13use OCA\Libresign\Service\Policy\Model\ResolvedPolicy;
14use OCA\Libresign\Service\Policy\Provider\IdentificationDocuments\IdentificationDocumentsPolicy;
15use OCA\Libresign\Service\Policy\Provider\IdentificationDocuments\IdentificationDocumentsPolicyValue;
16use OCP\IUser;
17
18class IdentificationDocumentsFilePolicyApplier extends AbstractFilePolicyApplier {
19
20    #[\Override]
21    public function apply(FileEntity $file, array $data): void {
22        $user = ($data['userManager'] ?? null) instanceof IUser ? $data['userManager'] : null;
23        $requestOverrides = $this->getOverrides($data);
24        $activeContext = $this->extractActiveContext($data);
25        $resolvedPolicy = $activeContext === null
26            ? $this->policyService->resolveForUser(IdentificationDocumentsPolicy::KEY, $user, $requestOverrides)
27            : $this->policyService->resolveForUser(IdentificationDocumentsPolicy::KEY, $user, $requestOverrides, $activeContext);
28        $this->assertOverrideAllowed($requestOverrides, $resolvedPolicy);
29        $this->storeIdentificationDocumentsPolicySnapshot($file, $resolvedPolicy);
30    }
31
32    #[\Override]
33    public function sync(FileEntity $file, array $data): void {
34        $requestOverrides = $this->getOverrides($data);
35        $activeContext = $this->extractActiveContext($data);
36        $resolvedPolicy = $activeContext === null
37            ? $this->policyService->resolveForUserId(IdentificationDocumentsPolicy::KEY, $file->getUserId(), $requestOverrides)
38            : $this->policyService->resolveForUserId(IdentificationDocumentsPolicy::KEY, $file->getUserId(), $requestOverrides, $activeContext);
39        $this->assertOverrideAllowed($requestOverrides, $resolvedPolicy);
40        $metadataBeforeUpdate = $file->getMetadata() ?? [];
41        $this->storeIdentificationDocumentsPolicySnapshot($file, $resolvedPolicy);
42        $metadataChanged = ($file->getMetadata() ?? []) !== $metadataBeforeUpdate;
43
44        if ($metadataChanged) {
45            $this->fileService->update($file);
46        }
47    }
48
49    #[\Override]
50    public function supportsCoreFlowSync(): bool {
51        return true;
52    }
53
54    /** @return array<string, array{enabled: bool, approvers: list<string>}> */
55    private function getOverrides(array $data): array {
56        return $this->extractSinglePolicyOverride(
57            $data,
58            IdentificationDocumentsPolicy::KEY,
59            static fn (mixed $value): array => IdentificationDocumentsPolicyValue::normalize($value, false),
60        );
61    }
62
63    /** @param array<string, mixed> $requestOverrides */
64    private function assertOverrideAllowed(array $requestOverrides, ResolvedPolicy $resolvedPolicy): void {
65        $this->assertRequestOverrideAllowed($requestOverrides, $resolvedPolicy, 'Identification documents flow override is blocked by %s.');
66    }
67
68    private function storeIdentificationDocumentsPolicySnapshot(FileEntity $file, ResolvedPolicy $resolvedPolicy): void {
69        parent::storePolicySnapshot(
70            $file,
71            $resolvedPolicy,
72            IdentificationDocumentsPolicyValue::normalize($resolvedPolicy->getEffectiveValue(), false),
73        );
74    }
75}