krz/hutch-notify

Notification server for Hutch.

clone: git clone https://gitbay.org/krz/hutch-notify.git

main: app/crud.py · raw

 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()