aboutsummaryrefslogtreecommitdiffstats
path: root/backend/routes/admin.py
blob: 5254f8b74ff4b4f0c51c428f36d395c68eacfcdd (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
"""
Adds new admin user.
"""
from pydantic import BaseModel, Field
from spectree import Response
from starlette.authentication import requires
from starlette.requests import Request
from starlette.responses import JSONResponse

from backend.route import Route
from backend.validation import ErrorMessage, OkayResponse, api


class AdminModel(BaseModel):
    id: str = Field(alias="_id")


class AdminRoute(Route):
    """Adds new admin user."""

    name = "admin"
    path = "/admin"

    @requires(["authenticated", "admin"])
    @api.validate(
        json=AdminModel,
        resp=Response(HTTP_200=OkayResponse, HTTP_400=ErrorMessage),
        tags=["admin"]
    )
    async def post(self, request: Request) -> JSONResponse:
        """Grant a user administrator privileges."""
        data = await request.json()
        admin = AdminModel(**data)

        if await request.state.db.admins.find_one(
            {"_id": admin.id}
        ):
            return JSONResponse({"error": "already_exists"}, status_code=400)

        await request.state.db.admins.insert_one(admin.dict(by_alias=True))
        return JSONResponse({"status": "ok"})