From 0a02df363a80e7571c9a0bbb9829b84f18cf7f4c Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Tue, 5 Oct 2021 21:32:12 -0700 Subject: [PATCH] feat(FastAPI): add /pkgbase/{name}/[un]vote (post) Signed-off-by: Kevin Morris --- aurweb/routers/packages.py | 38 ++++++++++++++++++++++++++++++++++++ test/test_packages_routes.py | 27 +++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/aurweb/routers/packages.py b/aurweb/routers/packages.py index ced9ea3d..8bfb680e 100644 --- a/aurweb/routers/packages.py +++ b/aurweb/routers/packages.py @@ -769,3 +769,41 @@ async def pkgbase_unnotify(request: Request, name: str): return RedirectResponse(f"/pkgbase/{name}", status_code=int(HTTPStatus.SEE_OTHER)) + + +@router.post("/pkgbase/{name}/vote") +@auth_required(True, redirect="/pkgbase/{name}") +async def pkgbase_vote(request: Request, name: str): + pkgbase = get_pkg_or_base(name, PackageBase) + + vote = pkgbase.package_votes.filter( + PackageVote.UsersID == request.user.ID + ).first() + has_cred = request.user.has_credential("CRED_PKGBASE_VOTE") + if has_cred and not vote: + now = int(datetime.utcnow().timestamp()) + with db.begin(): + db.create(PackageVote, + User=request.user, + PackageBase=pkgbase, + VoteTS=now) + + return RedirectResponse(f"/pkgbase/{name}", + status_code=int(HTTPStatus.SEE_OTHER)) + + +@router.post("/pkgbase/{name}/unvote") +@auth_required(True, redirect="/pkgbase/{name}") +async def pkgbase_unvote(request: Request, name: str): + pkgbase = get_pkg_or_base(name, PackageBase) + + vote = pkgbase.package_votes.filter( + PackageVote.UsersID == request.user.ID + ).first() + has_cred = request.user.has_credential("CRED_PKGBASE_VOTE") + if has_cred and vote: + with db.begin(): + db.session.delete(vote) + + return RedirectResponse(f"/pkgbase/{name}", + status_code=int(HTTPStatus.SEE_OTHER)) diff --git a/test/test_packages_routes.py b/test/test_packages_routes.py index 1d7fe17c..a03c5920 100644 --- a/test/test_packages_routes.py +++ b/test/test_packages_routes.py @@ -1753,3 +1753,30 @@ def test_pkgbase_notify(client: TestClient, user: User, package: Package): PackageNotification.UserID == user.ID ).first() assert notif is None + + +def test_pkgbase_vote(client: TestClient, user: User, package: Package): + pkgbase = package.PackageBase + + # We haven't voted yet. + vote = pkgbase.package_votes.filter(PackageVote.UsersID == user.ID).first() + assert vote is None + + # Vote for the package. + cookies = {"AURSID": user.login(Request(), "testPassword")} + endpoint = f"/pkgbase/{pkgbase.Name}/vote" + with client as request: + resp = request.post(endpoint, cookies=cookies) + assert resp.status_code == int(HTTPStatus.SEE_OTHER) + + vote = pkgbase.package_votes.filter(PackageVote.UsersID == user.ID).first() + assert vote is not None + + # Remove vote. + endpoint = f"/pkgbase/{pkgbase.Name}/unvote" + with client as request: + resp = request.post(endpoint, cookies=cookies) + assert resp.status_code == int(HTTPStatus.SEE_OTHER) + + vote = pkgbase.package_votes.filter(PackageVote.UsersID == user.ID).first() + assert vote is None