Voorbeeld 2: Bibliotheeksysteem
In dit voorbeeld maken we een API voor een bibliotheeksysteem met de volgende collecties:
- Books: een collectie van boeken met eigenschappen zoals titel, auteur, genre, ISBN, en beschikbaarheid
- Authors: een collectie van auteurs met biografische informatie
- Genres: een collectie van boekengenres voor categorisatie
- Members: een collectie van bibliotheekleden met lidmaatschapsinformatie
- Loans: een collectie van boekuitleningen met informatie over de leentermijn en retourstatus
Volledige JSON-configuratie
{
"collections": [
{
"name": "books",
"fields": [
{
"name": "id",
"type": "number",
"required": true
},
{
"name": "title",
"type": "string",
"required": true,
"min": 1,
"max": 200
},
{
"name": "authorId",
"type": "reference:authors",
"required": true
},
{
"name": "genreId",
"type": "reference:genres",
"required": true
},
{
"name": "isbn",
"type": "string",
"required": true,
"min": 10,
"max": 13
},
{
"name": "price",
"type": "number",
"required": true,
"min": 0
},
{
"name": "available",
"type": "boolean",
"required": true
}
],
"permissions": {
"GET": ["anonymous", "member", "editor", "admin"],
"POST": ["admin", "editor"],
"PUT": ["admin", "editor"],
"PATCH": ["admin", "editor"],
"DELETE": ["admin"]
}
},
{
"name": "authors",
"fields": [
{
"name": "id",
"type": "number",
"required": true
},
{
"name": "name",
"type": "string",
"required": true,
"min": 2,
"max": 100
},
{
"name": "bio",
"type": "string",
"required": false,
"max": 2000
}
],
"permissions": {
"GET": ["anonymous", "member", "editor", "admin"],
"POST": ["admin", "editor"],
"PUT": ["admin", "editor"],
"PATCH": ["admin", "editor"],
"DELETE": ["admin"]
}
},
{
"name": "genres",
"fields": [
{
"name": "id",
"type": "number",
"required": true
},
{
"name": "name",
"type": "string",
"required": true,
"min": 2,
"max": 50
},
{
"name": "description",
"type": "string",
"required": false,
"max": 500
}
],
"permissions": {
"GET": ["anonymous", "member", "editor", "admin"],
"POST": ["admin"],
"PUT": ["admin"],
"PATCH": ["admin"],
"DELETE": ["admin"]
}
},
{
"name": "members",
"fields": [
{
"name": "id",
"type": "number",
"required": true
},
{
"name": "name",
"type": "string",
"required": true,
"min": 2,
"max": 100
},
{
"name": "email",
"type": "string",
"required": true,
"min": 5,
"max": 100
},
{
"name": "membershipActive",
"type": "boolean",
"required": true
},
{
"name": "joinDate",
"type": "date",
"required": false,
"default": "CurrentDate"
}
],
"permissions": {
"GET": ["admin", "editor"],
"POST": ["admin"],
"PUT": ["admin", "editor"],
"PATCH": ["admin", "editor"],
"DELETE": ["admin"]
}
},
{
"name": "loans",
"fields": [
{
"name": "id",
"type": "number",
"required": true
},
{
"name": "memberId",
"type": "reference:members",
"required": true
},
{
"name": "bookId",
"type": "reference:books",
"required": true
},
{
"name": "loanDate",
"type": "date",
"required": false,
"default": "CurrentDate"
},
{
"name": "returnDate",
"type": "date",
"required": true
},
{
"name": "returned",
"type": "boolean",
"required": true
}
],
"permissions": {
"GET": ["member", "editor", "admin"],
"POST": ["editor", "admin"],
"PUT": ["editor", "admin"],
"PATCH": ["editor", "admin"],
"DELETE": ["admin"]
}
}
],
"users": [
{
"email": "[email protected]",
"password": "admin123",
"roles": ["admin"]
},
{
"email": "[email protected]",
"password": "medewerker123",
"roles": ["editor"]
},
{
"email": "[email protected]",
"password": "lid123",
"roles": ["member"]
}
],
"data": {
"genres": [
{
"id": 1,
"name": "Science Fiction",
"description": "Toekomstgerichte fictie"
},
{
"id": 2,
"name": "Fantasy",
"description": "Fantasierijke verhalen"
},
{
"id": 3,
"name": "Non-Fictie",
"description": "Educatieve en informatieve boeken"
},
{
"id": 4,
"name": "Thriller",
"description": "Spannende verhalen"
}
],
"authors": [
{
"id": 1,
"name": "Isaac Asimov",
"bio": "Russisch-Amerikaans schrijver van SF"
},
{
"id": 2,
"name": "J.K. Rowling",
"bio": "Britse schrijfster, bekend van Harry Potter"
},
{
"id": 3,
"name": "Yuval Noah Harari",
"bio": "Israëlische historicus en auteur"
}
],
"books": [
{
"id": 1,
"title": "Foundation",
"authorId": 1,
"genreId": 1,
"isbn": "9781234567890",
"price": 19.99,
"available": true
},
{
"id": 2,
"title": "Harry Potter en de Steen der Wijzen",
"authorId": 2,
"genreId": 2,
"isbn": "9781234567891",
"price": 14.95,
"available": false
},
{
"id": 3,
"title": "Sapiens",
"authorId": 3,
"genreId": 3,
"isbn": "9781234567892",
"price": 24.50,
"available": true
}
],
"members": [
{
"id": 1,
"name": "Jan Jansen",
"email": "[email protected]",
"membershipActive": true,
"joinDate": "2024-01-15"
},
{
"id": 2,
"name": "Maria de Vries",
"email": "[email protected]",
"membershipActive": true,
"joinDate": "2024-02-20"
}
],
"loans": [
{
"id": 1,
"memberId": 1,
"bookId": 2,
"loanDate": "2024-03-01",
"returnDate": "2024-03-21",
"returned": false
}
]
}
}
Belangrijkste kenmerken
- Boeken, auteurs en genres zijn publiekelijk zichtbaar (anonymous toegang)
- Ledeninformatie is alleen zichtbaar voor bibliotheekmedewerkers en beheerders
- Uitleningen zijn zichtbaar voor de leden zelf, medewerkers en beheerders
- Medewerkers kunnen boeken, auteurs en uitleningen beheren
- Alleen beheerders mogen items verwijderen