aboutsummaryrefslogtreecommitdiffstats
path: root/backend/routes/forms/submit.py
diff options
context:
space:
mode:
Diffstat (limited to 'backend/routes/forms/submit.py')
-rw-r--r--backend/routes/forms/submit.py25
1 files changed, 25 insertions, 0 deletions
diff --git a/backend/routes/forms/submit.py b/backend/routes/forms/submit.py
index 3ecbda0..150a343 100644
--- a/backend/routes/forms/submit.py
+++ b/backend/routes/forms/submit.py
@@ -4,11 +4,14 @@ Submit a form.
import binascii
import hashlib
+from typing import Any, Optional
import uuid
import httpx
+from pydantic.main import BaseModel
import pydnsbl
from pydantic import ValidationError
+from spectree import Response
from starlette.requests import Request
from starlette.responses import JSONResponse
@@ -16,6 +19,7 @@ from starlette.responses import JSONResponse
from backend.constants import HCAPTCHA_API_SECRET, FormFeatures
from backend.models import Form, FormResponse
from backend.route import Route
+from backend.validation import AuthorizationHeaders, ErrorMessage, api
HCAPTCHA_VERIFY_URL = "https://hcaptcha.com/siteverify"
HCAPTCHA_HEADERS = {
@@ -23,6 +27,16 @@ HCAPTCHA_HEADERS = {
}
+class SubmissionResponse(BaseModel):
+ form: Form
+ response: FormResponse
+
+
+class PartialSubmission(BaseModel):
+ response: dict[str, Any]
+ captcha: Optional[str]
+
+
class SubmitForm(Route):
"""
Submit a form with the provided form ID.
@@ -31,7 +45,18 @@ class SubmitForm(Route):
name = "submit_form"
path = "/submit/{form_id:str}"
+ @api.validate(
+ json=PartialSubmission,
+ resp=Response(
+ HTTP_200=SubmissionResponse,
+ HTTP_404=ErrorMessage,
+ HTTP_400=ErrorMessage
+ ),
+ headers=AuthorizationHeaders,
+ tags=["forms", "responses"]
+ )
async def post(self, request: Request) -> JSONResponse:
+ """Submit a response to the form."""
data = await request.json()
if form := await request.state.db.forms.find_one(