You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							128 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							128 lines
						
					
					
						
							5.5 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Gokul PI (<https://www.cybrosys.com>)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU LESSER
							 | 
						|
								#    GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#    This program is distributed in the hope that it will be useful,
							 | 
						|
								#    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								#    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
							 | 
						|
								#    (LGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								#############################################################################
							 | 
						|
								import json
							 | 
						|
								from odoo import http
							 | 
						|
								from odoo.http import request
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class MailPushNotification(http.Controller):
							 | 
						|
								    """Controller for handling push notifications using Firebase
							 | 
						|
								    Cloud Messaging"""
							 | 
						|
								
							 | 
						|
								    @http.route('/firebase-messaging-sw.js', type='http', auth="public")
							 | 
						|
								    def firebase_http(self):
							 | 
						|
								        """Returns the Firebase service worker script.
							 | 
						|
								        :return: The Firebase service worker script.
							 | 
						|
								        :rtype: str"""
							 | 
						|
								        if request.env.company and request.env.company.push_notification:
							 | 
						|
								            firebase_js = """
							 | 
						|
								            this.addEventListener('fetch', function(e) {
							 | 
						|
								              e.respondWith(
							 | 
						|
								                caches.match(e.request).then(function(response) {
							 | 
						|
								                  return response || fetch(e.request);
							 | 
						|
								                })
							 | 
						|
								              );
							 | 
						|
								            });
							 | 
						|
								            importScripts('https://www.gstatic.com/firebasejs/8.4.2/firebase-app.js');
							 | 
						|
								            importScripts('https://www.gstatic.com/firebasejs/8.4.2/firebase-messaging.js');
							 | 
						|
								            var firebaseConfig = {
							 | 
						|
								                apiKey: '%s',
							 | 
						|
								                authDomain: '%s',
							 | 
						|
								                projectId: '%s',
							 | 
						|
								                storageBucket: '%s',
							 | 
						|
								                messagingSenderId: '%s',
							 | 
						|
								                appId: '%s',
							 | 
						|
								                measurementId: '%s',
							 | 
						|
								            };
							 | 
						|
								            firebase.initializeApp(firebaseConfig);
							 | 
						|
								            const messaging = firebase.messaging();
							 | 
						|
								            messaging.setBackgroundMessageHandler(function(payload) {
							 | 
						|
								            const notificationTitle = "Background Message Title";
							 | 
						|
								            const notificationOptions = {
							 | 
						|
								                body: payload.notification.body,
							 | 
						|
								                icon:'/mail_push_notification/static/description/icon.png',
							 | 
						|
								            };
							 | 
						|
								            return self.registration.showNotification(
							 | 
						|
								                notificationTitle,
							 | 
						|
								                notificationOptions,
							 | 
						|
								            );
							 | 
						|
								            });
							 | 
						|
								            """ % (
							 | 
						|
								                request.env.company.api_key, request.env.company.auth_domain,
							 | 
						|
								                request.env.company.project_id_firebase,
							 | 
						|
								                request.env.company.storage_bucket,
							 | 
						|
								                request.env.company.messaging_sender_id_firebase,
							 | 
						|
								                request.env.company.app_id_firebase,
							 | 
						|
								                request.env.company.measurement_id_firebase)
							 | 
						|
								        else:
							 | 
						|
								            firebase_js = """
							 | 
						|
								                this.addEventListener('fetch', function(e) {
							 | 
						|
								                  e.respondWith(
							 | 
						|
								                    caches.match(e.request).then(function(response) {
							 | 
						|
								                      return response || fetch(e.request);
							 | 
						|
								                    })
							 | 
						|
								                  );
							 | 
						|
								                });
							 | 
						|
								            """
							 | 
						|
								        return http.request.make_response(firebase_js, [
							 | 
						|
								            ('Content-Type', 'text/javascript')])
							 | 
						|
								
							 | 
						|
								    @http.route('/push_notification', type='http', auth="public",
							 | 
						|
								                csrf=False)
							 | 
						|
								    def get_registration_tokens(self, **post):
							 | 
						|
								        """Handles registration tokens for push notifications.
							 | 
						|
								         Create a new registration token if it doesn't already exist
							 | 
						|
								        :param post: POST request data containing registration token.
							 | 
						|
								        :type post: dict
							 | 
						|
								       """
							 | 
						|
								        user_notification = request.env['push.notification'].sudo().search(
							 | 
						|
								            [('register_id', '=', post.get('name'))], limit=1)
							 | 
						|
								        if not user_notification:
							 | 
						|
								            request.env['push.notification'].sudo().create({
							 | 
						|
								                'register_id': post.get('name'),
							 | 
						|
								                'user_id': request.env.user.id
							 | 
						|
								            })
							 | 
						|
								
							 | 
						|
								    @http.route('/firebase_config_details', type='json', auth="public")
							 | 
						|
								    def send_datas(self):
							 | 
						|
								        """Sends Firebase configuration details.
							 | 
						|
								        :return: JSON containing Firebase configuration details.
							 | 
						|
								        :rtype: str"""
							 | 
						|
								        if request.env.company and request.env.company.push_notification:
							 | 
						|
								            return json.dumps({
							 | 
						|
								                'vapid': request.env.company.vapid,
							 | 
						|
								                'config': {
							 | 
						|
								                    'apiKey': request.env.company.api_key,
							 | 
						|
								                    'authDomain': request.env.company.auth_domain,
							 | 
						|
								                    'projectId': request.env.company.project_id_firebase,
							 | 
						|
								                    'storageBucket': request.env.company.storage_bucket,
							 | 
						|
								                    'messagingSenderId': request.env.company.messaging_sender_id_firebase,
							 | 
						|
								                    'appId': request.env.company.app_id_firebase,
							 | 
						|
								                    'measurementId': request.env.company.measurement_id_firebase
							 | 
						|
								                }
							 | 
						|
								            })
							 | 
						|
								
							 | 
						|
								    @http.route('/firebase_credentials', type="json", auth="public")
							 | 
						|
								    def firebase_credentials(self, **kw):
							 | 
						|
								        """ Retrieve Firebase credentials for the current company."""
							 | 
						|
								        return {'id': request.env.company.id,
							 | 
						|
								                'push_notification': request.env.company.push_notification}
							 |