From 036ae023ee0e90f8fb869f96a8d215eff9590243 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Sat, 17 Aug 2024 21:47:27 +0800 Subject: [PATCH] fix: improve delete --- server/__init__.py | 26 +------------------------- server/contrib.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/server/__init__.py b/server/__init__.py index 87be916..ef80620 100644 --- a/server/__init__.py +++ b/server/__init__.py @@ -6,7 +6,6 @@ from litestar.contrib.jinja import JinjaTemplateEngine from litestar.exceptions import ( InternalServerException, - NotAuthorizedException, NotFoundException, ) from litestar.response import Template @@ -23,7 +22,7 @@ from server import tmpl from server.auth import callback, login, session_auth_config from server.base import Request, pg, pg_pool_startup -from server.contrib import suggest_api, suggest_ui +from server.contrib import delete_patch, suggest_api, suggest_ui from server.model import Patch from server.review import review_patch @@ -104,29 +103,6 @@ async def get_patch(patch_id: str, request: Request) -> Template: ) -@litestar.post("/api/delete-patch/{patch_id:str}") -async def delete_patch(patch_id: str, request: Request) -> Template: - if not request.auth: - raise NotAuthorizedException - - p = await pg.fetchrow("""select * from patch where id = $1 and deleted_at is NULL""", patch_id) - if not p: - raise NotFoundException() - - patch = Patch(**p) - - if patch.from_user_id != request.auth.user_id: - raise NotAuthorizedException - - await pg.execute( - "update patch set deleted_at = $1 where id = $2 ", - datetime.now(tz=UTC), - patch_id, - ) - - return Template("patch.html.jinja2", context={"patch": p, "auth": request.auth}) - - def before_req(req: litestar.Request): req.state["now"] = datetime.now(tz=UTC) diff --git a/server/contrib.py b/server/contrib.py index 9eb1fba..bd6cd29 100644 --- a/server/contrib.py +++ b/server/contrib.py @@ -1,10 +1,12 @@ from dataclasses import dataclass +from datetime import datetime from typing import Annotated import litestar from litestar.enums import RequestEncodingType from litestar.exceptions import ( HTTPException, + NotAuthorizedException, NotFoundException, PermissionDeniedException, ValidationException, @@ -12,8 +14,9 @@ from litestar.params import Body from litestar.response import Redirect, Template +from config import UTC from server.base import Request, http_client, pg -from server.model import Wiki +from server.model import Patch, Wiki @litestar.get("/suggest") @@ -110,3 +113,30 @@ async def suggest_api( ) return Redirect(f"/patch/{pk}") + + +@litestar.post("/api/delete-patch/{patch_id:str}") +async def delete_patch(patch_id: str, request: Request) -> Redirect: + if not request.auth: + raise NotAuthorizedException + + async with pg.acquire() as conn: + async with conn.transaction(): + p = await conn.fetchrow( + """select * from patch where id = $1 and deleted_at is NULL""", patch_id + ) + if not p: + raise NotFoundException() + + patch = Patch(**p) + + if patch.from_user_id != request.auth.user_id: + raise NotAuthorizedException + + await conn.execute( + "update patch set deleted_at = $1 where id = $2 ", + datetime.now(tz=UTC), + patch_id, + ) + + return Redirect("/")