krz/hutch-notify
Notification server for Hutch.
clone: git clone https://gitbay.org/krz/hutch-notify.git
1from datetime import datetime
2from sqlalchemy import select, delete
3from sqlalchemy.ext.asyncio import AsyncSession
4from app.models import Device, Subscription, Event, Delivery
5from app.schemas import DeviceRegisterIn, SubscriptionUpsertIn
6
7
8async def upsert_device(db: AsyncSession, payload: DeviceRegisterIn) -> Device:
9 stmt = select(Device).where(
10 Device.apns_token == payload.apns_token,
11 Device.bundle_id == payload.bundle_id,
12 )
13 result = await db.execute(stmt)
14 device = result.scalar_one_or_none()
15
16 if device is None:
17 device = Device(
18 user_id=payload.user_id,
19 apns_token=payload.apns_token,
20 apns_env=payload.apns_env,
21 bundle_id=payload.bundle_id,
22 platform=payload.platform,
23 app_version=payload.app_version,
24 device_name=payload.device_name,
25 is_enabled=True,
26 last_seen_at=datetime.utcnow(),
27 )
28 db.add(device)
29 else:
30 device.user_id = payload.user_id
31 device.apns_env = payload.apns_env
32 device.platform = payload.platform
33 device.app_version = payload.app_version
34 device.device_name = payload.device_name
35 device.is_enabled = True
36 device.last_seen_at = datetime.utcnow()
37
38 await db.commit()
39 await db.refresh(device)
40 return device
41
42
43async def replace_subscriptions(db: AsyncSession, payload: SubscriptionUpsertIn) -> None:
44 await db.execute(delete(Subscription).where(Subscription.device_id == payload.device_id))
45 for item in payload.subscriptions:
46 db.add(
47 Subscription(
48 device_id=payload.device_id,
49 source_type=item.source_type,
50 source_id=item.source_id,
51 event_type=item.event_type,
52 is_enabled=item.is_enabled,
53 )
54 )
55 await db.commit()