Voorbeeld 3: Projectmanagementsysteem

In dit voorbeeld maken we een API voor een projectmanagementsysteem met de volgende collecties:

  • Projects: een collectie van projecten met eigenschappen zoals naam, beschrijving, datums en status
  • Tasks: een collectie van taken die aan projecten en medewerkers zijn gekoppeld
  • Employees: een collectie van medewerkers met hun rollen, afdelingen en uurtarieven
  • Clients: een collectie van klanten waarvoor projecten worden uitgevoerd
  • TimeEntries: een collectie van tijdsregistraties van medewerkers op taken

Volledige JSON-configuratie

{
  "collections": [
    {
      "name": "projects",
      "fields": [
        {
          "name": "id",
          "type": "number",
          "required": true
        },
        {
          "name": "name",
          "type": "string",
          "required": true,
          "min": 3,
          "max": 100
        },
        {
          "name": "description",
          "type": "string",
          "max": 1000
        },
        {
          "name": "startDate",
          "type": "date",
          "required": true
        },
        {
          "name": "deadline",
          "type": "date",
          "required": true
        },
        {
          "name": "status",
          "type": "string",
          "required": true,
          "Default": "planning"
        },
        {
          "name": "clientId",
          "type": "reference:clients",
          "required": true
        }
      ],
      "permissions": {
        "GET": ["employee", "manager", "admin"],
        "POST": ["manager", "admin"],
        "PUT": ["manager", "admin"],
        "DELETE": ["admin"]
      }
    },
    {
      "name": "tasks",
      "fields": [
        {
          "name": "id",
          "type": "number",
          "required": true
        },
        {
          "name": "projectId",
          "type": "reference:projects",
          "required": true
        },
        {
          "name": "title",
          "type": "string",
          "required": true,
          "min": 3,
          "max": 100
        },
        {
          "name": "description",
          "type": "string",
          "max": 1000
        },
        {
          "name": "assignedTo",
          "type": "reference:employees",
          "required": true
        },
        {
          "name": "status",
          "type": "string",
          "required": true,
          "Default": "to do"
        },
        {
          "name": "priority",
          "type": "string",
          "required": true,
          "Default": "medium"
        },
        {
          "name": "dueDate",
          "type": "date",
          "required": true
        },
        {
          "name": "estimatedHours",
          "type": "number",
          "required": true,
          "min": 0.5
        }
      ],
      "permissions": {
        "GET": ["employee", "manager", "admin"],
        "POST": ["manager", "admin"],
        "PUT": ["employee", "manager", "admin"],
        "DELETE": ["manager", "admin"]
      }
    },
    {
      "name": "employees",
      "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": "department",
          "type": "string",
          "required": true
        },
        {
          "name": "role",
          "type": "string",
          "required": true
        },
        {
          "name": "hourlyRate",
          "type": "number",
          "required": true,
          "min": 0
        }
      ],
      "permissions": {
        "GET": ["employee", "manager", "admin"],
        "POST": ["admin"],
        "PUT": ["admin"],
        "DELETE": ["admin"]
      }
    },
    {
      "name": "clients",
      "fields": [
        {
          "name": "id",
          "type": "number",
          "required": true
        },
        {
          "name": "name",
          "type": "string",
          "required": true,
          "min": 2,
          "max": 100
        },
        {
          "name": "contactPerson",
          "type": "string",
          "required": true,
          "min": 2,
          "max": 100
        },
        {
          "name": "email",
          "type": "string",
          "required": true,
          "min": 5,
          "max": 100
        },
        {
          "name": "phone",
          "type": "string",
          "max": 20
        },
        {
          "name": "address",
          "type": "string",
          "max": 200
        }
      ],
      "permissions": {
        "GET": ["employee", "manager", "admin"],
        "POST": ["admin", "manager"],
        "PUT": ["admin", "manager"],
        "DELETE": ["admin"]
      }
    },
    {
      "name": "timeEntries",
      "fields": [
        {
          "name": "id",
          "type": "number",
          "required": true
        },
        {
          "name": "employeeId",
          "type": "reference:employees",
          "required": true
        },
        {
          "name": "taskId",
          "type": "reference:tasks",
          "required": true
        },
        {
          "name": "date",
          "type": "date",
          "required": true,
          "Default": "CurrentDate"
        },
        {
          "name": "hours",
          "type": "number",
          "required": true,
          "min": 0.25,
          "max": 24
        },
        {
          "name": "description",
          "type": "string",
          "max": 500
        },
        {
          "name": "approved",
          "type": "boolean",
          "required": true,
          "Default": false
        }
      ],
      "permissions": {
        "GET": ["employee", "manager", "admin"],
        "POST": ["employee", "manager", "admin"],
        "PUT": ["manager", "admin"],
        "DELETE": ["manager", "admin"]
      }
    }
  ],
  "users": [
    {
      "email": "[email protected]",
      "password": "admin123",
      "roles": ["admin"]
    },
    {
      "email": "[email protected]",
      "password": "manager123",
      "roles": ["manager"]
    },
    {
      "email": "[email protected]",
      "password": "employee123",
      "roles": ["employee"]
    }
  ],
  "data": {
    "clients": [
      {
        "id": 1,
        "name": "ABC Bedrijf",
        "contactPerson": "John Doe",
        "email": "[email protected]",
        "phone": "0612345678",
        "address": "Hoofdstraat 1, Amsterdam"
      },
      {
        "id": 2,
        "name": "XYZ Organisatie",
        "contactPerson": "Jane Smith",
        "email": "[email protected]",
        "phone": "0687654321",
        "address": "Zakenstraat 10, Rotterdam"
      }
    ],
    "employees": [
      {
        "id": 1,
        "name": "Alex de Vries",
        "email": "[email protected]",
        "department": "Ontwikkeling",
        "role": "Ontwikkelaar",
        "hourlyRate": 65
      },
      {
        "id": 2,
        "name": "Robin Janssen",
        "email": "[email protected]",
        "department": "Design",
        "role": "UI/UX Designer",
        "hourlyRate": 60
      },
      {
        "id": 3,
        "name": "Sam Peters",
        "email": "[email protected]",
        "department": "Ontwikkeling",
        "role": "Backend Developer",
        "hourlyRate": 70
      }
    ],
    "projects": [
      {
        "id": 1,
        "name": "Website Redesign",
        "description": "Herontwerp van de bedrijfswebsite",
        "startDate": "2025-01-15",
        "deadline": "2025-03-31",
        "status": "in progress",
        "clientId": 1
      },
      {
        "id": 2,
        "name": "Mobile App Ontwikkeling",
        "description": "Ontwikkeling van een klanten-app",
        "startDate": "2025-02-01",
        "deadline": "2025-05-30",
        "status": "planning",
        "clientId": 2
      }
    ],
    "tasks": [
      {
        "id": 1,
        "projectId": 1,
        "title": "Wireframes maken",
        "description": "Wireframes maken voor alle pagina's",
        "assignedTo": 2,
        "status": "completed",
        "priority": "high",
        "dueDate": "2025-01-25",
        "estimatedHours": 16
      },
      {
        "id": 2,
        "projectId": 1,
        "title": "Frontend development",
        "description": "Implementeren van het design in HTML/CSS/JS",
        "assignedTo": 1,
        "status": "in progress",
        "priority": "high",
        "dueDate": "2025-02-28",
        "estimatedHours": 40
      },
      {
        "id": 3,
        "projectId": 1,
        "title": "Backend development",
        "description": "API en database ontwikkeling",
        "assignedTo": 3,
        "status": "in progress",
        "priority": "medium",
        "dueDate": "2025-03-15",
        "estimatedHours": 60
      }
    ],
    "timeEntries": [
      {
        "id": 1,
        "employeeId": 2,
        "taskId": 1,
        "date": "2025-01-20",
        "hours": 7.5,
        "description": "Wireframes voor homepagina en contactpagina",
        "approved": true
      },
      {
        "id": 2,
        "employeeId": 2,
        "taskId": 1,
        "date": "2025-01-21",
        "hours": 8,
        "description": "Wireframes voor overige pagina's",
        "approved": true
      },
      {
        "id": 3,
        "employeeId": 1,
        "taskId": 2,
        "date": "2025-02-01",
        "hours": 6,
        "description": "Setup project en implementatie header/footer",
        "approved": false
      }
    ]
  }
}

Belangrijkste kenmerken

  • Verschillende rollen: Admin, Manager en Employee met verschillende toegangsrechten
  • HiĆ«rarchie van toestemmingen: Admins kunnen alles, Managers kunnen veel, Employees hebben beperkte rechten
  • Projectgebaseerd systeem: Projecten bevatten taken die worden toegewezen aan medewerkers
  • Tijdsregistratie: Medewerkers kunnen tijd registreren op taken
  • Klantenbeheer: Projecten zijn gekoppeld aan klanten