aboutsummaryrefslogtreecommitdiffstats
path: root/backend/routes/forms/index.py
blob: bb2b2999c7ae0ceb7c91d3d031ea77cd11f610fc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
"""
Return a list of all forms to authenticated users.
"""
from pydantic import ValidationError
from starlette.authentication import requires
from starlette.requests import Request
from starlette.responses import JSONResponse

from backend.route import Route
from backend.models import Form


class FormsList(Route):
    """
    List all available forms for administrator viewing.
    """

    name = "forms_list_create"
    path = "/"

    @requires(["authenticated", "admin"])
    async def get(self, request: Request) -> JSONResponse:
        forms = []
        cursor = request.state.db.forms.find()

        for form in await cursor.to_list(None):
            forms.append(Form(**form))  # For converting _id to id

        # Covert them back to dictionaries
        forms = [form.dict() for form in forms]

        return JSONResponse(
            forms
        )

    @requires(["authenticated", "admin"])
    async def post(self, request: Request) -> JSONResponse:
        form_data = await request.json()
        try:
            form = Form(**form_data)
        except ValidationError as e:
            return JSONResponse(e.errors())

        if await request.state.db.forms.find_one({"_id": form.id}):
            return JSONResponse({
                "error": "id_taken"
            }, status_code=400)

        await request.state.db.forms.insert_one(form.dict(by_alias=True))
        return JSONResponse(form.dict())