22
33from aiocache .serializers import PickleSerializer
44from dependency_injector .wiring import Provide , inject
5- from fastapi import APIRouter , Depends
5+ from fastapi import APIRouter , Depends , Header , HTTPException
6+ from fastapi .params import Security
7+ from fastapi .security import APIKeyHeader
68from pydantic import UUID4
79from starlette .requests import Request
810from starlette .responses import Response
911
1012from app .api .dto .Error import ErrorResponse
11- from app .api .dto .paste_dto import CreatePaste , LegacyPasteResponse , PasteResponse
13+ from app .api .dto .paste_dto import (
14+ CreatePaste ,
15+ CreatePasteResponse ,
16+ EditPaste ,
17+ LegacyPasteResponse ,
18+ PasteResponse ,
19+ )
1220from app .config import config
1321from app .containers import Container
1422from app .ratelimit import get_ip_address , limiter
2129 max_size = config .CACHE_SIZE_LIMIT ,
2230)
2331
32+ edit_token_key_header = APIKeyHeader (name = "Authorization" , scheme_name = "Edit Token" )
33+ delete_token_key_header = APIKeyHeader (name = "Authorization" , scheme_name = "Delete Token" )
34+
2435
2536def get_exempt_key (request : Request ) -> str :
2637 auth_header = request .headers .get ("Authorization" )
@@ -123,7 +134,7 @@ async def get_paste(
123134 )
124135
125136
126- @pastes_route .post ("" )
137+ @pastes_route .post ("" , response_model = CreatePasteResponse )
127138@limiter .limit ("4/minute" , key_func = get_exempt_key )
128139@inject
129140async def create_paste (
@@ -134,3 +145,46 @@ async def create_paste(
134145 return await paste_service .create_paste (
135146 create_paste_body , request .state .user_metadata
136147 )
148+
149+
150+ @pastes_route .put ("/{paste_id}" )
151+ @limiter .limit ("4/minute" , key_func = get_exempt_key )
152+ @inject
153+ async def edit_paste (
154+ request : Request ,
155+ paste_id : UUID4 ,
156+ edit_paste_body : EditPaste ,
157+ edit_token : str = Security (edit_token_key_header ),
158+ paste_service : PasteService = Depends (Provide [Container .paste_service ]),
159+ ):
160+ result = await paste_service .edit_paste (paste_id , edit_paste_body , edit_token )
161+ if not result :
162+ raise HTTPException (
163+ status_code = 404 ,
164+ detail = ErrorResponse (
165+ error = "paste_not_found" ,
166+ message = f"Paste { paste_id } not found" ,
167+ ).model_dump (),
168+ )
169+ return result
170+
171+
172+ @pastes_route .delete ("/{paste_id}" )
173+ @limiter .limit ("4/minute" , key_func = get_exempt_key )
174+ @inject
175+ async def delete_paste (
176+ request : Request ,
177+ paste_id : UUID4 ,
178+ delete_token : str = Security (delete_token_key_header ),
179+ paste_service : PasteService = Depends (Provide [Container .paste_service ]),
180+ ):
181+ result = await paste_service .delete_paste (paste_id , delete_token )
182+ if not result :
183+ raise HTTPException (
184+ status_code = 404 ,
185+ detail = ErrorResponse (
186+ error = "paste_not_found" ,
187+ message = f"Paste { paste_id } not found" ,
188+ ).model_dump (),
189+ )
190+ return {"message" : "Paste deleted successfully" }
0 commit comments