Coverage for apps/outers/repositories/web_document_repository.py: 74%
38 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-22 19:03 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-22 19:03 +0000
1from typing import List
2from uuid import UUID
4import sqlalchemy
5from sqlalchemy import exc
6from sqlalchemy.engine import ScalarResult
7from sqlmodel import select
8from sqlmodel.ext.asyncio.session import AsyncSession
10from apps.inners.exceptions import repository_exception
11from apps.inners.models.daos.document import Document
12from apps.inners.models.daos.web_document import WebDocument
15class WebDocumentRepository:
17 def __init__(self):
18 pass
20 async def find_many_by_account_id_with_pagination(
21 self,
22 session: AsyncSession,
23 account_id: UUID,
24 page_position: int,
25 page_size: int
26 ) -> List[WebDocument]:
27 found_web_document_result: ScalarResult = await session.exec(
28 select(WebDocument)
29 .join(Document, Document.id == WebDocument.id)
30 .where(Document.account_id == account_id)
31 .limit(page_size)
32 .offset(page_size * (page_position - 1))
33 )
34 found_web_documents: List[WebDocument] = list(found_web_document_result.all())
36 return found_web_documents
38 async def find_one_by_id_and_account_id(self, session: AsyncSession, id: UUID, account_id: UUID) -> WebDocument:
39 try:
40 found_web_document_result: ScalarResult = await session.exec(
41 select(WebDocument)
42 .join(Document, Document.id == WebDocument.id)
43 .where(WebDocument.id == id)
44 .where(Document.account_id == account_id)
45 )
46 found_web_document: WebDocument = found_web_document_result.one()
47 except sqlalchemy.exc.NoResultFound:
48 raise repository_exception.NotFound()
50 return found_web_document
52 def create_one(self, session: AsyncSession, web_document_creator: WebDocument) -> WebDocument:
53 try:
54 session.add(web_document_creator)
55 except sqlalchemy.exc.IntegrityError:
56 raise repository_exception.IntegrityError()
58 return web_document_creator
60 async def patch_one_by_id_and_account_id(
61 self,
62 session: AsyncSession,
63 id: UUID,
64 account_id: UUID,
65 web_document_patcher: WebDocument
66 ) -> WebDocument:
67 found_web_document: WebDocument = await self.find_one_by_id_and_account_id(
68 session=session,
69 id=id,
70 account_id=account_id
71 )
72 found_web_document.patch_from(web_document_patcher.dict(exclude_none=True))
74 return found_web_document
76 async def delete_one_by_id_and_account_id(self, session: AsyncSession, id: UUID, account_id: UUID) -> WebDocument:
77 found_web_document: WebDocument = await self.find_one_by_id_and_account_id(
78 session=session,
79 id=id,
80 account_id=account_id
81 )
82 await session.delete(found_web_document)
84 return found_web_document