Version : 1.0
Contact : david@soulayrol.name
Chemin : /ipnoos/v1
Licence : CC-BY-NC-SA-4.0
ipnoos est une Interface Publique de nooSFere. Il s'agit d'une interface d'inspiration REST.
Une large partie de l'interface expose le contenu de la base de données comme un ensemble de collections ; par exemple les auteurs, les livres, les éditeurs ou encore les adhérents ou les événements recensés sur le site. Ces collections sont toutes présentées présentées de manière homogène. Elles sont paginées, il est possible de les restreindre par différents critères de recherche ou d'en choisir l'ordre de tri. De même, consulter un élément en particulier, le modifier ou en ajouter un nouveau se fait d'une manière similaire d'une collection à l'autre, tant que les opérations ont un sens et sont permises pour l'utilisateur connecté. Au delà de cette base commune, l'interface fournit des fonctions supplémentaires et spécifiques pour, par exemple, extraire des statistiques ou réaliser de manière optimisée une opération particulière.
Les chemins, les paramètres d'URL, les noms et les clefs des entités sont écrits en anglais pour sa concision (en général) et parce que le jeu de caractères nécessaire tient dans l'encodage ASCII, lequel nécessite moins d'attention, dans l'usage des URL en particulier. Toute la documentation, ainsi que les données transitant par l'interface, sont en revanche en français et encodées en UTF-8.
ipnoos utilise autant que possible les entêtes HTTP standards selon l'usage qui est normalisé. Lorsque des informations supplémentaires sont utiles, des entêtes spécifiques sont utilisés en suivant pour cela les recommandations fournies sur cette page.
Parce que l'interface permet des traitements automatisés et l'exploration systématique de la base de données, son utilisation est soumise à une authentification, et donc réservée aux adhérents de l'association.
TODO
En accord avec l'architecture REST, les données présentées sous forme de
collections se manipulent à l'aide des méthodes (ou verbes) HTTP ; GET,
POST, PUT, etc. Chacun de ces verbes s'accompagne d'une sémantique
propre (par exemple, lire une donnée, ou modifier une donnée).
Quelle que soit la collection visitée, les opérations décrites ci-après sont
stables. La collection visitée est représentée par le terme générique
COLLECTION. Il est indiqué les exceptions ou les compléments qui peuvent
êtres rencontrés. La documentation complète de chacune de ces opérations se
trouve dans la section Méthodes.
Il est à noter que l'ajout ou la modification d'éléments nécessite le plus souvent des droits particuliers. Par ailleurs, la suppression d'un élément est une opération très rare, voire dangereuse sur certaines collections. Elle peut donc être soumise à des contrôles spécifiques, voire ne pas être implémentée du tout.
La consultation d'une collection entière est l'opération la plus complète en
terme d'options. Elle est réalisée avec la méthode GET sur le chemin
racine de la collection visitée.
Toutes les réponses sur une collection entière sont paginées. Les parcourir se fait donc en sélectionnant un numéro de page et une taille de page, puis en envoyant d'autres requêtes pour obtenir la page précédente ou la page suivante si nécessaire.
Dans les exemple ci-dessous, il est d'abord demandé la première page de la collection, avec sa taille par défaut, puis la page 42, puis la première page mais avec une taille de page différente. Enfin, le dernier exmple démontre la possibilité de combiner les deux paramètres.
GET /ipnoos/v1/COLLECTION
GET /ipnoos/v1/COLLECTION?page=42
GET /ipnoos/v1/COLLECTION?size=50
GET /ipnoos/v1/COLLECTION?page=2&size=25
Il est également possible d'utiliser des filtres et choisir l'ordre de tri.
GET /ipnoos/v1/COLLECTION[?[filter[&filter]][sort]]
Tous les éléments de collection possèdent un identifiant unique sur la collection. Il est donc possible de demander un élément en spécifiant cet identifiant.
GET /ipnoos/v1/COLLECTION/by-id/ID
Selon la collection, un élément peut posséder un autre identifiant ou groupe de propriétés, unique. L'interface peut alors proposer le moyen d'obtenir un élément selon ces critères. Par exemple, l'adresse de courriel est unique pour chaque adhérent. Aussi, la collection des membres de l'association permet-elle d'obtenir la fiche d'un adhérent par son adresse.
GET /ipnoos/v1/members/by-email/EMAIL
La liste des membres procure d'ailleurs aussi un raccourci pour accéder à la fiche de l'adhérent connecté.
GET /ipnoos/v1/members/self
Pour créer un élément, il faut employer la méthode POST sur cette
collection. La création se fait en employant le même format que l'objet JSON
obtenu à la consultation. La création nécessite seulement un sous-ensemble
de l'ensemble des propriétés disponibles pour l'éléments. L'identifiant
unique en particulier n'est jamais requis ; il est choisi par le serveur.
POST /ipnoos/v1/COLLECTION
PUT /ipnoos/v1/COLLECTION/by-id/ID
DELETE /ipnoos/v1/COLLECTION/by-id/ID
Le format utilisé pour les échanges est JSON.
La valeur de cet entête est une succession de quatre champs qui renseignent sur le format et la taille de la collection visitée. Il est présent sur toutes les réponses paginées.
page-index : le numéro de page courant.page-size : la taille des pages.total-elements : le nombre total d'éléments dans la collections.total-pages : le nombre total de page.Exemple :
Ipnoos-Collection: page-index=1; page-size=10; total-pages=3; total-elements=23
Les URL permettant de naviguer rapidement à l'intérieur de la collection. Son contenu est une liste d'URLs tel que définit dans la RFC 8288.
Dans chaque réponse, l'entête comporte le lien qualifié canonical qui fournit l'URL de référence associée au contenu obtenu. Dans le cas d'une réponse paginée, l'entête comporte également les liens first et next qui représentent respectivement l'URL canonique de la page, le lien vers la première et la dernière page de la collection. Selon la page retournée dans la réponse et la taille de la collection, les liens prev et next peuvent aussi être présents pour naviguer vers la page précédente et la suivante.
/authors/by-id/{id}
→
AuthorDetails
id
(requis)
— défaut : null
/authors
→
array[
AuthorIdentity
]
page
(optionnel)
— défaut : 1
— format : int32
size
(optionnel)
— défaut : 10
— format : int32
filter
(optionnel)
— défaut : null
Les critères de filtre disponibles sont :
city : le nom de la ville de naissancecountry : le pays de naissancename : le nom de famillesort
(optionnel)
— défaut : null
/books/by-id/{id}
→
BookDetails
id
(requis)
— défaut : null
/books
→
array[
BookIdentity
]
page
(optionnel)
— défaut : 1
— format : int32
size
(optionnel)
— défaut : 10
— format : int32
filter
(optionnel)
— défaut : null
isbn et title.
sort
(optionnel)
— défaut : null
/events/by-id/{id}
→
EventDetails
id
(requis)
— défaut : null
/events
→
array[
EventDetails
]
page
(optionnel)
— défaut : 1
— format : int32
size
(optionnel)
— défaut : 10
— format : int32
filter
(optionnel)
— défaut : null
Les critères de filtre disponibles sont :
city : le nom de la ville où se tient l'événementsince : une date limite antérieure à l'événementtitle : le titre de l'événementuntil : une date limite postérieure à l'événementsort
(optionnel)
— défaut : null
Gestion des adhérents, de leur adhésion, de leur bibliothèque personnelle.
La sélection d'un adhérent peut se faire :
id:<identifiant> ;email:<adresse> ;self pour accéder aux informations de l'adhérent connecté./members
→
MemberDetails
MemberDetails
(requis)
/members/{selector}/subscriptions
→
SubscriptionDetails
selector
(requis)
— défaut : null
SubscriptionDetails
(requis)
/members/{selector}
selector
(requis)
— défaut : null
/members/{selector}/subscriptions/{id}
selector
(requis)
— défaut : null
id
(requis)
— défaut : null
/members/export
→
String
/members, celle-ci ne permet ni pagination ni
tri de la réponse.
/members/libraries
→
array[
MemberLibraryDetails
]
page
(optionnel)
— défaut : 1
— format : int32
size
(optionnel)
— défaut : 10
— format : int32
filter
(optionnel)
— défaut : null
Les critères de filtre disponibles sont :
name : le prénom ou le nom de famille de l'adhérent qui possède la bibliothèquesort
(optionnel)
— défaut : null
/members/libraries/{id}
→
MemberLibraryDetails
id
(requis)
— défaut : null
/members/{selector}
→
MemberDetails
selector
(requis)
— défaut : null
subscriptions
(optionnel)
— défaut : false
/members/{selector}/library
→
MemberLibraryDetails
selector
(requis)
— défaut : null
/members
→
array[
MemberIdentity
]
page
(optionnel)
— défaut : 1
— format : int32
size
(optionnel)
— défaut : 10
— format : int32
filter
(optionnel)
— défaut : null
Les critères de filtre disponibles sont :
name : le prénom ou le nom de famillesince : une date limite antérieure à la première cotisation de l'adhérentstatus : le statut de l'adhérent (actif ou inactif)until : une date limite postérieure à la dernière cotisation de l'adhérentyear : une année pour laquelle l'adhérent a cotisésort
(optionnel)
— défaut : null
/members/{selector}/subscriptions
→
array[
SubscriptionDetails
]
selector
(requis)
— défaut : null
/members/{selector}
→
MemberDetails
selector
(requis)
— défaut : null
MemberDetails
(requis)
/members/{selector}/subscriptions/{id}
→
SubscriptionDetails
selector
(requis)
— défaut : null
id
(requis)
— défaut : null
SubscriptionDetails
(requis)
/collections/by-id/{id}
→
CollectionDetails
id
(requis)
— défaut : null
/collections
→
array[
CollectionIdentity
]
page
(optionnel)
— défaut : 1
— format : int32
size
(optionnel)
— défaut : 10
— format : int32
filter
(optionnel)
— défaut : null
Les critères de filtre disponibles sont :
name : le nom de la collectionsince : une date limite antérieure à la création de la collectionuntil : une date limite postérieure à la fin de la collectionsort
(optionnel)
— défaut : null
/publishers/by-id/{id}
→
PublisherDetails
id
(requis)
— défaut : null
/publishers
→
array[
PublisherIdentity
]
page
(optionnel)
— défaut : 1
— format : int32
size
(optionnel)
— défaut : 10
— format : int32
filter
(optionnel)
— défaut : null
Les critères de filtre disponibles sont :
city : la ville d'établissement de l'éditeurcountry : le pays d'établissement de l'éditeurname : le nom de l'éditeursince : une date limite antérieure à la création de la maison d'éditionuntil : une date limite postérieure à la dissolution de la maison d'éditionsort
(optionnel)
— défaut : null
/session
→
SessionInfo
AuthInfo
(requis)
/session
→
SessionInfo
AuthInfo - Données d'authentificationAuthorDetails - Modèle d'un auteurAuthorIdentity - Résumé d'un auteurBookDetails - BookIdentity - CollectionDetails - CollectionIdentity - EventDetails - Modèle d'un événementMemberDetails - MemberIdentity - MemberLibraryDetails - Membership - PublisherDetails - PublisherIdentity - RequestError - SessionInfo - SessionInfo_server - SessionInfo_token - SessionInfo_user - SubscriptionDetails - Représentation d'une cotisationVariableDate - AuthInfo - Données d'authentification| Propriété | Type | Description |
|---|---|---|
| login |
String
|
L'identifiant de login de l'utilisateur, c'est à dire son adresse de courriel. |
| password |
String
|
Le mot de passe de connexion de l'utilisateur. |
AuthorDetails - Modèle d'un auteur| Propriété | Type | Description |
|---|---|---|
| id |
String
|
|
| name |
String
|
|
| city (optional) |
String
|
|
| country (optional) |
String
|
|
| lastName (optional) |
String
|
|
| firstName (optional) |
String
|
|
| fullName (optional) |
String
|
|
| email (optional) |
String
|
|
| comment (optional) |
String
|
|
| birthCity (optional) |
String
|
|
| birthArea (optional) |
String
|
|
| birthCountry (optional) |
String
|
|
| birthDate (optional) |
date
format: date
|
La date de naissance de l'auteur. |
| deathCity (optional) |
String
|
|
| deathArea (optional) |
String
|
|
| deathCountry (optional) |
String
|
|
| deathDate (optional) |
date
format: date
|
La date de décès de l'auteur. |
| noolink (optional) |
String
|
|
| sffOnly (optional) |
Boolean
|
|
| created (optional) |
Integer
|
|
| dissolved (optional) |
Integer
|
AuthorIdentity - Résumé d'un auteur| Propriété | Type | Description |
|---|---|---|
| id |
String
|
|
| name |
String
|
|
| city (optional) |
String
|
|
| country (optional) |
String
|
BookDetails - | Propriété | Type | Description |
|---|---|---|
| id |
String
|
|
| authors (optional) |
String
|
|
| isbn |
String
|
|
| title (optional) |
String
|
|
| comment (optional) |
String
|
|
| format (optional) |
String
|
|
| pages (optional) |
Integer
|
|
| collection (optional) |
CollectionIdentity
|
|
| publisher (optional) |
PublisherIdentity
|
|
| legalSubmission (optional) |
VariableDate
|
|
| publication (optional) |
VariableDate
|
|
| printing (optional) |
VariableDate
|
BookIdentity - | Propriété | Type | Description |
|---|---|---|
| id |
String
|
|
| authors (optional) |
String
|
|
| isbn |
String
|
|
| title (optional) |
String
|
|
| collection (optional) |
String
|
|
| publisher (optional) |
String
|
CollectionDetails - | Propriété | Type | Description |
|---|---|---|
| id |
String
|
|
| name |
String
|
|
| comment (optional) |
String
|
|
| ended (optional) |
Boolean
|
|
| publisher (optional) |
PublisherIdentity
|
|
| noolink (optional) |
String
|
|
| sffOnly (optional) |
Boolean
|
|
| creationYear (optional) |
Integer
|
|
| endYear (optional) |
Integer
|
|
| youth (optional) |
Boolean
|
CollectionIdentity - | Propriété | Type | Description |
|---|---|---|
| id |
String
|
|
| name |
String
|
EventDetails - Modèle d'un événement| Propriété | Type | Description |
|---|---|---|
| id (optional) |
String
|
L'identifiant unique de l'événement. |
| startDate (optional) |
date
format: date
|
La date de début de l'événement. |
| endDate (optional) |
date
format: date
|
La date de fin de l'événement. |
| editDate (optional) |
date
format: date
|
La date d'édition de l'événement dans la base de données. |
| title (optional) |
String
|
Le nom (titre) de l'événement. |
| subtitle (optional) |
String
|
Un sous-titre ou une description courte de l'événement. |
| description (optional) |
String
|
Une description longue de l'événement. |
| city (optional) |
String
|
La ville où se tient l'événement. |
| place (optional) |
String
|
Le nom du lieu, ou l'adresse, au sein de la ville. |
| source (optional) |
String
|
La référence de la source de l'information, ou evenements@noosfere.com pour un événement proposé via le site. |
| website (optional) |
String
|
Le lien vers le site Web de l'événement. |
| section (optional) |
String
|
Une chaîne de 1 à 5 caractères, où chaque lettre donne un aspect présent durant l'événement:
|
MemberDetails - | Propriété | Type | Description |
|---|---|---|
| id (optional) |
Long
format: int64
|
|
| firstname (optional) |
String
|
|
| lastname (optional) |
String
|
|
| surname (optional) |
String
|
|
| description (optional) |
String
|
|
| email (optional) |
String
|
|
| membership (optional) |
Membership
|
|
| role (optional) |
String
Enum:
|
|
| subscriptions (optional) |
array[SubscriptionDetails]
|
MemberIdentity - | Propriété | Type | Description |
|---|---|---|
| id (optional) |
Long
format: int64
|
|
| firstname (optional) |
String
|
|
| lastname (optional) |
String
|
|
| surname (optional) |
String
|
MemberLibraryDetails - | Propriété | Type | Description |
|---|---|---|
| id |
String
|
|
| firstname (optional) |
String
|
|
| lastname (optional) |
String
|
|
| managementMode (optional) |
String
Enum:
|
|
| lendingMode (optional) |
String
Enum:
|
Membership - | Propriété | Type | Description |
|---|---|---|
| status (optional) |
String
Enum:
|
|
| startDate (optional) |
date
format: date
|
|
| endDate (optional) |
date
format: date
|
|
| endMessage (optional) |
String
|
PublisherDetails - | Propriété | Type | Description |
|---|---|---|
| id |
String
|
|
| name |
String
|
|
| city (optional) |
String
|
|
| country (optional) |
String
|
|
| address (optional) |
String
|
|
| postCode (optional) |
String
|
|
| email (optional) |
String
|
|
| website (optional) |
String
|
|
| noolink (optional) |
String
|
|
| comment (optional) |
String
|
|
| sffOnly (optional) |
Boolean
|
|
| created (optional) |
Integer
|
|
| dissolved (optional) |
Integer
|
PublisherIdentity - | Propriété | Type | Description |
|---|---|---|
| id |
String
|
|
| name |
String
|
|
| city (optional) |
String
|
|
| country (optional) |
String
|
RequestError - | Propriété | Type | Description |
|---|---|---|
| reason (optional) |
String
|
SessionInfo - | Propriété | Type | Description |
|---|---|---|
| user |
SessionInfo_user
|
|
| server |
SessionInfo_server
|
|
| token |
SessionInfo_token
|
SessionInfo_server - | Propriété | Type | Description |
|---|---|---|
| dbMinusurl (optional) |
String
|
SessionInfo_token - | Propriété | Type | Description |
|---|---|---|
| expires |
Date
format: date-time
|
|
| issued |
Date
format: date-time
|
|
| value |
String
|
SessionInfo_user - | Propriété | Type | Description |
|---|---|---|
| authorities (optional) |
array[String]
|
|
| login |
String
|
|
| enabled (optional) |
Boolean
|
|
| expired (optional) |
Boolean
|
SubscriptionDetails - Représentation d'une cotisation| Propriété | Type | Description |
|---|---|---|
| id (optional) |
Long
format: int64
|
|
| amount (optional) |
Integer
|
Le montant de la cotisation. |
| currency (optional) |
String
Enum:
|
La monnaie qualifiant le montant de la cotisation. Seul l'EURO est supporté aujourd'hui. |
| date (optional) |
date
format: date
|
La date de paiement de la cotisation. |
| year (optional) |
Integer
|
L'année couverte par la cotisation. |
VariableDate - | Propriété | Type | Description |
|---|---|---|
| day (optional) |
Integer
|
|
| month (optional) |
Integer
|
|
| year (optional) |
Integer
|