{
  "endpoints": [
    {
      "path": "GET /",
      "description": "Returns all of the available API endpoints."
    },
    {
      "path": "POST /authenticate/",
      "description": "Authenticates the user and returns a JWT token.",
      "exampleResponse:": {
        "user": {
          "id": 1,
          "username": "MATTD",
          "token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9",
          "role": "USER"
        }
      }
    },
    {
      "path": "GET /score/",
      "description": "Returns all scores.",
      "exampleResponse": {
        "scores": [
          {
            "id": 1,
            "score": 100,
            "userId": 1,
            "username": "MATTD",
            "hits": 40,
            "notHits": 10,
            "misses": 4,
            "accuracy": 80.22
          },
          {
            "id": 2,
            "score": 50,
            "userId": 2,
            "username": "BILLY",
            "hits": 40,
            "notHits": 10,
            "misses": 4,
            "accuracy": 80.22
          }
        ]
      }
    },
    {
      "path": "GET /score/top-ten/",
      "description": "Returns the top ten scores in descending order.",
      "scores": [
        {
          "id": 1,
          "score": 200,
          "userId": 1,
          "username": "MATTD",
          "hits": 40,
          "notHits": 10,
          "misses": 4,
          "accuracy": 80.22
        },
        {
          "id": 2,
          "score": 150,
          "userId": 2,
          "username": "BILLY",
          "hits": 40,
          "notHits": 10,
          "misses": 4,
          "accuracy": 80.22
        }
      ]
    },
    {
      "path": "GET /score/{userId}/",
      "description": "Return all the user's scores.",
      "exampleResponse": {
        "scores": [
          {
            "id": 1,
            "score": 100,
            "userId": 1,
            "username": "MATTD",
            "hits": 40,
            "notHits": 10,
            "misses": 4,
            "accuracy": 80.22
          },
          {
            "id": 2,
            "score": 200,
            "userId": 1,
            "username": "MATTD",
            "hits": 40,
            "notHits": 10,
            "misses": 4,
            "accuracy": 80.22
          }
        ]
      }
    },
    {
      "path": "GET /score/avg/{userId}/",
      "description": "Return the user's average score.",
      "exampleResponse": {
        "score": {
          "userId": 1,
          "username": "MATTD",
          "totalHits": 200,
          "totalNotHits": 30,
          "totalMisses": 20,
          "avgScore": 100.34,
          "avgAccuracy": 80.23,
          "highScore": 500
        }
      }
    },
    {
      "path": "GET /score/last/{userId}/",
      "description": "Returns the user's last score.",
      "exampleResponse": {
        "score": {
          "id": 2,
          "score": 200,
          "userId": 1,
          "username": "MATTD",
          "hits": 40,
          "notHits": 10,
          "misses": 4,
          "accuracy": 80.22
        }
      }
    },
    {
      "path": "DELETE /score/",
      "authRequired": true,
      "requiredRole": "ADMIN",
      "description": "Deletes all scores."
    },
    {
      "path": "DELETE /score/{userId}/",
      "authRequired": true,
      "requiredRole": "ADMIN",
      "description": "Deletes all of the user's scores."
    },
    {
      "path": "POST /score/",
      "description": "Saves the user's score.",
      "authRequired": true,
      "requiredRole": "USER",
      "requestBody": {
        "userId": 2,
        "score": 40,
        "hits": 40,
        "notHits": 10,
        "misses": 4
      },
      "exampleResponse": {
        "score": {
          "id": 5,
          "score": 200,
          "userId": 1,
          "username": "MATTD",
          "hits": 40,
          "notHits": 10,
          "misses": 4
        }
      }
    },
    {
      "path": "GET /user/",
      "description": "Returns all users.",
      "authRequired": true,
      "requiredRole": "ADMIN",
      "exampleResponse": {
        "users": [
          {
            "id": 1,
            "username": "MATTD",
            "email": "matt@email.com",
            "banned": false,
            "verified": true,
            "role": "USER"
          },
          {
            "id": 3,
            "username": "ADMIN",
            "email": "admin@email.com",
            "banned": false,
            "verified": true,
            "role": "ADMIN"
          }
        ]
      }
    },
    {
      "path": "GET /${username}/",
      "description": "Returns the specified user.",
      "authRequired": true,
      "requiredRole": "USER",
      "exampleResponse": {
        "user": {
          "id": 1,
          "username": "MATTD",
          "email": "mattd@email.com",
          "banned": false,
          "verified": true,
          "role": "USER"
        }
      }
    },
    {
      "path": "POST /user/",
      "description": "Creates a new user.",
      "requestBody": {
        "username": "BILLY",
        "email": "billy@email.com",
        "password": "password"
      },
      "exampleResponse": {
        "user": {
          "id": 3,
          "username": "BILLY",
          "email": "billy@email.com",
          "banned": false,
          "verified": false,
          "role": "USER"
        }
      }
    },
    {
      "path": "PATCH /user/",
      "description": "Updates a user's email and username",
      "authRequired": true,
      "requiredRole": "USER",
      "requestBody": {
        "id": 1,
        "username": "NEWNAME",
        "email": "new@email.com"
      },
      "exampleResponse": {
        "user": {
          "id": 1,
          "username": "NEWNAME",
          "email": "new@email.com",
          "banned": false,
          "verified": true,
          "role": "USER"
        }
      }
    },
    {
      "path": "PATCH /user/password/",
      "description": "Updates a user's password.",
      "authRequired": true,
      "requiredRole": "USER",
      "requestBody": {
        "id": 1,
        "password": "newpassword"
      },
      "exampleResponse": {
        "user": {
          "id": 1,
          "username": "NEWNAME",
          "email": "new@email.com",
          "banned": false,
          "verified": true,
          "role": "USER"
        }
      }
    }
  ]
}