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" required: - title - theme_id - type - premium - active - bbox 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 organization_id: description: "Identifiant public de l'organisation." type: string 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: public bbox: $ref: "#/components/schemas/Bbox" img_url: description: "Url de l'image illustrant la carte. Peut être une chaîne vide." type: string 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" required: - title - title_url - description - theme - theme_id - organization - organization_id - organization_name - type - premium - active - valid - created_at - updated_at - nb_view - img_url - share - bbox - user - user_id - author - author_id - view_id - view_url 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: description: "Nom de l'organisation" type: string 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 active: description: "Carte active" type: boolean valid: description: "Carte valide" type: boolean 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. Peut être une chaîne vide." type: string 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 format: uri edit_id: description: "Id utilisé pour l'édition, renvoyé uniquement si l'utilisateur peut éditer la carte" type: string nullable: true user: description: "Nom public du dernier éditeur de la carte" type: string user_id: description: "Identifiant public du dernier éditeur de la carte" type: string author: description: "Nom public de l'auteur de la carte" type: string author_id: description: "Identifiant public 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" allOf: - $ref: "#/components/schemas/Map_list" - required: - data_url 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, renvoyé uniquement si l'utilisateur peut éditer la carte" type: string format: uri nullable: true editor: description: "utilisateur qui a modifié le contenu, renvoyé uniquement si l'utilisateur peut éditer la carte" type: string nullable: true 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 MapResearchItem: description: "Carte renvoyée dans les résultats de recherche. Cet objet est construit depuis une requête SQL, et non directement depuis le normalizer d'entité Map." required: - type - title - description - updated_at - nb_view - img_url - organization_id - organization_name - user - user_id - theme - theme_id - share - premium - valid - active - title_url - view_id - view_url - bbox properties: type: description: "Type de la carte ('macarte', 'storymap')" type: string title: description: "Titre de la carte" type: string description: description: "Description de la carte" type: string nullable: true 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: "URL de l'image illustrant la carte. Peut être une chaîne vide." type: string nullable: true organization_id: description: "Identifiant public de l'organisation" type: string nullable: true organization_name: description: "Nom de l'organisation" type: string nullable: true user: description: "Nom public de l'auteur de la carte" type: string user_id: description: "Identifiant public de l'auteur de la carte" type: string theme: description: "Thème lié à la carte" type: string nullable: true theme_id: description: "Id du thème" type: integer nullable: true share: description: "Publication de la carte ('atlas', 'public', 'private')" type: string premium: description: "Premium de la carte ('default', 'edugeo')" type: string nullable: true valid: description: "Carte valide" type: boolean active: description: "Carte active" type: boolean title_url: description: "Titre de la carte, adapté pour être utilisé dans les URLs" type: string view_id: description: "Id utilisé pour la visualisation" type: string view_url: description: "Lien vers la visualisation de la carte" type: string format: uri bbox: $ref: "#/components/schemas/Bbox" edit_id: description: "Id utilisé pour l'édition, renvoyé uniquement en contexte profile" type: string nullable: true edit_url: description: "Lien vers l'édition de la carte, renvoyé uniquement en contexte profile" type: string format: uri nullable: true type: object MapResearchTheme: description: "Agrégat du nombre de cartes par thème dans les résultats de recherche" required: - theme - count properties: theme: description: "Nom du thème, ou 'undefined' pour les cartes sans thème" type: string count: description: "Nombre de cartes" type: integer type: object MapResearchOrganization: description: "Agrégat du nombre de cartes par organisation dans les résultats de recherche" required: - organization - public_id - count properties: organization: description: "Nom de l'organisation, ou chaîne vide pour les cartes hors organisation" type: string public_id: description: "Identifiant public de l'organisation, ou chaîne vide pour les cartes hors organisation" type: string count: description: "Nombre de cartes" type: integer type: object Map_research: description: "Recherche des cartes" required: - maps - themes - organizations - users - types - premiums - actives - valides - shares - query - count - limit - offset properties: maps: type: array items: $ref: "#/components/schemas/MapResearchItem" themes: type: array items: $ref: "#/components/schemas/MapResearchTheme" organizations: type: array items: $ref: "#/components/schemas/MapResearchOrganization" users: type: array items: required: - user - count properties: user: description: "Nom public de l'utilisateur" type: string count: description: "Nombre de cartes" type: integer type: object types: type: array items: required: - type - count properties: type: description: "Nom du type" type: string count: description: "Nombre de cartes" type: integer type: object premiums: type: array items: required: - premium - count properties: premium: description: "Nom du premium" type: string count: description: "Nombre de cartes" type: integer type: object actives: type: array items: required: - active - count properties: active: description: "booléen indiquant active/inactive" type: boolean count: description: "Nombre de cartes" type: integer type: object valides: type: array items: required: - valid - count properties: valid: description: "booléen indiquant valide/invalide" type: boolean count: description: "Nombre de cartes" type: integer type: object shares: type: array items: required: - share - count 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 requête. Peut être null lorsque toutes les cartes sont demandées." type: integer nullable: true 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