summaryrefslogtreecommitdiff
path: root/app/crud.py
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-08 14:29:21 -0500
committerChristian Cleberg <[email protected]>2026-04-08 14:29:21 -0500
commita7c25076d16bde9ec928b9ef01bce952406ea7b1 (patch)
tree802c5f84902f240c6aab95acc1e6348dfbd806c2 /app/crud.py
downloadhutch-notify-a7c25076d16bde9ec928b9ef01bce952406ea7b1.tar.gz
hutch-notify-a7c25076d16bde9ec928b9ef01bce952406ea7b1.tar.bz2
hutch-notify-a7c25076d16bde9ec928b9ef01bce952406ea7b1.zip
initial commit
Diffstat (limited to 'app/crud.py')
-rw-r--r--app/crud.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/app/crud.py b/app/crud.py
new file mode 100644
index 0000000..424cbfe
--- /dev/null
+++ b/app/crud.py
@@ -0,0 +1,55 @@
+from datetime import datetime
+from sqlalchemy import select, delete
+from sqlalchemy.ext.asyncio import AsyncSession
+from app.models import Device, Subscription, Event, Delivery
+from app.schemas import DeviceRegisterIn, SubscriptionUpsertIn
+
+
+async def upsert_device(db: AsyncSession, payload: DeviceRegisterIn) -> Device:
+ stmt = select(Device).where(
+ Device.apns_token == payload.apns_token,
+ Device.bundle_id == payload.bundle_id,
+ )
+ result = await db.execute(stmt)
+ device = result.scalar_one_or_none()
+
+ if device is None:
+ device = Device(
+ user_id=payload.user_id,
+ apns_token=payload.apns_token,
+ apns_env=payload.apns_env,
+ bundle_id=payload.bundle_id,
+ platform=payload.platform,
+ app_version=payload.app_version,
+ device_name=payload.device_name,
+ is_enabled=True,
+ last_seen_at=datetime.utcnow(),
+ )
+ db.add(device)
+ else:
+ device.user_id = payload.user_id
+ device.apns_env = payload.apns_env
+ device.platform = payload.platform
+ device.app_version = payload.app_version
+ device.device_name = payload.device_name
+ device.is_enabled = True
+ device.last_seen_at = datetime.utcnow()
+
+ await db.commit()
+ await db.refresh(device)
+ return device
+
+
+async def replace_subscriptions(db: AsyncSession, payload: SubscriptionUpsertIn) -> None:
+ await db.execute(delete(Subscription).where(Subscription.device_id == payload.device_id))
+ for item in payload.subscriptions:
+ db.add(
+ Subscription(
+ device_id=payload.device_id,
+ source_type=item.source_type,
+ source_id=item.source_id,
+ event_type=item.event_type,
+ is_enabled=item.is_enabled,
+ )
+ )
+ await db.commit()