From 6ef3f1c6f7aff49e2c2734e656c0dd814b6b9462 Mon Sep 17 00:00:00 2001 From: Alix JEUDI--LEMOINE Date: Tue, 17 Jun 2025 23:09:35 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Added=20a=20router=20for=20push=20n?= =?UTF-8?q?otifications,=20including=20user=20subscription=20functionality?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/main.py | 5 ++-- app/routes/push.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 app/routes/push.py diff --git a/app/main.py b/app/main.py index ee41ead..e7a27cd 100644 --- a/app/main.py +++ b/app/main.py @@ -8,7 +8,7 @@ from app.routes.users import users_router from app.routes.pins import pins_router from app.routes.images import images_router from app.routes.admin import admin_router - +from app.routes.push import push_router # FastAPI app instance app = FastAPI( @@ -38,4 +38,5 @@ app.include_router(friends_router) app.include_router(users_router) app.include_router(pins_router) app.include_router(images_router) -app.include_router(admin_router) \ No newline at end of file +app.include_router(admin_router) +app.include_router(push_router) \ No newline at end of file diff --git a/app/routes/push.py b/app/routes/push.py new file mode 100644 index 0000000..f6089ad --- /dev/null +++ b/app/routes/push.py @@ -0,0 +1,57 @@ +# Push notifications +from fastapi import APIRouter, Depends, HTTPException, status, Body +import pymongo + +import app.config as config +from app.models import User, HTTPError, PushSubscription +from app.routes.utils import get_current_user + +# Database setup +client = pymongo.MongoClient(config.MONGODB_URL, username=config.MONGODB_USERNAME, password=config.MONGODB_PASSWORD) +db = client[config.MONGODB_DATABASE] + +users_collection = db["users"] + +push_router = APIRouter( + tags=["Push"] +) + +@push_router.post( + path="/push/subscribe", + responses={401: {"model": HTTPError}} +) +async def subscribe(subscription: PushSubscription, current_user: User = Depends(get_current_user)): + user_exists = users_collection.find_one({"username": current_user.username}) + if not user_exists: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="User not found" + ) + + # Convert the subscription to a JSON string + subscription_str = subscription.model_dump_json() + + # Check if the subscription is already in the database + if users_collection.find_one({"push_subscriptions": subscription_str}): + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Subscription already exists" + ) + + # Check if already has a subscription + if user_exists.get("push_subscriptions"): + # Add another subscription + users_collection.update_one( + {"username": current_user.username}, + {"$push": {"push_subscriptions": subscription_str}} + ) + else: + # Add the subscription + users_collection.update_one( + {"username": current_user.username}, + {"$set": {"push_subscriptions": [subscription_str]}} + ) + + return { + "message": "Push subscription successful" + }