Skip to content

Commit df5338c

Browse files
committed
Move document database interactions to CRUD
1 parent 7a883e6 commit df5338c

File tree

3 files changed

+79
-42
lines changed

3 files changed

+79
-42
lines changed

backend/app/api/routes/documents.py

Lines changed: 14 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
from pathlib import Path
33

44
from fastapi import APIRouter, File, UploadFile, HTTPException
5-
from sqlmodel import select, update, and_
5+
66
from sqlalchemy.exc import NoResultFound, MultipleResultsFound
77

8+
from app.crud import DocumentCrud
9+
from app.models import Document, DocumentList
810
from app.api.deps import CurrentUser, SessionDep
911
from app.core.cloud import AmazonCloudStorage
10-
from app.core.util import now
11-
from app.models import Document, DocumentList
1212

1313
router = APIRouter(prefix="/documents", tags=["documents"])
1414

@@ -20,20 +20,8 @@ def list_docs(
2020
skip: int = 0,
2121
limit: int = 100,
2222
):
23-
statement = (
24-
select(Document)
25-
.where(and_(
26-
Document.owner_id == current_user.id,
27-
Document.deleted_at.is_(None),
28-
))
29-
.offset(skip)
30-
.limit(limit)
31-
)
32-
docs = (session
33-
.exec(statement)
34-
.all())
35-
36-
return DocumentList(docs=docs)
23+
crud = DocumentCrud(session)
24+
return crud.read_many(current_user.id, skip, limit)
3725

3826
@router.post("/cp")
3927
def upload_doc(
@@ -48,15 +36,14 @@ def upload_doc(
4836
except ConnectionError as err:
4937
raise HTTPException(status_code=500, detail=str(err))
5038

39+
crud = DocumentCrud(session)
5140
document = Document(
5241
id=basename,
5342
owner_id=current_user.id,
5443
fname=src.filename,
5544
object_store_url=str(object_store_url),
5645
)
57-
session.add(document)
58-
session.commit()
59-
session.refresh(document)
46+
crud.update(document)
6047

6148
return document.id
6249

@@ -66,20 +53,11 @@ def delete_doc(
6653
current_user: CurrentUser,
6754
doc_id: UUID,
6855
):
69-
deleted_at = now()
70-
statement = (
71-
update(Document)
72-
.where(and_(
73-
Document.id == doc_id,
74-
Document.owner_id == current_user.id,
75-
))
76-
.values(deleted_at=deleted_at)
77-
)
78-
result = session.exec(statement)
79-
if not result.rowcount:
80-
detail = f'Item "{doc_id}" not found'
81-
raise HTTPException(status_code=404, detail=detail)
82-
session.commit()
56+
crud = DocumentCrud(session)
57+
try:
58+
crud.delete(doc_id, current_user.id)
59+
except FileNotFoundError as err:
60+
raise HTTPException(status_code=404, detail=str(err))
8361

8462
# TODO: perform delete on the collection
8563

@@ -89,14 +67,9 @@ def doc_info(
8967
current_user: CurrentUser,
9068
doc_id: UUID,
9169
):
92-
statement = (
93-
select(Document)
94-
.where(Document.id == doc_id)
95-
)
96-
result = session.exec(statement)
97-
70+
crud = DocumentCrud(session)
9871
try:
99-
return result.one()
72+
return crud.read_one(doc_id)
10073
except NoResultFound as err:
10174
raise HTTPException(status_code=404, detail=str(err))
10275
except MultipleResultsFound as err:

backend/app/crud/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44
create_user,
55
get_user_by_email,
66
update_user,
7-
)
7+
)
8+
9+
from .document import DocumentCrud

backend/app/crud/document.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from uuid import UUID
2+
from typing import Optional
3+
4+
from sqlmodel import Session, select, update, and_
5+
6+
from app.models import Document, DocumentList
7+
from app.core.util import now
8+
9+
class CrudObject:
10+
def __init__(self, session: Session):
11+
self.session = session
12+
13+
class DocumentCrud(CrudObject):
14+
def read_one(self, doc_id: UUID):
15+
statement = (
16+
select(Document)
17+
.where(Document.id == doc_id)
18+
)
19+
20+
return self.session.exec(statement).one()
21+
22+
def read_many(
23+
self,
24+
owner_id: UUID,
25+
skip: Optional[int] = None,
26+
limit: Optional[int] = None,
27+
):
28+
statement = (
29+
select(Document)
30+
.where(and_(
31+
Document.owner_id == owner_id,
32+
Document.deleted_at.is_(None),
33+
))
34+
)
35+
if skip is not None:
36+
statement = statement.offset(skip)
37+
if limit is not None:
38+
statement = statement.limit(limit)
39+
40+
docs = self.session.exec(statement).all()
41+
42+
return DocumentList(docs=docs)
43+
44+
def update(self, doc: Document):
45+
self.session.add(document)
46+
self.session.commit()
47+
self.session.refresh(document)
48+
49+
def delete(self, doc_id: UUID, owner_id: UUID):
50+
statement = (
51+
update(Document)
52+
.where(and_(
53+
Document.id == doc_id,
54+
Document.owner_id == owner_id,
55+
))
56+
.values(deleted_at=now())
57+
)
58+
result = self.session.exec(statement)
59+
if not result.rowcount:
60+
raise FileNotFoundError(f'Item "{doc_id}" not found')
61+
62+
self.session.commit()

0 commit comments

Comments
 (0)