11from typing import Any
22
33from fastapi import HTTPException , status
4- from pymongo .errors import PyMongoError
5- from pymongo import ReturnDocument
64
7- from app .utils .collection_name import CODE_SNIPPETS as SNIPPETS
85from app .api .routes .code_snippets .schema import (
96 CodeSnippetCreate ,
107 CodeSnippetOut ,
118 CodeSnippetUpdate ,
129)
10+ from app .core .cache import bump_version , cached
1311from app .database import db_manager
14- from app .utils .utils import create_timestamp , is_duplicate_key_error , new_id
15- from app .core .cache import cached , bump_version
12+ from app .utils .collection_name import CODE_SNIPPETS as SNIPPETS
13+ from app .utils .crud import safe_delete_one , safe_insert , safe_update_one
14+ from app .utils .utils import create_timestamp , new_id
1615
1716
1817def _doc_to_out (doc : dict [str , Any ]) -> CodeSnippetOut :
@@ -57,18 +56,7 @@ async def create_code_snippet(uid: str, body: CodeSnippetCreate) -> CodeSnippetO
5756 "createdAt" : created ,
5857 "updatedAt" : updated ,
5958 }
60- try :
61- await db_manager .insert_one (SNIPPETS , doc )
62- except PyMongoError as exc :
63- if is_duplicate_key_error (exc ):
64- raise HTTPException (
65- status_code = status .HTTP_409_CONFLICT ,
66- detail = "Snippet id already exists." ,
67- ) from exc
68- raise HTTPException (
69- status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
70- detail = "Failed to create snippet." ,
71- ) from exc
59+ await safe_insert (SNIPPETS , doc , name = "Snippet" )
7260 await bump_version (ns = "code_snippets" , uid = uid )
7361 return _doc_to_out (doc )
7462
@@ -78,20 +66,12 @@ async def update_code_snippet(uid: str, snippet_id: str, body: CodeSnippetUpdate
7866 if not patch :
7967 return await get_code_snippet (uid = uid , snippet_id = snippet_id )
8068 patch ["updatedAt" ] = create_timestamp ()
81- try :
82- result = await db_manager .find_one_and_update (
83- SNIPPETS ,
84- {"_id" : snippet_id , "created_by" : uid },
85- {"$set" : patch },
86- return_document = ReturnDocument .AFTER ,
87- )
88- except PyMongoError as exc :
89- raise HTTPException (
90- status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
91- detail = "Failed to update snippet." ,
92- ) from exc
93- if not result :
94- raise HTTPException (status_code = status .HTTP_404_NOT_FOUND , detail = "Snippet not found." )
69+ result = await safe_update_one (
70+ SNIPPETS ,
71+ {"_id" : snippet_id , "created_by" : uid },
72+ patch ,
73+ name = "Snippet" ,
74+ )
9575 await bump_version (ns = "code_snippets" , uid = uid )
9676 return _doc_to_out (result )
9777
@@ -105,7 +85,5 @@ async def get_code_snippet(*, uid: str, snippet_id: str) -> CodeSnippetOut:
10585
10686
10787async def delete_code_snippet (uid : str , snippet_id : str ) -> None :
108- result = await db_manager .delete_one (SNIPPETS , {"_id" : snippet_id , "created_by" : uid })
109- if result .deleted_count == 0 :
110- raise HTTPException (status_code = status .HTTP_404_NOT_FOUND , detail = "Snippet not found." )
88+ await safe_delete_one (SNIPPETS , {"_id" : snippet_id , "created_by" : uid }, name = "Snippet" )
11189 await bump_version (ns = "code_snippets" , uid = uid )
0 commit comments