todo_chatbot / src /api /push.py
Awais68
Deploy FastAPI backend with MCP and OpenAI agents
cccf200
Raw
History Blame Contribute Delete
3.3 kB
"""
Push notification registration API endpoint.
"""
from fastapi import APIRouter, Depends, HTTPException, status
from sqlmodel import Session, select
from src.db.session import get_session
from src.models.push_subscription import (
PushSubscription,
PushSubscriptionCreate,
PushSubscriptionResponse
)
from src.models.user import User
from src.middleware.auth import get_current_user
from datetime import datetime
router = APIRouter(prefix="/push", tags=["push"])
@router.post("/subscribe", response_model=PushSubscriptionResponse, status_code=status.HTTP_201_CREATED)
def subscribe_push_notifications(
subscription_data: PushSubscriptionCreate,
session: Session = Depends(get_session),
current_user: User = Depends(get_current_user)
):
"""
Register or update push notification subscription.
Args:
subscription_data: Push subscription data
session: Database session
current_user: Authenticated user
Returns:
PushSubscriptionResponse: Created or updated subscription
"""
# Check if subscription already exists for this endpoint
existing_subscription = session.exec(
select(PushSubscription).where(PushSubscription.endpoint == subscription_data.endpoint)
).first()
if existing_subscription:
# Update existing subscription
existing_subscription.p256dh = subscription_data.keys.get("p256dh", "")
existing_subscription.auth = subscription_data.keys.get("auth", "")
existing_subscription.updated_at = datetime.utcnow()
session.add(existing_subscription)
session.commit()
session.refresh(existing_subscription)
return PushSubscriptionResponse(
id=existing_subscription.id,
endpoint=existing_subscription.endpoint,
created_at=existing_subscription.created_at
)
# Create new subscription
subscription = PushSubscription(
user_id=current_user.id,
endpoint=subscription_data.endpoint,
p256dh=subscription_data.keys.get("p256dh", ""),
auth=subscription_data.keys.get("auth", "")
)
session.add(subscription)
session.commit()
session.refresh(subscription)
return PushSubscriptionResponse(
id=subscription.id,
endpoint=subscription.endpoint,
created_at=subscription.created_at
)
@router.delete("/unsubscribe/{endpoint}")
def unsubscribe_push_notifications(
endpoint: str,
session: Session = Depends(get_session),
current_user: User = Depends(get_current_user)
):
"""
Unsubscribe from push notifications.
Args:
endpoint: Push subscription endpoint to remove
session: Database session
current_user: Authenticated user
Raises:
HTTPException: If subscription not found
"""
subscription = session.exec(
select(PushSubscription).where(
PushSubscription.endpoint == endpoint,
PushSubscription.user_id == current_user.id
)
).first()
if not subscription:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Subscription not found"
)
session.delete(subscription)
session.commit()
return {"message": "Successfully unsubscribed"}