Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
1 / 1
n/a
0 / 0
CRAP
n/a
0 / 0
1<?php
2
3declare(strict_types=1);
4
5/** @license For full copyright and license information, please see the LICENSE.md file. */
6
7namespace App\Core\Access\Domain\Repository;
8
9defined('AMMONLY_APP') || exit('Direct script access is forbidden.');
10
11use App\Core\Access\Domain\Model\AccessRule;
12use App\Core\Access\Domain\Model\ModuleAccessLevel;
13
14/**
15 * Access Control Repository Interface.
16 *
17 * Contract for managing module access levels, explicit rules, and fast-lookup joins.
18 *
19 * @package App\Core\Access\Domain\Repository
20 */
21interface AccessRepositoryInterface
22{
23    /**
24     * Retrieves the base access level for a specific module.
25     *
26     * @param string $moduleName System module name.
27     * @return ModuleAccessLevel Configured access level (defaults to PRIVATE).
28     */
29    public function getModuleLevel(string $moduleName): ModuleAccessLevel;
30
31    /**
32     * Retrieves all configured module access levels mapped by module name.
33     *
34     * @return array<string, ModuleAccessLevel> Keyed map of module access levels.
35     */
36    public function getAllModuleLevels(): array;
37
38    /**
39     * Sets or updates the base access level for a module.
40     *
41     * @param string            $moduleName System module name.
42     * @param ModuleAccessLevel $level      Target access tier.
43     * @param int|null          $updatedBy  Actor user ID performing the update.
44     */
45    public function setModuleLevel(string $moduleName, ModuleAccessLevel $level, ?int $updatedBy = null): void;
46
47    /**
48     * Retrieves all defined access rules for a specific module.
49     *
50     * @param string $moduleName System module name.
51     * @return list<AccessRule> List of access rules.
52     */
53    public function findRulesByModule(string $moduleName): array;
54
55    /**
56     * Counts active access rules grouped by module name.
57     *
58     * @return array<string, int> Associative array of module names to rule counts.
59     */
60    public function countRulesByModule(): array;
61
62    /**
63     * Finds a single access rule by ID.
64     *
65     * @param int $id Rule identifier.
66     * @return AccessRule|null Found rule or null.
67     */
68    public function findRuleById(int $id): ?AccessRule;
69
70    /**
71     * Persists an access rule (insert or update).
72     *
73     * @param AccessRule $rule Domain rule entity.
74     * @return int Persisted rule ID.
75     */
76    public function saveRule(AccessRule $rule): int;
77
78    /**
79     * Deletes an access rule by ID.
80     *
81     * @param int $id Rule identifier.
82     * @return bool True if deleted successfully.
83     */
84    public function deleteRule(int $id): bool;
85
86    /**
87     * Finds all rules matching an actor and target for permission guard evaluation.
88     *
89     * @param string          $moduleName        Target module.
90     * @param int             $actorUserId       Actor user ID.
91     * @param array<int, int> $actorStructureIds Actor structure membership IDs.
92     * @return list<AccessRule> Matching rules.
93     */
94    public function findMatchingRules(string $moduleName, int $actorUserId, array $actorStructureIds = []): array;
95
96    /**
97     * Checks if actor has permission to access a non-CRUD module.
98     *
99     * @param string          $moduleName        Target non-CRUD module.
100     * @param int             $actorUserId       Actor user ID.
101     * @param array<int, int> $actorStructureIds Actor structure membership IDs.
102     * @return bool True if actor is authorized.
103     */
104    public function canAccessNonCrudModule(string $moduleName, int $actorUserId, array $actorStructureIds = []): bool;
105
106    /**
107     * Recompiles materialized user-owner fast lookup rows for a specific module.
108     *
109     * @param string $moduleName System module name.
110     */
111    public function recompileModule(string $moduleName): void;
112
113    /**
114     * Recompiles materialized rows for a specific user across all modules.
115     *
116     * @param int $userId Target user ID.
117     */
118    public function recompileUser(int $userId): void;
119
120    /**
121     * Recompiles the entire fast lookup table for all modules and users.
122     */
123    public function recompileAll(): void;
124
125    /**
126     * Checks whether an actor possesses compiled shared access to an owner's records.
127     *
128     * @param string $moduleName  Target module name.
129     * @param int    $actorUserId Actor user ID.
130     * @param string $ownerType   Target owner type ('user' or 'structure').
131     * @param int    $ownerId     Target owner identifier.
132     * @param string $action      Action being verified ('read', 'edit', 'delete').
133     * @return bool True if compiled shared permission exists.
134     */
135    public function hasSharedOwnerAccess(
136        string $moduleName,
137        int    $actorUserId,
138        string $ownerType,
139        int    $ownerId,
140        string $action = 'read'
141    ): bool;
142}