diff options
| author | 2020-12-21 00:48:40 +0000 | |
|---|---|---|
| committer | 2020-12-21 00:48:40 +0000 | |
| commit | 1f5446fdca7b9802b017db553f5049ab2538c2e4 (patch) | |
| tree | 81a24fc5d98338b8407e5a3e86c85c583dae9715 /backend/routes | |
| parent | Merge pull request #41 from python-discord/ks123/dns-check-remove (diff) | |
| parent | Update status code of pydantic errors response (diff) | |
Merge pull request #40 from python-discord/ks123/form-patch
Add PATCH method to form endpoint
Diffstat (limited to 'backend/routes')
| -rw-r--r-- | backend/routes/forms/form.py | 39 | 
1 files changed, 37 insertions, 2 deletions
| diff --git a/backend/routes/forms/form.py b/backend/routes/forms/form.py index c953135..b87c7cf 100644 --- a/backend/routes/forms/form.py +++ b/backend/routes/forms/form.py @@ -1,6 +1,7 @@  """ -Returns or deletes a single form given an ID. +Returns, updates or deletes a single form given an ID.  """ +from pydantic import ValidationError  from spectree.response import Response  from starlette.authentication import requires  from starlette.requests import Request @@ -13,7 +14,7 @@ from backend.validation import OkayResponse, api, ErrorMessage  class SingleForm(Route):      """ -    Returns or deletes a single form given an ID. +    Returns, updates or deletes a single form given an ID.      Returns all fields for admins, otherwise only public fields.      """ @@ -41,6 +42,40 @@ class SingleForm(Route):      @requires(["authenticated", "admin"])      @api.validate( +        resp=Response( +            HTTP_200=OkayResponse, +            HTTP_400=ErrorMessage, +            HTTP_404=ErrorMessage +        ), +        tags=["forms"] +    ) +    async def patch(self, request: Request) -> JSONResponse: +        """Updates form by ID.""" +        data = await request.json() + +        if raw_form := await request.state.db.forms.find_one( +            {"_id": request.path_params["form_id"]} +        ): +            if "_id" in data or "id" in data: +                return JSONResponse({"error": "locked_field"}, status_code=400) + +            raw_form.update(data) +            try: +                form = Form(**raw_form) +            except ValidationError as e: +                return JSONResponse(e.errors(), status_code=422) + +            await request.state.db.forms.replace_one( +                {"_id": request.path_params["form_id"]}, +                form.dict() +            ) + +            return JSONResponse(form.dict()) +        else: +            return JSONResponse({"error": "not_found"}, status_code=404) + +    @requires(["authenticated", "admin"]) +    @api.validate(          resp=Response(HTTP_200=OkayResponse, HTTP_404=ErrorMessage),          tags=["forms"]      ) | 
