feat: add SQLite persistence models
This commit is contained in:
69
app/db/repositories.py
Normal file
69
app/db/repositories.py
Normal file
@@ -0,0 +1,69 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.db.models import Activity, ActivityStatus, HealthState, SyncUser
|
||||
|
||||
|
||||
class UserRepository:
|
||||
def __init__(self, session: Session) -> None:
|
||||
self.session = session
|
||||
|
||||
def create(self, **values) -> SyncUser:
|
||||
user = SyncUser(**values)
|
||||
self.session.add(user)
|
||||
self.session.commit()
|
||||
return user
|
||||
|
||||
def get(self, user_id: int) -> SyncUser | None:
|
||||
return self.session.get(SyncUser, user_id)
|
||||
|
||||
def list_enabled(self) -> list[SyncUser]:
|
||||
return list(self.session.scalars(select(SyncUser).where(SyncUser.enabled.is_(True)).order_by(SyncUser.id)))
|
||||
|
||||
|
||||
class ActivityRepository:
|
||||
def __init__(self, session: Session) -> None:
|
||||
self.session = session
|
||||
|
||||
def get_or_create_discovered(
|
||||
self,
|
||||
*,
|
||||
user_id: int,
|
||||
mywhoosh_activity_id: str,
|
||||
activity_name: str,
|
||||
activity_timestamp: datetime | None,
|
||||
) -> tuple[Activity, bool]:
|
||||
existing = self.session.scalar(
|
||||
select(Activity).where(
|
||||
Activity.user_id == user_id,
|
||||
Activity.mywhoosh_activity_id == mywhoosh_activity_id,
|
||||
)
|
||||
)
|
||||
if existing is not None:
|
||||
return existing, False
|
||||
activity = Activity(
|
||||
user_id=user_id,
|
||||
mywhoosh_activity_id=mywhoosh_activity_id,
|
||||
activity_name=activity_name,
|
||||
activity_timestamp=activity_timestamp,
|
||||
status=ActivityStatus.DISCOVERED,
|
||||
last_completed_stage=ActivityStatus.DISCOVERED,
|
||||
)
|
||||
self.session.add(activity)
|
||||
try:
|
||||
self.session.commit()
|
||||
except IntegrityError:
|
||||
self.session.rollback()
|
||||
existing = self.session.scalar(
|
||||
select(Activity).where(
|
||||
Activity.user_id == user_id,
|
||||
Activity.mywhoosh_activity_id == mywhoosh_activity_id,
|
||||
)
|
||||
)
|
||||
if existing is None:
|
||||
raise
|
||||
return existing, False
|
||||
return activity, True
|
||||
Reference in New Issue
Block a user