decidim-api 0.29.1 → 0.29.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9585f47d411b9a9e9bda8e8a5608a3fcd90582e9844c7baed210b3c935b91c3b
4
- data.tar.gz: 641a97f83951689fc9d1e3ebd3fedc10749ee6a23a6681c59cbca0d781da45c5
3
+ metadata.gz: 468053a5bebf49385de8bda0afb78d2e4eac0c53899e9fb2b5d96c3cb4d7542b
4
+ data.tar.gz: 9ac0c09214d171b017d946f7e1aec123b9bc1616e5152ba3bbfe63eb9db45f8b
5
5
  SHA512:
6
- metadata.gz: ac63bab88afe41a312a3b0a563d017f7a1fbba6ffb4b8b4001485c57b197b0b239b1ab30bd552098b5e8a532d20b507dc3b1d43c4f8fa258f116dea01ba1912d
7
- data.tar.gz: 3c3863d36870b095f7afd928477f8c0e17cd3bef07ee1862c5162e717d44c6cf33458d59f5110ee19428502dd61d6073d09434a26aaffff7c389f618a5957c28
6
+ metadata.gz: 98af2b7e9adcd818c182d996734e0cfc3b77b95849b8e0f02140de3d66da889570cc1871fc3ef53d79b771ecd20c3ab3806ef6fd1731202ed44976b257fb6378
7
+ data.tar.gz: 1485446fae224e268fbd7f63a6f5efa4e0966203740a14e54334c33c055a7793f78e49b85c5037f62487474fac9996a7ba0a84c7180f1e2e0308140b602e2d47
data/decidim-api.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.version = Decidim::Api.version
11
11
  s.authors = ["Josep Jaume Rey Peroy", "Marc Riera Casals", "Oriol Gual Oliva"]
12
12
  s.email = ["josepjaume@gmail.com", "mrc2407@gmail.com", "oriolgual@gmail.com"]
13
- s.license = "AGPL-3.0"
13
+ s.license = "AGPL-3.0-or-later"
14
14
  s.homepage = "https://decidim.org"
15
15
  s.metadata = {
16
16
  "bug_tracker_uri" => "https://github.com/decidim/decidim/issues",
@@ -37,6 +37,7 @@ Gem::Specification.new do |s|
37
37
  s.add_dependency "graphql-docs", "~> 4.0"
38
38
  s.add_dependency "rack-cors", "~> 1.0"
39
39
 
40
+ s.add_development_dependency "decidim-assemblies", Decidim::Api.version
40
41
  s.add_development_dependency "decidim-comments", Decidim::Api.version
41
42
  s.add_development_dependency "decidim-dev", Decidim::Api.version
42
43
  s.add_development_dependency "decidim-participatory_processes", Decidim::Api.version
@@ -41,3 +41,438 @@ shared_context "with a graphql decidim component" do
41
41
  )
42
42
  end
43
43
  end
44
+
45
+ shared_examples "with resource visibility" do
46
+ let(:process_space_factory) { :participatory_process }
47
+ let(:space_type) { "participatoryProcess" }
48
+
49
+ shared_examples "graphQL visible resource" do
50
+ it "is visible" do
51
+ expect(response[space_type]["components"].first[lookout_key]).to eq(query_result)
52
+ end
53
+ end
54
+
55
+ shared_examples "graphQL hidden space" do
56
+ it "should not be visible" do
57
+ expect(response[space_type]).to be_nil
58
+ end
59
+ end
60
+
61
+ shared_examples "graphQL hidden component" do
62
+ it "should not be visible" do
63
+ expect(response[space_type]["components"].first).to be_nil
64
+ end
65
+ end
66
+
67
+ shared_examples "graphQL resource visible for admin" do
68
+ context "when the user is admin" do
69
+ let!(:current_user) { create(:user, :admin, :confirmed, organization: current_organization) }
70
+
71
+ it_behaves_like "graphQL visible resource"
72
+ end
73
+ end
74
+
75
+ shared_examples "graphQL space hidden to visitor" do
76
+ context "when user is visitor" do
77
+ let!(:current_user) { nil }
78
+ it_behaves_like "graphQL hidden space"
79
+ end
80
+ end
81
+
82
+ context "when space is published" do
83
+ let!(:participatory_process) { create(process_space_factory, :published, :with_steps, organization: current_organization) }
84
+
85
+ context "when component is published" do
86
+ let!(:current_component) { create(component_factory, :published, participatory_space: participatory_process) }
87
+
88
+ it_behaves_like "graphQL resource visible for admin"
89
+
90
+ context "when the user is space admin" do
91
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
92
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
93
+ it_behaves_like "graphQL visible resource"
94
+ end
95
+
96
+ context "when the user is space collaborator" do
97
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
98
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
99
+ it_behaves_like "graphQL visible resource"
100
+ end
101
+
102
+ context "when the user is space moderator" do
103
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
104
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
105
+ it_behaves_like "graphQL visible resource"
106
+ end
107
+
108
+ context "when the user is space valuator" do
109
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
110
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
111
+ it_behaves_like "graphQL visible resource"
112
+ end
113
+
114
+ context "when user is visitor" do
115
+ let!(:current_user) { nil }
116
+ it_behaves_like "graphQL visible resource"
117
+ end
118
+
119
+ context "when user is member" do
120
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
121
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
122
+ it_behaves_like "graphQL visible resource"
123
+ end
124
+
125
+ context "when user is member" do
126
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
127
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
128
+ it_behaves_like "graphQL visible resource"
129
+ end
130
+
131
+ context "when user is normal user" do
132
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
133
+ it_behaves_like "graphQL visible resource"
134
+ end
135
+ end
136
+
137
+ context "when component is not published" do
138
+ let!(:current_component) { create(component_factory, :unpublished, participatory_space: participatory_process) }
139
+
140
+ it_behaves_like "graphQL resource visible for admin"
141
+
142
+ context "when the user is space admin" do
143
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
144
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
145
+ it_behaves_like "graphQL visible resource"
146
+ end
147
+
148
+ context "when the user is space collaborator" do
149
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
150
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
151
+ it_behaves_like "graphQL hidden component"
152
+ end
153
+
154
+ context "when the user is space moderator" do
155
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
156
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
157
+ it_behaves_like "graphQL hidden component"
158
+ end
159
+
160
+ context "when the user is space valuator" do
161
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
162
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
163
+ it_behaves_like "graphQL visible resource"
164
+ end
165
+
166
+ context "when user is visitor" do
167
+ let!(:current_user) { nil }
168
+
169
+ it_behaves_like "graphQL hidden component"
170
+ end
171
+
172
+ context "when user is normal user" do
173
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
174
+ it_behaves_like "graphQL hidden component"
175
+ end
176
+
177
+ context "when user is member" do
178
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
179
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
180
+ it_behaves_like "graphQL hidden component"
181
+ end
182
+ end
183
+ end
184
+
185
+ context "when space is published, private and transparent" do
186
+ let(:process_space_factory) { :assembly }
187
+ let(:space_type) { "assembly" }
188
+
189
+ let(:participatory_process_query) do
190
+ %(
191
+ assembly(id: #{participatory_process.id}) {
192
+ components(filter: {type: "#{component_type}"}){
193
+ id
194
+ name {
195
+ translation(locale: "#{locale}")
196
+ }
197
+ weight
198
+ __typename
199
+ ...fooComponent
200
+ }
201
+ id
202
+ }
203
+ )
204
+ end
205
+ let!(:participatory_process) { create(process_space_factory, :published, :private, :transparent, organization: current_organization) }
206
+
207
+ context "when component is published" do
208
+ let!(:current_component) { create(component_factory, :published, participatory_space: participatory_process) }
209
+
210
+ it_behaves_like "graphQL resource visible for admin"
211
+
212
+ context "when the user is space admin" do
213
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
214
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "admin") }
215
+ it_behaves_like "graphQL visible resource"
216
+ end
217
+
218
+ context "when the user is space collaborator" do
219
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
220
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "collaborator") }
221
+ it_behaves_like "graphQL visible resource"
222
+ end
223
+
224
+ context "when the user is space moderator" do
225
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
226
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "moderator") }
227
+ it_behaves_like "graphQL visible resource"
228
+ end
229
+
230
+ context "when the user is space valuator" do
231
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
232
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "valuator") }
233
+ it_behaves_like "graphQL visible resource"
234
+ end
235
+
236
+ context "when user is visitor" do
237
+ let!(:current_user) { nil }
238
+ it_behaves_like "graphQL visible resource"
239
+ end
240
+
241
+ context "when user is member" do
242
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
243
+ let!(:participatory_space_private_user) { create(:assembly_private_user, user: current_user, privatable_to: participatory_process) }
244
+ it_behaves_like "graphQL visible resource"
245
+ end
246
+
247
+ context "when user is normal user" do
248
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
249
+ it_behaves_like "graphQL visible resource"
250
+ end
251
+ end
252
+
253
+ context "when component is not published" do
254
+ let!(:current_component) { create(component_factory, :unpublished, participatory_space: participatory_process) }
255
+
256
+ it_behaves_like "graphQL resource visible for admin"
257
+
258
+ context "when the user is space admin" do
259
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
260
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "admin") }
261
+ it_behaves_like "graphQL visible resource"
262
+ end
263
+
264
+ context "when the user is space collaborator" do
265
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
266
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "collaborator") }
267
+ it_behaves_like "graphQL visible resource"
268
+ end
269
+
270
+ context "when the user is space moderator" do
271
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
272
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "moderator") }
273
+ it_behaves_like "graphQL hidden component"
274
+ end
275
+
276
+ context "when the user is space valuator" do
277
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
278
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "valuator") }
279
+ it_behaves_like "graphQL visible resource"
280
+ end
281
+
282
+ context "when user is visitor" do
283
+ let!(:current_user) { nil }
284
+ it_behaves_like "graphQL hidden component"
285
+ end
286
+
287
+ context "when user is normal user" do
288
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
289
+ it_behaves_like "graphQL hidden component"
290
+ end
291
+
292
+ context "when user is member" do
293
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
294
+ let!(:participatory_space_private_user) { create(:assembly_private_user, user: current_user, privatable_to: participatory_process) }
295
+ it_behaves_like "graphQL hidden component"
296
+ end
297
+ end
298
+ end
299
+
300
+ context "when space is published but private" do
301
+ let!(:participatory_process) { create(process_space_factory, :published, :private, :with_steps, organization: current_organization) }
302
+
303
+ context "when component is published" do
304
+ let!(:current_component) { create(component_factory, :published, participatory_space: participatory_process) }
305
+
306
+ it_behaves_like "graphQL resource visible for admin"
307
+
308
+ context "when the user is space admin" do
309
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
310
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
311
+ it_behaves_like "graphQL hidden space"
312
+ end
313
+
314
+ context "when the user is space collaborator" do
315
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
316
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
317
+ it_behaves_like "graphQL hidden space"
318
+ end
319
+
320
+ context "when the user is space moderator" do
321
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
322
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
323
+
324
+ it_behaves_like "graphQL hidden space"
325
+ end
326
+
327
+ context "when the user is space valuator" do
328
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
329
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
330
+ it_behaves_like "graphQL hidden space"
331
+ end
332
+
333
+ it_behaves_like "graphQL space hidden to visitor"
334
+
335
+ context "when user is normal user" do
336
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
337
+ it_behaves_like "graphQL hidden space"
338
+ end
339
+
340
+ context "when user is member" do
341
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
342
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
343
+ it_behaves_like "graphQL visible resource"
344
+ end
345
+ end
346
+
347
+ context "when component is not published" do
348
+ let!(:current_component) { create(component_factory, :unpublished, participatory_space: participatory_process) }
349
+
350
+ it_behaves_like "graphQL resource visible for admin"
351
+
352
+ context "when the user is space admin" do
353
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
354
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
355
+ it_behaves_like "graphQL hidden space"
356
+ end
357
+
358
+ context "when the user is space collaborator" do
359
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
360
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
361
+ it_behaves_like "graphQL hidden space"
362
+ end
363
+
364
+ context "when the user is space moderator" do
365
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
366
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
367
+ it_behaves_like "graphQL hidden space"
368
+ end
369
+
370
+ context "when the user is space valuator" do
371
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
372
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
373
+ it_behaves_like "graphQL hidden space"
374
+ end
375
+ it_behaves_like "graphQL space hidden to visitor"
376
+
377
+ context "when user is member" do
378
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
379
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
380
+ it_behaves_like "graphQL hidden component"
381
+ end
382
+ context "when user is normal user" do
383
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
384
+ it_behaves_like "graphQL hidden space"
385
+ end
386
+ end
387
+ end
388
+
389
+ context "when space is unpublished" do
390
+ let(:participatory_process) { create(process_space_factory, :unpublished, :with_steps, organization: current_organization) }
391
+
392
+ context "when component is published" do
393
+ let!(:current_component) { create(component_factory, :published, participatory_space: participatory_process) }
394
+
395
+ it_behaves_like "graphQL resource visible for admin"
396
+
397
+ context "when the user is space admin" do
398
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
399
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
400
+ it_behaves_like "graphQL hidden space"
401
+ end
402
+
403
+ context "when the user is space collaborator" do
404
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
405
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
406
+ it_behaves_like "graphQL hidden space"
407
+ end
408
+
409
+ context "when the user is space moderator" do
410
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
411
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
412
+ it_behaves_like "graphQL hidden space"
413
+ end
414
+
415
+ context "when the user is space valuator" do
416
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
417
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
418
+ it_behaves_like "graphQL hidden space"
419
+ end
420
+
421
+ it_behaves_like "graphQL space hidden to visitor"
422
+
423
+ context "when user is member" do
424
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
425
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
426
+ it_behaves_like "graphQL hidden space"
427
+ end
428
+
429
+ context "when user is normal user" do
430
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
431
+ it_behaves_like "graphQL hidden space"
432
+ end
433
+ end
434
+
435
+ context "when component is not published" do
436
+ let!(:current_component) { create(component_factory, :unpublished, participatory_space: participatory_process) }
437
+
438
+ it_behaves_like "graphQL resource visible for admin"
439
+
440
+ context "when the user is space admin" do
441
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
442
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
443
+ it_behaves_like "graphQL hidden space"
444
+ end
445
+
446
+ context "when the user is space collaborator" do
447
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
448
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
449
+ it_behaves_like "graphQL hidden space"
450
+ end
451
+
452
+ context "when the user is space moderator" do
453
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
454
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
455
+ it_behaves_like "graphQL hidden space"
456
+ end
457
+
458
+ context "when the user is space valuator" do
459
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
460
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
461
+ it_behaves_like "graphQL hidden space"
462
+ end
463
+ it_behaves_like "graphQL space hidden to visitor"
464
+
465
+ context "when user is member" do
466
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
467
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
468
+ it_behaves_like "graphQL hidden space"
469
+ end
470
+
471
+ context "when user is normal user" do
472
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
473
+
474
+ it_behaves_like "graphQL hidden space"
475
+ end
476
+ end
477
+ end
478
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  shared_context "with a graphql class type" do
4
4
  let!(:current_organization) { create(:organization) }
5
- let!(:current_user) { create(:user, organization: current_organization) }
5
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
6
6
  let!(:current_component) { create(:component) }
7
7
  let(:model) { OpenStruct.new({}) }
8
8
  let(:type_class) { described_class }
@@ -5,6 +5,76 @@ module Decidim
5
5
  module Types
6
6
  class BaseObject < GraphQL::Schema::Object
7
7
  field_class Types::BaseField
8
+
9
+ def self.authorized?(object, context)
10
+ chain = []
11
+
12
+ subject = determine_subject_name(object)
13
+ context[subject] = object
14
+
15
+ chain.unshift(allowed_to?(:read, :participatory_space, object, context)) if object.respond_to?(:participatory_space)
16
+ chain.unshift(allowed_to?(:read, :component, object, context)) if object.respond_to?(:component) && object.component.present?
17
+
18
+ super && chain.all?
19
+ end
20
+
21
+ def self.determine_subject_name(object)
22
+ object.class.name.split("::").last.underscore.to_sym
23
+ end
24
+
25
+ # This is a simplified adaptation of allowed_to? from NeedsPermission concern
26
+ # @param action [Symbol] The action performed. Most cases the action is :read
27
+ # @param subject [Object] The name of the subject. Ex: :participatory_space, :component, or object
28
+ # @param object [ActiveModel::Base] The object that is being represented.
29
+ # @param context [GraphQL::Query::Context] The GraphQL context
30
+ #
31
+ # @return Boolean
32
+ def self.allowed_to?(action, subject, object, context)
33
+ unless subject.is_a?(::Symbol)
34
+ subject = determine_subject_name(object)
35
+ context[subject] = object
36
+ end
37
+
38
+ permission_action = Decidim::PermissionAction.new(scope: :public, action:, subject:)
39
+
40
+ permission_chain(object).inject(permission_action) do |current_permission_action, permission_class|
41
+ permission_class.new(
42
+ context[:current_user],
43
+ current_permission_action,
44
+ local_context(object, context)
45
+ ).permissions
46
+ end.allowed?
47
+ end
48
+
49
+ # Injects into context object current_participatory_space and current_component keys as they are needed
50
+ #
51
+ # @param object [ActiveModel::Base] The object that is being represented.
52
+ # @param context [GraphQL::Query::Context] The GraphQL context
53
+ #
54
+ # @return Hash
55
+ def self.local_context(object, context)
56
+ context[:current_participatory_space] = object.participatory_space if object.respond_to?(:participatory_space)
57
+ context[:current_component] = object.component if object.respond_to?(:component) && object.component.present?
58
+
59
+ context.to_h
60
+ end
61
+
62
+ # Creates the permission chain arrau that contains all the permission classes required to authorize a certain resource
63
+ # We are using unshift as we need the Admin and base permissions to be last in the chain
64
+ # @param object [ActiveModel::Base] The object that is being represented.
65
+ #
66
+ # @return [Decidim::DefaultPermissions]
67
+ def self.permission_chain(object)
68
+ permissions = [
69
+ Decidim::Admin::Permissions,
70
+ Decidim::Permissions
71
+ ]
72
+
73
+ permissions.unshift(object.participatory_space.manifest.permissions_class) if object.respond_to?(:participatory_space)
74
+ permissions.unshift(object.component.manifest.permissions_class) if object.respond_to?(:component) && object.component.present?
75
+
76
+ permissions
77
+ end
8
78
  end
9
79
  end
10
80
  end
@@ -4,7 +4,7 @@ module Decidim
4
4
  # This holds the decidim-api version.
5
5
  module Api
6
6
  def self.version
7
- "0.29.1"
7
+ "0.29.3"
8
8
  end
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.29.1
4
+ version: 0.29.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josep Jaume Rey Peroy
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-10-02 00:00:00.000000000 Z
13
+ date: 2025-04-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: decidim-core
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 0.29.1
21
+ version: 0.29.3
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - '='
27
27
  - !ruby/object:Gem::Version
28
- version: 0.29.1
28
+ version: 0.29.3
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: graphql
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -68,48 +68,62 @@ dependencies:
68
68
  - - "~>"
69
69
  - !ruby/object:Gem::Version
70
70
  version: '1.0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: decidim-assemblies
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.29.3
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '='
83
+ - !ruby/object:Gem::Version
84
+ version: 0.29.3
71
85
  - !ruby/object:Gem::Dependency
72
86
  name: decidim-comments
73
87
  requirement: !ruby/object:Gem::Requirement
74
88
  requirements:
75
89
  - - '='
76
90
  - !ruby/object:Gem::Version
77
- version: 0.29.1
91
+ version: 0.29.3
78
92
  type: :development
79
93
  prerelease: false
80
94
  version_requirements: !ruby/object:Gem::Requirement
81
95
  requirements:
82
96
  - - '='
83
97
  - !ruby/object:Gem::Version
84
- version: 0.29.1
98
+ version: 0.29.3
85
99
  - !ruby/object:Gem::Dependency
86
100
  name: decidim-dev
87
101
  requirement: !ruby/object:Gem::Requirement
88
102
  requirements:
89
103
  - - '='
90
104
  - !ruby/object:Gem::Version
91
- version: 0.29.1
105
+ version: 0.29.3
92
106
  type: :development
93
107
  prerelease: false
94
108
  version_requirements: !ruby/object:Gem::Requirement
95
109
  requirements:
96
110
  - - '='
97
111
  - !ruby/object:Gem::Version
98
- version: 0.29.1
112
+ version: 0.29.3
99
113
  - !ruby/object:Gem::Dependency
100
114
  name: decidim-participatory_processes
101
115
  requirement: !ruby/object:Gem::Requirement
102
116
  requirements:
103
117
  - - '='
104
118
  - !ruby/object:Gem::Version
105
- version: 0.29.1
119
+ version: 0.29.3
106
120
  type: :development
107
121
  prerelease: false
108
122
  version_requirements: !ruby/object:Gem::Requirement
109
123
  requirements:
110
124
  - - '='
111
125
  - !ruby/object:Gem::Version
112
- version: 0.29.1
126
+ version: 0.29.3
113
127
  description: API engine for decidim
114
128
  email:
115
129
  - josepjaume@gmail.com
@@ -162,7 +176,7 @@ files:
162
176
  - lib/tasks/decidim_api_docs.rake
163
177
  homepage: https://decidim.org
164
178
  licenses:
165
- - AGPL-3.0
179
+ - AGPL-3.0-or-later
166
180
  metadata:
167
181
  bug_tracker_uri: https://github.com/decidim/decidim/issues
168
182
  documentation_uri: https://docs.decidim.org/