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,
          "default": true
        }
      ],
      "permissions": {
        "GET": [
          "anonymous",
          "member",
          "editor",
          "admin"
        ],
        "POST": [
          "admin",
          "editor"
        ],
        "PUT": [
          "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",
          "max": 2000
        }
      ],
      "permissions": {
        "GET": [
          "anonymous",
          "member",
          "editor",
          "admin"
        ],
        "POST": [
          "admin",
          "editor"
        ],
        "PUT": [
          "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",
          "max": 500
        }
      ],
      "permissions": {
        "GET": [
          "anonymous",
          "member",
          "editor",
          "admin"
        ],
        "POST": [
          "admin"
        ],
        "PUT": [
          "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,
          "default": true
        },
        {
          "name": "joinDate",
          "type": "date",
          "required": true,
          "default": "CurrentDate"
        }
      ],
      "permissions": {
        "GET": [
          "admin",
          "editor"
        ],
        "POST": [
          "admin"
        ],
        "PUT": [
          "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": true,
          "default": "CurrentDate"
        },
        {
          "name": "returnDate",
          "type": "date",
          "required": true
        },
        {
          "name": "returned",
          "type": "boolean",
          "required": true,
          "default": false
        }
      ],
      "permissions": {
        "GET": [
          "member",
          "editor",
          "admin"
        ],
        "POST": [
          "editor",
          "admin"
        ],
        "PUT": [
          "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": "Israelische 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