|
# retoor <retoor@molodetz.nl>
|
|
import logging
|
|
from typing import Annotated
|
|
from datetime import datetime, timezone
|
|
from fastapi import APIRouter, Request, Form
|
|
from fastapi.responses import RedirectResponse, JSONResponse
|
|
from devplacepy.database import get_table, get_poll_for_post
|
|
from devplacepy.utils import generate_uid, require_user
|
|
from devplacepy.models import PollVoteForm
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/{poll_uid}/vote")
|
|
async def vote_poll(request: Request, poll_uid: str, data: Annotated[PollVoteForm, Form()]):
|
|
user = require_user(request)
|
|
poll = get_table("polls").find_one(uid=poll_uid)
|
|
if not poll:
|
|
return JSONResponse({"error": "Poll not found"}, status_code=404)
|
|
option = get_table("poll_options").find_one(uid=data.option_uid, poll_uid=poll_uid)
|
|
if not option:
|
|
return JSONResponse({"error": "Invalid option"}, status_code=400)
|
|
|
|
poll_votes = get_table("poll_votes")
|
|
existing = poll_votes.find_one(poll_uid=poll_uid, user_uid=user["uid"])
|
|
if existing:
|
|
if existing["option_uid"] == data.option_uid:
|
|
poll_votes.delete(id=existing["id"])
|
|
else:
|
|
poll_votes.update({"id": existing["id"], "option_uid": data.option_uid}, ["id"])
|
|
else:
|
|
poll_votes.insert({
|
|
"uid": generate_uid(),
|
|
"poll_uid": poll_uid,
|
|
"option_uid": data.option_uid,
|
|
"user_uid": user["uid"],
|
|
"created_at": datetime.now(timezone.utc).isoformat(),
|
|
})
|
|
|
|
result = get_poll_for_post(poll["post_uid"], user)
|
|
if request.headers.get("x-requested-with") == "fetch":
|
|
return JSONResponse(result)
|
|
return RedirectResponse(url=request.headers.get("Referer", "/feed"), status_code=302)
|