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