feat: fcm apis
feat: push notification api
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
from logging import Logger
|
||||
from database import get_db
|
||||
from sqlalchemy.orm import Session
|
||||
from firebase_admin import messaging
|
||||
|
||||
from models import Notifications, Users, Fcm
|
||||
from interface.common_response import CommonResponse
|
||||
from schemas.ResponseSchemas import NotificationResponse
|
||||
from exceptions.resource_not_found_exception import ResourceNotFoundException
|
||||
|
||||
class NotificationServices:
|
||||
def __init__(self):
|
||||
self.db:Session = next(get_db())
|
||||
|
||||
def createNotification(self, title, message, sender_id, receiver_id):
|
||||
# validate sender and receiver
|
||||
sender = self.db.query(Users).filter(Users.id == sender_id).first()
|
||||
receiver = self.db.query(Users).filter(Users.id == receiver_id).first()
|
||||
|
||||
if not sender or not receiver:
|
||||
raise ResourceNotFoundException("Sender or receiver not found")
|
||||
|
||||
notification = Notifications(title=title, message=message, sender_id=sender_id, receiver_id=receiver_id)
|
||||
self.db.add(notification)
|
||||
self.db.commit()
|
||||
return True
|
||||
|
||||
def getNotifications(self, user_id, limit: int, offset: int):
|
||||
notifications = self.db.query(Notifications).filter(Notifications.receiver_id == user_id).limit(limit).offset(offset).all()
|
||||
total = self.db.query(Notifications).filter(Notifications.receiver_id == user_id).count()
|
||||
|
||||
response = CommonResponse(data=[NotificationResponse(**notification.__dict__.copy()) for notification in notifications], total=total)
|
||||
|
||||
return response
|
||||
|
||||
def deleteNotification(self, notification_id):
|
||||
notification = self.db.query(Notifications).filter(Notifications.id == notification_id).first()
|
||||
|
||||
if not notification:
|
||||
raise ResourceNotFoundException("Notification not found")
|
||||
|
||||
self.db.delete(notification)
|
||||
self.db.commit()
|
||||
return True
|
||||
|
||||
def updateNotificationStatus(self, notification_id):
|
||||
notification = self.db.query(Notifications).filter(Notifications.id == notification_id).first()
|
||||
|
||||
if not notification:
|
||||
raise ResourceNotFoundException("Notification not found")
|
||||
|
||||
notification.is_read = not notification.is_read
|
||||
self.db.commit()
|
||||
return True
|
||||
|
||||
def createOrUpdateFCMToken(self,user_id,token):
|
||||
fcm = self.db.query(Fcm).filter(Fcm.token == token).first()
|
||||
|
||||
if fcm is None:
|
||||
fcm = Fcm(user_id=user_id, token=token)
|
||||
self.db.add(fcm)
|
||||
self.db.commit()
|
||||
return True
|
||||
|
||||
fcm.token = token
|
||||
self.db.commit()
|
||||
return True
|
||||
|
||||
def sendPushNotification(self, token:str, payload):
|
||||
try:
|
||||
message = messaging.Message(
|
||||
notification=messaging.Notification(
|
||||
title=payload["title"],
|
||||
body=payload["body"],
|
||||
),
|
||||
data={},
|
||||
token=token,
|
||||
)
|
||||
response = messaging.send(message)
|
||||
return response
|
||||
except:
|
||||
Logger.error("Failed to send push notification")
|
||||
Reference in New Issue
Block a user