openapi: 3.0.0
info:
title: 'MaCarte API'
description: "Documentation OpenAPI de l'API MaCarte"
version: 1.0.0
servers:
-
url: 'https://macarte.ign.fr/'
description: "Accède aux données de l'environnement Ma Carte"
paths:
/api/editorial/followers:
get:
tags:
- Editorial
operationId: getEditorialFollowers
responses:
'200':
description: 'Liste des followers par réseau social'
content:
application/json:
schema:
properties:
facebook: { type: string, example: 65K }
twitter: { type: string, example: 13K }
linkedin: { type: string, example: 24K }
instagram: { type: string, example: 11K }
type: object
'404':
$ref: '#/components/responses/NotFound'
/api/editorial/megamenu:
get:
tags:
- Editorial
operationId: getEditorialMegamenu
responses:
'200':
description: 'Contenu html du megamenu'
content:
application/json:
schema:
properties:
html: { type: string }
type: object
'404':
$ref: '#/components/responses/NotFound'
/api/editorial/categories:
get:
tags:
- Editorial
operationId: getEditorialCategories
responses:
'200':
description: "Liste des categories des articles de l'editorial"
content:
application/json:
schema:
type: array
items:
properties: { key: { description: 'clé de la catégorie', type: string }, value: { description: 'Nom de la catégorie', type: string } }
type: object
'/api/editorial/articles/{category}':
get:
tags:
- Editorial
operationId: getEditorialArticlesByCategory
parameters:
-
name: category
in: path
required: true
schema:
type: string
responses:
'200':
description: 'Liste des articles de la categorie'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Article'
'404':
$ref: '#/components/responses/NotFound'
/api/maps:
get:
tags:
- Map
operationId: getMaps
parameters:
-
name: context
in: query
description: "Contexte de la recherche. Doit être parmi :\n- 'atlas' : recherche publique parmi les cartes partagées\n- 'organization' : recherche des cartes publiques & atlas de l'organisation\n- 'profile' : recherche parmi les cartes de l'utilisateur (connexion requise)\n\nUne carte partagée a share='atlas', valid=true et active=true.\n\n**Ajouter le header 'Authorization: Bearer xxx' pour le cas 'profile'.** pour ne pas avoir les erreurs 401 et 403."
required: false
schema:
type: string
default: atlas
-
name: query
in: query
description: "Un ou plusieurs mots que doivent contenir le titre, la description ou le thème. S'il y a plusieurs mots, la recherche les interprète comme un ET."
required: false
schema:
type: string
-
name: theme
in: query
description: "Thème des cartes
\n - nom du thème
\n - 'undefined' pour avoir les cartes qui n'ont pas de thème
\n - null pour avoir toutes les cartes, indépendemment du thème\n "
required: false
schema:
type: string
-
name: type
in: query
description: "Type des cartes ('macarte', 'storymap')"
required: false
schema:
type: string
-
name: premium
in: query
description: "Premium des cartes ('default', 'edugeo')"
required: false
schema:
type: string
-
name: organization
in: query
description: "Identifiant public de l'organisation"
required: false
schema:
type: string
-
name: user
in: query
description: 'Nom public du créateur des cartes'
required: false
schema:
type: string
-
name: active
in: query
description: "Si context 'profile' : filtre les cartes actives (true) ou non-actives (false). Si context 'atlas', active=true."
required: false
schema:
type: boolean
-
name: valid
in: query
description: "Si context 'profile' : filtre les cartes valides (true) ou invalides (false). Si context 'atlas', valid=true."
required: false
schema:
type: boolean
-
name: share
in: query
description: "Si context 'profile' : filtre les cartes publiques ('atlas') ou privées ('private'). Si context 'atlas', share='atlas'."
required: false
schema:
type: string
-
name: sort
in: query
description: "Tri des cartes ('date', 'rank', 'views')"
required: false
schema:
type: string
default: date
-
name: limit
in: query
description: "Nombre maximum de cartes à retourner. Peut être 'all' dans le context 'profile'. Si limit > 100, limit sera considérée comme 100."
required: false
schema:
oneOf:
-
type: integer
-
type: string
default: 25
-
$ref: '#/components/parameters/offset'
responses:
'200':
description: 'Liste des cartes recherchées selon les critères définis dans la query'
content:
application/json:
schema:
$ref: '#/components/schemas/Map_research'
'206':
description: 'Contenu partiel de la liste des cartes recherchées selon les critères définis dans la query'
content:
application/json:
schema:
$ref: '#/components/schemas/Map_research'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
post:
tags:
- Map
operationId: postMap
requestBody:
required: true
content:
multipart/form-data:
schema:
required:
- carte
- file
properties:
carte:
$ref: '#/components/schemas/Map_add'
file:
description: 'Contenu de la carte au format .carte'
type: string
format: binary
type: object
responses:
'201':
description: 'Attributs de la carte créée'
content:
application/json:
schema:
$ref: '#/components/schemas/Map_view'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/NotConnected'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
/api/maps/users:
get:
tags:
- Map
description: 'Autocompletion des utilisateurs ayant des cartes publiques correspondant aux critères de recherche'
operationId: getMapsUsers
parameters:
-
name: theme
in: query
description: "Thème des cartes (nom du thème ou 'Non défini')"
required: false
schema:
type: string
-
name: public_name
in: query
description: 'string que le public_name des utilisateurs doit inclure'
required: false
schema:
type: string
-
name: query
in: query
description: "Un ou plusieurs mots que doivent contenir le titre, la description ou le thème. S'il y a plusieurs mots, la recherche les interprète comme un ET."
required: false
schema:
type: string
-
$ref: '#/components/parameters/limit'
responses:
'200':
description: 'Liste des noms publics des utilisateurs correspondant aux critères de recherche'
content:
application/json:
schema:
type: array
items:
type: string
'404':
$ref: '#/components/responses/NotFound'
'/api/maps/{view_id}':
get:
tags:
- Map
description: 'Récupérer les metadata de la carte par son identifiant de visualisation'
operationId: getMapByViewId
parameters:
-
$ref: '#/components/parameters/view_id'
responses:
'200':
description: "Attributs d'une carte pour visualisation"
content:
application/json:
schema:
$ref: '#/components/schemas/Map_view'
'404':
$ref: '#/components/responses/NotFound'
'451':
$ref: '#/components/responses/Invalid'
'/api/maps/{edit_id}/edit':
get:
tags:
- Map
description: "Récupérer les metadata de la carte par son identifiant d'édition"
operationId: getMapEditByEditId
parameters:
-
$ref: '#/components/parameters/edit_id'
responses:
'200':
description: "Attributs d'une carte pour edition"
content:
application/json:
schema:
$ref: '#/components/schemas/Map_view'
'404':
$ref: '#/components/responses/NotFound'
'451':
$ref: '#/components/responses/Invalid'
security:
-
bearer: []
'/api/maps/{view_id}/file':
get:
tags:
- Map
description: 'Récupérer les data de la carte par son identifiant de visualisation'
operationId: getMapFileByViewId
parameters:
-
$ref: '#/components/parameters/view_id'
responses:
'200':
description: "Contenu d'une carte"
content:
application/json:
schema: { }
'404':
$ref: '#/components/responses/NotFound'
'451':
$ref: '#/components/responses/Invalid'
'/api/maps/{edit_id}/edit/file':
get:
tags:
- Map
description: "Récupérer les data de la carte par son identifiant d'édition"
operationId: getMapFileByEditId
parameters:
-
$ref: '#/components/parameters/edit_id'
responses:
'200':
description: "Contenu d'une carte"
content:
application/json:
schema: { }
'404':
$ref: '#/components/responses/NotFound'
'451':
$ref: '#/components/responses/Invalid'
security:
-
bearer: []
'/api/maps/{edit_id}':
delete:
tags:
- Map
operationId: deleteMapByEditId
parameters:
-
$ref: '#/components/parameters/edit_id'
responses:
'204':
$ref: '#/components/responses/Deleted'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
patch:
tags:
- Map
operationId: patchMapByEditId
parameters:
-
$ref: '#/components/parameters/edit_id'
requestBody:
description: "Attributs de la carte, ne renseigner que les champs à modifier.\n__new_edit_id__ : boolean, si true → génère un nouvel identifiant de modification pour la carte."
required: true
content:
application/json:
schema:
type: object
allOf:
-
$ref: '#/components/schemas/Map_add'
-
properties: { new_edit_id: { description: "Demande à modifier l'id de modification", type: boolean } }
type: object
responses:
'200':
description: "Attributs d'une carte pour visualisation"
content:
application/json:
schema:
$ref: '#/components/schemas/Map_view'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
'/api/maps/{edit_id}/file':
post:
tags:
- Map
operationId: postMapFileByEditId
parameters:
-
$ref: '#/components/parameters/edit_id'
requestBody:
required: true
content:
multipart/form-data:
schema:
required:
- file
properties:
file:
description: 'Contenu de la carte au format .carte'
type: string
format: binary
type: object
responses:
'200':
description: "Contenu d'une carte"
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
/api/me:
get:
tags:
- User
operationId: getMe
responses:
'200':
description: "Attributs de l'utilisateur connecté"
content:
application/json:
schema:
$ref: '#/components/schemas/User_view'
'401':
$ref: '#/components/responses/NotConnected'
security:
-
bearer: []
delete:
tags:
- User
description: "Supprime en douceur (https://phpreaction.com/support/suppression-en-douceur-soft-delete/) le compte de l'utilisateur connecté"
operationId: deleteMe
responses:
'204':
description: "L'utilisateur a été supprimé"
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'451':
$ref: '#/components/responses/Invalid'
security:
-
bearer: []
patch:
tags:
- User
description: "Le paramètre **current_password** est nécessaire pour modifier les paramètres username, email et new_password\nusername, email et public_name sont uniques, la réponse 400 '... already used' peut être renvoyée"
operationId: patchMe
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/User_me_edit'
responses:
'200':
description: "Attributs de l'utilisateur"
content:
application/json:
schema:
$ref: '#/components/schemas/User_view'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/NotConnected'
security:
-
bearer: []
/api/medias:
get:
tags:
- Media
description: "Renvoie les medias de l'utilisateur connecté"
operationId: getUserMedias
parameters:
-
name: name
in: query
description: 'Name contient cette valeur'
required: false
schema:
type: string
-
name: id
in: query
description: 'Identifiant du média recherché'
required: false
schema:
type: integer
-
name: organization_id
in: query
description: "Identifiant public de l'organisation, renvoie la liste de ses médias"
required: false
schema:
type: integer
-
name: valid
in: query
description: "Si 'true', limite la recherche aux médias invalidés par les administrateurs"
required: false
schema:
type: boolean
-
name: sort
in: query
description: "tri des medias, parmi ['size', 'date']"
required: false
schema:
type: string
default: date
-
$ref: '#/components/parameters/offset'
-
$ref: '#/components/parameters/limit'
responses:
'200':
description: 'liste des medias'
content:
application/json:
schema:
$ref: '#/components/schemas/Media_list'
'206':
description: 'Contenu partiel des medias'
content:
application/json:
schema:
$ref: '#/components/schemas/Media_list'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
security:
-
bearer: []
post:
tags:
- Media
description: "Ajoute un media à l'utilisateur connecté ou à l'organisation d'identifiant organization_id si renseigné"
operationId: postMedia
requestBody:
required: true
content:
multipart/form-data:
schema:
required:
- file
properties:
file:
description: 'image à ajouter à la bibliothèque, le fichier doit faire moins de 2 Mo'
type: string
format: binary
folder:
description: "Dossier où ajouter l'image"
type: string
default: 'Non classé'
name:
description: 'Nom du fichier'
type: string
organization_id:
description: "Id de l'organization"
type: string
nullable: true
type: object
responses:
'201':
description: 'Attributs du media créé'
content:
application/json:
schema:
$ref: '#/components/schemas/Media'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'413':
$ref: '#/components/responses/TooLarge'
security:
-
bearer: []
/api/medias/folders:
get:
tags:
- Media
description: "Renvoie les dossiers d'images de l'utilisateur"
operationId: getUserMediaFolders
parameters:
-
name: organization_id
in: query
description: "Identifiant public de l'organisation. Si renseigné, renvoie les folders de l'organisation, pas de l'utilisateur connecté"
required: false
schema:
type: string
nullable: true
responses:
'200':
description: "liste des dossiers d'images"
content:
application/json:
schema:
type: array
items:
type: string
'401':
$ref: '#/components/responses/NotConnected'
security:
-
bearer: []
'/api/image/{filename}':
get:
tags:
- Media
description: "Renvoie l'image au format binaire, l'extension n'est pas prise en compte (ex : abc1234).\nPréfixer le filename par 'thumb_' pour recevoir la miniature (200px sur la plus grande dimension)."
operationId: getImageByFilename
parameters:
-
name: filename
in: path
description: 'Nom du fichier'
required: true
schema:
type: string
responses:
'200':
description: "Fichier binaire de l'image"
'404':
$ref: '#/components/responses/NotFound'
'451':
$ref: '#/components/responses/Invalid'
'/api/medias/{id}':
delete:
tags:
- Media
description: "Supprime un media de l'utilisateur connecté. Un média non valide ne peut pas être supprimé"
operationId: deleteMediaById
parameters:
-
$ref: '#/components/parameters/id'
responses:
'204':
$ref: '#/components/responses/Deleted'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'451':
$ref: '#/components/responses/Invalid'
security:
-
bearer: []
'/api/medias/{id}/{attribute}':
put:
tags:
- Media
description: "Affecte value à l'attribut du media d'identifiant id (attribute dans ['folder', 'name'])"
operationId: putMediaAttribute
parameters:
-
$ref: '#/components/parameters/id'
-
name: attribute
in: path
description: "Attribut à modifier : doit etre parmi ['folder', 'name']"
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
properties:
value:
description: "valeur à affecter à l'attribut [folder => peut être null]"
type: string
type: object
responses:
'200':
description: 'Attributs du media modifié'
content:
application/json:
schema:
properties:
id: { description: 'identifiant du média modifié', type: integer }
attribute: { description: 'attribut modifié', type: string }
value: { description: "nouvelle valeur affectée à l'attribut", type: string }
type: object
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
'/api/medias/{id}/file':
post:
tags:
- Media
description: "Modifie l'image associée au media"
operationId: postMediaFileById
parameters:
-
$ref: '#/components/parameters/id'
requestBody:
required: true
content:
multipart/form-data:
schema:
required:
- file
properties:
file:
description: 'image à associer à la bibliothèque, le fichier doit faire moins de 2 Mo'
type: string
format: binary
type: object
responses:
'200':
description: 'Attributs du media modifié'
content:
application/json:
schema:
properties:
id: { description: 'identifiant du média modifié', type: integer }
attribute: { description: 'attribut modifié', type: string }
view_url: { description: "url de l'image", type: string }
thumb_url: { description: 'url de la vignette', type: string }
type: object
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'413':
$ref: '#/components/responses/TooLarge'
security:
-
bearer: []
/api/notifications:
get:
tags:
- Notifications
operationId: getNotifications
responses:
'200':
description: 'Liste des notifications actives'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Notification'
/api/organizations/roles:
get:
tags:
- Organization
operationId: getOrganizationsRoles
responses:
'200':
description: 'Liste des rôles'
content:
application/json:
schema:
type: array
items:
properties: { key: { description: 'clé du rôle', type: string }, value: { description: 'Nom du rôle', type: string } }
type: object
/api/organizations/me:
get:
tags:
- Organization
operationId: getOrganizationsMe
responses:
'200':
description: "Liste des organisations dont l'utilisateur est membre"
content:
application/json:
schema:
type: array
items:
properties: { public_id: { description: "identifiant de l'organisation", type: string }, name: { description: "Nom de l'organisation", type: string }, profile_picture: { description: "Logo de l'organisation", type: string }, cover_picture: { description: 'Image de couverture', type: string }, user_role: { description: "Rôle de l'utilisateur dans l'organisation", type: string }, active: { description: "l'utilisateur est actif dans l'organisation", type: boolean } }
type: object
'401':
$ref: '#/components/responses/NotConnected'
security:
-
bearer: []
'/api/organizations/{id}/activate':
get:
tags:
- Organization
description: "Active l'utilisateur invité dans l'organisation"
operationId: getOrganizationsByIdActivate
parameters:
-
$ref: '#/components/parameters/id'
responses:
'200':
description: "Attributs de l'organisation"
content:
application/json:
schema:
$ref: '#/components/schemas/Organization'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/NotConnected'
security:
-
bearer: []
'/api/organizations/{id}':
get:
tags:
- Organization
description: "Récupérer les données de l'organisation. NB : si pas membre, seul un décompte des membres est fourni."
operationId: getOrganizationsById
parameters:
-
$ref: '#/components/parameters/id'
responses:
'200':
description: "Attributs de l'organisation, les membres ne sont renvoyés que si l'utilisateur connecté fait partie de l'organisation"
content:
application/json:
schema:
$ref: '#/components/schemas/Organization'
'404':
$ref: '#/components/responses/NotFound'
delete:
tags:
- Organization
description: "Supprime l'organisation d'identifiant id"
operationId: deleteOrganization
parameters:
-
$ref: '#/components/parameters/id'
responses:
'204':
$ref: '#/components/responses/Deleted'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
/api/organizations:
post:
tags:
- Organization
description: "Créer une organisation - L'utilisateur connecté devient un propriétaire"
operationId: postOrganization
requestBody:
required: true
content:
application/json:
schema:
required:
- name
properties:
name:
description: "Nom de l'organisation (obligatoire)"
type: string
presentation:
description: "Présentation de l'organisation"
type: string
nullable: true
profile_picture:
description: "Image / logo de l'organisation"
type: string
format: uri
nullable: true
cover_picture:
description: 'Image de couverture'
type: string
format: uri
nullable: true
type: object
responses:
'201':
description: "Attributs de l'organisation"
content:
application/json:
schema:
$ref: '#/components/schemas/Organization'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
security:
-
bearer: []
'/api/organizations/{id}/{attribute}':
put:
tags:
- Organization
description: "Affecte value à l'attribut de l'organisation d'identifiant public_id"
operationId: putOrganizationAttribute
parameters:
-
$ref: '#/components/parameters/id'
-
name: attribute
in: path
description: "Attribut à modifier : parmi ['name', 'presentation', 'profile_picture', 'cover_picture', 'mail_pattern']"
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
properties:
value:
description: "valeur à affecter à l'attribut [name => non null]"
type: string
type: object
responses:
'200':
description: "L'organisation a été modifiée"
content:
application/json:
schema:
properties:
id: { description: "identifiant de l'organisation modifiée", type: integer }
attribute: { description: 'attribut modifié', type: string }
value: { description: "nouvelle valeur affectée à l'attribut", type: string }
type: object
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
'/api/organizations/{id}/join-link/{role}':
put:
tags:
- Organization
description: "Modifie le lien d'accès à l'organisation"
operationId: putOrganizationJoinLinkRole
parameters:
-
$ref: '#/components/parameters/id'
-
name: role
in: path
description: "rôle que donne le lien, parmi ['member', 'editor']"
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
properties:
value:
description: 'true : crée le lien, false : supprime le lien'
type: boolean
type: object
responses:
'200':
description: "clé / nouvelle valeur de l'attribut modifié"
content:
application/json:
schema:
properties:
id: { description: "identifiant de l'organisation modifiée", type: integer }
attribute: { description: 'attribut modifié', type: string }
value: { description: "nouvelle valeur affectée à l'attribut", type: string }
type: object
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
'/api/organizations/join/{id}':
get:
tags:
- Organization
description: "L'utilisateur s'ajoute à l'organisation via le jeton id"
operationId: joinOrganizationById
parameters:
-
$ref: '#/components/parameters/id'
responses:
'200':
description: "Attributs de l'organisation"
content:
application/json:
schema:
$ref: '#/components/schemas/Organization'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
'/api/organizations/links/{id}':
get:
tags:
- Organization
description: "Récupère les liens d'invitation de l'organisation. Seuls les propriétaires peuvent accéder à cette ressource."
operationId: getOrganizationLinksById
parameters:
-
$ref: '#/components/parameters/id'
responses:
'200':
description: "Les liens d'invitation de l'organisation"
content:
application/json:
schema:
properties:
link_as_member: { description: "lien d'invitation en tant que membre, null si absent", type: string, nullable: true }
link_as_editor: { description: "lien d'invitation en tant qu'éditeur, null si absent", type: string, nullable: true }
mail_pattern: { description: "pattern mail de l'organisation, null si absent", type: string, nullable: true }
type: object
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
'/api/organizations/{id}/members/{userId}':
post:
tags:
- Organization
description: "Ajoute un membre à l'organisation"
operationId: addMemberToOrganization
parameters:
-
$ref: '#/components/parameters/id'
-
name: userId
in: path
description: "Identifiant (public_id) de l'utilisateur"
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
properties:
role:
description: "rôle de l'utilisateur, parmi ['member', 'editor', 'owner']"
type: string
type: object
responses:
'200':
description: "Description du rôle de l'utilisateur"
content:
application/json:
schema:
properties:
organization_id: { description: "Identifiant public de l'organisation", type: string }
user_id: { description: "Identifiant public de l'utilisateur", type: string }
user_public_name: { description: "Nom public de l'utilisateur", type: string }
user_role: { description: "Rôle de l'utilisateur dans l'organisation", type: string }
mail_sent: { description: "si false, l'opération a été effectuée, mais le mail d'information n'a pas été envoyé à l'utilisateur", type: boolean }
type: object
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
delete:
tags:
- Organization
description: "Enlève un membre de l'organisation. Un utilisateur peut se retirer lui-même, sinon un owner doit effectuer cette action."
operationId: deleteOrganizationMember
parameters:
-
$ref: '#/components/parameters/id'
-
name: userId
in: path
description: "Identifiant (public_id) de l'utilisateur"
required: true
schema:
type: string
responses:
'204':
$ref: '#/components/responses/Deleted'
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
'/api/organizations/{id}/members/{userId}/role':
put:
tags:
- Organization
description: "Modifie le rôle d'un membre dans l'organisation"
operationId: putOrganizationMemberRole
parameters:
-
$ref: '#/components/parameters/id'
-
name: userId
in: path
description: "Identifiant (public_id) de l'utilisateur"
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
properties:
value:
description: "nouveau rôle, parmi ['member', 'editor', 'owner']"
type: string
type: object
responses:
'200':
description: "Description du rôle de l'utilisateur"
content:
application/json:
schema:
properties:
organization_id: { description: "Identifiant public de l'organisation", type: string }
user_id: { description: "Identifiant public de l'utilisateur", type: string }
user_public_name: { description: "Nom public de l'utilisateur", type: string }
user_role: { description: "Rôle de l'utilisateur dans l'organisation", type: string }
mail_sent: { description: "si false, l'opération a été effectuée, mais le mail d'information n'a pas été envoyé à l'utilisateur", type: boolean }
type: object
'401':
$ref: '#/components/responses/NotConnected'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
security:
-
bearer: []
/api/token/refresh:
post:
tags:
- Login
operationId: refreshToken
parameters:
-
name: refresh_token
in: query
required: true
schema:
type: string
responses:
'200':
description: 'Jeton JWT et refresh'
content:
application/json:
schema:
$ref: '#/components/schemas/Login'
'401':
description: 'An authentication exception occurred'
content:
application/json:
schema:
properties:
code: { type: integer, example: 401 }
message: { type: string, example: 'An authentication exception occurred' }
type: object
/api/login:
post:
tags:
- Login
operationId: postLogin
parameters:
-
name: username
in: query
required: true
schema:
type: string
-
name: password
in: query
required: true
schema:
type: string
responses:
'200':
description: 'Jeton Jwt et rafraichissement'
content:
application/json:
schema:
$ref: '#/components/schemas/Login'
'401':
description: "Erreur dans le nom d'utilisateur ou le mot de passe"
content:
application/json:
schema:
properties:
code: { type: integer, example: 401 }
message: { type: string, example: 'Bad credentials' }
type: object
'429':
description: 'Trop de tentatives de connexion échouées'
content:
application/json:
schema:
properties:
code: { type: integer, example: 429 }
message: { type: string, example: '5 tentatives de connexion échouées, allez sur /debloquer-mon-compte' }
type: object
/api/logout:
post:
tags:
- Login
operationId: postLogout
responses:
'200':
description: logout
'401':
$ref: '#/components/responses/NotConnected'
security:
-
bearer: []
/api/themes:
get:
tags:
- Theme
operationId: getThemes
responses:
'200':
description: 'Liste des themes'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Theme'
'/api/users/public/{publicId}':
get:
tags:
- User
operationId: getUserByPublicid
parameters:
-
name: publicId
in: path
description: "Identifiant public (immuable) de l'utilisateur"
required: true
schema:
type: string
responses:
'200':
description: "Attributs publics de l'utilisateur"
content:
application/json:
schema:
$ref: '#/components/schemas/User_public'
'404':
$ref: '#/components/responses/NotFound'
/api/users:
get:
tags:
- User
description: "Recherche d'utilisateurs par autocompletion"
operationId: getUsers
parameters:
-
name: query
in: query
description: 'public_name contient query'
required: true
schema:
type: string
responses:
'200':
description: 'Liste des utilisateurs correspondants'
content:
application/json:
schema:
type: array
items:
properties: { public_name: { type: string, example: my_public_name }, public_id: { type: string, example: 1aBc }, profile_picture: { type: string, format: uri } }
type: object
'400':
$ref: '#/components/responses/BadRequest'
components:
schemas:
Article:
properties:
id:
description: "Identifiant de l'article"
type: integer
category:
description: "Catégorie de l'article"
type: string
position:
description: "Ordre d'affichage de l'article"
type: number
title:
description: "Titre de l'article"
type: string
content:
description: "Contenu de l'article"
type: string
tags:
description: "Tags de l'article"
type: array
items:
type: string
updated_at:
description: "Date de mise à jour de l'article"
type: string
format: date-time
updated_by:
description: "Nom public de l'utilisateur qui a modifié l'article"
type: string
img_url:
description: "Url de l'image d'illustration de l'article"
type: string
format: uri
link_text:
description: 'Article de la catégorie news : texte du lien'
type: string
link_url:
description: 'Article de la catégorie news : destination du lien'
type: string
format: uri
type: object
Bbox:
description: 'Emprise visible de la carte (haut, droite, bas, gauche)'
type: array
items:
type: number
maxItems: 4
minItems: 4
Map_add:
description: "Objet carte à envoyer lors d'ajout / modification d'une carte"
properties:
title:
description: 'Titre de la carte'
type: string
description:
description: 'Description de la carte'
type: string
nullable: true
theme_id:
description: 'identifiant du theme'
type: integer
type:
description: "Type de la carte ('macarte', 'mesadresses', statistic', storymap')"
type: string
premium:
description: "Premium de la carte ('default', 'edugeo')"
type: string
default: default
organization_id:
description: "Identifiant public de l'organisation."
type: string
nullable: true
default: 'null'
active:
description: 'Carte active (par ex : terminée ou non)'
type: boolean
share:
description: "Publication de la carte ('atlas', 'public', 'private').\nSi 'organization' est rempli, la valeur sera 'private' sauf si l'utilisateur connecté est owner"
type: string
default: private
bbox:
$ref: '#/components/schemas/Bbox'
img_url:
description: "Url de l'image illustrant la carte"
type: string
format: uri
nullable: true
creator_id:
description: 'Identifiant public du créateur (si la carte est dans une organisation)'
type: string
type: object
Map_list:
description: "Description d'une carte avec ses métadonnées"
properties:
title:
description: 'Titre de la carte'
type: string
title_url:
description: 'Titre de la carte, adapté pour etre utilisé dans les url'
type: string
description:
description: 'Description de la carte'
type: string
nullable: true
theme:
description: 'Thème lié à la carte'
type: string
nullable: true
theme_id:
description: 'Id du thème'
type: integer
nullable: true
organization_id:
description: "Identifiant de l'organisation"
type: string
organization_name:
description: "Nom de l'organisation"
type: string
type:
description: "Type de la carte ('macarte', 'mesadresses', statistic', storymap')"
type: string
premium:
description: "Premium de la carte ('default', 'edugeo')"
type: string
created_at:
description: 'Date de création de la carte'
type: string
format: date-time
updated_at:
description: 'Dernière date de mise à jour de la carte'
type: string
format: date-time
nb_view:
description: 'Nombre total de vues'
type: integer
img_url:
description: "URI de l'image"
type: string
format: uri
nullable: true
share:
description: "Publication de la carte ('atlas', 'public', 'private')"
type: string
bbox:
$ref: '#/components/schemas/Bbox'
view_id:
description: 'Id utilisé pour la visualisation'
type: string
view_url:
description: 'Lien vers la visualisation de la carte'
type: string
edit_id:
description: 'Si auteur de la carte'
type: string
author:
description: "Public_id de l'auteur de la carte"
type: string
type: object
Map_view:
description: "Description d'une carte avec ses métadonnées et les liens de modification / visualisation"
type: object
allOf:
-
$ref: '#/components/schemas/Map_list'
-
properties:
data_url:
description: 'lien vers le contenu de la carte'
type: string
format: uri
data_edit_url:
description: "lien vers l'édition du contenu de la carte, si auteur de la carte"
type: string
format: uri
editor:
description: 'utilisateur qui a modifié le contenu, renvoyé si auteur de la carte'
type: string
creator_id:
description: "identifiant de l'utilisateur qui a créé le contenu, renvoyé si auteur de la carte"
type: string
type: object
Media:
description: media
properties:
id:
description: 'identifiant du media'
type: integer
name:
description: "nom de l'image originale"
type: string
fileName:
description: 'nom du fichier enregistré'
type: string
owner:
description: "username de l'utilisateur qui a chargé le media"
type: string
organization_id:
description: "id de l'organisation à qui appartient le media"
type: string
organization:
description: "nom de l'organisation à qui appartient le media"
type: string
uploaded_at:
description: "date du chargement de l'image"
type: string
format: date-time
size:
description: "Taille de l'image (en octet)"
type: integer
folder:
description: 'Nom du fichier contenant le media'
type: string
valid:
description: "Validité de l'image"
type: boolean
view_url:
description: "Url de l'image"
type: string
format: uri
thumb_url:
description: "Url de la vignette de l'image"
type: string
format: uri
type: object
Media_list:
description: 'Liste de médias'
properties:
medias:
type: array
items:
$ref: '#/components/schemas/Media'
count:
description: 'Nombre de média correspondant à la recherche'
type: integer
limit:
description: 'Nombre de média recues dans la requete'
type: integer
offset:
description: 'Nombre de média à passer avant de ls inclure dans la requete'
type: integer
type: object
Notification:
description: Notifications
properties:
id:
type: integer
description:
type: string
scope:
description: 'Applicatifs où afficher la notification'
type: string
showFrom:
type: string
format: date-time
showUntil:
type: string
format: date-time
repeatibility:
description: 'Nombre de fois à afficher la notification'
type: integer
type: object
Organization:
properties:
public_id:
description: "Identifiant de l'organisation"
type: string
name:
description: "Nom de l'organisation"
type: string
presentation:
description: "Présentation / Description de l'organisation"
type: string
nullable: true
profile_picture:
description: "URL de l'image / logo de l'organisation"
type: string
format: uri
nullable: true
cover_picture:
description: "URL de l'image / logo de couverture de l'organisation"
type: string
format: uri
nullable: true
created_at:
description: "Date de création de l'organisation"
type: string
format: date-time
updated_at:
description: "Date de modification de l'organisation"
type: string
format: date-time
premium:
description: "Premium l'organisation parmi [null, 'edugeo']"
type: string
nullable: true
nb_members:
description: "Nombre de membres dans l'organisation"
type: integer
nb_shared_maps:
description: "Nombre de cartes de l'organisation partagées dans l'atlas"
type: integer
nb_views:
description: "Nombre de vues sur l'ensemble des cartes de l'organisation"
type: integer
locked:
description: "L'organisation est bloquée par un admin"
type: boolean
media_size_limit:
description: "Taille globale autorisée pour les images de l'organisation (en octets)"
type: integer
medias_size:
description: "Taille globale des images de l'organisation (en octets)"
type: integer
members:
description: "Membres de l'organisation"
type: array
items:
properties:
public_name:
description: "Nom public de l'utilisateur"
type: string
public_id:
description: "Identifiant public de l'utilisateur"
type: string
registered_at:
description: "Date où l'utilisateur a été ajouté"
type: string
format: date-time
role:
description: "Role de l'utilisateur dans l'organisation ('member'|'editor'|'owner')"
type: string
promoted_at:
description: "Date où l'utilisateur a été promu"
type: string
format: date-time
active:
description: "L'utilisateur est actif dans l'organisation"
type: boolean
profile_picture:
description: "Url de l'image de profil"
type: string
format: uri
type: object
type: object
Map_research:
description: 'Recherche des cartes'
properties:
maps:
type: array
items:
$ref: '#/components/schemas/Map_list'
themes:
type: array
items:
$ref: '#/components/schemas/Theme'
users:
type: array
items:
properties:
user:
description: "Nom public de l'utilisateur"
type: string
count:
description: 'Nombre de cartes'
type: integer
type: object
types:
type: array
items:
properties:
type:
description: 'Nom du type'
type: string
count:
description: 'Nombre de cartes'
type: integer
type: object
premiums:
type: array
items:
properties:
premium:
description: 'Nom du premium'
type: string
count:
description: 'Nombre de cartes'
type: integer
type: object
actives:
type: array
items:
properties:
active:
description: 'booléen indiquant active/inactive'
type: boolean
count:
description: 'Nombre de cartes'
type: integer
type: object
valides:
type: array
items:
properties:
valid:
description: 'booléen indiquant valide/invalide'
type: boolean
count:
description: 'Nombre de cartes'
type: integer
type: object
shares:
type: array
items:
properties:
share:
description: 'Publication de la carte'
type: string
count:
description: 'Nombre de cartes'
type: integer
type: object
query:
description: 'Mot(s) contenu(s) dans le titre, la description ou le theme des cartes'
type: string
count:
description: 'Nombre de cartes correspondant à la recherche'
type: integer
limit:
description: 'Nombre de cartes reçues dans la requete'
type: integer
offset:
description: 'Nombre de cartes à passer avant de les inclure dans la requete'
type: integer
type: object
Theme:
description: Theme
properties:
id:
description: 'Id du thème'
type: integer
name:
description: 'Nom complet du thème'
type: string
type: object
Login:
properties:
token:
description: 'Jeton JWT à envoyer dans le header Authorization: Bearer xxx'
type: string
refresh_token:
description: 'Jeton pour rafraichir le jeton JWT à envoyer /api/token/refresh'
type: string
type: object
User_public:
properties:
public_id:
description: "identifiant public de l'utilisateur, ne sera jamais modifié"
type: string
public_name:
description: 'Unique, ne doit pas être déjà utilisé (Erreur 400)'
type: string
twitter_account:
description: 'Nom de compte Twitter'
type: string
facebook_account:
description: 'Nom de compte Facebook'
type: string
linkedin_account:
description: 'Nom de compte LinkedIn'
type: string
presentation:
description: 'Présentation publique'
type: string
profile_picture:
description: "Url de l'image de profil"
type: string
format: uri
cover_picture:
description: "Url de l'image de couverture"
type: string
format: uri
type: object
User_edit:
type: object
allOf:
-
$ref: '#/components/schemas/User_public'
-
properties:
email:
description: 'Unique, ne doit pas être déjà utilisé (Erreur 400)'
type: string
format: email
username:
description: 'Unique, ne doit pas être déjà utilisé (Erreur 400)'
type: string
type: object
User_me_edit:
type: object
allOf:
-
$ref: '#/components/schemas/User_edit'
-
properties:
current_password:
type: string
new_password:
type: string
type: object
User_view:
type: object
allOf:
-
$ref: '#/components/schemas/User_edit'
-
properties:
locked:
description: 'Compte bloqué'
type: boolean
id:
type: integer
medias_limit_size:
description: 'Taille globale limite des images uploadées (en octet)'
type: integer
medias_size:
description: 'Taille globale des images uploadées (en octet)'
type: integer
roles:
description: "Rôle(s) de l'utilisateur"
type: array
items:
type: string
type: object
responses:
Already_reported:
description: 'La ressource est déjà existante'
content:
application/json:
schema:
properties:
code:
type: integer
example: 208
message:
type: string
example: 'La ressource est déjà existante'
type: object
Deleted:
description: 'La ressource a été supprimée'
content:
application/json:
schema:
properties:
code:
type: integer
example: 204
message:
type: string
example: 'La ressource a été supprimée'
type: object
BadRequest:
description: "La requête n'est pas correcte"
content:
application/json:
schema:
properties:
code:
type: integer
example: 400
message:
type: string
example: "La requête n'est pas correcte"
type: object
NotConnected:
description: 'Vous devez être connecté'
content:
application/json:
schema:
properties:
code:
type: integer
example: 401
message:
type: string
example: 'Vous devez être connecté'
type: object
NotFound:
description: "La ressource n'existe pas"
content:
application/json:
schema:
properties:
code:
type: integer
example: 404
message:
type: string
example: "La ressource n'existe pas"
type: object
Forbidden:
description: "Vous n'avez pas accès à cette ressource"
content:
application/json:
schema:
properties:
code:
type: integer
example: 403
message:
type: string
example: "Vous n'avez pas accès à cette ressource"
type: object
Invalid:
description: 'Vous ne pouvez pas accéder à la ressource pour des raisons légales'
content:
application/json:
schema:
properties:
code:
type: integer
example: 451
message:
type: string
example: 'Vous ne pouvez pas accéder à la ressource pour des raisons légales'
type: object
TooLarge:
description: "L'objet joint est trop volumineux"
content:
application/json:
schema:
properties:
code:
type: integer
example: 413
message:
type: string
example: "L'objet joint est trop volumineux"
type: object
parameters:
id:
name: id
in: path
description: 'Identifiant de la ressource'
required: true
schema:
oneOf:
-
type: integer
-
type: string
view_id:
name: view_id
in: path
description: 'Identifiant de visualisation de la carte'
required: true
schema:
oneOf:
-
type: integer
-
type: string
edit_id:
name: edit_id
in: path
description: "Identifiant d'édition de la carte"
required: true
schema:
oneOf:
-
type: integer
-
type: string
limit:
name: limit
in: query
description: "Nombre maximum d'objets à retourner"
required: false
schema:
type: integer
default: 15
offset:
name: offset
in: query
description: "Le nombre d'objets à ignorer avant de commencer à collecter l'ensemble de résultats"
required: false
schema:
type: integer
default: 0
securitySchemes:
bearer:
type: http
bearerFormat: JWT
scheme: bearer
tags:
-
name: Editorial
description: Editorial
-
name: Map
description: Map
-
name: User
description: User
-
name: Media
description: Media
-
name: Notifications
description: Notifications
-
name: Organization
description: Organization
-
name: Login
description: Login
-
name: Theme
description: Theme