@communecter/cocolight-api-client 1.0.0

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.
@@ -0,0 +1,4026 @@
1
+ export default {
2
+ "endpoints": [
3
+ {
4
+ "name": "Enregistrement d'un utilisateur",
5
+ "path": "/co2/person/register",
6
+ "constant": "PERSON_REGISTER",
7
+ "method": "POST",
8
+ "auth": "none",
9
+ "description": "Permet d’enregistrer un nouvel utilisateur avec ses informations personnelles.",
10
+ "contentType": "application/x-www-form-urlencoded",
11
+ "request": {
12
+ "type": "object",
13
+ "description": "Permet d’enregistrer un nouvel utilisateur avec ses informations personnelles.",
14
+ "properties": {
15
+ "name": {
16
+ "type": "string",
17
+ "description": "Nom complet de l'utilisateur"
18
+ },
19
+ "username": {
20
+ "type": "string",
21
+ "description": "Pseudo ou identifiant unique"
22
+ },
23
+ "email": {
24
+ "type": "string",
25
+ "format": "email",
26
+ "description": "Adresse email de l'utilisateur"
27
+ },
28
+ "pwd": {
29
+ "type": "string",
30
+ "description": "Mot de passe"
31
+ },
32
+ "app": {
33
+ "type": "string",
34
+ "description": "Nom de l'application"
35
+ },
36
+ "pendingUserId": {
37
+ "type": "string",
38
+ "description": "ID d’un utilisateur en attente (facultatif)"
39
+ },
40
+ "mode": {
41
+ "type": "string",
42
+ "description": "Mode d’enregistrement"
43
+ },
44
+ "isInvitation": {
45
+ "type": "boolean",
46
+ "description": "Indique s’il s’agit d’une invitation (facultatif)"
47
+ }
48
+ },
49
+ "required": ["name", "username", "email", "pwd"],
50
+ "additionalProperties": false
51
+ },
52
+ "responses": {
53
+ "200": {
54
+ "oneOf": [
55
+ {
56
+ "description": "Réponse en cas de succès lors de la création d'un utilisateur",
57
+ "type": "object",
58
+ "properties": {
59
+ "result": { "type": "boolean", "const": true },
60
+ "msg": { "type": "string" },
61
+ "id": { "type": "string" },
62
+ "person": {
63
+ "type": "object",
64
+ "properties": {
65
+ "name": { "type": "string" },
66
+ "username": { "type": "string" },
67
+ "pwd": { "type": "string" },
68
+ "email": { "type": "string", "format": "email" },
69
+ "_id": { "type": "string" }
70
+ },
71
+ "required": ["name", "username", "pwd", "email", "_id"]
72
+ }
73
+ },
74
+ "required": ["result", "msg", "id", "person"],
75
+ "additionalProperties": false
76
+ },
77
+ {
78
+ "description": "Réponse en cas d'erreur lors de la création d'un utilisateur",
79
+ "type": "object",
80
+ "properties": {
81
+ "result": { "type": "boolean", "const": false },
82
+ "msg": { "type": "string" }
83
+ },
84
+ "required": ["result", "msg"],
85
+ "additionalProperties": false
86
+ }
87
+ ]
88
+ }
89
+ }
90
+ },
91
+ {
92
+ "name": "Authentification",
93
+ "path": "/api/cocolight/authenticate",
94
+ "constant": "AUTHENTICATE_URL",
95
+ "method": "POST",
96
+ "auth": "none",
97
+ "description": "Permet de se connecter en utilisant une adresse email et un mot de passe.",
98
+ "contentType": "application/json",
99
+ "postActions": [
100
+ { "type": "setToken", "path": "accessToken" },
101
+ { "type": "setRefreshToken", "path": "refreshToken" },
102
+ { "type": "setUserId", "path": "user.id" },
103
+ {
104
+ "type": "emitEvent",
105
+ "event": "userLoggedIn",
106
+ "payloadPath": "user"
107
+ }
108
+ ],
109
+ "request": {
110
+ "type": "object",
111
+ "description": "Permet de se connecter en utilisant une adresse email et un mot de passe.",
112
+ "properties": {
113
+ "email": {
114
+ "type": "string",
115
+ "format": "email",
116
+ "description": "Adresse email de l'utilisateur"
117
+ },
118
+ "password": {
119
+ "type": "string",
120
+ "description": "Mot de passe de l'utilisateur"
121
+ }
122
+ },
123
+ "required": ["email", "password"],
124
+ "additionalProperties": false
125
+ },
126
+ "responses":{
127
+ "200": {
128
+ "type": "object",
129
+ "description": "Objet data renvoyé après une authentification réussie.",
130
+ "properties": {
131
+ "user": {
132
+ "type": "object",
133
+ "properties": {
134
+ "id": { "type": "string", "description": "Identifiant unique de l'utilisateur" },
135
+ "username": { "type": "string", "description": "Pseudo ou nom d'utilisateur" },
136
+ "email": { "type": "string", "format": "email", "description": "Adresse email de l'utilisateur" },
137
+ "roles": {
138
+ "type": "object",
139
+ "properties": {
140
+ "betaTester": { "type": "boolean" },
141
+ "standalonePageAccess": { "type": "boolean" },
142
+ "superAdmin": { "type": "boolean" }
143
+ }
144
+ },
145
+ "timezone": { "type": "string", "description": "Fuseau horaire de l'utilisateur" },
146
+ "lastLoginDate": { "type": "integer", "description": "Timestamp Unix du dernier login" },
147
+ "profilImageUrl": {
148
+ "anyOf": [
149
+ { "type": "string", "format": "uri" },
150
+ { "type": "string", "enum": [""] }
151
+ ],
152
+ "description": "URL de l'image de profil utilisateur, ou chaîne vide"
153
+ }
154
+ },
155
+ "required": ["id", "username", "email", "roles"],
156
+ "additionalProperties": false
157
+ },
158
+ "accessToken": { "type": "string", "description": "Token JWT d'accès" },
159
+ "refreshToken": { "type": "string", "description": "Token JWT pour rafraîchir l'access token" },
160
+ "status": { "type": "integer", "description": "Code de statut personnalisé renvoyé par l'API" }
161
+ },
162
+ "required": ["user", "accessToken", "refreshToken", "status"],
163
+ "additionalProperties": false
164
+ },
165
+ "401": {
166
+ "type": "object",
167
+ "description": "Erreur d'authentification (identifiants incorrects)",
168
+ "properties": {
169
+ "error": {
170
+ "type": "string",
171
+ "description": "Description de l'erreur"
172
+ }
173
+ },
174
+ "required": ["error"],
175
+ "additionalProperties": false
176
+ }
177
+ }
178
+ },
179
+ {
180
+ "name": "Rafraîchir un token",
181
+ "path": "/api/cocolight/refreshtoken",
182
+ "constant": "REFRESH_TOKEN_URL",
183
+ "method": "POST",
184
+ "auth": "none",
185
+ "description": "Permet de rafraîchir un token d'accès expiré en utilisant un token de rafraîchissement.",
186
+ "contentType": "application/json",
187
+ "request": {
188
+ "type": "object",
189
+ "description": "Permet de rafraîchir un token d'accès expiré en utilisant un token de rafraîchissement.",
190
+ "properties": {
191
+ "refreshToken": {
192
+ "type": "string",
193
+ "description": "Token de rafraîchissement"
194
+ }
195
+ },
196
+ "required": ["refreshToken"],
197
+ "additionalProperties": false
198
+ },
199
+ "responses": {
200
+ "200": {
201
+ "type": "object",
202
+ "description": "Objet data renvoyé après un rafraîchissement réussi.",
203
+ "properties": {
204
+ "token": { "type": "string", "description": "Token JWT d'accès" },
205
+ "refreshToken": { "type": "string", "description": "Token JWT pour rafraîchir l'access token" }
206
+ },
207
+ "required": ["token", "refreshToken"],
208
+ "additionalProperties": false
209
+ },
210
+ "401": {
211
+ "type": "object",
212
+ "description": "Erreur de rafraîchissement (token invalide ou expiré)",
213
+ "properties": {
214
+ "error": {
215
+ "type": "string",
216
+ "description": "Description de l'erreur"
217
+ }
218
+ },
219
+ "required": ["error"],
220
+ "additionalProperties": false
221
+ }
222
+ }
223
+ },
224
+ {
225
+ "name": "Récupérer les informations utilisateur",
226
+ "path": "/api/cocolight/me",
227
+ "constant": "ME_INFO_URL",
228
+ "method": "POST",
229
+ "auth": "bearer",
230
+ "description": "Récupère les informations du profil utilisateur pour un token donné.",
231
+ "contentType": "application/json",
232
+ "responses": {
233
+ "200": {
234
+ "type": "object",
235
+ "description": "Schéma JSON pour les informations détaillées d'un utilisateur.",
236
+ "properties": {
237
+ "_id": {
238
+ "type": "object",
239
+ "properties": {
240
+ "$id": { "type": "string" }
241
+ },
242
+ "required": ["$id"],
243
+ "additionalProperties": false
244
+ },
245
+ "username": { "type": "string" },
246
+ "email": { "type": "string", "format": "email" },
247
+ "name": { "type": "string" },
248
+ "slug": { "type": "string" },
249
+ "collection": { "type": "string" },
250
+ "modified": {
251
+ "type": "object",
252
+ "properties": {
253
+ "sec": { "type": "integer" },
254
+ "usec": { "type": "integer" }
255
+ },
256
+ "required": ["sec", "usec"],
257
+ "additionalProperties": false
258
+ },
259
+ "roles": {
260
+ "type": "object",
261
+ "properties": {
262
+ "betaTester": { "type": "boolean" },
263
+ "standalonePageAccess": { "type": "boolean" },
264
+ "superAdmin": { "type": "boolean" }
265
+ }
266
+ },
267
+ "preferences": {
268
+ "type": "object",
269
+ "properties": {
270
+ "privateFields": {
271
+ "type": "array",
272
+ "items": { "type": "string" }
273
+ },
274
+ "publicFields": {
275
+ "type": "array",
276
+ "items": { "type": "string" }
277
+ },
278
+ "isOpenData": { "type": "boolean" },
279
+ "badge": { "type": "boolean" },
280
+ "sendMail": {
281
+ "oneOf": [
282
+ {
283
+ "type": "object",
284
+ "properties": {
285
+ "source": {
286
+ "type": "array",
287
+ "items": {}
288
+ }
289
+ },
290
+ "required": ["source"],
291
+ "additionalProperties": false
292
+ },
293
+ {
294
+ "type": "boolean",
295
+ "const": false
296
+ }
297
+ ]
298
+ },
299
+ "activitypub": { "type": "boolean" },
300
+ "activitypubStarterClosed": { "type": "boolean" },
301
+ "notifications": { "type": "array", "items": {} }
302
+ },
303
+ "required": ["isOpenData", "sendMail", "publicFields", "privateFields"]
304
+ },
305
+ "language": { "type": "string" },
306
+ "profilImageUrl": { "type": "string" },
307
+ "profilMarkerImageUrl": { "type": "string", "format": "uri-reference" },
308
+ "profilMediumImageUrl": { "type": "string", "format": "uri-reference" },
309
+ "profilThumbImageUrl": { "type": "string", "format": "uri-reference" },
310
+ "profilBannerUrl": { "type": "string", "format": "uri-reference" },
311
+ "profilRealBannerUrl": { "type": "string", "format": "uri-reference" },
312
+ "shortDescription": { "type": "string" },
313
+ "description": { "type": "string" },
314
+ "tags": {
315
+ "type": "array",
316
+ "items": { "type": "string" }
317
+ },
318
+ "birthDate": {
319
+ "type": "object",
320
+ "properties": {
321
+ "sec": { "type": "integer" },
322
+ "usec": { "type": "integer" }
323
+ },
324
+ "required": ["sec", "usec"],
325
+ "additionalProperties": false
326
+ }
327
+ },
328
+ "required": ["_id", "name", "email", "username", "roles", "collection", "preferences", "slug"]
329
+ },
330
+ "401": {
331
+ "type": "object",
332
+ "description": "Erreur d'authentification (token invalide ou expiré)",
333
+ "properties": {
334
+ "error": {
335
+ "type": "string",
336
+ "description": "Description de l'erreur"
337
+ }
338
+ },
339
+ "required": ["error"],
340
+ "additionalProperties": false
341
+ }
342
+ }
343
+ },
344
+ {
345
+ "name": "Récupération de mot de passe",
346
+ "path": "/co2/person/sendemail",
347
+ "constant": "PASSWORD_RECOVERY",
348
+ "method": "POST",
349
+ "auth": "none",
350
+ "description": "Envoie un email pour récupérer le mot de passe.",
351
+ "contentType": "application/x-www-form-urlencoded",
352
+ "request": {
353
+ "type": "object",
354
+ "properties": {
355
+ "email": {
356
+ "type": "string",
357
+ "format": "email",
358
+ "description": "Adresse email de l'utilisateur"
359
+ },
360
+ "type": {
361
+ "type": "string",
362
+ "description": "Type d'email envoyé",
363
+ "const": "password",
364
+ "default": "password"
365
+ }
366
+ },
367
+ "required": ["email", "type"],
368
+ "additionalProperties": false
369
+ },
370
+ "responses": {
371
+ "200": {
372
+ "oneOf": [
373
+ {
374
+ "description": "Erreur: email non trouvé dans la base",
375
+ "type": "object",
376
+ "properties": {
377
+ "result": { "type": "boolean", "const": false },
378
+ "errId": { "type": "string", "const": "UNKNOWN_ACCOUNT_ID" },
379
+ "msg": { "type": "string" }
380
+ },
381
+ "required": ["result", "errId", "msg"],
382
+ "additionalProperties": false
383
+ },
384
+ {
385
+ "description": "Succès: email de récupération envoyé",
386
+ "type": "object",
387
+ "properties": {
388
+ "result": { "type": "boolean", "const": true },
389
+ "msg": { "type": "string" }
390
+ },
391
+ "required": ["result", "msg"],
392
+ "additionalProperties": false
393
+ }
394
+ ]
395
+ }
396
+ }
397
+ },
398
+ {
399
+ "name": "Échange de token avec un autre serveur",
400
+ "path": "/api/cocolight/exchangetoken",
401
+ "constant": "SERVER_EXCHANGE_TOKEN",
402
+ "method": "POST",
403
+ "auth": "bearer",
404
+ "description": "Permet de se connecter à un autre serveur Communecter en échangeant un token.",
405
+ "contentType": "application/json",
406
+ "request": {
407
+ "type": "object",
408
+ "properties": {
409
+ "serverUrl": {
410
+ "type": "string",
411
+ "description": "URL du serveur distant"
412
+ }
413
+ },
414
+ "required": ["serverUrl"],
415
+ "additionalProperties": false
416
+ },
417
+ "responses": {
418
+ "200": {
419
+ "type": "object",
420
+ "description": "Objet data renvoyé après une authentification réussie.",
421
+ "properties": {
422
+ "user": {
423
+ "type": "object",
424
+ "properties": {
425
+ "id": { "type": "string", "description": "Identifiant unique de l'utilisateur" },
426
+ "username": { "type": "string", "description": "Pseudo ou nom d'utilisateur" },
427
+ "email": { "type": "string", "format": "email", "description": "Adresse email de l'utilisateur" },
428
+ "roles": {
429
+ "type": "object",
430
+ "properties": {
431
+ "betaTester": { "type": "boolean" },
432
+ "standalonePageAccess": { "type": "boolean" },
433
+ "superAdmin": { "type": "boolean" }
434
+ }
435
+ },
436
+ "timezone": { "type": "string", "description": "Fuseau horaire de l'utilisateur" },
437
+ "lastLoginDate": { "type": "integer", "description": "Timestamp Unix du dernier login" },
438
+ "profilImageUrl": { "type": "string", "format": "uri", "description": "URL de l'image de profil utilisateur" }
439
+ },
440
+ "required": ["id", "username", "email", "roles"],
441
+ "additionalProperties": false
442
+ },
443
+ "accessToken": { "type": "string", "description": "Token JWT d'accès" },
444
+ "refreshToken": { "type": "string", "description": "Token JWT pour rafraîchir l'access token" },
445
+ "status": { "type": "integer", "description": "Code de statut personnalisé renvoyé par l'API" }
446
+ },
447
+ "required": ["user", "accessToken", "refreshToken", "status"],
448
+ "additionalProperties": false
449
+ },
450
+ "401": {
451
+ "type": "object",
452
+ "description": "Erreur d'authentification (token invalide ou expiré)",
453
+ "properties": {
454
+ "error": {
455
+ "type": "string",
456
+ "description": "Description de l'erreur"
457
+ }
458
+ },
459
+ "required": ["error"],
460
+ "additionalProperties": false
461
+ }
462
+ }
463
+ },
464
+ {
465
+ "name": "Changer le mot de passe",
466
+ "path": "/co2/person/changepassword",
467
+ "constant": "CHANGE_PASSWORD",
468
+ "method": "POST",
469
+ "auth": "bearer",
470
+ "description": "Permet de changer le mot de passe d'un utilisateur.",
471
+ "contentType": "application/x-www-form-urlencoded",
472
+ "request": {
473
+ "type": "object",
474
+ "properties": {
475
+ "mode": { "type": "string", "description": "Mode ou contexte du changement", "const": "changePassword", "default": "changePassword" },
476
+ "userId": { "type": "string", "description": "Identifiant de l'utilisateur", "default": "@userId" },
477
+ "oldPassword": { "type": "string", "description": "Ancien mot de passe" },
478
+ "newPassword": { "type": "string", "description": "Nouveau mot de passe" },
479
+ "newPassword2": { "type": "string", "description": "Confirmation du nouveau mot de passe" },
480
+ "scope": { "type": ["string"], "description": "Périmètre concerné", "default": "" }
481
+ },
482
+ "required": ["mode", "userId", "oldPassword", "newPassword", "newPassword2"],
483
+ "additionalProperties": false
484
+ },
485
+ "responses": {
486
+ "200": {
487
+ "oneOf": [
488
+ {
489
+ "description": "Réponse en cas de succès lors du changement de mot de passe",
490
+ "type": "object",
491
+ "properties": {
492
+ "result": { "type": "boolean", "const": true },
493
+ "msg": { "type": "string" }
494
+ },
495
+ "required": ["result", "msg"],
496
+ "additionalProperties": false
497
+ },
498
+ {
499
+ "description": "Réponse en cas d'erreur lors du changement de mot de passe",
500
+ "type": "object",
501
+ "properties": {
502
+ "result": { "type": "boolean", "const": false },
503
+ "msg": { "type": "string" }
504
+ },
505
+ "required": ["result", "msg"],
506
+ "additionalProperties": false
507
+ }
508
+ ]
509
+ },
510
+ "401": {
511
+ "type": "object",
512
+ "description": "Erreur d'authentification (token invalide ou expiré)",
513
+ "properties": {
514
+ "error": {
515
+ "type": "string",
516
+ "description": "Description de l'erreur"
517
+ }
518
+ },
519
+ "required": ["error"],
520
+ "additionalProperties": false
521
+ }
522
+ }
523
+ },
524
+ {
525
+ "name": "Supprimer un compte",
526
+ "path": "/co2/element/delete/id/{id}/type/citoyens",
527
+ "constant": "DELETE_ACCOUNT",
528
+ "method": "POST",
529
+ "auth": "bearer",
530
+ "description": "Permet de supprimer un compte utilisateur.",
531
+ "contentType": "application/x-www-form-urlencoded",
532
+ "postActions": [
533
+ { "type": "resetSession" },
534
+ { "type": "emitEvent", "event": "accountDeleted", "path": null }
535
+ ],
536
+ "pathParams": {
537
+ "type": "object",
538
+ "properties": {
539
+ "id": {
540
+ "type": "string",
541
+ "description": "Identifiant de l'utilisateur à supprimer",
542
+ "default": "@userId"
543
+ }
544
+ },
545
+ "required": ["id"],
546
+ "additionalProperties": false
547
+ },
548
+ "request": {
549
+ "type": "object",
550
+ "properties": {
551
+ "reason": { "type": "string", "description": "Raison de la suppression", "default": "" }
552
+ },
553
+ "required": ["reason"],
554
+ "additionalProperties": false
555
+ },
556
+ "responses": {
557
+ "200": {
558
+ "type": "object",
559
+ "description": "Réponse après la suppression du compte",
560
+ "properties": {
561
+ "result": { "type": "boolean", "const": true },
562
+ "msg": { "type": "string" }
563
+ },
564
+ "required": ["result", "msg"],
565
+ "additionalProperties": false
566
+ },
567
+ "401": {
568
+ "type": "object",
569
+ "description": "Erreur d'authentification (token invalide ou expiré)",
570
+ "properties": {
571
+ "error": {
572
+ "type": "string",
573
+ "description": "Description de l'erreur"
574
+ }
575
+ },
576
+ "required": ["error"],
577
+ "additionalProperties": false
578
+ }
579
+ }
580
+ },
581
+ {
582
+ "name": "Mettre à jour les paramètres utilisateur",
583
+ "path": "/co2/element/updatesettings",
584
+ "constant": "UPDATE_SETTINGS",
585
+ "method": "POST",
586
+ "auth": "bearer",
587
+ "description": "Mise à jour des paramètres spécifiques d'un utilisateur.",
588
+ "contentType": "application/x-www-form-urlencoded",
589
+ "request": {
590
+ "type": "object",
591
+ "properties": {
592
+ "type": { "type": "string" },
593
+ "value": {},
594
+ "typeEntity": {
595
+ "type": "string",
596
+ "default": "citoyens"
597
+ },
598
+ "idEntity": { "type": "string" }
599
+ },
600
+ "required": ["type", "value", "typeEntity", "idEntity"],
601
+ "additionalProperties": false,
602
+ "allOf": [
603
+ {
604
+ "if": {
605
+ "properties": {
606
+ "typeEntity": { "const": "citoyens" }
607
+ }
608
+ },
609
+ "then": {
610
+ "properties": {
611
+ "idEntity": {
612
+ "type": "string",
613
+ "default": "@userId"
614
+ }
615
+ }
616
+ }
617
+ },
618
+ {
619
+ "if": {
620
+ "properties": {
621
+ "typeEntity": { "const": "citoyens" },
622
+ "type": { "enum": ["birthDate", "email", "locality", "phone", "directory"] }
623
+ }
624
+ },
625
+ "then": {
626
+ "properties": {
627
+ "value": { "type": "string", "enum": ["private", "public", "mask"] }
628
+ }
629
+ }
630
+ },
631
+ {
632
+ "if": {
633
+ "properties": {
634
+ "typeEntity": { "const": "citoyens" },
635
+ "type": { "enum": ["activitypub", "isOpenData"] }
636
+ }
637
+ },
638
+ "then": {
639
+ "properties": {
640
+ "value": { "type": "boolean" }
641
+ }
642
+ }
643
+ },
644
+ {
645
+ "if": {
646
+ "properties": {
647
+ "typeEntity": { "not": { "const": "citoyens" } },
648
+ "type": { "enum": ["isOpenData", "isOpenEdition", "private", "feedback"] }
649
+ }
650
+ },
651
+ "then": {
652
+ "properties": {
653
+ "value": { "type": "boolean" }
654
+ }
655
+ }
656
+ }
657
+ ]
658
+ },
659
+ "responses": {
660
+ "200": {
661
+ "type": "object",
662
+ "description": "Réponse après la mise à jour des paramètres",
663
+ "properties": {
664
+ "result": { "type": "boolean", "const": true },
665
+ "msg": { "type": "string" }
666
+ },
667
+ "required": ["result", "msg"],
668
+ "additionalProperties": false
669
+ },
670
+ "401": {
671
+ "type": "object",
672
+ "description": "Erreur d'authentification (token invalide ou expiré)",
673
+ "properties": {
674
+ "error": {
675
+ "type": "string",
676
+ "description": "Description de l'erreur"
677
+ }
678
+ },
679
+ "required": ["error"],
680
+ "additionalProperties": false
681
+ }
682
+ }
683
+ },
684
+ {
685
+ "name": "Mettre à jour la description d'un élément",
686
+ "path": "/co2/element/updateblock/",
687
+ "constant": "UPDATE_BLOCK_DESCRIPTION",
688
+ "constantCocolight": "UPDATE_BLOCK",
689
+ "method": "POST",
690
+ "auth": "bearer",
691
+ "description": "Permet de mettre à jour la description courte et complète d'un élément.",
692
+ "contentType": "application/x-www-form-urlencoded",
693
+ "request": {
694
+ "type": "object",
695
+ "properties": {
696
+ "block": {
697
+ "type": "string",
698
+ "const": "descriptions",
699
+ "default": "descriptions",
700
+ "description": "Nom du bloc à mettre à jour (doit être 'descriptions')"
701
+ },
702
+ "typeElement": {
703
+ "type": "string",
704
+ "default": "citoyens",
705
+ "enum": ["citoyens", "projects", "organizations"],
706
+ "description": "Type d'élément (citoyens, projects, organizations)"
707
+ },
708
+ "id": {
709
+ "type": "string",
710
+ "description": "ID de l'élément concerné"
711
+ },
712
+ "scope": {
713
+ "type": ["string", "null"],
714
+ "default": "",
715
+ "description": "Périmètre de mise à jour",
716
+ "$comment": "Non utilisé dans l'application Cocolight"
717
+ },
718
+ "descMentions": {
719
+ "type": "string",
720
+ "description": "Mentions dans la description",
721
+ "default": "",
722
+ "$comment": "Non utilisé dans l'application Cocolight"
723
+ },
724
+ "shortDescription": {
725
+ "type": "string",
726
+ "description": "Courte description"
727
+ },
728
+ "description": {
729
+ "type": "string",
730
+ "description": "Description complète"
731
+ }
732
+ },
733
+ "required": ["block", "typeElement", "id"],
734
+ "additionalProperties": false,
735
+ "allOf": [
736
+ {
737
+ "if": {
738
+ "properties": {
739
+ "typeElement": { "const": "citoyens" }
740
+ }
741
+ },
742
+ "then": {
743
+ "properties": {
744
+ "id": {
745
+ "type": "string",
746
+ "default": "@userId"
747
+ }
748
+ }
749
+ }
750
+ },
751
+ {
752
+ "anyOf": [
753
+ {
754
+ "required": ["description"],
755
+ "properties": {
756
+ "description": { "not": { "type": "null" } }
757
+ }
758
+ },
759
+ {
760
+ "required": ["shortDescription"],
761
+ "properties": {
762
+ "shortDescription": { "not": { "type": "null" } }
763
+ }
764
+ }
765
+ ]
766
+ }
767
+ ]
768
+ },
769
+ "responses": {
770
+ "200": {
771
+ "type": "object",
772
+ "description": "Réponse après la mise à jour de la description",
773
+ "properties": {
774
+ "result": { "type": "boolean", "const": true },
775
+ "resultGoods": {
776
+ "type": "object",
777
+ "properties": {
778
+ "result": { "type": "boolean", "const": true },
779
+ "msg": { "type": "string" },
780
+ "values": {
781
+ "type": "object",
782
+ "properties": {
783
+ "shortDescription": { "type": ["string", "null"] },
784
+ "description": { "type": ["string", "null"] }
785
+ },
786
+ "additionalProperties": true
787
+ }
788
+ },
789
+ "required": ["result", "msg"],
790
+ "additionalProperties": true
791
+ }
792
+ },
793
+ "required": ["result", "resultGoods"],
794
+ "additionalProperties": false
795
+ },
796
+ "401": {
797
+ "type": "object",
798
+ "description": "Erreur d'authentification (token invalide ou expiré)",
799
+ "properties": {
800
+ "error": {
801
+ "type": "string",
802
+ "description": "Description de l'erreur"
803
+ }
804
+ },
805
+ "required": ["error"],
806
+ "additionalProperties": false
807
+ }
808
+ }
809
+ },
810
+ {
811
+ "name": "Mettre à jour les informations d'un élément",
812
+ "path": "/co2/element/updateblock/",
813
+ "constant": "UPDATE_BLOCK_INFO",
814
+ "constantCocolight": "UPDATE_BLOCK",
815
+ "method": "POST",
816
+ "auth": "bearer",
817
+ "description": "Permet de mettre à jour les informations générales d'un élément (nom, contacts, etc.).",
818
+ "contentType": "application/x-www-form-urlencoded",
819
+ "request": {
820
+ "type": "object",
821
+ "properties": {
822
+ "block": {
823
+ "type": "string",
824
+ "const": "info",
825
+ "default": "info",
826
+ "description": "Nom du bloc à mettre à jour (doit être 'info')"
827
+ },
828
+ "typeElement": {
829
+ "type": "string",
830
+ "default": "citoyens",
831
+ "enum": ["citoyens", "projects", "organizations"],
832
+ "description": "Type d'élément (citoyens, projects, organizations)"
833
+ },
834
+ "id": {
835
+ "type": "string",
836
+ "description": "ID de l'élément concerné"
837
+ },
838
+ "scope": {
839
+ "type": "string",
840
+ "default": "",
841
+ "description": "Périmètre de mise à jour"
842
+ }
843
+ },
844
+ "required": ["block", "typeElement", "id"],
845
+ "$defs": {
846
+ "sharedFields": {
847
+ "name": {
848
+ "type": "string",
849
+ "description": "Nom de l'entité"
850
+ },
851
+ "url": {
852
+ "type": "string",
853
+ "format": "uri",
854
+ "description": "Lien vers le site ou la page publique"
855
+ },
856
+ "email": {
857
+ "type": "string",
858
+ "format": "email",
859
+ "description": "Adresse email"
860
+ },
861
+ "tags": {
862
+ "anyOf": [
863
+ { "type": "array", "items": { "type": "string" } },
864
+ { "type": "string", "enum": [""] }
865
+ ],
866
+ "description": "Tags : \"\" pour effacer tous les tags, ou tableau de mots-clés."
867
+ }
868
+ }
869
+ },
870
+ "allOf": [
871
+ {
872
+ "if": {
873
+ "properties": { "typeElement": { "const": "citoyens" } }
874
+ },
875
+ "then": {
876
+ "properties": {
877
+ "block": {
878
+ "type": "string",
879
+ "const": "info",
880
+ "default": "info",
881
+ "description": "Nom du bloc à mettre à jour (doit être 'info')"
882
+ },
883
+ "typeElement": {
884
+ "type": "string",
885
+ "default": "citoyens",
886
+ "enum": ["citoyens", "projects", "organizations"],
887
+ "description": "Type d'élément (citoyens, projects, organizations)"
888
+ },
889
+ "scope": {
890
+ "type": "string",
891
+ "default": "",
892
+ "description": "Périmètre de mise à jour"
893
+ },
894
+ "id": {
895
+ "type": "string",
896
+ "description": "ID de l'élément concerné",
897
+ "default": "@userId"
898
+ },
899
+ "name": { "$ref": "#/$defs/sharedFields/name" },
900
+ "email": { "$ref": "#/$defs/sharedFields/email" },
901
+ "url": { "$ref": "#/$defs/sharedFields/url" },
902
+ "tags": { "$ref": "#/$defs/sharedFields/tags" },
903
+ "birthDate": {
904
+ "type": "string",
905
+ "format": "date",
906
+ "description": "Date de naissance"
907
+ },
908
+ "fixe": {
909
+ "type": "string",
910
+ "description": "Téléphone fixe"
911
+ },
912
+ "mobile": {
913
+ "type": "string",
914
+ "description": "Téléphone mobile"
915
+ }
916
+ },
917
+ "anyOf": [
918
+ { "required": ["name"], "properties": { "name": { "not": { "type": "null" } } } },
919
+ { "required": ["birthDate"], "properties": { "birthDate": { "not": { "type": "null" } } } },
920
+ { "required": ["fixe"], "properties": { "fixe": { "not": { "type": "null" } } } },
921
+ { "required": ["mobile"], "properties": { "mobile": { "not": { "type": "null" } } } },
922
+ { "required": ["url"], "properties": { "url": { "not": { "type": "null" } } } },
923
+ { "required": ["tags"], "properties": { "tags": { "not": { "type": "null" } } } },
924
+ { "required": ["email"], "properties": { "email": { "not": { "type": "null" } } } }
925
+ ],
926
+ "additionalProperties": false
927
+ }
928
+ },
929
+ {
930
+ "if": {
931
+ "properties": {
932
+ "typeElement": { "const": "projects" }
933
+ }
934
+ },
935
+ "then": {
936
+ "properties": {
937
+ "block": {
938
+ "type": "string",
939
+ "const": "info",
940
+ "default": "info",
941
+ "description": "Nom du bloc à mettre à jour (doit être 'info')"
942
+ },
943
+ "typeElement": {
944
+ "type": "string",
945
+ "default": "citoyens",
946
+ "enum": ["citoyens", "projects", "organizations"],
947
+ "description": "Type d'élément (citoyens, projects, organizations)"
948
+ },
949
+ "id": {
950
+ "type": "string",
951
+ "description": "ID de l'élément concerné"
952
+ },
953
+ "scope": {
954
+ "type": "string",
955
+ "default": "",
956
+ "description": "Périmètre de mise à jour"
957
+ },
958
+ "name": { "$ref": "#/$defs/sharedFields/name" },
959
+ "email": { "$ref": "#/$defs/sharedFields/email" },
960
+ "url": { "$ref": "#/$defs/sharedFields/url" },
961
+ "tags": { "$ref": "#/$defs/sharedFields/tags" },
962
+ "avancement": {
963
+ "type": "string",
964
+ "enum": [
965
+ "abandoned", "concept", "development", "production",
966
+ "started", "testing", "idea", "mature", "qa", "finished"
967
+ ],
968
+ "description": "État d'avancement du projet"
969
+ },
970
+ "parent": {
971
+ "type": "object",
972
+ "patternProperties": {
973
+ "^[a-fA-F0-9]{24}$": {
974
+ "type": "object",
975
+ "properties": {
976
+ "type": {
977
+ "type": "string",
978
+ "description": "Type d'entité parent"
979
+ },
980
+ "name": {
981
+ "type": "string",
982
+ "description": "Nom de l'entité parent"
983
+ }
984
+ },
985
+ "required": ["type", "name"],
986
+ "additionalProperties": false
987
+ }
988
+ },
989
+ "additionalProperties": false,
990
+ "description": "Objet contenant les entités parentes (clé = ID). null signifie que les parents ne sont pas modifiés."
991
+ }
992
+ },
993
+ "anyOf": [
994
+ { "required": ["name"], "properties": { "name": { "not": { "type": "null" } } } },
995
+ { "required": ["url"], "properties": { "url": { "not": { "type": "null" } } } },
996
+ { "required": ["tags"], "properties": { "tags": { "not": { "type": "null" } } } },
997
+ { "required": ["email"], "properties": { "email": { "not": { "type": "null" } } } },
998
+ { "required": ["avancement"], "properties": { "avancement": { "not": { "type": "null" } } } },
999
+ { "required": ["parent"], "properties": { "parent": { "not": { "type": "null" } } } }
1000
+ ],
1001
+ "additionalProperties": false
1002
+ }
1003
+ },
1004
+ {
1005
+ "if": {
1006
+ "properties": { "typeElement": { "const": "organizations" } }
1007
+ },
1008
+ "then": {
1009
+ "properties": {
1010
+ "block": {
1011
+ "type": "string",
1012
+ "const": "info",
1013
+ "default": "info",
1014
+ "description": "Nom du bloc à mettre à jour (doit être 'info')"
1015
+ },
1016
+ "typeElement": {
1017
+ "type": "string",
1018
+ "default": "citoyens",
1019
+ "enum": ["citoyens", "projects", "organizations"],
1020
+ "description": "Type d'élément (citoyens, projects, organizations)"
1021
+ },
1022
+ "id": {
1023
+ "type": "string",
1024
+ "description": "ID de l'élément concerné"
1025
+ },
1026
+ "scope": {
1027
+ "type": "string",
1028
+ "default": "",
1029
+ "description": "Périmètre de mise à jour"
1030
+ },
1031
+ "name": { "$ref": "#/$defs/sharedFields/name" },
1032
+ "email": { "$ref": "#/$defs/sharedFields/email" },
1033
+ "url": { "$ref": "#/$defs/sharedFields/url" },
1034
+ "tags": { "$ref": "#/$defs/sharedFields/tags" },
1035
+ "type": {
1036
+ "type": "string",
1037
+ "enum": [
1038
+ "NGO", "Cooperative", "LocalBusiness", "GovernmentOrganizationautre"
1039
+ ],
1040
+ "description": "Type d'organisation (ex. association, entreprise)"
1041
+ }
1042
+ },
1043
+ "anyOf": [
1044
+ { "required": ["name"], "properties": { "name": { "not": { "type": "null" } } } },
1045
+ { "required": ["url"], "properties": { "url": { "not": { "type": "null" } } } },
1046
+ { "required": ["tags"], "properties": { "tags": { "not": { "type": "null" } } } },
1047
+ { "required": ["email"], "properties": { "email": { "not": { "type": "null" } } } },
1048
+ { "required": ["type"], "properties": { "type": { "not": { "type": "null" } } } }
1049
+ ],
1050
+ "additionalProperties": false
1051
+ }
1052
+ }
1053
+ ]
1054
+ },
1055
+ "responses": {
1056
+ "200": {
1057
+ "oneOf": [
1058
+ {
1059
+ "type": "object",
1060
+ "properties": {
1061
+ "result": { "type": "boolean", "const": true },
1062
+ "resultGoods": {
1063
+ "type": "object",
1064
+ "properties": {
1065
+ "result": { "type": "boolean", "const": true },
1066
+ "msg": { "type": "string" },
1067
+ "values": {
1068
+ "type": "object",
1069
+ "description": "Contient les champs mis à jour",
1070
+ "additionalProperties": true,
1071
+ "$comment": "Ce schéma n'est pas encore complet"
1072
+ }
1073
+ },
1074
+ "required": ["result", "msg"],
1075
+ "additionalProperties": true
1076
+ }
1077
+ },
1078
+ "required": ["result", "resultGoods"],
1079
+ "additionalProperties": false
1080
+ },
1081
+ {
1082
+ "type": "object",
1083
+ "properties": {
1084
+ "resultErrors": {
1085
+ "type": "object",
1086
+ "properties": {
1087
+ "result": { "type": "boolean", "const": false },
1088
+ "msg": { "type": "string", "description": "Message d'erreur" }
1089
+ },
1090
+ "required": ["result", "msg"],
1091
+ "additionalProperties": true
1092
+ }
1093
+ },
1094
+ "required": ["resultErrors"],
1095
+ "additionalProperties": false
1096
+ }
1097
+ ]
1098
+ },
1099
+ "401": {
1100
+ "type": "object",
1101
+ "description": "Erreur d'authentification (token invalide ou expiré)",
1102
+ "properties": {
1103
+ "error": {
1104
+ "type": "string",
1105
+ "description": "Description de l'erreur"
1106
+ }
1107
+ },
1108
+ "required": ["error"],
1109
+ "additionalProperties": false
1110
+ }
1111
+ }
1112
+ },
1113
+ {
1114
+ "name": "Mettre à jour les réseaux sociaux d'un élément",
1115
+ "path": "/co2/element/updateblock/",
1116
+ "constant": "UPDATE_BLOCK_SOCIAL",
1117
+ "constantCocolight": "UPDATE_BLOCK",
1118
+ "method": "POST",
1119
+ "auth": "bearer",
1120
+ "description": "Permet de mettre à jour les liens vers les réseaux sociaux d'un élément.",
1121
+ "contentType": "application/x-www-form-urlencoded",
1122
+ "request": {
1123
+ "type": "object",
1124
+ "properties": {
1125
+ "block": {
1126
+ "type": "string",
1127
+ "const": "network",
1128
+ "default": "network",
1129
+ "description": "Nom du bloc à mettre à jour (doit être 'network')"
1130
+ },
1131
+ "typeElement": {
1132
+ "type": "string",
1133
+ "default": "citoyens",
1134
+ "enum": ["citoyens", "projects", "organizations"],
1135
+ "description": "Type d'élément (citoyens, projects, organizations)"
1136
+ },
1137
+ "id": {
1138
+ "type": "string",
1139
+ "description": "ID de l'élément concerné"
1140
+ },
1141
+ "scope": {
1142
+ "type": "string",
1143
+ "default": "",
1144
+ "description": "Périmètre de mise à jour"
1145
+ },
1146
+ "gitlab": {
1147
+ "$ref": "#/$defs/socialField",
1148
+ "description": "Compte Gitlab"
1149
+ },
1150
+ "github": {
1151
+ "$ref": "#/$defs/socialField",
1152
+ "description": "Compte Github"
1153
+ },
1154
+ "twitter": {
1155
+ "$ref": "#/$defs/socialField",
1156
+ "description": "Compte Twitter"
1157
+ },
1158
+ "facebook": {
1159
+ "$ref": "#/$defs/socialField",
1160
+ "description": "Compte Facebook"
1161
+ },
1162
+ "instagram": {
1163
+ "$ref": "#/$defs/socialField",
1164
+ "description": "Compte Instagram"
1165
+ },
1166
+ "diaspora": {
1167
+ "$ref": "#/$defs/socialField",
1168
+ "description": "Compte Diaspora"
1169
+ },
1170
+ "mastodon": {
1171
+ "$ref": "#/$defs/socialField",
1172
+ "description": "Compte Mastodon"
1173
+ },
1174
+ "telegram": {
1175
+ "$ref": "#/$defs/socialField",
1176
+ "description": "Compte Telegram"
1177
+ },
1178
+ "signal": {
1179
+ "$ref": "#/$defs/socialField",
1180
+ "description": "Compte Signal"
1181
+ }
1182
+ },
1183
+ "required": ["block", "typeElement", "id"],
1184
+ "$defs": {
1185
+ "socialField": {
1186
+ "anyOf": [
1187
+ { "type": "string", "enum": [""], "description": "Vide pour effacer le champ" },
1188
+ { "type": "string", "format": "uri", "description": "URL du profil sur le réseau social" }
1189
+ ]
1190
+ }
1191
+ },
1192
+ "allOf": [
1193
+ {
1194
+ "if": {
1195
+ "properties": {
1196
+ "typeElement": { "const": "citoyens" }
1197
+ }
1198
+ },
1199
+ "then": {
1200
+ "properties": {
1201
+ "id": {
1202
+ "type": "string",
1203
+ "default": "@userId"
1204
+ }
1205
+ }
1206
+ }
1207
+ },
1208
+ {
1209
+ "anyOf": [
1210
+ { "required": ["gitlab"], "properties": { "gitlab": { "not": { "type": "null" } } } },
1211
+ { "required": ["github"], "properties": { "github": { "not": { "type": "null" } } } },
1212
+ { "required": ["twitter"], "properties": { "twitter": { "not": { "type": "null" } } } },
1213
+ { "required": ["facebook"], "properties": { "facebook": { "not": { "type": "null" } } } },
1214
+ { "required": ["instagram"], "properties": { "instagram": { "not": { "type": "null" } } } },
1215
+ { "required": ["diaspora"], "properties": { "diaspora": { "not": { "type": "null" } } } },
1216
+ { "required": ["mastodon"], "properties": { "mastodon": { "not": { "type": "null" } } } },
1217
+ { "required": ["telegram"], "properties": { "telegram": { "not": { "type": "null" } } } },
1218
+ { "required": ["signal"], "properties": { "signal": { "not": { "type": "null" } } } }
1219
+ ]
1220
+ }
1221
+ ]
1222
+ },
1223
+ "responses": {
1224
+ "200": {
1225
+ "oneOf": [
1226
+ {
1227
+ "type": "object",
1228
+ "properties": {
1229
+ "result": { "type": "boolean", "const": true },
1230
+ "resultGoods": {
1231
+ "type": "object",
1232
+ "properties": {
1233
+ "result": { "type": "boolean", "const": true },
1234
+ "msg": { "type": "string" },
1235
+ "values": {
1236
+ "type": "object",
1237
+ "description": "Contient les champs mis à jour",
1238
+ "additionalProperties": true,
1239
+ "$comment": "Ce schéma n'est pas encore complet"
1240
+ }
1241
+ },
1242
+ "required": ["result", "msg"],
1243
+ "additionalProperties": true
1244
+ }
1245
+ },
1246
+ "required": ["result", "resultGoods"],
1247
+ "additionalProperties": false
1248
+ },
1249
+ {
1250
+ "type": "object",
1251
+ "properties": {
1252
+ "resultErrors": {
1253
+ "type": "object",
1254
+ "properties": {
1255
+ "result": { "type": "boolean", "const": false },
1256
+ "msg": { "type": "string", "description": "Message d'erreur" }
1257
+ },
1258
+ "required": ["result", "msg"],
1259
+ "additionalProperties": true
1260
+ }
1261
+ },
1262
+ "required": ["resultErrors"],
1263
+ "additionalProperties": false
1264
+ }
1265
+ ]
1266
+ },
1267
+ "401": {
1268
+ "type": "object",
1269
+ "description": "Erreur d'authentification (token invalide ou expiré)",
1270
+ "properties": {
1271
+ "error": {
1272
+ "type": "string",
1273
+ "description": "Description de l'erreur"
1274
+ }
1275
+ },
1276
+ "required": ["error"],
1277
+ "additionalProperties": false
1278
+ }
1279
+ }
1280
+ },
1281
+ {
1282
+ "name": "Mettre à jour les localités d'un élément",
1283
+ "path": "/co2/element/updateblock/",
1284
+ "constant": "UPDATE_BLOCK_LOCALITY",
1285
+ "constantCocolight": "UPDATE_BLOCK",
1286
+ "method": "POST",
1287
+ "auth": "bearer",
1288
+ "description": "Permet de mettre à jour l'adresse et les informations géographiques d'un élément.",
1289
+ "contentType": "application/x-www-form-urlencoded",
1290
+ "request": {
1291
+ "type": "object",
1292
+ "properties": {
1293
+ "block": {
1294
+ "type": "string",
1295
+ "const": "localities",
1296
+ "default": "localities",
1297
+ "description": "Nom du bloc à mettre à jour (doit être 'localities')"
1298
+ },
1299
+ "typeElement": {
1300
+ "type": "string",
1301
+ "default": "citoyens",
1302
+ "enum": ["citoyens", "projects", "organizations"],
1303
+ "description": "Type d'élément"
1304
+ },
1305
+ "id": {
1306
+ "type": "string",
1307
+ "description": "ID de l'élément concerné"
1308
+ },
1309
+ "scope": {
1310
+ "type": "string",
1311
+ "default": "",
1312
+ "description": "Périmètre de mise à jour"
1313
+ },
1314
+ "geo": {
1315
+ "type": "object",
1316
+ "description": "Coordonnées géographiques",
1317
+ "properties": {
1318
+ "@type": { "type": "string", "const": "GeoCoordinates" },
1319
+ "latitude": { "type": ["string", "number"] },
1320
+ "longitude": { "type": ["string", "number"] }
1321
+ },
1322
+ "required": ["latitude", "longitude"],
1323
+ "additionalProperties": false
1324
+ },
1325
+ "geoPosition": {
1326
+ "type": "object",
1327
+ "description": "Position géographique GeoJSON",
1328
+ "properties": {
1329
+ "type": {
1330
+ "type": "string",
1331
+ "const": "Point",
1332
+ "description": "Type GeoJSON (doit être 'Point')"
1333
+ },
1334
+ "coordinates": {
1335
+ "type": "array",
1336
+ "items": { "type": "number" },
1337
+ "minItems": 2,
1338
+ "maxItems": 2,
1339
+ "description": "Tableau contenant [longitude, latitude]"
1340
+ },
1341
+ "float": {
1342
+ "type": "boolean",
1343
+ "const": true,
1344
+ "default": true,
1345
+ "description": "Indicateur pour forcer la conversion en float côté serveur"
1346
+ }
1347
+ },
1348
+ "required": ["type", "coordinates", "float"],
1349
+ "additionalProperties": true
1350
+ },
1351
+ "address": {
1352
+ "type": "object",
1353
+ "properties": {
1354
+ "@type": { "type": "string", "const": "PostalAddress" },
1355
+ "addressCountry": { "type": "string" },
1356
+ "codeInsee": { "type": "string" },
1357
+ "addressLocality": { "type": "string" },
1358
+ "localityId": { "type": "string" },
1359
+ "level1": { "type": "string" },
1360
+ "level1Name": { "type": "string" },
1361
+ "level3": {
1362
+ "type": "string",
1363
+ "description": "ID du département. Peut être vide pour les pays étrangers.",
1364
+ "minLength": 0
1365
+ },
1366
+ "level3Name": {
1367
+ "type": "string",
1368
+ "description": "Nom du département. Peut être vide pour les pays étrangers.",
1369
+ "minLength": 0
1370
+ },
1371
+ "level4": {
1372
+ "type": "string",
1373
+ "description": "ID de la commune. Peut être vide pour les pays étrangers.",
1374
+ "minLength": 0
1375
+ },
1376
+ "level4Name": {
1377
+ "type": "string",
1378
+ "description": "Nom de la commune. Peut être vide pour les pays étrangers.",
1379
+ "minLength": 0
1380
+ },
1381
+ "postalCode": { "type": "string" },
1382
+ "streetAddress": { "type": "string" }
1383
+ },
1384
+ "required": [
1385
+ "@type",
1386
+ "addressCountry",
1387
+ "codeInsee",
1388
+ "addressLocality",
1389
+ "localityId",
1390
+ "level1",
1391
+ "level1Name"
1392
+ ],
1393
+ "additionalProperties": false,
1394
+ "$comment": "Certains champs comme level3/level4 peuvent être vides selon le pays (ex : Maurice)"
1395
+ }
1396
+ },
1397
+ "required": ["block", "typeElement", "id", "address"],
1398
+ "allOf": [
1399
+ {
1400
+ "if": {
1401
+ "properties": {
1402
+ "typeElement": { "const": "citoyens" }
1403
+ }
1404
+ },
1405
+ "then": {
1406
+ "properties": {
1407
+ "id": {
1408
+ "type": "string",
1409
+ "default": "@userId"
1410
+ }
1411
+ }
1412
+ }
1413
+ }
1414
+ ]
1415
+ },
1416
+ "responses": {
1417
+ "200": {
1418
+ "oneOf": [
1419
+ {
1420
+ "type": "object",
1421
+ "properties": {
1422
+ "result": { "type": "boolean", "const": true },
1423
+ "resultGoods": {
1424
+ "type": "object",
1425
+ "properties": {
1426
+ "result": { "type": "boolean", "const": true },
1427
+ "msg": { "type": "string" },
1428
+ "values": {
1429
+ "type": "object",
1430
+ "description": "Contient les champs mis à jour",
1431
+ "additionalProperties": true,
1432
+ "$comment": "Ce schéma n'est pas encore complet"
1433
+ }
1434
+ },
1435
+ "required": ["result", "msg"],
1436
+ "additionalProperties": true
1437
+ }
1438
+ },
1439
+ "required": ["result", "resultGoods"],
1440
+ "additionalProperties": false
1441
+ },
1442
+ {
1443
+ "type": "object",
1444
+ "properties": {
1445
+ "resultErrors": {
1446
+ "type": "object",
1447
+ "properties": {
1448
+ "result": { "type": "boolean", "const": false },
1449
+ "msg": { "type": "string", "description": "Message d'erreur" }
1450
+ },
1451
+ "required": ["result", "msg"],
1452
+ "additionalProperties": true
1453
+ }
1454
+ },
1455
+ "required": ["resultErrors"],
1456
+ "additionalProperties": false
1457
+ }
1458
+ ]
1459
+ },
1460
+ "401": {
1461
+ "type": "object",
1462
+ "description": "Erreur d'authentification (token invalide ou expiré)",
1463
+ "properties": {
1464
+ "error": {
1465
+ "type": "string",
1466
+ "description": "Description de l'erreur"
1467
+ }
1468
+ },
1469
+ "required": ["error"],
1470
+ "additionalProperties": false
1471
+ }
1472
+ }
1473
+ },
1474
+ {
1475
+ "name": "Mettre à jour le slug d'un élément",
1476
+ "path": "/co2/element/updateblock/",
1477
+ "constant": "UPDATE_BLOCK_SLUG",
1478
+ "constantCocolight": "UPDATE_BLOCK",
1479
+ "method": "POST",
1480
+ "auth": "bearer",
1481
+ "description": "Permet de mettre à jour le slug pour une URL simplifiée.",
1482
+ "contentType": "application/x-www-form-urlencoded",
1483
+ "request": {
1484
+ "type": "object",
1485
+ "properties": {
1486
+ "block": {
1487
+ "type": "string",
1488
+ "const": "info",
1489
+ "default": "info",
1490
+ "description": "Nom du bloc à mettre à jour (doit être 'info')"
1491
+ },
1492
+ "typeElement": {
1493
+ "type": "string",
1494
+ "default": "citoyens",
1495
+ "enum": ["citoyens", "projects", "organizations"],
1496
+ "description": "Type d'élément (citoyens, projects, organizations)"
1497
+ },
1498
+ "id": {
1499
+ "type": "string",
1500
+ "description": "ID de l'élément concerné"
1501
+ },
1502
+ "scope": {
1503
+ "type": "string",
1504
+ "default": "",
1505
+ "$comment": "Non utilisé dans l'application Cocolight"
1506
+ },
1507
+ "slug": {
1508
+ "type": "string",
1509
+ "description": "Slug simplifié pour URL",
1510
+ "pattern": "^[a-zA-Z0-9]+$",
1511
+ "minLength": 3,
1512
+ "maxLength": 100
1513
+ }
1514
+ },
1515
+ "required": ["block", "typeElement", "id", "slug"],
1516
+ "allOf": [
1517
+ {
1518
+ "if": {
1519
+ "properties": {
1520
+ "typeElement": { "const": "citoyens" }
1521
+ }
1522
+ },
1523
+ "then": {
1524
+ "properties": {
1525
+ "id": {
1526
+ "type": "string",
1527
+ "default": "@userId"
1528
+ }
1529
+ }
1530
+ }
1531
+ }
1532
+ ]
1533
+ },
1534
+ "responses": {
1535
+ "200": {
1536
+ "description": "Réponse après la mise à jour de l'élément",
1537
+ "oneOf": [
1538
+ {
1539
+ "type": "object",
1540
+ "properties": {
1541
+ "result": { "type": "boolean", "const": true },
1542
+ "resultGoods": {
1543
+ "type": "object",
1544
+ "properties": {
1545
+ "result": { "type": "boolean", "const": true },
1546
+ "msg": { "type": "string" },
1547
+ "values": {
1548
+ "type": "object",
1549
+ "description": "Contient les champs mis à jour",
1550
+ "additionalProperties": true,
1551
+ "properties": {
1552
+ "slug": { "type": "string" }
1553
+ }
1554
+ }
1555
+ },
1556
+ "required": ["result", "msg"],
1557
+ "additionalProperties": true
1558
+ }
1559
+ },
1560
+ "required": ["result", "resultGoods"],
1561
+ "additionalProperties": false
1562
+ },
1563
+ {
1564
+ "type": "object",
1565
+ "properties": {
1566
+ "resultErrors": {
1567
+ "type": "object",
1568
+ "properties": {
1569
+ "result": { "type": "boolean", "const": false },
1570
+ "msg": { "type": "string", "description": "Message d'erreur" }
1571
+ },
1572
+ "required": ["result", "msg"],
1573
+ "additionalProperties": true
1574
+ }
1575
+ },
1576
+ "required": ["resultErrors"],
1577
+ "additionalProperties": false
1578
+ }
1579
+ ]
1580
+ },
1581
+ "401": {
1582
+ "type": "object",
1583
+ "description": "Erreur d'authentification (token invalide ou expiré)",
1584
+ "properties": {
1585
+ "error": {
1586
+ "type": "string",
1587
+ "description": "Description de l'erreur"
1588
+ }
1589
+ },
1590
+ "required": ["error"],
1591
+ "additionalProperties": false
1592
+ }
1593
+ }
1594
+ },
1595
+ {
1596
+ "name": "Vérifier l'état d'une URL",
1597
+ "path": "/co2/slug/check",
1598
+ "constant": "CHECK",
1599
+ "method": "POST",
1600
+ "auth": "bearer",
1601
+ "description": "Vérifie si une URL (slug) est valide ou disponible.",
1602
+ "contentType": "application/x-www-form-urlencoded",
1603
+ "request": {
1604
+ "type": "object",
1605
+ "properties": {
1606
+ "block": {
1607
+ "type": "string",
1608
+ "const": "info",
1609
+ "default": "info",
1610
+ "description": "Nom du bloc"
1611
+ },
1612
+ "id": {
1613
+ "type": "string",
1614
+ "description": "ID de l'élément"
1615
+ },
1616
+ "type": {
1617
+ "type": "string",
1618
+ "enum": ["citoyens", "projects", "organizations"],
1619
+ "default": "citoyens",
1620
+ "description": "Type d'élément"
1621
+ },
1622
+ "slug": {
1623
+ "type": "string",
1624
+ "description": "Slug à vérifier",
1625
+ "pattern": "^[a-zA-Z0-9]+$",
1626
+ "minLength": 3,
1627
+ "maxLength": 100
1628
+ }
1629
+ },
1630
+ "required": ["block", "type", "id", "slug"],
1631
+ "allOf": [
1632
+ {
1633
+ "if": {
1634
+ "properties": {
1635
+ "type": { "const": "citoyens" }
1636
+ }
1637
+ },
1638
+ "then": {
1639
+ "properties": {
1640
+ "id": {
1641
+ "type": "string",
1642
+ "default": "@userId"
1643
+ }
1644
+ }
1645
+ }
1646
+ }
1647
+ ],
1648
+ "additionalProperties": false
1649
+ },
1650
+ "responses": {
1651
+ "200": {
1652
+ "oneOf": [
1653
+ {
1654
+ "description": "Slug valide ou disponible",
1655
+ "type": "object",
1656
+ "properties": {
1657
+ "result": { "type": "boolean", "const": true },
1658
+ "domaineName": { "type": "string" }
1659
+ },
1660
+ "required": ["result", "domaineName"],
1661
+ "additionalProperties": false
1662
+ },
1663
+ {
1664
+ "description": "Slug non valide ou non disponible",
1665
+ "type": "object",
1666
+ "properties": {
1667
+ "result": { "type": "boolean", "const": false },
1668
+ "domaineName": { "type": "string" }
1669
+ },
1670
+ "required": ["result", "domaineName"],
1671
+ "additionalProperties": false
1672
+ }
1673
+ ]
1674
+ },
1675
+ "401": {
1676
+ "type": "object",
1677
+ "description": "Erreur d'authentification (token invalide ou expiré)",
1678
+ "properties": {
1679
+ "error": {
1680
+ "type": "string",
1681
+ "description": "Description de l'erreur"
1682
+ }
1683
+ },
1684
+ "required": ["error"],
1685
+ "additionalProperties": false
1686
+ }
1687
+ }
1688
+ },
1689
+ {
1690
+ "name": "Mettre à jour l'image de profil",
1691
+ "path": "/co2/document/upload-save/dir/communecter/folder/{folder}/ownerId/{ownerId}/input/profil_avatar/contentKey/profil/docType/image",
1692
+ "method": "POST",
1693
+ "constant": "PROFIL_IMAGE",
1694
+ "constantCocolight": ["PROFIL_IMAGE", "UPDATE_PDP"],
1695
+ "auth": "bearer",
1696
+ "description": "Permet de mettre à jour l'image de profil d'un utilisateur ou d'une entité.",
1697
+ "contentType": "multipart/form-data",
1698
+ "pathParams": {
1699
+ "type": "object",
1700
+ "properties": {
1701
+ "folder": {
1702
+ "type": "string",
1703
+ "enum": ["citoyens", "projects", "organizations"],
1704
+ "default": "citoyens",
1705
+ "description": "Type d'entité"
1706
+ },
1707
+ "ownerId": {
1708
+ "type": "string",
1709
+ "description": "ID de l'utilisateur ou de l'entité"
1710
+ }
1711
+ },
1712
+ "required": ["folder", "ownerId"],
1713
+ "allOf": [
1714
+ {
1715
+ "if": {
1716
+ "properties": {
1717
+ "folder": { "const": "citoyens" }
1718
+ }
1719
+ },
1720
+ "then": {
1721
+ "properties": {
1722
+ "ownerId": { "default": "@userId" }
1723
+ }
1724
+ }
1725
+ }
1726
+ ],
1727
+ "additionalProperties": false
1728
+ },
1729
+ "request": {
1730
+ "type": "object",
1731
+ "properties": {
1732
+ "profil_avatar": {
1733
+ "$comment": "Ce champ est un fichier binaire non validé par AJV",
1734
+ "description": "Fichier image de profil au format binaire"
1735
+ }
1736
+ },
1737
+ "required": ["profil_avatar"],
1738
+ "additionalProperties": false
1739
+ },
1740
+ "responses": {
1741
+ "200": {
1742
+ "description": "Réponse après l'enregistrement de l'image de profil",
1743
+ "oneOf": [
1744
+ {
1745
+ "type": "object",
1746
+ "properties": {
1747
+ "resultUpload": { "type": "boolean", "const": true },
1748
+ "success": { "type": "boolean", "const": true },
1749
+ "name": { "type": "string", "description": "Nom du fichier enregistré" },
1750
+ "docPath": { "type": "string", "description": "Chemin du fichier sur le serveur" },
1751
+ "size": { "type": "integer", "description": "Taille du fichier en octets" },
1752
+ "result": { "type": "boolean", "const": true },
1753
+ "msg": { "type": "string", "description": "Message de confirmation" },
1754
+ "id": {
1755
+ "type": "object",
1756
+ "properties": {
1757
+ "$id": { "type": "string", "description": "ID du document enregistré" }
1758
+ },
1759
+ "required": ["$id"],
1760
+ "additionalProperties": false
1761
+ },
1762
+ "src": {
1763
+ "type": "object",
1764
+ "description": "Informations sur les images générées",
1765
+ "properties": {
1766
+ "result": { "type": "boolean", "const": true },
1767
+ "msg": { "type": "string" },
1768
+ "changes": {
1769
+ "type": "object",
1770
+ "properties": {
1771
+ "profilImageUrl": { "type": "string", "format": "uri-reference" },
1772
+ "profilMediumImageUrl": { "type": "string", "format": "uri-reference" },
1773
+ "profilThumbImageUrl": { "type": "string", "format": "uri-reference" },
1774
+ "profilMarkerImageUrl": { "type": "string", "format": "uri-reference" }
1775
+ },
1776
+ "required": [
1777
+ "profilImageUrl",
1778
+ "profilMediumImageUrl",
1779
+ "profilThumbImageUrl",
1780
+ "profilMarkerImageUrl"
1781
+ ],
1782
+ "additionalProperties": false
1783
+ }
1784
+ },
1785
+ "required": ["result", "msg", "changes"],
1786
+ "additionalProperties": false
1787
+ },
1788
+ "survey": {
1789
+ "type": ["boolean", "null"],
1790
+ "description": "Peut être à false ou null selon les cas"
1791
+ }
1792
+ },
1793
+ "required": [
1794
+ "resultUpload", "success", "name", "docPath", "size",
1795
+ "result", "msg", "id", "src"
1796
+ ],
1797
+ "additionalProperties": false
1798
+ },
1799
+ {
1800
+ "type": "object",
1801
+ "description": "Réponse en cas d'échec de l'upload",
1802
+ "properties": {
1803
+ "result": { "type": "boolean", "const": false },
1804
+ "msg": { "type": "string" }
1805
+ },
1806
+ "required": ["result", "msg"],
1807
+ "additionalProperties": false
1808
+ }
1809
+ ]
1810
+ },
1811
+ "401": {
1812
+ "description": "Erreur d'authentification (token invalide ou expiré)",
1813
+ "type": "object",
1814
+ "properties": {
1815
+ "error": {
1816
+ "type": "string",
1817
+ "description": "Description de l'erreur"
1818
+ }
1819
+ },
1820
+ "required": ["error"],
1821
+ "additionalProperties": false
1822
+ }
1823
+ }
1824
+ },
1825
+ {
1826
+ "name": "Obtenir les éléments liés",
1827
+ "path": "/co2/element/about/type/{type}/id/{id}/json/true",
1828
+ "constant": "GET_ELEMENTS_ABOUT",
1829
+ "method": "POST",
1830
+ "auth": "none",
1831
+ "description": "Récupère les informations détaillées d'un élément et de ses éléments liés.",
1832
+ "contentType": "application/x-www-form-urlencoded",
1833
+ "pathParams": {
1834
+ "type": "object",
1835
+ "properties": {
1836
+ "type": {
1837
+ "type": "string",
1838
+ "enum": ["citoyens", "projects", "organizations"],
1839
+ "default": "citoyens",
1840
+ "description": "Type d'entité"
1841
+ },
1842
+ "id": {
1843
+ "type": "string",
1844
+ "description": "ID de l'utilisateur ou de l'entité"
1845
+ }
1846
+ },
1847
+ "required": ["type", "id"],
1848
+ "allOf": [
1849
+ {
1850
+ "if": {
1851
+ "properties": {
1852
+ "type": { "const": "citoyens" }
1853
+ }
1854
+ },
1855
+ "then": {
1856
+ "properties": {
1857
+ "id": { "default": "@userId" }
1858
+ }
1859
+ }
1860
+ }
1861
+ ],
1862
+ "additionalProperties": false
1863
+ },
1864
+ "request": {
1865
+ "type": "object",
1866
+ "properties": {
1867
+ "tpl": {
1868
+ "type": "string",
1869
+ "default": "ficheInfoElement",
1870
+ "const": "ficheInfoElement",
1871
+ "description": "Template utilisé (ex: ficheInfoElement)"
1872
+ }
1873
+ },
1874
+ "required": ["tpl"],
1875
+ "additionalProperties": false
1876
+ },
1877
+ "responses": {
1878
+ "200": {
1879
+ "oneOf": [
1880
+ {
1881
+ "type": "object",
1882
+ "description": "Schéma JSON pour les informations détaillées d'un utilisateur.",
1883
+ "properties": {
1884
+ "_id": {
1885
+ "type": "object",
1886
+ "properties": {
1887
+ "$id": { "type": "string" }
1888
+ },
1889
+ "required": ["$id"],
1890
+ "additionalProperties": false
1891
+ },
1892
+ "username": { "type": "string" },
1893
+ "email": { "type": "string", "format": "email" },
1894
+ "name": { "type": "string" },
1895
+ "slug": { "type": "string" },
1896
+ "collection": { "type": "string", "enum": ["citoyens"] },
1897
+ "modified": {
1898
+ "type": "object",
1899
+ "properties": {
1900
+ "sec": { "type": "integer" },
1901
+ "usec": { "type": "integer" }
1902
+ },
1903
+ "required": ["sec", "usec"],
1904
+ "additionalProperties": false
1905
+ },
1906
+ "roles": {
1907
+ "type": "object",
1908
+ "properties": {
1909
+ "betaTester": { "type": "boolean" },
1910
+ "standalonePageAccess": { "type": "boolean" },
1911
+ "superAdmin": { "type": "boolean" }
1912
+ }
1913
+ },
1914
+ "preferences": {
1915
+ "type": "object",
1916
+ "properties": {
1917
+ "privateFields": {
1918
+ "type": "array",
1919
+ "items": { "type": "string" }
1920
+ },
1921
+ "publicFields": {
1922
+ "type": "array",
1923
+ "items": { "type": "string" }
1924
+ },
1925
+ "isOpenData": { "type": "boolean" },
1926
+ "badge": { "type": "boolean" },
1927
+ "sendMail": {
1928
+ "oneOf": [
1929
+ {
1930
+ "type": "object",
1931
+ "properties": {
1932
+ "source": {
1933
+ "type": "array",
1934
+ "items": {}
1935
+ }
1936
+ },
1937
+ "required": ["source"],
1938
+ "additionalProperties": false
1939
+ },
1940
+ {
1941
+ "type": "boolean",
1942
+ "const": false
1943
+ }
1944
+ ]
1945
+ },
1946
+ "activitypub": { "type": "boolean" },
1947
+ "activitypubStarterClosed": { "type": "boolean" },
1948
+ "notifications": { "type": "array", "items": {} }
1949
+ },
1950
+ "required": ["isOpenData", "sendMail", "publicFields", "privateFields"]
1951
+ },
1952
+ "language": { "type": "string" },
1953
+ "profilImageUrl": {
1954
+ "anyOf": [
1955
+ { "type": "string", "enum": [""] },
1956
+ { "type": "string", "format": "uri-reference" }
1957
+ ]
1958
+ },
1959
+ "profilMarkerImageUrl": {
1960
+ "anyOf": [
1961
+ { "type": "string", "enum": [""] },
1962
+ { "type": "string", "format": "uri-reference" }
1963
+ ]
1964
+ },
1965
+ "profilMediumImageUrl": {
1966
+ "anyOf": [
1967
+ { "type": "string", "enum": [""] },
1968
+ { "type": "string", "format": "uri-reference" }
1969
+ ]
1970
+ },
1971
+ "profilThumbImageUrl": {
1972
+ "anyOf": [
1973
+ { "type": "string", "enum": [""] },
1974
+ { "type": "string", "format": "uri-reference" }
1975
+ ]
1976
+ },
1977
+ "profilBannerUrl": {
1978
+ "anyOf": [
1979
+ { "type": "string", "enum": [""] },
1980
+ { "type": "string", "format": "uri-reference" }
1981
+ ]
1982
+ },
1983
+ "profilRealBannerUrl": {
1984
+ "anyOf": [
1985
+ { "type": "string", "enum": [""] },
1986
+ { "type": "string", "format": "uri-reference" }
1987
+ ]
1988
+ },
1989
+ "shortDescription": { "type": "string" },
1990
+ "description": { "type": "string" },
1991
+ "tags": {
1992
+ "type": "array",
1993
+ "items": { "type": "string" }
1994
+ },
1995
+ "birthDate": {
1996
+ "type": "object",
1997
+ "properties": {
1998
+ "sec": { "type": "integer" },
1999
+ "usec": { "type": "integer" }
2000
+ },
2001
+ "required": ["sec", "usec"],
2002
+ "additionalProperties": false
2003
+ }
2004
+ },
2005
+ "required": ["_id", "name", "username", "roles", "collection", "preferences", "slug"]
2006
+ },
2007
+ {
2008
+ "description": "Schéma JSON pour les informations détaillées d'un projet",
2009
+ "type": "object",
2010
+ "properties": {
2011
+ "_id": {
2012
+ "type": "object",
2013
+ "properties": {
2014
+ "$id": { "type": "string" }
2015
+ },
2016
+ "required": ["$id"],
2017
+ "additionalProperties": false
2018
+ },
2019
+ "collection": {
2020
+ "type": "string",
2021
+ "enum": ["projects"]
2022
+ },
2023
+ "created": { "type": "integer" },
2024
+ "creator": { "type": "string" },
2025
+ "modified": {
2026
+ "type": "object",
2027
+ "properties": {
2028
+ "sec": { "type": "integer" },
2029
+ "usec": { "type": "integer" }
2030
+ },
2031
+ "required": ["sec", "usec"],
2032
+ "additionalProperties": false
2033
+ },
2034
+ "name": { "type": "string" },
2035
+ "parent": {
2036
+ "type": "object",
2037
+ "patternProperties": {
2038
+ "^[0-9a-fA-F]{24}$": {
2039
+ "type": "object",
2040
+ "properties": {
2041
+ "type": { "type": "string" },
2042
+ "name": { "type": "string" },
2043
+ "_id": {
2044
+ "type": "object",
2045
+ "properties": {
2046
+ "$id": { "type": "string" }
2047
+ },
2048
+ "required": ["$id"],
2049
+ "additionalProperties": false
2050
+ },
2051
+ "slug": { "type": "string" },
2052
+ "profilThumbImageUrl": { "type": "string" }
2053
+ },
2054
+ "required": ["type", "name"],
2055
+ "additionalProperties": true
2056
+ }
2057
+ },
2058
+ "additionalProperties": false
2059
+ },
2060
+ "preferences": {
2061
+ "type": "object",
2062
+ "properties": {
2063
+ "isOpenData": {
2064
+ "anyOf": [
2065
+ { "type": "boolean" },
2066
+ { "type": "string", "enum": ["true", "false"] }
2067
+ ]
2068
+ },
2069
+ "isOpenEdition": {
2070
+ "anyOf": [
2071
+ { "type": "boolean" },
2072
+ { "type": "string", "enum": ["true", "false"] }
2073
+ ]
2074
+ },
2075
+ "crowdfunding": {
2076
+ "anyOf": [
2077
+ { "type": "boolean" },
2078
+ { "type": "string", "enum": ["true", "false"] }
2079
+ ]
2080
+ },
2081
+ "private": {
2082
+ "anyOf": [
2083
+ { "type": "boolean" },
2084
+ { "type": "string", "enum": ["true", "false"] }
2085
+ ]
2086
+ }
2087
+ },
2088
+ "required": ["isOpenData", "isOpenEdition"]
2089
+ },
2090
+ "slug": { "type": "string" },
2091
+ "updated": { "type": "integer" },
2092
+ "links": {
2093
+ "type": "object",
2094
+ "$comment": "Ce schéma n'est pas encore complet"
2095
+ },
2096
+ "profilImageUrl": {
2097
+ "anyOf": [
2098
+ { "type": "string", "enum": [""] },
2099
+ { "type": "string", "format": "uri-reference" }
2100
+ ]
2101
+ },
2102
+ "profilThumbImageUrl": {
2103
+ "anyOf": [
2104
+ { "type": "string", "enum": [""] },
2105
+ { "type": "string", "format": "uri-reference" }
2106
+ ]
2107
+ },
2108
+ "profilMarkerImageUrl": {
2109
+ "anyOf": [
2110
+ { "type": "string", "enum": [""] },
2111
+ { "type": "string", "format": "uri-reference" }
2112
+ ]
2113
+ },
2114
+ "profilMediumImageUrl": {
2115
+ "anyOf": [
2116
+ { "type": "string", "enum": [""] },
2117
+ { "type": "string", "format": "uri-reference" }
2118
+ ]
2119
+ },
2120
+ "typeSig": { "type": "string" },
2121
+ "type": { "type": "string" }
2122
+ },
2123
+ "required": [
2124
+ "_id",
2125
+ "collection",
2126
+ "created",
2127
+ "creator",
2128
+ "modified",
2129
+ "name",
2130
+ "parent",
2131
+ "preferences",
2132
+ "slug",
2133
+ "typeSig",
2134
+ "type",
2135
+ "updated"
2136
+ ]
2137
+ },
2138
+ {
2139
+ "description": "Schéma JSON pour les informations détaillées d'une organisation",
2140
+ "type": "object",
2141
+ "properties": {
2142
+ "_id": {
2143
+ "type": "object",
2144
+ "properties": {
2145
+ "$id": { "type": "string" }
2146
+ },
2147
+ "required": ["$id"],
2148
+ "additionalProperties": false
2149
+ },
2150
+ "collection": {
2151
+ "type": "string",
2152
+ "enum": ["organizations"]
2153
+ },
2154
+ "created": { "type": "integer" },
2155
+ "creator": { "type": "string" },
2156
+ "modified": {
2157
+ "type": "object",
2158
+ "properties": {
2159
+ "sec": { "type": "integer" },
2160
+ "usec": { "type": "integer" }
2161
+ },
2162
+ "required": ["sec", "usec"],
2163
+ "additionalProperties": false
2164
+ },
2165
+ "name": { "type": "string" },
2166
+ "preferences": {
2167
+ "type": "object",
2168
+ "properties": {
2169
+ "isOpenData": {
2170
+ "anyOf": [
2171
+ { "type": "boolean" },
2172
+ { "type": "string", "enum": ["true", "false"] }
2173
+ ]
2174
+ },
2175
+ "isOpenEdition": {
2176
+ "anyOf": [
2177
+ { "type": "boolean" },
2178
+ { "type": "string", "enum": ["true", "false"] }
2179
+ ]
2180
+ }
2181
+ },
2182
+ "required": ["isOpenData", "isOpenEdition"]
2183
+ },
2184
+ "slug": { "type": "string" },
2185
+ "type": { "type": "string" },
2186
+ "updated": { "type": "integer" },
2187
+ "links": {
2188
+ "type": "object",
2189
+ "$comment": "Ce schéma n'est pas encore complet"
2190
+ },
2191
+ "profilImageUrl": {
2192
+ "anyOf": [
2193
+ { "type": "string", "enum": [""] },
2194
+ { "type": "string", "format": "uri-reference" }
2195
+ ],
2196
+ "description": "URL de l'image de profil (vide ou URI)."
2197
+ },
2198
+ "profilThumbImageUrl": {
2199
+ "anyOf": [
2200
+ { "type": "string", "enum": [""] },
2201
+ { "type": "string", "format": "uri-reference" }
2202
+ ],
2203
+ "description": "URL de l'image miniature (vide ou URI)."
2204
+ },
2205
+ "profilMarkerImageUrl": {
2206
+ "anyOf": [
2207
+ { "type": "string", "enum": [""] },
2208
+ { "type": "string", "format": "uri-reference" }
2209
+ ],
2210
+ "description": "URL de l'image pour le marqueur (vide ou URI)."
2211
+ },
2212
+ "profilMediumImageUrl": {
2213
+ "anyOf": [
2214
+ { "type": "string", "enum": [""] },
2215
+ { "type": "string", "format": "uri-reference" }
2216
+ ],
2217
+ "description": "URL de l'image de taille moyenne (vide ou URI)."
2218
+ }
2219
+ },
2220
+ "required": [
2221
+ "_id",
2222
+ "collection",
2223
+ "modified",
2224
+ "name",
2225
+ "preferences",
2226
+ "slug",
2227
+ "type",
2228
+ "updated"
2229
+ ]
2230
+ }
2231
+ ]
2232
+ },
2233
+ "401": {
2234
+ "description": "Erreur d'authentification (token invalide ou expiré)",
2235
+ "type": "object",
2236
+ "properties": {
2237
+ "error": {
2238
+ "type": "string",
2239
+ "description": "Description de l'erreur"
2240
+ }
2241
+ },
2242
+ "required": ["error"],
2243
+ "additionalProperties": false
2244
+ }
2245
+ }
2246
+ },
2247
+ {
2248
+ "name": "Gérer des connexions multiples",
2249
+ "path": "/co2/link/multiconnect",
2250
+ "constant": "MULTICONNECT",
2251
+ "method": "POST",
2252
+ "auth": "bearer",
2253
+ "description": "Permet d’inviter ou de connecter plusieurs utilisateurs en même temps à une entité.",
2254
+ "contentType": "application/x-www-form-urlencoded",
2255
+ "request": {
2256
+ "type": "object",
2257
+ "properties": {
2258
+ "parentId": {
2259
+ "type": "string",
2260
+ "description": "ID de l'entité parente"
2261
+ },
2262
+ "parentType": {
2263
+ "type": "string",
2264
+ "enum": ["citoyens", "projects", "organizations"],
2265
+ "default": "citoyens",
2266
+ "description": "Type de l'entité parente"
2267
+ },
2268
+ "listInvite": {
2269
+ "type": "object",
2270
+ "description": "Liste des citoyens invités",
2271
+ "patternProperties": {
2272
+ "^(citoyens|projects|organizations)$": {
2273
+ "type": "object",
2274
+ "patternProperties": {
2275
+ "^[0-9a-fA-F]{24}$": {
2276
+ "type": "object",
2277
+ "properties": {
2278
+ "name": { "type": "string", "description": "Nom de l'invité" }
2279
+ },
2280
+ "required": ["name"],
2281
+ "additionalProperties": false
2282
+ }
2283
+ },
2284
+ "additionalProperties": false
2285
+ }
2286
+ },
2287
+ "additionalProperties": false
2288
+ }
2289
+ },
2290
+ "required": ["parentId", "parentType", "listInvite"],
2291
+ "allOf": [
2292
+ {
2293
+ "if": {
2294
+ "properties": {
2295
+ "parentType": { "const": "citoyens" }
2296
+ }
2297
+ },
2298
+ "then": {
2299
+ "properties": {
2300
+ "parentId": {
2301
+ "type": "string",
2302
+ "default": "@userId"
2303
+ }
2304
+ }
2305
+ }
2306
+ }
2307
+ ],
2308
+ "additionalProperties": false
2309
+ },
2310
+ "responses": {
2311
+ "200": {
2312
+ "oneOf": [
2313
+ {
2314
+ "type": "object",
2315
+ "properties": {
2316
+ "citoyens": {
2317
+ "type": "array",
2318
+ "items": {
2319
+ "oneOf": [
2320
+ {
2321
+ "type": "object",
2322
+ "properties": {
2323
+ "result": { "type": "boolean", "const": true },
2324
+ "msg": { "type": "string" },
2325
+ "newElement": {
2326
+ "type": "object",
2327
+ "properties": {
2328
+ "_id": {
2329
+ "type": "object",
2330
+ "properties": {
2331
+ "$id": { "type": "string" }
2332
+ },
2333
+ "required": ["$id"],
2334
+ "additionalProperties": false
2335
+ },
2336
+ "name": { "type": "string" },
2337
+ "profilThumbImageUrl": { "type": "string" },
2338
+ "id": { "type": "string" },
2339
+ "isInviting": { "type": "boolean" }
2340
+ },
2341
+ "required": ["_id", "name", "profilThumbImageUrl", "id", "isInviting"],
2342
+ "additionalProperties": true
2343
+ },
2344
+ "newElementType": { "type": "string", "const": "citoyens" }
2345
+ },
2346
+ "required": ["result", "msg", "newElement", "newElementType"]
2347
+ },
2348
+ {
2349
+ "type": "object",
2350
+ "properties": {
2351
+ "result": { "type": "boolean", "const": false },
2352
+ "msg": { "type": "string" }
2353
+ },
2354
+ "required": ["result", "msg"],
2355
+ "additionalProperties": false
2356
+ }
2357
+ ]
2358
+ }
2359
+ }
2360
+ },
2361
+ "required": ["citoyens"],
2362
+ "additionalProperties": false
2363
+ }
2364
+ ]
2365
+ },
2366
+ "401": {
2367
+ "description": "Erreur d'authentification (token invalide ou expiré)",
2368
+ "type": "object",
2369
+ "properties": {
2370
+ "error": {
2371
+ "type": "string",
2372
+ "description": "Description de l'erreur"
2373
+ }
2374
+ },
2375
+ "required": ["error"],
2376
+ "additionalProperties": false
2377
+ }
2378
+ }
2379
+ },
2380
+ {
2381
+ "name": "Récupérer les actualités",
2382
+ "path": "/news/co/get/type/{type}/id/{id}/isLive/{isLive}/json/{json}",
2383
+ "constant": "GET_NEWS",
2384
+ "constantCocolight": "GET_NEWS",
2385
+ "method": "POST",
2386
+ "auth": "none",
2387
+ "description": "Récupère la liste d’actualités selon plusieurs critères.",
2388
+ "contentType": "application/x-www-form-urlencoded",
2389
+ "pathParams": {
2390
+ "type": "object",
2391
+ "properties": {
2392
+ "isLive": {
2393
+ "type": "boolean",
2394
+ "default": true,
2395
+ "description": "Indique si l'actualité est en direct"
2396
+ },
2397
+ "type": {
2398
+ "type": "string",
2399
+ "enum": ["citoyens", "projects", "organizations"],
2400
+ "default": "citoyens",
2401
+ "description": "Type d'actualité (ex: 'citoyens', 'projects', 'organizations')"
2402
+ },
2403
+ "id": {
2404
+ "type": "string",
2405
+ "description": "ID de l'élément (ex: ID d'un utilisateur, d'un projet ou d'une organisation)"
2406
+ },
2407
+ "json": {
2408
+ "type": "boolean",
2409
+ "default": true,
2410
+ "description": "Indique si la réponse doit être au format JSON"
2411
+ }
2412
+ },
2413
+ "required": ["isLive", "type", "id", "json"],
2414
+ "allOf": [
2415
+ {
2416
+ "if": {
2417
+ "properties": {
2418
+ "type": { "const": "citoyens" }
2419
+ }
2420
+ },
2421
+ "then": {
2422
+ "properties": {
2423
+ "id": { "default": "@userId" }
2424
+ }
2425
+ }
2426
+ }
2427
+ ],
2428
+ "additionalProperties": false
2429
+ },
2430
+ "request": {
2431
+ "type": "object",
2432
+ "properties": {
2433
+ "dateLimit": {
2434
+ "type": "integer",
2435
+ "default": 0,
2436
+ "description": "Limite de date timestamp ou 0"
2437
+ },
2438
+ "search": {
2439
+ "type": "object",
2440
+ "properties": {
2441
+ "name": {
2442
+ "type": "string",
2443
+ "default": "",
2444
+ "description": "Nom ou terme recherché"
2445
+ }
2446
+ },
2447
+ "required": ["name"],
2448
+ "additionalProperties": false
2449
+ },
2450
+ "indexStep": {
2451
+ "type": "integer",
2452
+ "default": 12,
2453
+ "description": "Nombre de résultats par page"
2454
+ }
2455
+ },
2456
+ "required": ["dateLimit", "indexStep"],
2457
+ "additionalProperties": false
2458
+ },
2459
+ "responses": {
2460
+ "200": {
2461
+ "$defs": {
2462
+ "NewsSchema": {
2463
+ "type": "object",
2464
+ "properties": {
2465
+ "_id": {
2466
+ "type": "object",
2467
+ "properties": {
2468
+ "$id": { "type": "string" }
2469
+ },
2470
+ "required": ["$id"],
2471
+ "additionalProperties": false
2472
+ },
2473
+ "type": {
2474
+ "type": "string",
2475
+ "const": "news"
2476
+ },
2477
+ "text": {
2478
+ "type": "string"
2479
+ },
2480
+ "author": {
2481
+ "$ref": "#/$defs/user"
2482
+ },
2483
+ "date": {
2484
+ "$ref": "#/$defs/dateObject"
2485
+ },
2486
+ "collection": {
2487
+ "type": "string",
2488
+ "const": "news"
2489
+ },
2490
+ "sharedBy": {
2491
+ "type": "array",
2492
+ "items": { "$ref": "#/$defs/sharedUser" }
2493
+ },
2494
+ "target": {
2495
+ "$ref": "#/$defs/user"
2496
+ },
2497
+ "created": {
2498
+ "$ref": "#/$defs/dateObject"
2499
+ },
2500
+ "markdownActive": {
2501
+ "type": "boolean"
2502
+ },
2503
+ "scope": {
2504
+ "type": "object",
2505
+ "properties": {
2506
+ "type": { "type": "string" }
2507
+ },
2508
+ "required": ["type"],
2509
+ "additionalProperties": true
2510
+ },
2511
+ "updated": {
2512
+ "$ref": "#/$defs/dateObject"
2513
+ },
2514
+ "comment": {
2515
+ "type": ["string", "null"]
2516
+ },
2517
+ "typeSig": {
2518
+ "type": "string",
2519
+ "const": "news"
2520
+ },
2521
+ "lastAuthorShare": {
2522
+ "$ref": "#/$defs/sharedUser"
2523
+ },
2524
+ "media": {
2525
+ "type": "object",
2526
+ "description": "Optionnel. Contient les informations de média associées à la news.",
2527
+ "additionalProperties": true
2528
+ },
2529
+ "mediaImg": {
2530
+ "type": "object",
2531
+ "description": "Optionnel. Contient les images associées à la news.",
2532
+ "additionalProperties": true
2533
+ },
2534
+ "mentions": {
2535
+ "type": "array",
2536
+ "description": "Optionnel. Liste des personnes mentionnées.",
2537
+ "items": {
2538
+ "type": "object",
2539
+ "properties": {
2540
+ "id": { "type": "string" },
2541
+ "name": { "type": "string" },
2542
+ "slug": { "type": "string" },
2543
+ "avatar": { "type": "string" },
2544
+ "type": { "type": "string" },
2545
+ "value": { "type": "string" },
2546
+ "count": { "type": "string" }
2547
+ },
2548
+ "required": ["id", "name", "slug", "avatar", "type", "value", "count"],
2549
+ "additionalProperties": true
2550
+ }
2551
+ },
2552
+ "tags": {
2553
+ "type": "array",
2554
+ "description": "Optionnel. Liste de tags associés à la news.",
2555
+ "items": { "type": "string" }
2556
+ },
2557
+ "vote": {
2558
+ "type": "object",
2559
+ "description": "Optionnel. Votes associés à la news.",
2560
+ "additionalProperties": {
2561
+ "type": "object",
2562
+ "properties": {
2563
+ "status": { "type": "string" },
2564
+ "date": { "$ref": "#/$defs/dateObject" }
2565
+ },
2566
+ "required": ["status", "date"],
2567
+ "additionalProperties": false
2568
+ }
2569
+ },
2570
+ "voteCount": {
2571
+ "type": "object",
2572
+ "description": "Optionnel. Compteurs de votes.",
2573
+ "additionalProperties": { "type": "number" }
2574
+ }
2575
+ },
2576
+ "required": [
2577
+ "_id",
2578
+ "type",
2579
+ "text",
2580
+ "author",
2581
+ "date",
2582
+ "collection",
2583
+ "sharedBy",
2584
+ "target",
2585
+ "created",
2586
+ "markdownActive",
2587
+ "scope",
2588
+ "updated",
2589
+ "comment",
2590
+ "typeSig",
2591
+ "lastAuthorShare"
2592
+ ],
2593
+ "additionalProperties": true
2594
+ },
2595
+ "dateObject": {
2596
+ "type": "object",
2597
+ "properties": {
2598
+ "sec": { "type": "number" },
2599
+ "usec": { "type": "number" }
2600
+ },
2601
+ "required": ["sec", "usec"],
2602
+ "additionalProperties": false
2603
+ },
2604
+ "user": {
2605
+ "type": "object",
2606
+ "properties": {
2607
+ "id": { "type": "string" },
2608
+ "name": { "type": "string" },
2609
+ "type": { "type": "string" },
2610
+ "profilThumbImageUrl": { "type": "string", "format": "uri-reference" },
2611
+ "geo": {
2612
+ "type": "object",
2613
+ "properties": {
2614
+ "@type": { "type": "string", "const": "GeoCoordinates" },
2615
+ "latitude": { "type": "string" },
2616
+ "longitude": { "type": "string" }
2617
+ },
2618
+ "required": ["@type", "latitude", "longitude"],
2619
+ "additionalProperties": false
2620
+ }
2621
+ },
2622
+ "required": ["id", "name", "type"],
2623
+ "additionalProperties": true
2624
+ },
2625
+ "sharedUser": {
2626
+ "allOf": [
2627
+ { "$ref": "#/$defs/user" },
2628
+ {
2629
+ "type": "object",
2630
+ "properties": {
2631
+ "updated": { "$ref": "#/$defs/dateObject" },
2632
+ "comment": { "type": ["string", "null"] }
2633
+ },
2634
+ "required": ["updated", "comment"]
2635
+ }
2636
+ ]
2637
+ }
2638
+ },
2639
+ "oneOf": [
2640
+ {
2641
+ "type": "object",
2642
+ "description": "Réponse renvoyée lorsqu'aucune actualité n'est disponible",
2643
+ "properties": {
2644
+ "type": {
2645
+ "type": "string",
2646
+ "enum": ["citoyens", "projects", "organizations"]
2647
+ },
2648
+ "endStream": {
2649
+ "type": "boolean",
2650
+ "const": true
2651
+ },
2652
+ "news": {
2653
+ "type": "array",
2654
+ "minItems": 0,
2655
+ "maxItems": 0
2656
+ },
2657
+ "limitDate": {
2658
+ "type": "boolean",
2659
+ "const": false
2660
+ }
2661
+ },
2662
+ "required": ["type", "endStream", "news", "limitDate"]
2663
+ },
2664
+ {
2665
+ "type": "object",
2666
+ "description": "Réponse renvoyée lorsqu'une ou plusieurs actualités sont disponibles",
2667
+ "properties": {
2668
+ "type": {
2669
+ "type": "string",
2670
+ "enum": ["citoyens", "projects", "organizations"]
2671
+ },
2672
+ "endStream": {
2673
+ "type": "boolean"
2674
+ },
2675
+ "news": {
2676
+ "type": "object",
2677
+ "description": "Contient plusieurs objets news. Chaque clé est un identifiant dynamique (par exemple, un ObjectID Mongo) et chaque valeur doit respecter la structure définie par NewsCommonSchema.",
2678
+ "patternProperties": {
2679
+ "^[a-f0-9]{24}$": { "$ref": "#/$defs/NewsSchema" }
2680
+ },
2681
+ "additionalProperties": false
2682
+ },
2683
+ "limitDate": {
2684
+ "type": "object"
2685
+ }
2686
+ },
2687
+ "required": ["type", "endStream", "news", "limitDate"]
2688
+ }
2689
+ ]
2690
+ },
2691
+ "401": {
2692
+ "description": "Erreur d'authentification (token invalide ou expiré)",
2693
+ "type": "object",
2694
+ "properties": {
2695
+ "error": {
2696
+ "type": "string",
2697
+ "description": "Description de l'erreur"
2698
+ }
2699
+ },
2700
+ "required": ["error"],
2701
+ "additionalProperties": false
2702
+ }
2703
+ }
2704
+ },
2705
+ {
2706
+ "name": "Récupérer des actualités par IDs",
2707
+ "path": "/news/co/getbyids",
2708
+ "constant": "GET_NEWS_BY_ID",
2709
+ "method": "POST",
2710
+ "auth": "none",
2711
+ "description": "Récupère des actualités à partir d’une liste d’identifiants.",
2712
+ "contentType": "application/x-www-form-urlencoded",
2713
+ "request": {
2714
+ "type": "object",
2715
+ "properties": {
2716
+ "ids": {
2717
+ "type": "array",
2718
+ "items": { "type": "string" },
2719
+ "description": "Liste des IDs d’actualités à récupérer"
2720
+ }
2721
+ },
2722
+ "required": ["ids"],
2723
+ "additionalProperties": false
2724
+ },
2725
+ "responses": {
2726
+ "200": {
2727
+ "$defs": {
2728
+ "NewsSchema": {
2729
+ "type": "object",
2730
+ "properties": {
2731
+ "_id": {
2732
+ "type": "object",
2733
+ "properties": {
2734
+ "$id": { "type": "string" }
2735
+ },
2736
+ "required": ["$id"],
2737
+ "additionalProperties": false
2738
+ },
2739
+ "type": {
2740
+ "type": "string",
2741
+ "const": "news"
2742
+ },
2743
+ "text": {
2744
+ "type": "string"
2745
+ },
2746
+ "author": {
2747
+ "$ref": "#/$defs/user"
2748
+ },
2749
+ "date": {
2750
+ "$ref": "#/$defs/dateObject"
2751
+ },
2752
+ "collection": {
2753
+ "type": "string",
2754
+ "const": "news"
2755
+ },
2756
+ "sharedBy": {
2757
+ "type": "array",
2758
+ "items": { "$ref": "#/$defs/sharedUser" }
2759
+ },
2760
+ "target": {
2761
+ "$ref": "#/$defs/user"
2762
+ },
2763
+ "created": {
2764
+ "$ref": "#/$defs/dateObject"
2765
+ },
2766
+ "markdownActive": {
2767
+ "type": "boolean"
2768
+ },
2769
+ "scope": {
2770
+ "type": "object",
2771
+ "properties": {
2772
+ "type": { "type": "string" }
2773
+ },
2774
+ "required": ["type"],
2775
+ "additionalProperties": true
2776
+ },
2777
+ "updated": {
2778
+ "$ref": "#/$defs/dateObject"
2779
+ },
2780
+ "comment": {
2781
+ "type": ["string", "null"]
2782
+ },
2783
+ "typeSig": {
2784
+ "type": "string",
2785
+ "const": "news"
2786
+ },
2787
+ "lastAuthorShare": {
2788
+ "$ref": "#/$defs/sharedUser"
2789
+ },
2790
+ "media": {
2791
+ "type": "object",
2792
+ "description": "Optionnel. Contient les informations de média associées à la news.",
2793
+ "additionalProperties": true
2794
+ },
2795
+ "mediaImg": {
2796
+ "type": "object",
2797
+ "description": "Optionnel. Contient les images associées à la news.",
2798
+ "additionalProperties": true
2799
+ },
2800
+ "mentions": {
2801
+ "type": "array",
2802
+ "description": "Optionnel. Liste des personnes mentionnées.",
2803
+ "items": {
2804
+ "type": "object",
2805
+ "properties": {
2806
+ "id": { "type": "string" },
2807
+ "name": { "type": "string" },
2808
+ "slug": { "type": "string" },
2809
+ "avatar": { "type": "string" },
2810
+ "type": { "type": "string" },
2811
+ "value": { "type": "string" },
2812
+ "count": { "type": "string" }
2813
+ },
2814
+ "required": ["id", "name", "slug", "avatar", "type", "value", "count"],
2815
+ "additionalProperties": true
2816
+ }
2817
+ },
2818
+ "tags": {
2819
+ "type": "array",
2820
+ "description": "Optionnel. Liste de tags associés à la news.",
2821
+ "items": { "type": "string" }
2822
+ },
2823
+ "vote": {
2824
+ "type": "object",
2825
+ "description": "Optionnel. Votes associés à la news.",
2826
+ "additionalProperties": {
2827
+ "type": "object",
2828
+ "properties": {
2829
+ "status": { "type": "string" },
2830
+ "date": { "$ref": "#/$defs/dateObject" }
2831
+ },
2832
+ "required": ["status", "date"],
2833
+ "additionalProperties": false
2834
+ }
2835
+ },
2836
+ "voteCount": {
2837
+ "type": "object",
2838
+ "description": "Optionnel. Compteurs de votes.",
2839
+ "additionalProperties": { "type": "number" }
2840
+ }
2841
+ },
2842
+ "required": [
2843
+ "_id",
2844
+ "type",
2845
+ "text",
2846
+ "author",
2847
+ "date",
2848
+ "collection",
2849
+ "sharedBy",
2850
+ "target",
2851
+ "created",
2852
+ "markdownActive",
2853
+ "scope",
2854
+ "updated",
2855
+ "comment",
2856
+ "typeSig",
2857
+ "lastAuthorShare"
2858
+ ],
2859
+ "additionalProperties": true
2860
+ },
2861
+ "dateObject": {
2862
+ "type": "object",
2863
+ "properties": {
2864
+ "sec": { "type": "number" },
2865
+ "usec": { "type": "number" }
2866
+ },
2867
+ "required": ["sec", "usec"],
2868
+ "additionalProperties": false
2869
+ },
2870
+ "user": {
2871
+ "type": "object",
2872
+ "properties": {
2873
+ "id": { "type": "string" },
2874
+ "name": { "type": "string" },
2875
+ "type": { "type": "string" },
2876
+ "profilThumbImageUrl": { "type": "string", "format": "uri-reference" },
2877
+ "geo": {
2878
+ "type": "object",
2879
+ "properties": {
2880
+ "@type": { "type": "string", "const": "GeoCoordinates" },
2881
+ "latitude": { "type": "string" },
2882
+ "longitude": { "type": "string" }
2883
+ },
2884
+ "required": ["@type", "latitude", "longitude"],
2885
+ "additionalProperties": false
2886
+ }
2887
+ },
2888
+ "required": ["id", "name", "type"],
2889
+ "additionalProperties": true
2890
+ },
2891
+ "sharedUser": {
2892
+ "allOf": [
2893
+ { "$ref": "#/$defs/user" },
2894
+ {
2895
+ "type": "object",
2896
+ "properties": {
2897
+ "updated": { "$ref": "#/$defs/dateObject" },
2898
+ "comment": { "type": ["string", "null"] }
2899
+ },
2900
+ "required": ["updated", "comment"]
2901
+ }
2902
+ ]
2903
+ }
2904
+ },
2905
+ "type": "array",
2906
+ "items": {
2907
+ "$ref": "#/$defs/NewsSchema"
2908
+ },
2909
+ "description": "Liste d'actualités correspondant aux IDs fournis"
2910
+ }
2911
+ }
2912
+ },
2913
+ {
2914
+ "name": "Ajouter une actualité",
2915
+ "path": "/news/co/save",
2916
+ "constant": "ADD_NEWS",
2917
+ "method": "POST",
2918
+ "auth": "bearer",
2919
+ "description": "Ajoute une nouvelle actualité.",
2920
+ "contentType": "application/x-www-form-urlencoded",
2921
+ "request": {
2922
+ "type": "object",
2923
+ "properties": {
2924
+ "text": {
2925
+ "type": "string",
2926
+ "description": "Contenu de l’actualité"
2927
+ },
2928
+ "scope": {
2929
+ "type": "string",
2930
+ "description": "Portée de l'actualité (ex: public, privé...)",
2931
+ "enum": ["public", "private", "restricted"],
2932
+ "default": "public"
2933
+ },
2934
+ "markdownActive": {
2935
+ "type": "boolean",
2936
+ "default": true,
2937
+ "description": "Markdown activé (true/false)"
2938
+ },
2939
+ "parentId": {
2940
+ "type": "string",
2941
+ "description": "ID de l'entité parente"
2942
+ },
2943
+ "parentType": {
2944
+ "type": "string",
2945
+ "enum": ["citoyens", "projects", "organizations"],
2946
+ "default": "citoyens",
2947
+ "description": "Type de l'entité parente"
2948
+ },
2949
+ "type": {
2950
+ "type": "string",
2951
+ "const": "news",
2952
+ "default": "news",
2953
+ "description": "Type de l'objet, toujours 'news'."
2954
+ },
2955
+ "json": {
2956
+ "type": "boolean",
2957
+ "const": true,
2958
+ "default": true,
2959
+ "description": "Indique que la réponse est au format JSON."
2960
+ },
2961
+ "tags": {
2962
+ "anyOf": [
2963
+ { "type": "array", "items": { "type": "string" } },
2964
+ { "type": "string", "enum": [""] }
2965
+ ],
2966
+ "description": "Tags : \"\" pour effacer tous les tags, ou tableau de mots-clés."
2967
+ },
2968
+ "mediaImg": {
2969
+ "type": "object",
2970
+ "description": "Optionnel. Informations sur les images associées à la news.",
2971
+ "properties": {
2972
+ "countImages": {
2973
+ "type": "number",
2974
+ "description": "Nombre d'images."
2975
+ },
2976
+ "images": {
2977
+ "type": "array",
2978
+ "description": "Liste des identifiants ou chemins d'images.",
2979
+ "items": {
2980
+ "type": "string"
2981
+ }
2982
+ }
2983
+ },
2984
+ "required": ["countImages", "images"],
2985
+ "additionalProperties": false
2986
+ },
2987
+ "mediaFile": {
2988
+ "type": "object",
2989
+ "description": "Optionnel. Informations sur les fichiers associés à la news.",
2990
+ "properties": {
2991
+ "countFiles": {
2992
+ "type": "number",
2993
+ "description": "Nombre de fichiers."
2994
+ },
2995
+ "files": {
2996
+ "type": "array",
2997
+ "description": "Liste des identifiants ou chemins de fichiers.",
2998
+ "items": {
2999
+ "type": "string"
3000
+ }
3001
+ }
3002
+ },
3003
+ "required": ["countFiles", "files"],
3004
+ "additionalProperties": false
3005
+ },
3006
+ "mentions": {
3007
+ "type": "object",
3008
+ "description": "Liste des mentions sous forme d'objet avec des clés dynamiques représentant l'indice de la mention.",
3009
+ "patternProperties": {
3010
+ "^[0-9]+$": {
3011
+ "type": "object",
3012
+ "properties": {
3013
+ "id": { "type": "string" },
3014
+ "name": { "type": "string" },
3015
+ "slug": { "type": "string" },
3016
+ "type": { "type": "string" },
3017
+ "value": { "type": "string" },
3018
+ "count": { "type": "number" }
3019
+ },
3020
+ "required": ["id", "name", "slug", "type", "value", "count"],
3021
+ "additionalProperties": false
3022
+ }
3023
+ },
3024
+ "additionalProperties": false
3025
+ }
3026
+ },
3027
+ "required": ["scope", "markdownActive", "parentId", "parentType", "type", "json"],
3028
+ "anyOf": [
3029
+ { "required": ["text"] },
3030
+ { "required": ["mediaImg"] },
3031
+ { "required": ["mediaFile"] }
3032
+ ],
3033
+ "allOf": [
3034
+ {
3035
+ "if": {
3036
+ "properties": {
3037
+ "parentType": { "const": "citoyens" }
3038
+ }
3039
+ },
3040
+ "then": {
3041
+ "properties": {
3042
+ "parentId": {
3043
+ "type": "string",
3044
+ "default": "@userId"
3045
+ }
3046
+ }
3047
+ }
3048
+ }
3049
+ ],
3050
+ "additionalProperties": false
3051
+ },
3052
+ "responses": {
3053
+ "200": {
3054
+ "$defs": {
3055
+ "NewsSchema": {
3056
+ "type": "object",
3057
+ "properties": {
3058
+ "_id": {
3059
+ "type": "object",
3060
+ "properties": {
3061
+ "$id": { "type": "string" }
3062
+ },
3063
+ "required": ["$id"],
3064
+ "additionalProperties": false
3065
+ },
3066
+ "type": {
3067
+ "type": "string",
3068
+ "const": "news"
3069
+ },
3070
+ "text": {
3071
+ "type": "string"
3072
+ },
3073
+ "author": {
3074
+ "$ref": "#/$defs/user"
3075
+ },
3076
+ "date": {
3077
+ "$ref": "#/$defs/dateObject"
3078
+ },
3079
+ "collection": {
3080
+ "type": "string",
3081
+ "const": "news"
3082
+ },
3083
+ "sharedBy": {
3084
+ "type": "array",
3085
+ "items": { "$ref": "#/$defs/sharedUser" }
3086
+ },
3087
+ "target": {
3088
+ "$ref": "#/$defs/user"
3089
+ },
3090
+ "created": {
3091
+ "$ref": "#/$defs/dateObject"
3092
+ },
3093
+ "markdownActive": {
3094
+ "type": "boolean"
3095
+ },
3096
+ "scope": {
3097
+ "type": "object",
3098
+ "properties": {
3099
+ "type": { "type": "string" }
3100
+ },
3101
+ "required": ["type"],
3102
+ "additionalProperties": true
3103
+ },
3104
+ "updated": {
3105
+ "$ref": "#/$defs/dateObject"
3106
+ },
3107
+ "comment": {
3108
+ "type": ["string", "null"]
3109
+ },
3110
+ "typeSig": {
3111
+ "type": "string",
3112
+ "const": "news"
3113
+ },
3114
+ "lastAuthorShare": {
3115
+ "$ref": "#/$defs/sharedUser"
3116
+ },
3117
+ "media": {
3118
+ "type": "object",
3119
+ "description": "Optionnel. Contient les informations de média associées à la news.",
3120
+ "additionalProperties": true
3121
+ },
3122
+ "mediaImg": {
3123
+ "type": "object",
3124
+ "description": "Optionnel. Contient les images associées à la news.",
3125
+ "additionalProperties": true
3126
+ },
3127
+ "mentions": {
3128
+ "type": "array",
3129
+ "description": "Optionnel. Liste des personnes mentionnées.",
3130
+ "items": {
3131
+ "type": "object",
3132
+ "properties": {
3133
+ "id": { "type": "string" },
3134
+ "name": { "type": "string" },
3135
+ "slug": { "type": "string" },
3136
+ "avatar": { "type": "string" },
3137
+ "type": { "type": "string" },
3138
+ "value": { "type": "string" },
3139
+ "count": { "type": "string" }
3140
+ },
3141
+ "required": ["id", "name", "slug", "avatar", "type", "value", "count"],
3142
+ "additionalProperties": true
3143
+ }
3144
+ },
3145
+ "tags": {
3146
+ "type": "array",
3147
+ "description": "Optionnel. Liste de tags associés à la news.",
3148
+ "items": { "type": "string" }
3149
+ },
3150
+ "vote": {
3151
+ "type": "object",
3152
+ "description": "Optionnel. Votes associés à la news.",
3153
+ "additionalProperties": {
3154
+ "type": "object",
3155
+ "properties": {
3156
+ "status": { "type": "string" },
3157
+ "date": { "$ref": "#/$defs/dateObject" }
3158
+ },
3159
+ "required": ["status", "date"],
3160
+ "additionalProperties": false
3161
+ }
3162
+ },
3163
+ "voteCount": {
3164
+ "type": "object",
3165
+ "description": "Optionnel. Compteurs de votes.",
3166
+ "additionalProperties": { "type": "number" }
3167
+ }
3168
+ },
3169
+ "required": [
3170
+ "_id",
3171
+ "type",
3172
+ "text",
3173
+ "author",
3174
+ "date",
3175
+ "collection",
3176
+ "sharedBy",
3177
+ "target",
3178
+ "created",
3179
+ "markdownActive",
3180
+ "scope",
3181
+ "updated",
3182
+ "comment",
3183
+ "typeSig",
3184
+ "lastAuthorShare"
3185
+ ],
3186
+ "additionalProperties": true
3187
+ },
3188
+ "dateObject": {
3189
+ "type": "object",
3190
+ "properties": {
3191
+ "sec": { "type": "number" },
3192
+ "usec": { "type": "number" }
3193
+ },
3194
+ "required": ["sec", "usec"],
3195
+ "additionalProperties": false
3196
+ },
3197
+ "user": {
3198
+ "type": "object",
3199
+ "properties": {
3200
+ "id": { "type": "string" },
3201
+ "name": { "type": "string" },
3202
+ "type": { "type": "string" },
3203
+ "profilThumbImageUrl": { "type": "string", "format": "uri-reference" },
3204
+ "geo": {
3205
+ "type": "object",
3206
+ "properties": {
3207
+ "@type": { "type": "string", "const": "GeoCoordinates" },
3208
+ "latitude": { "type": "string" },
3209
+ "longitude": { "type": "string" }
3210
+ },
3211
+ "required": ["@type", "latitude", "longitude"],
3212
+ "additionalProperties": false
3213
+ }
3214
+ },
3215
+ "required": ["id", "name"],
3216
+ "additionalProperties": true
3217
+ },
3218
+ "sharedUser": {
3219
+ "allOf": [
3220
+ { "$ref": "#/$defs/user" },
3221
+ {
3222
+ "type": "object",
3223
+ "properties": {
3224
+ "updated": { "$ref": "#/$defs/dateObject" },
3225
+ "comment": { "type": ["string", "null"] }
3226
+ },
3227
+ "required": ["updated", "comment"]
3228
+ }
3229
+ ]
3230
+ }
3231
+ },
3232
+ "oneOf":[
3233
+ {
3234
+ "type": "object",
3235
+ "properties": {
3236
+ "result": { "type": "boolean", "const": true },
3237
+ "msg": { "type": "string" },
3238
+ "id": {
3239
+ "type": "object",
3240
+ "properties": {
3241
+ "$id": { "type": "string" }
3242
+ },
3243
+ "required": ["$id"],
3244
+ "additionalProperties": false
3245
+ },
3246
+ "object": {
3247
+ "$comment": "dans object.author il y a pas type il y a que typeSig",
3248
+ "$ref": "#/$defs/NewsSchema"
3249
+ }
3250
+ },
3251
+ "required": ["result", "msg", "id", "object"],
3252
+ "additionalProperties": false
3253
+ },
3254
+ {
3255
+ "type": "object",
3256
+ "properties": {
3257
+ "result": { "type": "boolean", "const": false },
3258
+ "msg": { "type": "string" }
3259
+ },
3260
+ "required": ["result", "msg"],
3261
+ "additionalProperties": false
3262
+ }
3263
+ ]
3264
+ },
3265
+ "401": {
3266
+ "description": "Erreur d'authentification (token invalide ou expiré)",
3267
+ "type": "object",
3268
+ "properties": {
3269
+ "error": {
3270
+ "type": "string",
3271
+ "description": "Description de l'erreur"
3272
+ }
3273
+ },
3274
+ "required": ["error"],
3275
+ "additionalProperties": false
3276
+ }
3277
+ }
3278
+ },
3279
+ {
3280
+ "name": "Ajouter une image à une actualité",
3281
+ "path": "/co2/document/uploadSave/dir/communecter/folder/{folder}/ownerId/{ownerId}/input/newsImage/docType/image/contentKey/slider",
3282
+ "constant": "ADD_IMAGE_NEWS",
3283
+ "constantCocolight": "ADD_IMAGE_NEWS",
3284
+ "method": "POST",
3285
+ "auth": "bearer",
3286
+ "description": "Ajoute une images à une actualité.",
3287
+ "contentType": "multipart/form-data",
3288
+ "pathParams": {
3289
+ "type": "object",
3290
+ "properties": {
3291
+ "folder": {
3292
+ "type": "string",
3293
+ "enum": ["citoyens", "projects", "organizations"],
3294
+ "default": "citoyens",
3295
+ "description": "Type de l'entité parente (ex: 'citoyens', 'projects', 'organizations')"
3296
+ },
3297
+ "ownerId": {
3298
+ "type": "string",
3299
+ "description": "ID de l'utilisateur ou de l'entité parente"
3300
+ }
3301
+ },
3302
+ "required": ["folder", "ownerId"],
3303
+ "allOf": [
3304
+ {
3305
+ "if": {
3306
+ "properties": {
3307
+ "folder": { "const": "citoyens" }
3308
+ }
3309
+ },
3310
+ "then": {
3311
+ "properties": {
3312
+ "ownerId": { "default": "@userId" }
3313
+ }
3314
+ }
3315
+ }
3316
+ ],
3317
+ "additionalProperties": false
3318
+ },
3319
+ "request":{
3320
+ "type": "object",
3321
+ "properties": {
3322
+ "newsImage": {
3323
+ "$comment": "Ce champ est un fichier binaire non validé par AJV",
3324
+ "description": "Fichier image à télécharger"
3325
+ }
3326
+ },
3327
+ "required": ["newsImage"],
3328
+ "additionalProperties": false
3329
+ },
3330
+ "responses": {
3331
+ "200": {
3332
+ "oneOf": [
3333
+ {
3334
+ "type": "object",
3335
+ "description": "Réponse en cas de succès de l'upload",
3336
+ "properties": {
3337
+ "resultUpload": {
3338
+ "type": "boolean", "const": true,
3339
+ "description": "Indique si le téléchargement a abouti."
3340
+ },
3341
+ "success": {
3342
+ "type": "boolean", "const": true,
3343
+ "description": "Indique le succès de l'opération."
3344
+ },
3345
+ "name": {
3346
+ "type": "string",
3347
+ "description": "Nom du document."
3348
+ },
3349
+ "docPath": {
3350
+ "type": "string",
3351
+ "description": "Chemin d'accès au document."
3352
+ },
3353
+ "size": {
3354
+ "type": "number",
3355
+ "description": "Taille du document en octets."
3356
+ },
3357
+ "result": {
3358
+ "type": "boolean", "const": true,
3359
+ "description": "Résultat de l'opération."
3360
+ },
3361
+ "msg": {
3362
+ "type": "string",
3363
+ "description": "Message de confirmation."
3364
+ },
3365
+ "id": {
3366
+ "type": "object",
3367
+ "description": "Identifiant du document sous forme d'objet.",
3368
+ "properties": {
3369
+ "$id": {
3370
+ "type": "string",
3371
+ "description": "ID du document (généralement un ObjectID MongoDB)."
3372
+ }
3373
+ },
3374
+ "required": ["$id"],
3375
+ "additionalProperties": false
3376
+ }
3377
+ },
3378
+ "required": ["resultUpload", "success", "name", "docPath", "size", "result", "msg", "id"]
3379
+ },
3380
+ {
3381
+ "type": "object",
3382
+ "description": "Réponse en cas d'échec de l'upload",
3383
+ "properties": {
3384
+ "result": { "type": "boolean", "const": false },
3385
+ "msg": { "type": "string" }
3386
+ },
3387
+ "required": ["result", "msg"],
3388
+ "additionalProperties": false
3389
+ }
3390
+ ]
3391
+ },
3392
+ "401": {
3393
+ "description": "Erreur d'authentification (token invalide ou expiré)",
3394
+ "type": "object",
3395
+ "properties": {
3396
+ "error": {
3397
+ "type": "string",
3398
+ "description": "Description de l'erreur"
3399
+ }
3400
+ },
3401
+ "required": ["error"],
3402
+ "additionalProperties": false
3403
+ }
3404
+ }
3405
+ },
3406
+ {
3407
+ "name": "Ajouter un fichier à une actualité",
3408
+ "path": "/co2/document/uploadSave/dir/communecter/folder/{folder}/ownerId/{ownerId}}/input/newsFile/docType/file",
3409
+ "constant": "ADD_FILE_NEWS",
3410
+ "constantCocolight": "ADD_FILE_NEWS",
3411
+ "method": "POST",
3412
+ "auth": "bearer",
3413
+ "description": "Ajoute un fichier à une actualité.",
3414
+ "contentType": "multipart/form-data",
3415
+ "pathParams": {
3416
+ "type": "object",
3417
+ "properties": {
3418
+ "folder": {
3419
+ "type": "string",
3420
+ "enum": ["citoyens", "projects", "organizations"],
3421
+ "default": "citoyens",
3422
+ "description": "Type de l'entité parente (ex: 'citoyens', 'projects', 'organizations')"
3423
+ },
3424
+ "ownerId": {
3425
+ "type": "string",
3426
+ "description": "ID de l'utilisateur ou de l'entité parente"
3427
+ }
3428
+ },
3429
+ "required": ["folder", "ownerId"],
3430
+ "allOf": [
3431
+ {
3432
+ "if": {
3433
+ "properties": {
3434
+ "folder": { "const": "citoyens" }
3435
+ }
3436
+ },
3437
+ "then": {
3438
+ "properties": {
3439
+ "ownerId": { "default": "@userId" }
3440
+ }
3441
+ }
3442
+ }
3443
+ ],
3444
+ "additionalProperties": false
3445
+ },
3446
+ "request":{
3447
+ "type": "object",
3448
+ "properties": {
3449
+ "newsFile": {
3450
+ "$comment": "Ce champ est un fichier binaire non validé par AJV",
3451
+ "description": "Fichier image à télécharger"
3452
+ }
3453
+ },
3454
+ "required": ["newsFile"],
3455
+ "additionalProperties": false
3456
+ },
3457
+ "responses": {
3458
+ "200": {
3459
+ "oneOf": [
3460
+ {
3461
+ "type": "object",
3462
+ "description": "Réponse en cas de succès de l'upload",
3463
+ "properties": {
3464
+ "resultUpload": {
3465
+ "type": "boolean", "const": true,
3466
+ "description": "Indique si le téléchargement a abouti."
3467
+ },
3468
+ "success": {
3469
+ "type": "boolean", "const": true,
3470
+ "description": "Indique le succès de l'opération."
3471
+ },
3472
+ "name": {
3473
+ "type": "string",
3474
+ "description": "Nom du document."
3475
+ },
3476
+ "docPath": {
3477
+ "type": "string",
3478
+ "description": "Chemin d'accès au document."
3479
+ },
3480
+ "size": {
3481
+ "type": "number",
3482
+ "description": "Taille du document en octets."
3483
+ },
3484
+ "result": {
3485
+ "type": "boolean", "const": true,
3486
+ "description": "Résultat de l'opération."
3487
+ },
3488
+ "msg": {
3489
+ "type": "string",
3490
+ "description": "Message de confirmation"
3491
+ },
3492
+ "id": {
3493
+ "type": "object",
3494
+ "description": "Identifiant du document sous forme d'objet.",
3495
+ "properties": {
3496
+ "$id": {
3497
+ "type": "string",
3498
+ "description": "ID du document (généralement un ObjectID MongoDB)."
3499
+ }
3500
+ },
3501
+ "required": ["$id"],
3502
+ "additionalProperties": false
3503
+ }
3504
+ },
3505
+ "required": ["resultUpload", "success", "name", "docPath", "size", "result", "msg", "id"]
3506
+ },
3507
+ {
3508
+ "type": "object",
3509
+ "description": "Réponse en cas d'échec de l'upload",
3510
+ "properties": {
3511
+ "result": { "type": "boolean", "const": false },
3512
+ "msg": { "type": "string" }
3513
+ },
3514
+ "required": ["result", "msg"],
3515
+ "additionalProperties": false
3516
+ }
3517
+ ]
3518
+ },
3519
+ "401": {
3520
+ "description": "Erreur d'authentification (token invalide ou expiré)",
3521
+ "type": "object",
3522
+ "properties": {
3523
+ "error": {
3524
+ "type": "string",
3525
+ "description": "Description de l'erreur"
3526
+ }
3527
+ },
3528
+ "required": ["error"],
3529
+ "additionalProperties": false
3530
+ }
3531
+ }
3532
+ },
3533
+ {
3534
+ "name": "Supprimer une actualité",
3535
+ "path": "/news/co/delete/id/{id}",
3536
+ "constant": "DELETE_NEWS",
3537
+ "constantCocolight": "DELETE_NEWS",
3538
+ "method": "POST",
3539
+ "auth": "bearer",
3540
+ "description": "Supprime une actualité existante.",
3541
+ "contentType": "application/x-www-form-urlencoded",
3542
+ "pathParams": {
3543
+ "type": "object",
3544
+ "properties": {
3545
+ "id": {
3546
+ "type": "string",
3547
+ "description": "ID de l'actualité à supprimer"
3548
+ }
3549
+ },
3550
+ "required": ["id"],
3551
+ "additionalProperties": false
3552
+ },
3553
+ "request": {
3554
+ "type": "object",
3555
+ "properties": {
3556
+ "isLive": {
3557
+ "type": "boolean",
3558
+ "default": false
3559
+ }
3560
+ },
3561
+ "required": ["isLive"],
3562
+ "additionalProperties": false
3563
+ },
3564
+ "responses": {
3565
+ "200": {
3566
+ "oneOf": [
3567
+ {
3568
+ "type": "object",
3569
+ "description": "Réponse en cas de succès de la suppression",
3570
+ "properties": {
3571
+ "result": {
3572
+ "type": "boolean",
3573
+ "const": true
3574
+ },
3575
+ "msg": {
3576
+ "type": "string"
3577
+ },
3578
+ "type": {
3579
+ "type": "string",
3580
+ "const": "news"
3581
+ },
3582
+ "commentsDeleted": {
3583
+ "type": "number",
3584
+ "description": "Nombre de commentaires supprimés",
3585
+ "$comment": "bizarre même si il y a des commentaires ce champs reste à 0"
3586
+ }
3587
+ },
3588
+ "required": ["result", "msg", "type", "commentsDeleted"],
3589
+ "additionalProperties": false
3590
+ },
3591
+ {
3592
+ "type": "object",
3593
+ "description": "Réponse en cas d'échec de la suppression",
3594
+ "properties": {
3595
+ "result": {
3596
+ "type": "boolean",
3597
+ "const": false
3598
+ },
3599
+ "msg": {
3600
+ "type": "string"
3601
+ }
3602
+ },
3603
+ "required": ["result", "msg"]
3604
+ }
3605
+ ]
3606
+ },
3607
+ "401": {
3608
+ "description": "Erreur d'authentification (token invalide ou expiré)",
3609
+ "type": "object",
3610
+ "properties": {
3611
+ "error": {
3612
+ "type": "string",
3613
+ "description": "Description de l'erreur"
3614
+ }
3615
+ },
3616
+ "required": ["error"],
3617
+ "additionalProperties": false
3618
+ }
3619
+ }
3620
+ },
3621
+ {
3622
+ "name": "Mettre à jour une actualité",
3623
+ "path": "/news/co/update",
3624
+ "constant": "UPDATE_NEWS",
3625
+ "method": "POST",
3626
+ "auth": "bearer",
3627
+ "description": "Met à jour le contenu d’une actualité existante.",
3628
+ "contentType": "application/x-www-form-urlencoded",
3629
+ "request": {
3630
+ "type": "object",
3631
+ "properties": {
3632
+ "idNews": {
3633
+ "type": "string",
3634
+ "description": "ID de l'actualité à mettre à jour"
3635
+ },
3636
+ "text": {
3637
+ "type": "string",
3638
+ "description": "Contenu de l’actualité"
3639
+ },
3640
+ "scope": {
3641
+ "type": "string",
3642
+ "description": "Portée de l'actualité (ex: public, privé...)",
3643
+ "enum": ["public", "private", "restricted"],
3644
+ "default": "public"
3645
+ },
3646
+ "markdownActive": {
3647
+ "type": "boolean",
3648
+ "default": true,
3649
+ "description": "Markdown activé (true/false)"
3650
+ },
3651
+ "parentId": {
3652
+ "type": "string",
3653
+ "description": "ID de l'entité parente"
3654
+ },
3655
+ "parentType": {
3656
+ "type": "string",
3657
+ "enum": ["citoyens", "projects", "organizations"],
3658
+ "default": "citoyens",
3659
+ "description": "Type de l'entité parente"
3660
+ },
3661
+ "type": {
3662
+ "type": "string",
3663
+ "const": "news",
3664
+ "default": "news",
3665
+ "description": "Type de l'objet, toujours 'news'."
3666
+ },
3667
+ "tags": {
3668
+ "anyOf": [
3669
+ { "type": "array", "items": { "type": "string" } },
3670
+ { "type": "string", "enum": [""] }
3671
+ ],
3672
+ "description": "Tags : \"\" pour effacer tous les tags, ou tableau de mots-clés."
3673
+ },
3674
+ "mediaImg": {
3675
+ "type": "object",
3676
+ "description": "Optionnel. Informations sur les images associées à la news.",
3677
+ "properties": {
3678
+ "countImages": {
3679
+ "type": "number",
3680
+ "description": "Nombre d'images."
3681
+ },
3682
+ "images": {
3683
+ "type": "array",
3684
+ "description": "Liste des identifiants ou chemins d'images.",
3685
+ "items": {
3686
+ "type": "string"
3687
+ }
3688
+ }
3689
+ },
3690
+ "required": ["countImages", "images"],
3691
+ "additionalProperties": false
3692
+ },
3693
+ "mediaFile": {
3694
+ "type": "object",
3695
+ "description": "Optionnel. Informations sur les fichiers associés à la news.",
3696
+ "properties": {
3697
+ "countFiles": {
3698
+ "type": "number",
3699
+ "description": "Nombre de fichiers."
3700
+ },
3701
+ "files": {
3702
+ "type": "array",
3703
+ "description": "Liste des identifiants ou chemins de fichiers.",
3704
+ "items": {
3705
+ "type": "string"
3706
+ }
3707
+ }
3708
+ },
3709
+ "required": ["countFiles", "files"],
3710
+ "additionalProperties": false
3711
+ },
3712
+ "mentions": {
3713
+ "type": "object",
3714
+ "description": "Liste des mentions sous forme d'objet avec des clés dynamiques représentant l'indice de la mention.",
3715
+ "patternProperties": {
3716
+ "^[0-9]+$": {
3717
+ "type": "object",
3718
+ "properties": {
3719
+ "id": { "type": "string" },
3720
+ "name": { "type": "string" },
3721
+ "slug": { "type": "string" },
3722
+ "type": { "type": "string" },
3723
+ "value": { "type": "string" },
3724
+ "count": { "type": "number" }
3725
+ },
3726
+ "required": ["id", "name", "slug", "type", "value", "count"],
3727
+ "additionalProperties": false
3728
+ }
3729
+ },
3730
+ "additionalProperties": false
3731
+ }
3732
+ },
3733
+ "required": ["idNews","scope", "markdownActive", "parentId", "parentType", "type"],
3734
+ "anyOf": [
3735
+ { "required": ["text"] },
3736
+ { "required": ["mediaImg"] },
3737
+ { "required": ["mediaFile"] }
3738
+ ],
3739
+ "allOf": [
3740
+ {
3741
+ "if": {
3742
+ "properties": {
3743
+ "parentType": { "const": "citoyens" }
3744
+ }
3745
+ },
3746
+ "then": {
3747
+ "properties": {
3748
+ "parentId": {
3749
+ "type": "string",
3750
+ "default": "@userId"
3751
+ }
3752
+ }
3753
+ }
3754
+ }
3755
+ ],
3756
+ "additionalProperties": false
3757
+ },
3758
+ "responses": {
3759
+ "200": {
3760
+ "$defs": {
3761
+ "NewsSchema": {
3762
+ "type": "object",
3763
+ "properties": {
3764
+ "_id": {
3765
+ "type": "object",
3766
+ "properties": {
3767
+ "$id": { "type": "string" }
3768
+ },
3769
+ "required": ["$id"],
3770
+ "additionalProperties": false
3771
+ },
3772
+ "type": {
3773
+ "type": "string",
3774
+ "const": "news"
3775
+ },
3776
+ "text": {
3777
+ "type": "string"
3778
+ },
3779
+ "author": {
3780
+ "$ref": "#/$defs/user"
3781
+ },
3782
+ "date": {
3783
+ "$ref": "#/$defs/dateObject"
3784
+ },
3785
+ "collection": {
3786
+ "type": "string",
3787
+ "const": "news"
3788
+ },
3789
+ "sharedBy": {
3790
+ "type": "array",
3791
+ "items": { "$ref": "#/$defs/sharedUser" }
3792
+ },
3793
+ "target": {
3794
+ "$ref": "#/$defs/user"
3795
+ },
3796
+ "created": {
3797
+ "$ref": "#/$defs/dateObject"
3798
+ },
3799
+ "markdownActive": {
3800
+ "type": "boolean"
3801
+ },
3802
+ "scope": {
3803
+ "type": "object",
3804
+ "properties": {
3805
+ "type": { "type": "string" }
3806
+ },
3807
+ "required": ["type"],
3808
+ "additionalProperties": true
3809
+ },
3810
+ "updated": {
3811
+ "$ref": "#/$defs/dateObject"
3812
+ },
3813
+ "comment": {
3814
+ "type": ["string", "null"]
3815
+ },
3816
+ "typeSig": {
3817
+ "type": "string",
3818
+ "const": "news"
3819
+ },
3820
+ "lastAuthorShare": {
3821
+ "$ref": "#/$defs/sharedUser"
3822
+ },
3823
+ "media": {
3824
+ "type": "object",
3825
+ "description": "Optionnel. Contient les informations de média associées à la news.",
3826
+ "additionalProperties": true
3827
+ },
3828
+ "mediaImg": {
3829
+ "type": "object",
3830
+ "description": "Optionnel. Contient les images associées à la news.",
3831
+ "additionalProperties": true
3832
+ },
3833
+ "mentions": {
3834
+ "type": "array",
3835
+ "description": "Optionnel. Liste des personnes mentionnées.",
3836
+ "items": {
3837
+ "type": "object",
3838
+ "properties": {
3839
+ "id": { "type": "string" },
3840
+ "name": { "type": "string" },
3841
+ "slug": { "type": "string" },
3842
+ "avatar": { "type": "string" },
3843
+ "type": { "type": "string" },
3844
+ "value": { "type": "string" },
3845
+ "count": { "type": "string" }
3846
+ },
3847
+ "required": ["id", "name", "slug", "avatar", "type", "value", "count"],
3848
+ "additionalProperties": true
3849
+ }
3850
+ },
3851
+ "tags": {
3852
+ "type": "array",
3853
+ "description": "Optionnel. Liste de tags associés à la news.",
3854
+ "items": { "type": "string" }
3855
+ },
3856
+ "vote": {
3857
+ "type": "object",
3858
+ "description": "Optionnel. Votes associés à la news.",
3859
+ "additionalProperties": {
3860
+ "type": "object",
3861
+ "properties": {
3862
+ "status": { "type": "string" },
3863
+ "date": { "$ref": "#/$defs/dateObject" }
3864
+ },
3865
+ "required": ["status", "date"],
3866
+ "additionalProperties": false
3867
+ }
3868
+ },
3869
+ "voteCount": {
3870
+ "type": "object",
3871
+ "description": "Optionnel. Compteurs de votes.",
3872
+ "additionalProperties": { "type": "number" }
3873
+ }
3874
+ },
3875
+ "required": [
3876
+ "_id",
3877
+ "type",
3878
+ "text",
3879
+ "author",
3880
+ "date",
3881
+ "collection",
3882
+ "sharedBy",
3883
+ "target",
3884
+ "created",
3885
+ "markdownActive",
3886
+ "scope",
3887
+ "updated",
3888
+ "comment",
3889
+ "typeSig",
3890
+ "lastAuthorShare"
3891
+ ],
3892
+ "additionalProperties": true
3893
+ },
3894
+ "dateObject": {
3895
+ "type": "object",
3896
+ "properties": {
3897
+ "sec": { "type": "number" },
3898
+ "usec": { "type": "number" }
3899
+ },
3900
+ "required": ["sec", "usec"],
3901
+ "additionalProperties": false
3902
+ },
3903
+ "user": {
3904
+ "type": "object",
3905
+ "properties": {
3906
+ "id": { "type": "string" },
3907
+ "name": { "type": "string" },
3908
+ "type": { "type": "string" },
3909
+ "profilThumbImageUrl": { "type": "string", "format": "uri-reference" },
3910
+ "geo": {
3911
+ "type": "object",
3912
+ "properties": {
3913
+ "@type": { "type": "string", "const": "GeoCoordinates" },
3914
+ "latitude": { "type": "string" },
3915
+ "longitude": { "type": "string" }
3916
+ },
3917
+ "required": ["@type", "latitude", "longitude"],
3918
+ "additionalProperties": false
3919
+ }
3920
+ },
3921
+ "required": ["id", "name"],
3922
+ "additionalProperties": true
3923
+ },
3924
+ "sharedUser": {
3925
+ "allOf": [
3926
+ { "$ref": "#/$defs/user" },
3927
+ {
3928
+ "type": "object",
3929
+ "properties": {
3930
+ "updated": { "$ref": "#/$defs/dateObject" },
3931
+ "comment": { "type": ["string", "null"] }
3932
+ },
3933
+ "required": ["updated", "comment"]
3934
+ }
3935
+ ]
3936
+ }
3937
+ },
3938
+ "oneOf":[
3939
+ {
3940
+ "type": "object",
3941
+ "properties": {
3942
+ "result": { "type": "boolean", "const": true },
3943
+ "msg": { "type": "string" },
3944
+ "object": {
3945
+ "$comment": "dans object.author il y a pas type il y a que typeSig",
3946
+ "$ref": "#/$defs/NewsSchema"
3947
+ }
3948
+ },
3949
+ "required": ["result", "msg", "object"],
3950
+ "additionalProperties": false
3951
+ },
3952
+ {
3953
+ "type": "object",
3954
+ "properties": {
3955
+ "result": { "type": "boolean", "const": false },
3956
+ "msg": { "type": "string" }
3957
+ },
3958
+ "required": ["result", "msg"],
3959
+ "additionalProperties": false
3960
+ }
3961
+ ]
3962
+ },
3963
+ "401": {
3964
+ "description": "Erreur d'authentification (token invalide ou expiré)",
3965
+ "type": "object",
3966
+ "properties": {
3967
+ "error": {
3968
+ "type": "string",
3969
+ "description": "Description de l'erreur"
3970
+ }
3971
+ },
3972
+ "required": ["error"],
3973
+ "additionalProperties": false
3974
+ }
3975
+ }
3976
+ },
3977
+ {
3978
+ "name": "Partager une actualité",
3979
+ "path": "/news/co/share",
3980
+ "constant": "SHARE_NEWS",
3981
+ "constantCocolight": "SHARE_NEWS",
3982
+ "method": "POST",
3983
+ "auth": "bearer",
3984
+ "description": "Partage une actualité avec une entité ou un utilisateur.",
3985
+ "contentType": "application/x-www-form-urlencoded",
3986
+ "request": {
3987
+ "type": "object",
3988
+ "properties": {
3989
+ "parentId": {
3990
+ "type": "string",
3991
+ "description": "ID de l'actualité à partager"
3992
+ },
3993
+ "parentType": {
3994
+ "type": "string",
3995
+ "const": "news",
3996
+ "default": "news",
3997
+ "description": "Type de l'objet, toujours 'news'."
3998
+ },
3999
+ "childId": {
4000
+ "type": "string",
4001
+ "description": "ID de l'entité partageante"
4002
+ },
4003
+ "childType": {
4004
+ "type": "string",
4005
+ "enum": ["citoyens", "projects", "organizations"],
4006
+ "default": "citoyens",
4007
+ "description": "Type de l'entité partageante"
4008
+ },
4009
+ "connectType": {
4010
+ "type": "string",
4011
+ "const": "share",
4012
+ "default": "share",
4013
+ "description": "Type de connexion, toujours 'share'."
4014
+ },
4015
+ "comment": {
4016
+ "type": "string",
4017
+ "description": "Commentaire de partage"
4018
+ }
4019
+ },
4020
+ "required": ["parentId", "parentType", "childId", "childType", "connectType" ],
4021
+ "additionalProperties": false
4022
+ }
4023
+ }
4024
+ ]
4025
+ }
4026
+ ;