diff options
author | 2020-12-17 04:31:37 +0300 | |
---|---|---|
committer | 2020-12-17 06:35:22 +0300 | |
commit | b80b3293a5cc50d4482ead0903d516652f83b27e (patch) | |
tree | 604d70d7dd6522b30bfb528b653eddbf5cba0424 /backend/models/form.py | |
parent | Create config.yml (diff) |
Adds Webhook Option
Adds webhook option on form creation, and adds validation. Updates
`SCHEMA.md`.
Signed-off-by: Hassan Abouelela <[email protected]>
Diffstat (limited to 'backend/models/form.py')
-rw-r--r-- | backend/models/form.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/backend/models/form.py b/backend/models/form.py index cb58065..e6c56a4 100644 --- a/backend/models/form.py +++ b/backend/models/form.py @@ -1,5 +1,6 @@ import typing as t +import httpx from pydantic import BaseModel, Field, validator from backend.constants import FormFeatures @@ -8,6 +9,55 @@ from .question import Question PUBLIC_FIELDS = ["id", "features", "questions", "name", "description"] +class _WebHook(BaseModel): + """Schema model of discord webhooks.""" + url: str + message: str + + @validator("url") + def validate_url(cls, url: str) -> str: + """Checks if discord webhook urls are valid.""" + if not isinstance(url, str): + raise ValueError("Webhook URL must be a string.") + + if "discord.com/api/webhooks/" not in url: + raise ValueError("URL must be a discord webhook.") + + # Attempt to connect to URL + try: + httpx.get(url).raise_for_status() + + except httpx.RequestError as e: + # Catch exceptions in request format + raise ValueError( + f"Encountered error while trying to connect to url: `{e}`" + ) + + except httpx.HTTPStatusError as e: + # Catch exceptions in response + status = e.response.status_code + + if status == 401: + raise ValueError( + "Could not authenticate with target. Please check the webhook url." + ) + elif status == 404: + raise ValueError( + "Target could not find webhook url. Please check the webhook url." + ) + else: + raise ValueError( + f"Unknown error ({status}) while connecting to target: {e}" + ) + + return url + + +class _FormMeta(BaseModel): + """Schema model for form meta data.""" + webhook: _WebHook + + class Form(BaseModel): """Schema model for form.""" @@ -16,6 +66,7 @@ class Form(BaseModel): questions: list[Question] name: str description: str + meta: _FormMeta class Config: allow_population_by_field_name = True |