From 854b9ca563bb2c9671fbc94ad5acaf2270c82b42 Mon Sep 17 00:00:00 2001
From: Mikhail Sennikov <mifls@yandex.ru>
Date: Thu, 25 Jan 2024 19:32:03 +0300
Subject: [PATCH] Fix repo

---
 Backend/database/.gitkeep           |  0
 ProxyNode/database/.gitkeep         |  0
 database/repositories/base.py       |  4 ++++
 database/repositories/cam_groups.py | 13 ++++++++++++-
 database/repositories/cams.py       | 13 ++++++++++++-
 database/repositories/nodes.py      | 13 ++++++++++++-
 database/repositories/roles.py      | 13 ++++++++++++-
 database/repositories/users.py      | 13 ++++++++++++-
 docker-compose.yml                  |  2 ++
 9 files changed, 66 insertions(+), 5 deletions(-)
 create mode 100644 Backend/database/.gitkeep
 create mode 100644 ProxyNode/database/.gitkeep

diff --git a/Backend/database/.gitkeep b/Backend/database/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/ProxyNode/database/.gitkeep b/ProxyNode/database/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/database/repositories/base.py b/database/repositories/base.py
index 56b8ae6..aa20391 100755
--- a/database/repositories/base.py
+++ b/database/repositories/base.py
@@ -12,6 +12,10 @@ class Repository:
     async def list_all(self) -> List[BaseModel]:
         return [BaseModel()]
 
+    # noinspection PyMethodMayBeStatic
+    async def get_or_none(self, entity_id: int) -> BaseModel | None:
+        return BaseModel()
+
     # noinspection PyMethodMayBeStatic
     async def get(self, entity_id: int) -> BaseModel:
         return BaseModel()
diff --git a/database/repositories/cam_groups.py b/database/repositories/cam_groups.py
index 1ab1cac..76d9dda 100644
--- a/database/repositories/cam_groups.py
+++ b/database/repositories/cam_groups.py
@@ -1,7 +1,9 @@
 from typing import List
 
+from fastapi import HTTPException
 from sqlalchemy import select
 from sqlalchemy.ext.asyncio import AsyncSession
+from starlette import status
 
 from database.models.auth import User
 from database.models.cams import Group, UserInGroup, Cam, CamInGroup
@@ -20,10 +22,19 @@ class GroupRepository(Repository):
         group_db_obj = await self._session.execute(query)
         return [group for group, in group_db_obj]
 
-    async def get(self, group_id: int) -> Group | None:
+    async def get_or_none(self, group_id: int) -> Group | None:
         group_db_obj = await self._session.get(Group, group_id)
         return group_db_obj
 
+    async def get(self, group_id: int) -> Group:
+        group_db_obj = await self.get_or_none(group_id)
+        if group_db_obj is None:
+            raise HTTPException(
+                status_code=status.HTTP_404_NOT_FOUND,
+                detail=f"Group with id={group_id} not found"
+            )
+        return group_db_obj
+
     async def create(self, group: GroupBase) -> Group:
         group_db_obj = Group(**group.model_dump(exclude_unset=True))
         self._session.add(group_db_obj)
diff --git a/database/repositories/cams.py b/database/repositories/cams.py
index 6cfb71b..13d1c97 100644
--- a/database/repositories/cams.py
+++ b/database/repositories/cams.py
@@ -1,7 +1,9 @@
 from typing import List
 
+from fastapi import HTTPException
 from sqlalchemy import select
 from sqlalchemy.ext.asyncio import AsyncSession
+from starlette import status
 
 from database.models.cams import Group, Cam, CamInGroup
 from database.models.nodes import Node
@@ -19,10 +21,19 @@ class CamRepository(Repository):
         cam_db_obj = await self._session.execute(query)
         return [cam for cam, in cam_db_obj]
 
-    async def get(self, cam_id: int) -> Cam | None:
+    async def get_or_none(self, cam_id: int) -> Cam | None:
         cam_db_obj = await self._session.get(Cam, cam_id)
         return cam_db_obj
 
+    async def get(self, cam_id: int) -> Cam:
+        cam_db_obj = await self.get_or_none(cam_id)
+        if cam_db_obj is None:
+            raise HTTPException(
+                status_code=status.HTTP_404_NOT_FOUND,
+                detail=f"Cam with id={cam_id} not found"
+            )
+        return cam_db_obj
+
     async def create(self, cam: CamCreate) -> Cam:
         cam_db_obj = Cam(**cam.model_dump(exclude_unset=True))
         self._session.add(cam_db_obj)
diff --git a/database/repositories/nodes.py b/database/repositories/nodes.py
index a69c222..f28682b 100644
--- a/database/repositories/nodes.py
+++ b/database/repositories/nodes.py
@@ -1,7 +1,9 @@
 from typing import List, Tuple
 
+from fastapi import HTTPException
 from sqlalchemy import select
 from sqlalchemy.ext.asyncio import AsyncSession
+from starlette import status
 
 from database.models.cams import Cam, CamInGroup, Group
 from database.models.nodes import Node
@@ -19,10 +21,19 @@ class NodeRepository(Repository):
         node_db_obj = await self._session.execute(query)
         return [node for node, in node_db_obj]
 
-    async def get(self, node_id: int) -> Node | None:
+    async def get_or_none(self, node_id: int) -> Node | None:
         node_db_obj = await self._session.get(Node, node_id)
         return node_db_obj
 
+    async def get(self, node_id: int) -> Node:
+        node_db_obj = await self.get_or_none(node_id)
+        if node_db_obj is None:
+            raise HTTPException(
+                status_code=status.HTTP_404_NOT_FOUND,
+                detail=f"Node with id={node_id} not found"
+            )
+        return node_db_obj
+
     async def create(self, node: NodeCreate) -> Node:
         node_db_obj = Node(**node.model_dump(exclude_unset=True))
         self._session.add(node_db_obj)
diff --git a/database/repositories/roles.py b/database/repositories/roles.py
index 0b82ccc..fff27da 100644
--- a/database/repositories/roles.py
+++ b/database/repositories/roles.py
@@ -1,7 +1,9 @@
 from typing import List
 
+from fastapi import HTTPException
 from sqlalchemy import select
 from sqlalchemy.ext.asyncio import AsyncSession
+from starlette import status
 
 from database.models.auth import Role
 from database.repositories.base import Repository
@@ -18,10 +20,19 @@ class RoleRepository(Repository):
         role_db_obj = await self._session.execute(query)
         return [role for role, in role_db_obj]
 
-    async def get(self, role_id: int) -> Role | None:
+    async def get_or_none(self, role_id: int) -> Role | None:
         role_db_obj = await self._session.get(Role, role_id)
         return role_db_obj
 
+    async def get(self, role_id: int) -> Role:
+        role_db_obj = await self.get_or_none(role_id)
+        if role_db_obj is None:
+            raise HTTPException(
+                status_code=status.HTTP_404_NOT_FOUND,
+                detail=f"Role with id={role_id} not found"
+            )
+        return role_db_obj
+
     async def create(self, role: RoleBase) -> Role:
         role_db_obj = Role(**role.model_dump(exclude_unset=True))
         self._session.add(role_db_obj)
diff --git a/database/repositories/users.py b/database/repositories/users.py
index 3c37e9f..854a4a0 100644
--- a/database/repositories/users.py
+++ b/database/repositories/users.py
@@ -2,8 +2,10 @@ import bcrypt
 
 from typing import List
 
+from fastapi import HTTPException
 from sqlalchemy import select
 from sqlalchemy.ext.asyncio import AsyncSession
+from starlette import status
 
 from database.models.auth import User, Role, UserRole
 from database.repositories.base import Repository
@@ -20,10 +22,19 @@ class UserRepository(Repository):
         user_db_obj = await self._session.execute(query)
         return [user for user, in user_db_obj]
 
-    async def get(self, user_id: int) -> User | None:
+    async def get_or_none(self, user_id: int) -> User | None:
         user_db_obj = await self._session.get(User, user_id)
         return user_db_obj
 
+    async def get(self, user_id: int) -> User:
+        user_db_obj = await self.get_or_none(user_id)
+        if user_db_obj is None:
+            raise HTTPException(
+                status_code=status.HTTP_404_NOT_FOUND,
+                detail=f"User with id={user_id} not found"
+            )
+        return user_db_obj
+
     async def create(self, user: UserCreate) -> User:
         hashed_password = bcrypt.hashpw(user.password.encode("utf-8"),
                                         bcrypt.gensalt(12, prefix=b"2b"))
diff --git a/docker-compose.yml b/docker-compose.yml
index ef231b9..03a0b1e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -7,6 +7,8 @@ services:
       POSTGRES_DB: "postgres"
       POSTGRES_USER: "postgres"
       POSTGRES_PASSWORD: "password"
+    volumes:
+      - ./pg-data:/var/lib/postgresql
 
   ptz-proxy-master:
     build:
-- 
GitLab