{
  "openapi" : "3.1.2",
  "info" : {
    "contact" : {
      "email" : "david@soulayrol.name"
    },
    "description" : "**ipnoos** est une **I**nterface **P**ublique de **nooS**Fere. Il s'agit\nd'une interface d'inspiration\n[REST](https://fr.wikipedia.org/wiki/Representational_state_transfer).\n### Choix de conception\n\nUne large partie de l'interface expose le contenu de la base de données\ncomme un ensemble de collections ; par exemple les *auteurs*, les *livres*,\nles *éditeurs* ou encore les *adhérents* ou les *événements* recensés sur le\nsite. Ces collections sont toutes présentées présentées de manière homogène.\nElles sont paginées, il est possible de les restreindre par différents\ncritères de recherche ou d'en choisir l'ordre de tri. De même, consulter un\nélément en particulier, le modifier ou en ajouter un nouveau se fait d'une\nmanière similaire d'une collection à l'autre, tant que les opérations ont un\nsens et sont permises pour l'utilisateur connecté. Au delà de cette base\ncommune, l'interface fournit des fonctions supplémentaires et spécifiques\npour, par exemple, extraire des statistiques ou réaliser de manière\noptimisée une opération particulière.\n\nLes chemins, les paramètres d'URL, les noms et les clefs des entités sont\nécrits en anglais pour sa concision (en général) et parce que le jeu de\ncaractères nécessaire tient dans l'encodage ASCII, lequel nécessite moins\nd'attention, dans l'usage des URL en particulier. Toute la documentation,\nainsi que les données transitant par l'interface, sont en revanche en\nfrançais et encodées en UTF-8.\n\n**ipnoos** utilise autant que possible les entêtes HTTP standards selon\nl'usage qui est normalisé. Lorsque des informations supplémentaires sont\nutiles, des entêtes spécifiques sont utilisés en suivant pour cela les\nrecommandations fournies [sur cette\npage](https://paulserban.eu/blog/post/rest-headers-the-complete-guide-to-http-header-design-and-implementation/).\n\nParce que l'interface permet des traitements automatisés et l'exploration\nsystématique de la base de données, son utilisation est soumise à une\nauthentification, et donc réservée aux adhérents de l'association.\n\n### Authentification\n\n**TODO**\n\n### Utilisation des collections\n\nEn accord avec l'architecture REST, les données présentées sous forme de\ncollections se manipulent à l'aide des méthodes (ou verbes) HTTP ; `GET`,\n`POST`, `PUT`, etc. Chacun de ces verbes s'accompagne d'une sémantique\npropre (par exemple, *lire une donnée*, ou *modifier une donnée*).\n\nQuelle que soit la collection visitée, les opérations décrites ci-après sont\nstables. La collection visitée est représentée par le terme générique\n`COLLECTION`. Il est indiqué les exceptions ou les compléments qui peuvent\nêtres rencontrés. La documentation complète de chacune de ces opérations se\ntrouve dans la section [Méthodes](#__Methods).\n\nIl est à noter que l'ajout ou la modification d'éléments nécessite le plus\nsouvent des droits particuliers. Par ailleurs, la suppression d'un élément\nest une opération très rare, voire dangereuse sur certaines collections.\nElle peut donc être soumise à des contrôles spécifiques, voire ne pas être\nimplémentée du tout.\n\n#### Lister les éléments\n\nLa consultation d'une collection entière est l'opération la plus complète en\nterme d'options. Elle est réalisée avec la méthode `GET` sur le chemin\nracine de la collection visitée.\n\nToutes les réponses sur une collection entière sont paginées. Les parcourir\nse fait donc en sélectionnant un numéro de page et une taille de page, puis\nen envoyant d'autres requêtes pour obtenir la page précédente ou la page\nsuivante si nécessaire.\n\nDans les exemple ci-dessous, il est d'abord demandé la première page de la\ncollection, avec sa taille par défaut, puis la page 42, puis la première\npage mais avec une taille de page différente. Enfin, le dernier exmple\ndémontre la possibilité de combiner les deux paramètres.\n\n    GET /ipnoos/v1/COLLECTION\n    GET /ipnoos/v1/COLLECTION?page=42\n    GET /ipnoos/v1/COLLECTION?size=50\n    GET /ipnoos/v1/COLLECTION?page=2&size=25\n\nIl est également possible d'utiliser des filtres et choisir l'ordre de tri. \n\n    GET /ipnoos/v1/COLLECTION[?[filter[&filter]][sort]]\n\n#### Consulter un élément\n\nTous les éléments de collection possèdent un identifiant unique sur la\ncollection. Il est donc possible de demander un élément en spécifiant cet\nidentifiant.\n\n    GET /ipnoos/v1/COLLECTION/by-id/ID\n\nSelon la collection, un élément peut posséder un autre identifiant ou groupe\nde propriétés, unique. L'interface peut alors proposer le moyen d'obtenir un\nélément selon ces critères. Par exemple, l'adresse de courriel est unique\npour chaque adhérent. Aussi, la collection des membres de l'association\npermet-elle d'obtenir la fiche d'un adhérent par son adresse.\n\n    GET /ipnoos/v1/members/by-email/EMAIL\n\nLa liste des membres procure d'ailleurs aussi un raccourci pour accéder à la\nfiche de l'adhérent connecté.\n\n    GET /ipnoos/v1/members/self\n\n#### Ajouter un élément\n\nPour créer un élément, il faut employer la méthode `POST` sur cette\ncollection. La création se fait en employant le même format que l'objet JSON\nobtenu à la consultation. La création nécessite seulement un sous-ensemble\nde l'ensemble des propriétés disponibles pour l'éléments. L'identifiant\nunique en particulier n'est jamais requis ; il est choisi par le serveur.\n\n    POST /ipnoos/v1/COLLECTION\n\n#### Modifier un élément\n\n    PUT /ipnoos/v1/COLLECTION/by-id/ID\n\n#### Supprimer un élément\n\n    DELETE /ipnoos/v1/COLLECTION/by-id/ID\n\n### Modèle de données\n\nLe format utilisé pour les échanges est [JSON](https://json.org/json-fr.html).\n\n### Réponses\n\n#### <tt>Ipnoos-Collection</tt>\n\nLa valeur de cet entête est une succession de quatre champs qui renseignent\nsur le format et la taille de la collection visitée. Il est présent sur\ntoutes les réponses paginées.\n\n- `page-index` : le numéro de page courant.\n- `page-size` : la taille des pages.\n- `total-elements` : le nombre total d'éléments dans la collections.\n- `total-pages` : le nombre total de page.\n\nExemple :\n\n    Ipnoos-Collection: page-index=1; page-size=10; total-pages=3; total-elements=23\n\n#### <tt>Link</tt>\n\nLes URL permettant de naviguer rapidement à l'intérieur de la collection.\nSon contenu est une liste d'URLs tel que définit dans la <a\nhref=\"https://www.rfc-editor.org/rfc/rfc8288.txt\">RFC 8288</a>.\n\nDans chaque réponse, l'entête comporte le lien qualifié *canonical* qui\nfournit l'URL de référence associée au contenu obtenu. Dans le cas d'une\nréponse paginée, l'entête comporte également les liens *first* et *next* qui\nreprésentent respectivement l'URL canonique de la page, le lien vers la\npremière et la dernière page de la collection. Selon la page retournée dans\nla réponse et la taille de la collection, les liens *prev* et *next* peuvent\naussi être présents pour naviguer vers la page précédente et la suivante.\n",
    "license" : {
      "name" : "CC-BY-NC-SA-4.0",
      "url" : "https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.fr"
    },
    "title" : "ipnoos",
    "version" : "1.0"
  },
  "servers" : [ {
    "url" : "https://noosfere.org/ipnoos/v1"
  } ],
  "security" : [ {
    "bearerAuth" : [ ]
  } ],
  "tags" : [ {
    "description" : "Gestion des adhérents, de leur adhésion, de leur bibliothèque personnelle.\n\nLa sélection d'un adhérent peut se faire :\n  - par son identifiant avec un sélecteur de la forme `id:<identifiant>` ;\n  - par son adresse de courriel, qui doit être unique : `email:<adresse>` ;\n  - par le sélecteur `self` pour accéder aux informations de l'adhérent connecté.\n",
    "name" : "members"
  } ],
  "paths" : {
    "/authors" : {
      "get" : {
        "operationId" : "getAuthors",
        "parameters" : [ {
          "description" : "Le numéro de la page.",
          "explode" : true,
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "default" : 1,
            "format" : "int32",
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Le nombre d'éléments par page.",
          "explode" : true,
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "default" : 10,
            "format" : "int32",
            "maximum" : 50,
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Les critères de filtre disponibles sont :\n  - `city` : le nom de la ville de naissance\n  - `country` : le pays de naissance\n  - `name` : le nom de famille\n",
          "explode" : true,
          "in" : "query",
          "name" : "filter",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        }, {
          "explode" : true,
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "items" : {
                    "$ref" : "#/components/schemas/AuthorIdentity"
                  },
                  "maxItems" : 50,
                  "type" : "array"
                }
              }
            },
            "description" : "Une page de la liste des auteurs.",
            "headers" : {
              "Ipnoos-Collection" : {
                "description" : "Les méta-informations de la collection visitée.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              },
              "Link" : {
                "description" : "Les liens de pagination.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              }
            }
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Lister les auteurs",
        "tags" : [ "authors" ]
      }
    },
    "/authors/by-id/{id}" : {
      "get" : {
        "operationId" : "getAuthor",
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/AuthorDetails"
                }
              }
            },
            "description" : "La fiche d'un auteur."
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Obtenir la fiche d'un auteur",
        "tags" : [ "authors" ]
      },
      "parameters" : [ {
        "explode" : false,
        "in" : "path",
        "name" : "id",
        "required" : true,
        "schema" : {
          "type" : "string"
        },
        "style" : "simple"
      } ]
    },
    "/books" : {
      "get" : {
        "operationId" : "getBooks",
        "parameters" : [ {
          "description" : "Le numéro de la page.",
          "explode" : true,
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "default" : 1,
            "format" : "int32",
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Le nombre d'éléments par page.",
          "explode" : true,
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "default" : 10,
            "format" : "int32",
            "maximum" : 50,
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Les critères de filtre disponibles sont uniquement `isbn` et `title`.\n",
          "explode" : true,
          "in" : "query",
          "name" : "filter",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        }, {
          "explode" : true,
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "items" : {
                    "$ref" : "#/components/schemas/BookIdentity"
                  },
                  "maxItems" : 50,
                  "type" : "array"
                }
              }
            },
            "description" : "Une page de la liste des livres.",
            "headers" : {
              "Ipnoos-Collection" : {
                "description" : "Les méta-informations de la collection visitée.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              },
              "Link" : {
                "description" : "Les liens de pagination.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              }
            }
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Lister les livres",
        "tags" : [ "books" ]
      }
    },
    "/books/by-id/{id}" : {
      "get" : {
        "operationId" : "getBook",
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/BookDetails"
                }
              }
            },
            "description" : "La fiche d'un livre."
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Obtenir la fiche d'un livre",
        "tags" : [ "books" ]
      },
      "parameters" : [ {
        "explode" : false,
        "in" : "path",
        "name" : "id",
        "required" : true,
        "schema" : {
          "type" : "string"
        },
        "style" : "simple"
      } ]
    },
    "/collections" : {
      "get" : {
        "operationId" : "getCollections",
        "parameters" : [ {
          "description" : "Le numéro de la page.",
          "explode" : true,
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "default" : 1,
            "format" : "int32",
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Le nombre d'éléments par page.",
          "explode" : true,
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "default" : 10,
            "format" : "int32",
            "maximum" : 50,
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Les critères de filtre disponibles sont :\n  - `name` : le nom de la collection\n  - `since` : une date limite antérieure à la création de la collection\n  - `until` : une date limite postérieure à la fin de la collection\n",
          "explode" : true,
          "in" : "query",
          "name" : "filter",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        }, {
          "explode" : true,
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "items" : {
                    "$ref" : "#/components/schemas/CollectionIdentity"
                  },
                  "maxItems" : 50,
                  "type" : "array"
                }
              }
            },
            "description" : "Une page de la liste des collections.",
            "headers" : {
              "Ipnoos-Collection" : {
                "description" : "Les méta-informations de la collection visitée.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              },
              "Link" : {
                "description" : "Les liens de pagination.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              }
            }
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Lister les collections d'édition",
        "tags" : [ "publishers" ]
      }
    },
    "/collections/by-id/{id}" : {
      "get" : {
        "operationId" : "getCollection",
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/CollectionDetails"
                }
              }
            },
            "description" : "La fiche d'une collection."
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Obtenir la fiche d'une collection d'édition",
        "tags" : [ "publishers" ]
      },
      "parameters" : [ {
        "explode" : false,
        "in" : "path",
        "name" : "id",
        "required" : true,
        "schema" : {
          "type" : "string"
        },
        "style" : "simple"
      } ]
    },
    "/events" : {
      "get" : {
        "operationId" : "getEvents",
        "parameters" : [ {
          "description" : "Le numéro de la page.",
          "explode" : true,
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "default" : 1,
            "format" : "int32",
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Le nombre d'éléments par page.",
          "explode" : true,
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "default" : 10,
            "format" : "int32",
            "maximum" : 50,
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Les critères de filtre disponibles sont :\n  - `city` : le nom de la ville où se tient l'événement\n  - `since` : une date limite antérieure à l'événement\n  - `title` : le titre de l'événement\n  - `until` : une date limite postérieure à l'événement\n",
          "explode" : true,
          "in" : "query",
          "name" : "filter",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        }, {
          "explode" : true,
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "items" : {
                    "$ref" : "#/components/schemas/EventDetails"
                  },
                  "maxItems" : 50,
                  "type" : "array"
                }
              }
            },
            "description" : "Une page de la liste des événements.",
            "headers" : {
              "Ipnoos-Collection" : {
                "description" : "Les méta-informations de la collection visitée.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              },
              "Link" : {
                "description" : "Les liens de pagination.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              }
            }
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Lister les événements recensés",
        "tags" : [ "events" ]
      }
    },
    "/events/by-id/{id}" : {
      "get" : {
        "operationId" : "getEvent",
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/EventDetails"
                }
              }
            },
            "description" : "La description d'un événement"
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Obtenir les détails d'un événement",
        "tags" : [ "events" ]
      },
      "parameters" : [ {
        "explode" : false,
        "in" : "path",
        "name" : "id",
        "required" : true,
        "schema" : {
          "type" : "string"
        },
        "style" : "simple"
      } ]
    },
    "/members" : {
      "get" : {
        "operationId" : "getMembers",
        "parameters" : [ {
          "description" : "Le numéro de la page.",
          "explode" : true,
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "default" : 1,
            "format" : "int32",
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Le nombre d'éléments par page.",
          "explode" : true,
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "default" : 10,
            "format" : "int32",
            "maximum" : 50,
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Les critères de filtre disponibles sont :\n  - `name` : le prénom ou le nom de famille\n  - `since` : une date limite antérieure à la première cotisation de l'adhérent\n  - `status` : le statut de l'adhérent (actif ou inactif)\n  - `until` : une date limite postérieure à la dernière cotisation de l'adhérent\n  - `year` : une année pour laquelle l'adhérent a cotisé\n",
          "explode" : true,
          "in" : "query",
          "name" : "filter",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        }, {
          "explode" : true,
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "items" : {
                    "$ref" : "#/components/schemas/MemberIdentity"
                  },
                  "maxItems" : 50,
                  "type" : "array"
                }
              }
            },
            "description" : "Une page de la liste des adhérents",
            "headers" : {
              "Ipnoos-Collection" : {
                "description" : "Les méta-informations de la collection visitée.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              },
              "Link" : {
                "description" : "Les liens de pagination.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              }
            }
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Lister les adhérents de l'association",
        "tags" : [ "members" ]
      },
      "post" : {
        "operationId" : "addMember",
        "requestBody" : {
          "content" : {
            "application/json;schema=member-details" : {
              "schema" : {
                "$ref" : "#/components/schemas/MemberDetails"
              }
            }
          },
          "description" : "Les détails du nouvel adhérent.",
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json;schema=member-details" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MemberDetails"
                }
              }
            },
            "description" : "La fiche de l'adhérent"
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Créer un nouvel adhérent",
        "tags" : [ "members" ]
      }
    },
    "/members/export" : {
      "get" : {
        "description" : "Contrairement à la requête `/members`, celle-ci ne permet ni pagination ni\ntri de la réponse.\n",
        "operationId" : "exportMembers",
        "responses" : {
          "200" : {
            "content" : {
              "text/csv" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "description" : "L'export complet de la table des adhérents.\nLe résultat est un fichier CSV. Les champs sont, dans cet ordre :\n- le nom ;\n- le prénom ;\n- le surnom ;\n- l'adresse de courriel ;\n- un espace réservé pour l'adresse ;\n- un espace réservé pour la ville ;\n- un espace réservé pour le pays ;\n- la date d'adhésion ;\n- la date de radiation ;\n- le commentaire associé à la radiation.\nLes champs sont séparés par un point-virgule.\n"
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Exportation de la liste complète des adhérents",
        "tags" : [ "members" ]
      }
    },
    "/members/{selector}" : {
      "delete" : {
        "operationId" : "deleteMemberBySelector",
        "responses" : {
          "200" : {
            "description" : "Succès"
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Supprimer la fiche d'un adhérent",
        "tags" : [ "members" ]
      },
      "get" : {
        "operationId" : "getMemberBySelector",
        "parameters" : [ {
          "description" : "Demande la liste des cotisations du membre",
          "explode" : true,
          "in" : "query",
          "name" : "subscriptions",
          "required" : false,
          "schema" : {
            "default" : false,
            "type" : "boolean"
          },
          "style" : "form"
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json;schema=member-details" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MemberDetails"
                }
              }
            },
            "description" : "La fiche de l'adhérent"
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Obtenir la fiche d'un adhérent",
        "tags" : [ "members" ]
      },
      "parameters" : [ {
        "explode" : false,
        "in" : "path",
        "name" : "selector",
        "required" : true,
        "schema" : {
          "title" : "MemberSelector",
          "type" : "string"
        },
        "style" : "simple"
      } ],
      "put" : {
        "operationId" : "updateMemberBySelector",
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/MemberDetails"
              }
            }
          },
          "description" : "Les détails à jour de l'adhérent.",
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json;schema=member-details" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MemberDetails"
                }
              }
            },
            "description" : "La fiche de l'adhérent"
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Modifier la fiche d'un adhérent",
        "tags" : [ "members" ]
      }
    },
    "/members/{selector}/subscriptions" : {
      "get" : {
        "operationId" : "getSubscriptions",
        "responses" : {
          "200" : {
            "content" : {
              "application/json;schema=subscription-array" : {
                "schema" : {
                  "items" : {
                    "$ref" : "#/components/schemas/SubscriptionDetails"
                  },
                  "type" : "array"
                }
              }
            },
            "description" : "La liste des cotisations."
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Lister les cotisations d'un adhérent",
        "tags" : [ "members" ]
      },
      "parameters" : [ {
        "explode" : false,
        "in" : "path",
        "name" : "selector",
        "required" : true,
        "schema" : {
          "title" : "MemberSelector",
          "type" : "string"
        },
        "style" : "simple"
      } ],
      "post" : {
        "description" : "Le format pour créer une cotisation est le même que celui utilisé dans la\ncollection des cotisations. Cependant, seules les propriétés *amount*,\n*date* et *year* sont nécessaires. L'identifiant est généré par le serveur\net la seule monnaie supportée aujourd'hui est l'EURO.\n",
        "operationId" : "addSubscription",
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/SubscriptionDetails"
              }
            }
          },
          "description" : "Les détails de la nouvelle cotisation.",
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/SubscriptionDetails"
                }
              }
            },
            "description" : "La cotisation a correctement été enregistrée."
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Ajouter une cotisation pour un adhérent",
        "tags" : [ "members" ]
      }
    },
    "/members/{selector}/subscriptions/{id}" : {
      "delete" : {
        "operationId" : "deleteSubscription",
        "responses" : {
          "200" : {
            "description" : "La cotisation a correctement été supprimée."
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Supprimer une cotisation",
        "tags" : [ "members" ]
      },
      "parameters" : [ {
        "explode" : false,
        "in" : "path",
        "name" : "selector",
        "required" : true,
        "schema" : {
          "title" : "MemberSelector",
          "type" : "string"
        },
        "style" : "simple"
      }, {
        "explode" : false,
        "in" : "path",
        "name" : "id",
        "required" : true,
        "schema" : {
          "type" : "string"
        },
        "style" : "simple"
      } ],
      "put" : {
        "operationId" : "updateSubscription",
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/SubscriptionDetails"
              }
            }
          },
          "description" : "Les détails à jour de la cotisation.",
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/SubscriptionDetails"
                }
              }
            },
            "description" : "La cotisation modifiée avec succès."
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Modifier une cotisation",
        "tags" : [ "members" ]
      }
    },
    "/members/{selector}/library" : {
      "get" : {
        "operationId" : "getMemberLibrary",
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MemberLibraryDetails"
                }
              }
            },
            "description" : "La bibliothèque d'un adhérent"
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Obtenir la description de la bibliothèque de l'adhérent",
        "tags" : [ "members" ]
      },
      "parameters" : [ {
        "explode" : false,
        "in" : "path",
        "name" : "selector",
        "required" : true,
        "schema" : {
          "title" : "MemberSelector",
          "type" : "string"
        },
        "style" : "simple"
      } ]
    },
    "/members/libraries" : {
      "get" : {
        "operationId" : "getLibraries",
        "parameters" : [ {
          "description" : "Le numéro de la page.",
          "explode" : true,
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "default" : 1,
            "format" : "int32",
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Le nombre d'éléments par page.",
          "explode" : true,
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "default" : 10,
            "format" : "int32",
            "maximum" : 50,
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Les critères de filtre disponibles sont :\n  - `name` : le prénom ou le nom de famille de l'adhérent qui possède la bibliothèque\n",
          "explode" : true,
          "in" : "query",
          "name" : "filter",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        }, {
          "explode" : true,
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "items" : {
                    "$ref" : "#/components/schemas/MemberLibraryDetails"
                  },
                  "maxItems" : 50,
                  "type" : "array"
                }
              }
            },
            "description" : "Une page de la liste des bibliothèques partagées par les adhérents.",
            "headers" : {
              "Ipnoos-Collection" : {
                "description" : "Les méta-informations de la collection visitée.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              },
              "Link" : {
                "description" : "Les liens de pagination.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              }
            }
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Lister les bibliothèques des adhérents",
        "tags" : [ "members" ]
      }
    },
    "/members/libraries/{id}" : {
      "get" : {
        "operationId" : "getLibrary",
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/MemberLibraryDetails"
                }
              }
            },
            "description" : "La bibliothèque d'un adhérent"
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Obtenir la description de la bibliothèque d'un adhérent",
        "tags" : [ "members" ]
      },
      "parameters" : [ {
        "explode" : false,
        "in" : "path",
        "name" : "id",
        "required" : true,
        "schema" : {
          "type" : "string"
        },
        "style" : "simple"
      } ]
    },
    "/publishers" : {
      "get" : {
        "operationId" : "getPublishers",
        "parameters" : [ {
          "description" : "Le numéro de la page.",
          "explode" : true,
          "in" : "query",
          "name" : "page",
          "required" : false,
          "schema" : {
            "default" : 1,
            "format" : "int32",
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Le nombre d'éléments par page.",
          "explode" : true,
          "in" : "query",
          "name" : "size",
          "required" : false,
          "schema" : {
            "default" : 10,
            "format" : "int32",
            "maximum" : 50,
            "type" : "integer"
          },
          "style" : "form"
        }, {
          "description" : "Les critères de filtre disponibles sont :\n  - `city` : la ville d'établissement de l'éditeur\n  - `country` : le pays d'établissement de l'éditeur\n  - `name` : le nom de l'éditeur\n  - `since` : une date limite antérieure à la création de la maison d'édition\n  - `until` : une date limite postérieure à la dissolution de la maison d'édition\n",
          "explode" : true,
          "in" : "query",
          "name" : "filter",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        }, {
          "explode" : true,
          "in" : "query",
          "name" : "sort",
          "required" : false,
          "schema" : {
            "type" : "string"
          },
          "style" : "form"
        } ],
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "items" : {
                    "$ref" : "#/components/schemas/PublisherIdentity"
                  },
                  "maxItems" : 50,
                  "type" : "array"
                }
              }
            },
            "description" : "Une page de la liste des éditeurs.",
            "headers" : {
              "Ipnoos-Collection" : {
                "description" : "Les méta-informations de la collection visitée.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              },
              "Link" : {
                "description" : "Les liens de pagination.",
                "explode" : false,
                "schema" : {
                  "type" : "string"
                },
                "style" : "simple"
              }
            }
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Lister les éditeurs",
        "tags" : [ "publishers" ]
      }
    },
    "/publishers/by-id/{id}" : {
      "get" : {
        "operationId" : "getPublisher",
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/PublisherDetails"
                }
              }
            },
            "description" : "La fiche d'un éditeur."
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Obtenir la fiche d'un éditeur",
        "tags" : [ "publishers" ]
      },
      "parameters" : [ {
        "explode" : false,
        "in" : "path",
        "name" : "id",
        "required" : true,
        "schema" : {
          "type" : "string"
        },
        "style" : "simple"
      } ]
    },
    "/session" : {
      "get" : {
        "operationId" : "readSession",
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/SessionInfo"
                }
              }
            },
            "description" : "La réponse pour une authentification avec succès."
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Obtenir les informations relatives à la session",
        "tags" : [ "session" ]
      },
      "post" : {
        "operationId" : "createSession",
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/AuthInfo"
              }
            }
          },
          "description" : "Les références de l'utilisateur",
          "required" : true
        },
        "responses" : {
          "200" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/SessionInfo"
                }
              }
            },
            "description" : "La réponse pour une authentification avec succès."
          },
          "default" : {
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/RequestError"
                }
              }
            },
            "description" : "Erreur"
          }
        },
        "summary" : "Ouvrir une nouvelle session",
        "tags" : [ "session" ]
      }
    }
  },
  "components" : {
    "schemas" : {
      "VariableDate" : {
        "properties" : {
          "day" : {
            "type" : "integer"
          },
          "month" : {
            "type" : "integer"
          },
          "year" : {
            "type" : "integer"
          }
        },
        "title" : "VariableDate",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "PublisherIdentity" : {
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "name" : {
            "type" : "string"
          },
          "city" : {
            "type" : "string"
          },
          "country" : {
            "type" : "string"
          }
        },
        "required" : [ "id", "name" ],
        "title" : "PublisherIdentity",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "AuthInfo" : {
        "description" : "Données d'authentification",
        "properties" : {
          "login" : {
            "description" : "L'identifiant de *login* de l'utilisateur, c'est à dire son adresse de courriel.",
            "type" : "string"
          },
          "password" : {
            "description" : "Le mot de passe de connexion de l'utilisateur.",
            "type" : "string"
          }
        },
        "required" : [ "login", "password" ],
        "title" : "AuthInfo"
      },
      "MemberLibraryDetails" : {
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "firstname" : {
            "type" : "string"
          },
          "lastname" : {
            "type" : "string"
          },
          "managementMode" : {
            "enum" : [ "COLLECTOR", "USER" ],
            "title" : "MemberLibraryManagementMode",
            "type" : "string"
          },
          "lendingMode" : {
            "enum" : [ "NEVER", "EXCEPTIONALLY", true ],
            "title" : "MemberLibraryLendingMode",
            "type" : "string"
          }
        },
        "required" : [ "id" ],
        "title" : "MemberLibraryDetails",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "AuthorIdentity" : {
        "description" : "Résumé d'un auteur",
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "name" : {
            "type" : "string"
          },
          "city" : {
            "type" : "string"
          },
          "country" : {
            "type" : "string"
          }
        },
        "required" : [ "id", "name" ],
        "title" : "AuthorIdentity",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "SessionInfo" : {
        "properties" : {
          "user" : {
            "$ref" : "#/components/schemas/SessionInfo_user"
          },
          "server" : {
            "$ref" : "#/components/schemas/SessionInfo_server"
          },
          "token" : {
            "$ref" : "#/components/schemas/SessionInfo_token"
          }
        },
        "required" : [ "server", "token", "user" ],
        "title" : "SessionInfo",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY)"
      },
      "BookIdentity" : {
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "authors" : {
            "type" : "string"
          },
          "isbn" : {
            "type" : "string"
          },
          "title" : {
            "type" : "string"
          },
          "collection" : {
            "type" : "string"
          },
          "publisher" : {
            "type" : "string"
          }
        },
        "required" : [ "id", "isbn" ],
        "title" : "BookIdentity",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "SessionInfo_user" : {
        "properties" : {
          "authorities" : {
            "items" : {
              "type" : "string"
            },
            "type" : "array"
          },
          "login" : {
            "type" : "string"
          },
          "enabled" : {
            "type" : "boolean"
          },
          "expired" : {
            "type" : "boolean"
          }
        },
        "required" : [ "login" ]
      },
      "SessionInfo_token" : {
        "properties" : {
          "expires" : {
            "format" : "date-time",
            "type" : "string",
            "x-field-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = \"yyyy-MM-dd hh:mm:ss\")"
          },
          "issued" : {
            "format" : "date-time",
            "type" : "string",
            "x-field-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = \"yyyy-MM-dd hh:mm:ss\")"
          },
          "value" : {
            "type" : "string"
          }
        },
        "required" : [ "expires", "issued", "value" ]
      },
      "EventDetails" : {
        "description" : "Modèle d'un événement",
        "properties" : {
          "id" : {
            "description" : "L'identifiant unique de l'événement.",
            "type" : "string"
          },
          "startDate" : {
            "description" : "La date de début de l'événement.",
            "format" : "date",
            "type" : "string",
            "x-field-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = \"yyyy-MM-dd\")"
          },
          "endDate" : {
            "description" : "La date de fin de l'événement.",
            "format" : "date",
            "type" : "string",
            "x-field-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = \"yyyy-MM-dd\")"
          },
          "editDate" : {
            "description" : "La date d'édition de l'événement dans la base de données.",
            "format" : "date",
            "type" : "string",
            "x-field-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = \"yyyy-MM-dd\")"
          },
          "title" : {
            "description" : "Le nom (titre) de l'événement.",
            "type" : "string"
          },
          "subtitle" : {
            "description" : "Un sous-titre ou une description courte de l'événement.",
            "type" : "string"
          },
          "description" : {
            "description" : "Une description longue de l'événement.",
            "type" : "string"
          },
          "city" : {
            "description" : "La ville où se tient l'événement.",
            "type" : "string"
          },
          "place" : {
            "description" : "Le nom du lieu, ou l'adresse, au sein de la ville.",
            "type" : "string"
          },
          "source" : {
            "description" : "La référence de la source de l'information, ou `evenements@noosfere.com` pour un événement proposé via le site.",
            "type" : "string"
          },
          "website" : {
            "description" : "Le lien vers le site Web de l'événement.",
            "type" : "string"
          },
          "section" : {
            "description" : "Une chaîne de 1 à 5 caractères, où chaque lettre donne un aspect présent durant l'événement:\n  - **I**llustration\n  - **L**ittérature\n  - **C**inéma\n  - **B**D\n  - **A**utres\n",
            "type" : "string"
          }
        },
        "title" : "EventDetails",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "SubscriptionDetails" : {
        "description" : "Représentation d'une cotisation",
        "properties" : {
          "id" : {
            "format" : "int64",
            "type" : "integer"
          },
          "amount" : {
            "description" : "Le montant de la cotisation.",
            "type" : "integer"
          },
          "currency" : {
            "description" : "La monnaie qualifiant le montant de la cotisation. Seul l'EURO est supporté aujourd'hui.",
            "enum" : [ "EURO", "FRANC" ],
            "title" : "Currency",
            "type" : "string"
          },
          "date" : {
            "description" : "La date de paiement de la cotisation.",
            "format" : "date",
            "type" : "string",
            "x-field-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = \"yyyy-MM-dd\")"
          },
          "year" : {
            "description" : "L'année couverte par la cotisation.",
            "type" : "integer"
          }
        },
        "title" : "SubscriptionDetails"
      },
      "BookDetails" : {
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "authors" : {
            "type" : "string"
          },
          "isbn" : {
            "type" : "string"
          },
          "title" : {
            "type" : "string"
          },
          "comment" : {
            "type" : "string"
          },
          "format" : {
            "type" : "string"
          },
          "pages" : {
            "type" : "integer"
          },
          "collection" : {
            "$ref" : "#/components/schemas/CollectionIdentity"
          },
          "publisher" : {
            "$ref" : "#/components/schemas/PublisherIdentity"
          },
          "legalSubmission" : {
            "$ref" : "#/components/schemas/VariableDate"
          },
          "publication" : {
            "$ref" : "#/components/schemas/VariableDate"
          },
          "printing" : {
            "$ref" : "#/components/schemas/VariableDate"
          }
        },
        "required" : [ "id", "isbn" ],
        "title" : "BookDetails",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "RequestError" : {
        "properties" : {
          "reason" : {
            "type" : "string"
          }
        },
        "title" : "RequestError"
      },
      "MemberIdentity" : {
        "properties" : {
          "id" : {
            "format" : "int64",
            "type" : "integer"
          },
          "firstname" : {
            "type" : "string"
          },
          "lastname" : {
            "type" : "string"
          },
          "surname" : {
            "type" : "string"
          }
        },
        "title" : "MemberIdentity",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "CollectionIdentity" : {
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "name" : {
            "type" : "string"
          }
        },
        "required" : [ "id", "name" ],
        "title" : "CollectionIdentity",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "PublisherDetails" : {
        "allOf" : [ {
          "properties" : {
            "id" : {
              "type" : "string"
            },
            "name" : {
              "type" : "string"
            },
            "city" : {
              "type" : "string"
            },
            "country" : {
              "type" : "string"
            }
          },
          "required" : [ "id", "name" ],
          "title" : "PublisherIdentity",
          "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
        }, {
          "properties" : {
            "address" : {
              "type" : "string"
            },
            "postCode" : {
              "type" : "string"
            },
            "email" : {
              "type" : "string"
            },
            "website" : {
              "type" : "string"
            },
            "noolink" : {
              "type" : "string"
            },
            "comment" : {
              "type" : "string"
            },
            "sffOnly" : {
              "type" : "boolean"
            },
            "created" : {
              "type" : "integer"
            },
            "dissolved" : {
              "type" : "integer"
            }
          }
        } ],
        "title" : "PublisherDetails",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "AuthorDetails" : {
        "allOf" : [ {
          "description" : "Résumé d'un auteur",
          "properties" : {
            "id" : {
              "type" : "string"
            },
            "name" : {
              "type" : "string"
            },
            "city" : {
              "type" : "string"
            },
            "country" : {
              "type" : "string"
            }
          },
          "required" : [ "id", "name" ],
          "title" : "AuthorIdentity",
          "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
        }, {
          "properties" : {
            "lastName" : {
              "type" : "string"
            },
            "firstName" : {
              "type" : "string"
            },
            "fullName" : {
              "type" : "string"
            },
            "email" : {
              "type" : "string"
            },
            "comment" : {
              "type" : "string"
            },
            "birthCity" : {
              "type" : "string"
            },
            "birthArea" : {
              "type" : "string"
            },
            "birthCountry" : {
              "type" : "string"
            },
            "birthDate" : {
              "description" : "La date de naissance de l'auteur.",
              "format" : "date",
              "type" : "string",
              "x-field-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = \"yyyy-MM-dd\")"
            },
            "deathCity" : {
              "type" : "string"
            },
            "deathArea" : {
              "type" : "string"
            },
            "deathCountry" : {
              "type" : "string"
            },
            "deathDate" : {
              "description" : "La date de décès de l'auteur.",
              "format" : "date",
              "type" : "string",
              "x-field-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = \"yyyy-MM-dd\")"
            },
            "noolink" : {
              "type" : "string"
            },
            "sffOnly" : {
              "type" : "boolean"
            },
            "created" : {
              "type" : "integer"
            },
            "dissolved" : {
              "type" : "integer"
            }
          }
        } ],
        "description" : "Modèle d'un auteur",
        "title" : "AuthorDetails",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      },
      "Membership" : {
        "properties" : {
          "status" : {
            "enum" : [ "ACTIVE", "GUEST", "INACTIVE" ],
            "title" : "MemberStatus",
            "type" : "string"
          },
          "startDate" : {
            "format" : "date",
            "type" : "string",
            "x-field-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = \"yyyy-MM-dd\")"
          },
          "endDate" : {
            "format" : "date",
            "type" : "string",
            "x-field-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonFormat(shape = com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING, pattern = \"yyyy-MM-dd\")"
          },
          "endMessage" : {
            "type" : "string"
          }
        },
        "title" : "Membership",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY)"
      },
      "MemberDetails" : {
        "allOf" : [ {
          "properties" : {
            "id" : {
              "format" : "int64",
              "type" : "integer"
            },
            "firstname" : {
              "type" : "string"
            },
            "lastname" : {
              "type" : "string"
            },
            "surname" : {
              "type" : "string"
            }
          },
          "title" : "MemberIdentity",
          "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
        }, {
          "properties" : {
            "description" : {
              "type" : "string"
            },
            "email" : {
              "type" : "string"
            },
            "membership" : {
              "$ref" : "#/components/schemas/Membership"
            },
            "role" : {
              "enum" : [ "MEMBER", "WRITER", "EDITOR", "ADMIN" ],
              "title" : "MemberRole",
              "type" : "string"
            },
            "subscriptions" : {
              "items" : {
                "$ref" : "#/components/schemas/SubscriptionDetails"
              },
              "type" : "array"
            },
            "surname" : {
              "type" : "string"
            }
          }
        } ],
        "title" : "MemberDetails",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY)"
      },
      "SessionInfo_server" : {
        "properties" : {
          "db-url" : {
            "type" : "string"
          }
        }
      },
      "CollectionDetails" : {
        "allOf" : [ {
          "properties" : {
            "id" : {
              "type" : "string"
            },
            "name" : {
              "type" : "string"
            }
          },
          "required" : [ "id", "name" ],
          "title" : "CollectionIdentity",
          "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
        }, {
          "properties" : {
            "comment" : {
              "type" : "string"
            },
            "ended" : {
              "type" : "boolean"
            },
            "publisher" : {
              "$ref" : "#/components/schemas/PublisherIdentity"
            },
            "noolink" : {
              "type" : "string"
            },
            "sffOnly" : {
              "type" : "boolean"
            },
            "creationYear" : {
              "type" : "integer"
            },
            "endYear" : {
              "type" : "integer"
            },
            "youth" : {
              "type" : "boolean"
            }
          }
        } ],
        "title" : "CollectionDetails",
        "x-class-extra-annotation" : "@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)"
      }
    },
    "securitySchemes" : {
      "bearerAuth" : {
        "bearerFormat" : "JWT",
        "scheme" : "bearer",
        "type" : "http"
      }
    }
  }
}