decidim-api 0.29.1 → 0.30.0.rc1

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: 2fee654b2c8123c5e96d037b90447eea8cb6fe330698bcccc5fc5333809ef9e5
4
+ data.tar.gz: 2f41b07548990e7c19952d51cbd22e153ff86a8461b564f4f83088922374443a
5
5
  SHA512:
6
- metadata.gz: ac63bab88afe41a312a3b0a563d017f7a1fbba6ffb4b8b4001485c57b197b0b239b1ab30bd552098b5e8a532d20b507dc3b1d43c4f8fa258f116dea01ba1912d
7
- data.tar.gz: 3c3863d36870b095f7afd928477f8c0e17cd3bef07ee1862c5162e717d44c6cf33458d59f5110ee19428502dd61d6073d09434a26aaffff7c389f618a5957c28
6
+ metadata.gz: 84fea0923ec4e3ffea2393241b0c5cb4f915400ab978033e001f7342b561a782a57436ca07b990ef115c737fcc05ec49c498e80a390f67bb04f951216db5f3b0
7
+ data.tar.gz: 27dcf85d7b0b5cb83657b5b34c5c64d5edbd8234a848474c25a7ad27bb414deeaa7475f03126b368750d2a16b59ac2f77117325d42723edbae6b5f7677bb1dbe
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",
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
  "homepage_uri" => "https://decidim.org",
20
20
  "source_code_uri" => "https://github.com/decidim/decidim"
21
21
  }
22
- s.required_ruby_version = "~> 3.2.0"
22
+ s.required_ruby_version = "~> 3.3.0"
23
23
 
24
24
  s.name = "decidim-api"
25
25
  s.summary = "Decidim API module"
@@ -33,10 +33,11 @@ Gem::Specification.new do |s|
33
33
  end
34
34
 
35
35
  s.add_dependency "decidim-core", Decidim::Api.version
36
- s.add_dependency "graphql", "~> 2.2.6"
37
- s.add_dependency "graphql-docs", "~> 4.0"
36
+ s.add_dependency "graphql", "~> 2.4.0"
37
+ s.add_dependency "graphql-docs", "~> 5.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
@@ -9,8 +9,9 @@ shared_context "with a graphql decidim component" do
9
9
 
10
10
  let(:locale) { "en" }
11
11
 
12
- let(:participatory_process) { create :participatory_process, organization: current_organization }
13
- let(:category) { create(:category, participatory_space: participatory_process) }
12
+ let(:participatory_process) { create(:participatory_process, organization: current_organization) }
13
+ let(:taxonomy) { create(:taxonomy, :with_parent, organization: participatory_process.organization) }
14
+ let(:taxonomies) { [taxonomy] }
14
15
 
15
16
  let(:component_type) { nil }
16
17
  let(:component_fragment) { nil }
@@ -41,3 +42,438 @@ shared_context "with a graphql decidim component" do
41
42
  )
42
43
  end
43
44
  end
45
+
46
+ shared_examples "with resource visibility" do
47
+ let(:process_space_factory) { :participatory_process }
48
+ let(:space_type) { "participatoryProcess" }
49
+
50
+ shared_examples "graphQL visible resource" do
51
+ it "is visible" do
52
+ expect(response[space_type]["components"].first[lookout_key]).to eq(query_result)
53
+ end
54
+ end
55
+
56
+ shared_examples "graphQL hidden space" do
57
+ it "should not be visible" do
58
+ expect(response[space_type]).to be_nil
59
+ end
60
+ end
61
+
62
+ shared_examples "graphQL hidden component" do
63
+ it "should not be visible" do
64
+ expect(response[space_type]["components"].first).to be_nil
65
+ end
66
+ end
67
+
68
+ shared_examples "graphQL resource visible for admin" do
69
+ context "when the user is admin" do
70
+ let!(:current_user) { create(:user, :admin, :confirmed, organization: current_organization) }
71
+
72
+ it_behaves_like "graphQL visible resource"
73
+ end
74
+ end
75
+
76
+ shared_examples "graphQL space hidden to visitor" do
77
+ context "when user is visitor" do
78
+ let!(:current_user) { nil }
79
+ it_behaves_like "graphQL hidden space"
80
+ end
81
+ end
82
+
83
+ context "when space is published" do
84
+ let!(:participatory_process) { create(process_space_factory, :published, :with_steps, organization: current_organization) }
85
+
86
+ context "when component is published" do
87
+ let!(:current_component) { create(component_factory, :published, participatory_space: participatory_process) }
88
+
89
+ it_behaves_like "graphQL resource visible for admin"
90
+
91
+ context "when the user is space admin" do
92
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
93
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
94
+ it_behaves_like "graphQL visible resource"
95
+ end
96
+
97
+ context "when the user is space collaborator" do
98
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
99
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
100
+ it_behaves_like "graphQL visible resource"
101
+ end
102
+
103
+ context "when the user is space moderator" do
104
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
105
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
106
+ it_behaves_like "graphQL visible resource"
107
+ end
108
+
109
+ context "when the user is space valuator" do
110
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
111
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
112
+ it_behaves_like "graphQL visible resource"
113
+ end
114
+
115
+ context "when user is visitor" do
116
+ let!(:current_user) { nil }
117
+ it_behaves_like "graphQL visible resource"
118
+ end
119
+
120
+ context "when user is member" do
121
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
122
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
123
+ it_behaves_like "graphQL visible resource"
124
+ end
125
+
126
+ context "when user is member" do
127
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
128
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
129
+ it_behaves_like "graphQL visible resource"
130
+ end
131
+
132
+ context "when user is normal user" do
133
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
134
+ it_behaves_like "graphQL visible resource"
135
+ end
136
+ end
137
+
138
+ context "when component is not published" do
139
+ let!(:current_component) { create(component_factory, :unpublished, participatory_space: participatory_process) }
140
+
141
+ it_behaves_like "graphQL resource visible for admin"
142
+
143
+ context "when the user is space admin" do
144
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
145
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
146
+ it_behaves_like "graphQL visible resource"
147
+ end
148
+
149
+ context "when the user is space collaborator" do
150
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
151
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
152
+ it_behaves_like "graphQL hidden component"
153
+ end
154
+
155
+ context "when the user is space moderator" do
156
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
157
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
158
+ it_behaves_like "graphQL hidden component"
159
+ end
160
+
161
+ context "when the user is space valuator" do
162
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
163
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
164
+ it_behaves_like "graphQL visible resource"
165
+ end
166
+
167
+ context "when user is visitor" do
168
+ let!(:current_user) { nil }
169
+
170
+ it_behaves_like "graphQL hidden component"
171
+ end
172
+
173
+ context "when user is normal user" do
174
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
175
+ it_behaves_like "graphQL hidden component"
176
+ end
177
+
178
+ context "when user is member" do
179
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
180
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
181
+ it_behaves_like "graphQL hidden component"
182
+ end
183
+ end
184
+ end
185
+
186
+ context "when space is published, private and transparent" do
187
+ let(:process_space_factory) { :assembly }
188
+ let(:space_type) { "assembly" }
189
+
190
+ let(:participatory_process_query) do
191
+ %(
192
+ assembly(id: #{participatory_process.id}) {
193
+ components(filter: {type: "#{component_type}"}){
194
+ id
195
+ name {
196
+ translation(locale: "#{locale}")
197
+ }
198
+ weight
199
+ __typename
200
+ ...fooComponent
201
+ }
202
+ id
203
+ }
204
+ )
205
+ end
206
+ let!(:participatory_process) { create(process_space_factory, :published, :private, :transparent, organization: current_organization) }
207
+
208
+ context "when component is published" do
209
+ let!(:current_component) { create(component_factory, :published, participatory_space: participatory_process) }
210
+
211
+ it_behaves_like "graphQL resource visible for admin"
212
+
213
+ context "when the user is space admin" do
214
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
215
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "admin") }
216
+ it_behaves_like "graphQL visible resource"
217
+ end
218
+
219
+ context "when the user is space collaborator" do
220
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
221
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "collaborator") }
222
+ it_behaves_like "graphQL visible resource"
223
+ end
224
+
225
+ context "when the user is space moderator" do
226
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
227
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "moderator") }
228
+ it_behaves_like "graphQL visible resource"
229
+ end
230
+
231
+ context "when the user is space valuator" do
232
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
233
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "valuator") }
234
+ it_behaves_like "graphQL visible resource"
235
+ end
236
+
237
+ context "when user is visitor" do
238
+ let!(:current_user) { nil }
239
+ it_behaves_like "graphQL visible resource"
240
+ end
241
+
242
+ context "when user is member" do
243
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
244
+ let!(:participatory_space_private_user) { create(:assembly_private_user, user: current_user, privatable_to: participatory_process) }
245
+ it_behaves_like "graphQL visible resource"
246
+ end
247
+
248
+ context "when user is normal user" do
249
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
250
+ it_behaves_like "graphQL visible resource"
251
+ end
252
+ end
253
+
254
+ context "when component is not published" do
255
+ let!(:current_component) { create(component_factory, :unpublished, participatory_space: participatory_process) }
256
+
257
+ it_behaves_like "graphQL resource visible for admin"
258
+
259
+ context "when the user is space admin" do
260
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
261
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "admin") }
262
+ it_behaves_like "graphQL visible resource"
263
+ end
264
+
265
+ context "when the user is space collaborator" do
266
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
267
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "collaborator") }
268
+ it_behaves_like "graphQL visible resource"
269
+ end
270
+
271
+ context "when the user is space moderator" do
272
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
273
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "moderator") }
274
+ it_behaves_like "graphQL hidden component"
275
+ end
276
+
277
+ context "when the user is space valuator" do
278
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
279
+ let!(:role) { create(:assembly_user_role, assembly: participatory_process, user: current_user, role: "valuator") }
280
+ it_behaves_like "graphQL visible resource"
281
+ end
282
+
283
+ context "when user is visitor" do
284
+ let!(:current_user) { nil }
285
+ it_behaves_like "graphQL hidden component"
286
+ end
287
+
288
+ context "when user is normal user" do
289
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
290
+ it_behaves_like "graphQL hidden component"
291
+ end
292
+
293
+ context "when user is member" do
294
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
295
+ let!(:participatory_space_private_user) { create(:assembly_private_user, user: current_user, privatable_to: participatory_process) }
296
+ it_behaves_like "graphQL hidden component"
297
+ end
298
+ end
299
+ end
300
+
301
+ context "when space is published but private" do
302
+ let!(:participatory_process) { create(process_space_factory, :published, :private, :with_steps, organization: current_organization) }
303
+
304
+ context "when component is published" do
305
+ let!(:current_component) { create(component_factory, :published, participatory_space: participatory_process) }
306
+
307
+ it_behaves_like "graphQL resource visible for admin"
308
+
309
+ context "when the user is space admin" do
310
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
311
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
312
+ it_behaves_like "graphQL hidden space"
313
+ end
314
+
315
+ context "when the user is space collaborator" do
316
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
317
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
318
+ it_behaves_like "graphQL hidden space"
319
+ end
320
+
321
+ context "when the user is space moderator" do
322
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
323
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
324
+
325
+ it_behaves_like "graphQL hidden space"
326
+ end
327
+
328
+ context "when the user is space valuator" do
329
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
330
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
331
+ it_behaves_like "graphQL hidden space"
332
+ end
333
+
334
+ it_behaves_like "graphQL space hidden to visitor"
335
+
336
+ context "when user is normal user" do
337
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
338
+ it_behaves_like "graphQL hidden space"
339
+ end
340
+
341
+ context "when user is member" do
342
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
343
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
344
+ it_behaves_like "graphQL visible resource"
345
+ end
346
+ end
347
+
348
+ context "when component is not published" do
349
+ let!(:current_component) { create(component_factory, :unpublished, participatory_space: participatory_process) }
350
+
351
+ it_behaves_like "graphQL resource visible for admin"
352
+
353
+ context "when the user is space admin" do
354
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
355
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
356
+ it_behaves_like "graphQL hidden space"
357
+ end
358
+
359
+ context "when the user is space collaborator" do
360
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
361
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
362
+ it_behaves_like "graphQL hidden space"
363
+ end
364
+
365
+ context "when the user is space moderator" do
366
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
367
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
368
+ it_behaves_like "graphQL hidden space"
369
+ end
370
+
371
+ context "when the user is space valuator" do
372
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
373
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
374
+ it_behaves_like "graphQL hidden space"
375
+ end
376
+ it_behaves_like "graphQL space hidden to visitor"
377
+
378
+ context "when user is member" do
379
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
380
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
381
+ it_behaves_like "graphQL hidden component"
382
+ end
383
+ context "when user is normal user" do
384
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
385
+ it_behaves_like "graphQL hidden space"
386
+ end
387
+ end
388
+ end
389
+
390
+ context "when space is unpublished" do
391
+ let(:participatory_process) { create(process_space_factory, :unpublished, :with_steps, organization: current_organization) }
392
+
393
+ context "when component is published" do
394
+ let!(:current_component) { create(component_factory, :published, participatory_space: participatory_process) }
395
+
396
+ it_behaves_like "graphQL resource visible for admin"
397
+
398
+ context "when the user is space admin" do
399
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
400
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
401
+ it_behaves_like "graphQL hidden space"
402
+ end
403
+
404
+ context "when the user is space collaborator" do
405
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
406
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
407
+ it_behaves_like "graphQL hidden space"
408
+ end
409
+
410
+ context "when the user is space moderator" do
411
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
412
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
413
+ it_behaves_like "graphQL hidden space"
414
+ end
415
+
416
+ context "when the user is space valuator" do
417
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
418
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
419
+ it_behaves_like "graphQL hidden space"
420
+ end
421
+
422
+ it_behaves_like "graphQL space hidden to visitor"
423
+
424
+ context "when user is member" do
425
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
426
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
427
+ it_behaves_like "graphQL hidden space"
428
+ end
429
+
430
+ context "when user is normal user" do
431
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
432
+ it_behaves_like "graphQL hidden space"
433
+ end
434
+ end
435
+
436
+ context "when component is not published" do
437
+ let!(:current_component) { create(component_factory, :unpublished, participatory_space: participatory_process) }
438
+
439
+ it_behaves_like "graphQL resource visible for admin"
440
+
441
+ context "when the user is space admin" do
442
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
443
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "admin") }
444
+ it_behaves_like "graphQL hidden space"
445
+ end
446
+
447
+ context "when the user is space collaborator" do
448
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
449
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "collaborator") }
450
+ it_behaves_like "graphQL hidden space"
451
+ end
452
+
453
+ context "when the user is space moderator" do
454
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
455
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "moderator") }
456
+ it_behaves_like "graphQL hidden space"
457
+ end
458
+
459
+ context "when the user is space valuator" do
460
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
461
+ let!(:role) { create(:participatory_process_user_role, participatory_process:, user: current_user, role: "valuator") }
462
+ it_behaves_like "graphQL hidden space"
463
+ end
464
+ it_behaves_like "graphQL space hidden to visitor"
465
+
466
+ context "when user is member" do
467
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
468
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: current_user, privatable_to: participatory_process) }
469
+ it_behaves_like "graphQL hidden space"
470
+ end
471
+
472
+ context "when user is normal user" do
473
+ let!(:current_user) { create(:user, :confirmed, organization: current_organization) }
474
+
475
+ it_behaves_like "graphQL hidden space"
476
+ end
477
+ end
478
+ end
479
+ 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.30.0.rc1"
8
8
  end
9
9
  end
10
10
  end
data/lib/decidim/api.rb CHANGED
@@ -24,6 +24,10 @@ module Decidim
24
24
  15
25
25
  end
26
26
 
27
+ config_accessor :disclose_system_version do
28
+ %w(1 true yes).include?(ENV.fetch("DECIDIM_API_DISCLOSE_SYSTEM_VERSION", nil))
29
+ end
30
+
27
31
  # This declares all the types an interface or union can resolve to. This needs
28
32
  # to be done in order to be able to have them found. This is a shortcoming of
29
33
  # graphql-ruby and the way it deals with loading types, in combination with
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.30.0.rc1
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-02-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: decidim-core
@@ -18,42 +18,42 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 0.29.1
21
+ version: 0.30.0.rc1
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.30.0.rc1
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: graphql
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: 2.2.6
35
+ version: 2.4.0
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: 2.2.6
42
+ version: 2.4.0
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: graphql-docs
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: '4.0'
49
+ version: '5.0'
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
- version: '4.0'
56
+ version: '5.0'
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: rack-cors
59
59
  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.30.0.rc1
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '='
83
+ - !ruby/object:Gem::Version
84
+ version: 0.30.0.rc1
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.30.0.rc1
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.30.0.rc1
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.30.0.rc1
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.30.0.rc1
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.30.0.rc1
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.30.0.rc1
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/
@@ -177,14 +191,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
177
191
  requirements:
178
192
  - - "~>"
179
193
  - !ruby/object:Gem::Version
180
- version: 3.2.0
194
+ version: 3.3.0
181
195
  required_rubygems_version: !ruby/object:Gem::Requirement
182
196
  requirements:
183
197
  - - ">="
184
198
  - !ruby/object:Gem::Version
185
199
  version: '0'
186
200
  requirements: []
187
- rubygems_version: 3.4.10
201
+ rubygems_version: 3.5.11
188
202
  signing_key:
189
203
  specification_version: 4
190
204
  summary: Decidim API module