aboutsummaryrefslogtreecommitdiffstats
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/constants.py4
-rw-r--r--backend/models/form.py10
-rw-r--r--backend/routes/forms/form.py22
-rw-r--r--backend/routes/forms/index.py5
-rw-r--r--backend/routes/forms/submit.py6
5 files changed, 22 insertions, 25 deletions
diff --git a/backend/constants.py b/backend/constants.py
index bfcf261..bf0c33c 100644
--- a/backend/constants.py
+++ b/backend/constants.py
@@ -67,7 +67,3 @@ class FormFeatures(Enum):
class WebHook(Enum):
URL = "url"
MESSAGE = "message"
-
-
-class Meta(Enum):
- WEB_HOOK = WebHook
diff --git a/backend/models/form.py b/backend/models/form.py
index d5e2ff5..57372ea 100644
--- a/backend/models/form.py
+++ b/backend/models/form.py
@@ -4,7 +4,7 @@ import httpx
from pydantic import BaseModel, Field, validator
from pydantic.error_wrappers import ErrorWrapper, ValidationError
-from backend.constants import FormFeatures, Meta, WebHook
+from backend.constants import FormFeatures, WebHook
from .question import Question
PUBLIC_FIELDS = ["id", "features", "questions", "name", "description"]
@@ -24,11 +24,6 @@ class _WebHook(BaseModel):
return url
-class _FormMeta(BaseModel):
- """Schema model for form meta data."""
- webhook: _WebHook = None
-
-
class Form(BaseModel):
"""Schema model for form."""
@@ -37,7 +32,7 @@ class Form(BaseModel):
questions: list[Question]
name: str
description: str
- meta: _FormMeta = _FormMeta()
+ webhook: _WebHook = None
class Config:
allow_population_by_field_name = True
@@ -124,7 +119,6 @@ async def validate_hook_url(url: str) -> t.Optional[ValidationError]:
await validate()
except Exception as e:
loc = (
- Meta.__name__.lower(),
WebHook.__name__.lower(),
WebHook.URL.value
)
diff --git a/backend/routes/forms/form.py b/backend/routes/forms/form.py
index b87c7cf..8ecfdf6 100644
--- a/backend/routes/forms/form.py
+++ b/backend/routes/forms/form.py
@@ -1,15 +1,16 @@
"""
Returns, updates or deletes a single form given an ID.
"""
+import deepmerge
from pydantic import ValidationError
from spectree.response import Response
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
-from backend.validation import OkayResponse, api, ErrorMessage
+from backend.route import Route
+from backend.validation import ErrorMessage, OkayResponse, api
class SingleForm(Route):
@@ -53,15 +54,22 @@ class SingleForm(Route):
"""Updates form by ID."""
data = await request.json()
- if raw_form := await request.state.db.forms.find_one(
- {"_id": request.path_params["form_id"]}
- ):
+ form_id = {"_id": request.path_params["form_id"]}
+ if raw_form := await request.state.db.forms.find_one(form_id):
if "_id" in data or "id" in data:
return JSONResponse({"error": "locked_field"}, status_code=400)
- raw_form.update(data)
+ # Build Data Merger
+ merge_strategy = [
+ (dict, ["merge"])
+ ]
+ merger = deepmerge.Merger(merge_strategy, ["override"], ["override"])
+
+ # Merge Form Data
+ updated_form = merger.merge(raw_form, data)
+
try:
- form = Form(**raw_form)
+ form = Form(**updated_form)
except ValidationError as e:
return JSONResponse(e.errors(), status_code=422)
diff --git a/backend/routes/forms/index.py b/backend/routes/forms/index.py
index 0e1dee8..5fd90ab 100644
--- a/backend/routes/forms/index.py
+++ b/backend/routes/forms/index.py
@@ -6,7 +6,7 @@ from starlette.authentication import requires
from starlette.requests import Request
from starlette.responses import JSONResponse
-from backend.constants import Meta, WebHook
+from backend.constants import WebHook
from backend.models import Form, FormList
from backend.models.form import validate_hook_url
from backend.route import Route
@@ -51,8 +51,7 @@ class FormsList(Route):
# Verify Webhook
try:
# Get url from request
- path = (Meta.__name__.lower(), WebHook.__name__.lower(), WebHook.URL.value)
- url = form_data[path[0]][path[1]][path[2]]
+ url = form_data[WebHook.__name__.lower()][WebHook.URL.value]
# Validate URL
validation = await validate_hook_url(url)
diff --git a/backend/routes/forms/submit.py b/backend/routes/forms/submit.py
index 82caa81..8588a2d 100644
--- a/backend/routes/forms/submit.py
+++ b/backend/routes/forms/submit.py
@@ -155,7 +155,7 @@ class SubmitForm(Route):
) -> None:
"""Helper to send a submission message to a discord webhook."""
# Stop if webhook is not available
- if form.meta.webhook is None:
+ if form.webhook is None:
raise ValueError("Got empty webhook.")
try:
@@ -190,7 +190,7 @@ class SubmitForm(Route):
}
# Set hook message
- message = form.meta.webhook.message
+ message = form.webhook.message
if message:
# Available variables, see SCHEMA.md
ctx = {
@@ -208,5 +208,5 @@ class SubmitForm(Route):
# Post hook
async with httpx.AsyncClient() as client:
- r = await client.post(form.meta.webhook.url, json=hook)
+ r = await client.post(form.webhook.url, json=hook)
r.raise_for_status()