Files

43 lines
1.7 KiB
Python

# retoor <retoor@molodetz.nl>
import hashlib
from fastapi import APIRouter, Request
from molodetz import config
from molodetz.database import admin_uids_ordered, insert_join_request
from molodetz.dependencies import json_or_form
from molodetz.models import JoinForm
from molodetz.responses import action_result, respond
from molodetz.schemas.joins import JoinPageOut
from molodetz.seo import base_seo_context
from molodetz.seo_meta_text import description_for
from molodetz.utils.audit import record
from molodetz.utils.notifications import create_notification
from molodetz.utils.request_meta import client_ip
router = APIRouter()
def _seo(request):
return base_seo_context(request, "Join", description_for("join"), breadcrumbs=[("Molodetz", "/"), ("Join", "/join")])
@router.get("")
async def join_page(request: Request):
submitted = request.query_params.get("ok") == "1"
return respond(request, "join.html", {"submitted": submitted, "errors": [], "form": {}, "seo": _seo(request)}, model=JoinPageOut)
@router.post("")
async def join_submit(request: Request):
data = await json_or_form(request, JoinForm)
if data.website:
record(request, "join.request.honeypot", result="denied")
return action_result(request, "/join?ok=1")
ip_hash = hashlib.sha256(f"{config.SECRET_KEY}:{client_ip(request)}".encode()).hexdigest()[:24]
row = insert_join_request(data.name, data.contact, data.repo_url, data.message, ip_hash)
record(request, "join.request.create", payload={"uid": row["uid"]}, targets=[("join_request", row["uid"])])
for uid in admin_uids_ordered():
create_notification(uid, "join.request", f"{data.name} wants to write along", "/admin/joins")
return action_result(request, "/join?ok=1", data={"uid": row["uid"]})