Files
F-r-ldraledigplannerare/backend/app/repositories_impl/sqlite/user_repository.py
T
2026-06-01 16:48:21 +02:00

78 lines
2.7 KiB
Python

"""SQLite implementation of UserRepository."""
from datetime import datetime
from uuid import UUID
import aiosqlite
from app.entities.user import User
from app.repositories.user_repository import UserRepository
from app.utils.errors import NotFoundError
class SQLiteUserRepository(UserRepository):
def __init__(self, connection: aiosqlite.Connection) -> None:
self._conn = connection
@staticmethod
def _row_to_entity(row: aiosqlite.Row) -> User:
return User(
id=UUID(row["id"]),
personal_data_uuid=UUID(row["personal_data_uuid"]),
email=row["email"],
hashed_password=row["hashed_password"],
created_at=datetime.fromisoformat(row["created_at"]),
)
async def create(self, item: User) -> User:
now = datetime.now()
item.created_at = item.created_at or now
await self._conn.execute(
"""
INSERT INTO "user" (id, personal_data_uuid, email, hashed_password, created_at)
VALUES (?, ?, ?, ?, ?)
""",
(
str(item.id),
str(item.personal_data_uuid),
item.email,
item.hashed_password,
item.created_at.isoformat(),
),
)
await self._conn.commit()
return item
async def get_by_id(self, id: UUID) -> User | None:
cursor = await self._conn.execute('SELECT * FROM "user" WHERE id = ?', (str(id),))
row = await cursor.fetchone()
return self._row_to_entity(row) if row else None
async def get_by_email(self, email: str) -> User | None:
cursor = await self._conn.execute('SELECT * FROM "user" WHERE email = ?', (email,))
row = await cursor.fetchone()
return self._row_to_entity(row) if row else None
async def update(self, id: UUID, item: User) -> User:
cursor = await self._conn.execute(
'UPDATE "user" SET email = ?, hashed_password = ? WHERE id = ?',
(item.email, item.hashed_password, str(id)),
)
await self._conn.commit()
if cursor.rowcount == 0:
raise NotFoundError(f"User {id} not found")
refreshed = await self.get_by_id(id)
assert refreshed is not None
return refreshed
async def delete(self, id: UUID) -> None:
cursor = await self._conn.execute('DELETE FROM "user" WHERE id = ?', (str(id),))
await self._conn.commit()
if cursor.rowcount == 0:
raise NotFoundError(f"User {id} not found")
async def list(self, **filters: object) -> list[User]:
cursor = await self._conn.execute('SELECT * FROM "user"')
rows = await cursor.fetchall()
return [self._row_to_entity(r) for r in rows]