@@ -28,12 +28,34 @@ public function viewAny(User $user, Event|EventSeries|Organization|null $referen
28
28
return $ this ->deny ();
29
29
}
30
30
31
- return match ($ reference ::class) {
32
- Event::class => $ this ->requireAbility ($ user , Ability::ViewDocumentsOfEvents),
33
- EventSeries::class => $ this ->requireAbility ($ user , Ability::ViewDocumentsOfEventSeries),
34
- Organization::class => $ this ->requireAbility ($ user , Ability::ViewDocumentsOfOrganizations),
35
- default => $ this ->deny (),
36
- };
31
+ if ($ user ->hasAbility (Ability::ViewDocuments)) {
32
+ // ViewDocuments grants access to all documents.
33
+ return $ this ->allow ();
34
+ }
35
+
36
+ return $ this ->requireAbilityOrResponsibleUser (
37
+ match ($ reference ::class) {
38
+ Event::class => $ this ->requireAbility ($ user , Ability::ViewDocumentsOfEvents),
39
+ EventSeries::class => $ this ->requireAbility ($ user , Ability::ViewDocumentsOfEventSeries),
40
+ Organization::class => $ this ->requireAbility ($ user , Ability::ViewDocumentsOfOrganizations),
41
+ default => $ this ->deny (),
42
+ },
43
+ $ user ,
44
+ $ reference
45
+ );
46
+ }
47
+
48
+ private function requireAbilityOrResponsibleUser (
49
+ Response $ abilityResponse ,
50
+ User $ user ,
51
+ Event |EventSeries |Organization $ reference
52
+ ): Response {
53
+ if ($ abilityResponse ->allowed ()) {
54
+ return $ abilityResponse ;
55
+ }
56
+
57
+ // Responsible users can always access documents of their events, event series and organizations.
58
+ return $ this ->response ($ user ->isResponsibleFor ($ reference ));
37
59
}
38
60
39
61
/**
@@ -58,12 +80,16 @@ public function create(User $user, Event|EventSeries|Organization $reference): R
58
80
return $ this ->deny ();
59
81
}
60
82
61
- return match ($ reference ::class) {
62
- Event::class => $ this ->requireAbility ($ user , Ability::AddDocumentsToEvents),
63
- EventSeries::class => $ this ->requireAbility ($ user , Ability::AddDocumentsToEventSeries),
64
- Organization::class => $ this ->requireAbility ($ user , Ability::AddDocumentsToOrganizations),
65
- default => $ this ->deny (),
66
- };
83
+ return $ this ->requireAbilityOrResponsibleUser (
84
+ match ($ reference ::class) {
85
+ Event::class => $ this ->requireAbility ($ user , Ability::AddDocumentsToEvents),
86
+ EventSeries::class => $ this ->requireAbility ($ user , Ability::AddDocumentsToEventSeries),
87
+ Organization::class => $ this ->requireAbility ($ user , Ability::AddDocumentsToOrganizations),
88
+ default => $ this ->deny (),
89
+ },
90
+ $ user ,
91
+ $ reference
92
+ );
67
93
}
68
94
69
95
/**
@@ -75,12 +101,16 @@ public function update(User $user, Document $document): Response
75
101
return $ this ->deny ();
76
102
}
77
103
78
- return match ($ document ->reference ::class) {
79
- Event::class => $ this ->requireAbility ($ user , Ability::EditDocumentsOfEvents),
80
- EventSeries::class => $ this ->requireAbility ($ user , Ability::EditDocumentsOfEventSeries),
81
- Organization::class => $ this ->requireAbility ($ user , Ability::EditDocumentsOfOrganizations),
82
- default => $ this ->deny (),
83
- };
104
+ return $ this ->requireAbilityOrResponsibleUser (
105
+ match ($ document ->reference ::class) {
106
+ Event::class => $ this ->requireAbility ($ user , Ability::EditDocumentsOfEvents),
107
+ EventSeries::class => $ this ->requireAbility ($ user , Ability::EditDocumentsOfEventSeries),
108
+ Organization::class => $ this ->requireAbility ($ user , Ability::EditDocumentsOfOrganizations),
109
+ default => $ this ->deny (),
110
+ },
111
+ $ user ,
112
+ $ document ->reference
113
+ );
84
114
}
85
115
86
116
/**
0 commit comments