Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 79
FCMNotificationService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 5
306.00
0.00% covered (danger)
0.00%
0 / 79
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 __clone
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 getInstance
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 5
 sendFCMNotificationToSingleUser
0.00% covered (danger)
0.00%
0 / 1
156.00
0.00% covered (danger)
0.00%
0 / 65
 sendPushNotification
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 5
<?php
/**
 * User: jithinvijayan
 * Date: 15/03/18
 * Time: 3:23 PM
 */
namespace com\linways\core\ams\professional\service\notification;
use com\linways\core\ams\professional\dto\mobile\MobileLoginUser;
use com\linways\core\ams\professional\dto\notification\FCMNotification;
use com\linways\core\ams\professional\exception\mobile\MobileException;
use com\linways\core\ams\professional\service\BaseService;
use com\linways\core\ams\professional\service\mobile\MobileUserService;
use Unirest;
class FCMNotificationService extends BaseService
{
    private static $_instance = null;
    // /Condition 2 - Locked down the constructor
    private function __construct()
    {
    }
    // Prevent any oustide instantiation of this class
    // /Condition 3 - Prevent any object or instance of that class to be cloned
    private function __clone()
    {
    }
    // Prevent any copy of this object
    // /Condition 4 - Have a single globally accessible static method
    public static function getInstance()
    {
        if (!is_object(self::$_instance)) // or if( is_null(self::$_instance) ) or if( self::$_instance == null )
            self::$_instance = new self();
        return self::$_instance;
    }
    /**
     * create notification structure and fetching fcm tokens from database
     * @param FCMNotification $fcmNotification
     * @return \stdClass
     * @throws MobileException
     */
    public function sendFCMNotificationToSingleUser(FCMNotification $fcmNotification)
    {
        $response = new \stdClass();
        $failed = 0;
        $devices = 0;
        $status = false;
        $fcmNotification = $this->realEscapeObject($fcmNotification);
        $userDetails = $fcmNotification->mobileUser;
        if (empty($userDetails->userId)) {
            throw new MobileException("Invalid User Id", MobileException::INVALID_USER_ID);
        }
        if (empty($userDetails->userType)) {
            throw new MobileException("Invalid user type", MobileException::INVALID_USER_TYPE);
        }
        try {
            $fcmTokens = MobileUserService::getInstance()->getFCMTokenByUserIDandUserType($userDetails->userId, $userDetails->userType);
            if (!empty($fcmTokens)) {
                $nucleusConfigPath = getenv('NUCLEUS_CONF');
                if (empty($nucleusConfigPath)) {
                    throw new MobileException("Nucleus configuration missing", MobileException::NUCLEUS_CONFIGURATIONS_MISSING);
                }
                require_once $nucleusConfigPath;
                global $FCM_SERVER_KEY;
                if (empty($FCM_SERVER_KEY)) {
                    throw new MobileException("FCM Authorization key missing", MobileException::INVALID_AUTHORIZATION_KEY);
                }
                $authorizationKey = $FCM_SERVER_KEY;
                $mainContent = array(
                    "notificationId" => $fcmNotification->id,
                    "message" => $fcmNotification->body,
                    "title" => $fcmNotification->title,
                    "sound" => "default",
                    "notificationURL" => $fcmNotification->url,
                    "channelId" => $fcmNotification->channelId,
                    "label" => $fcmNotification->label,
                    "category" => $fcmNotification->category,
                    "priority" => $fcmNotification->priority,
                    "groupKey" => $fcmNotification->groupKey
                );
                $headers = array();
                $headers["Content-Type"] = 'application/json';
                $headers["Authorization"] = 'key=' . $authorizationKey;
                $devices = sizeof($fcmTokens);
                $postData = array();
                $registrationIds = [];
                foreach ($fcmTokens as $fcmToken) {
                    array_push($registrationIds, $fcmToken->fcm_token);
                }
                $postData['registration_ids'] = $registrationIds;
                $postData['data'] = $mainContent;
                $unirestResponse = $this->sendPushNotification($fcmNotification->fcmSendingURL, $postData, $headers);
                if ($unirestResponse->code != 200 || $unirestResponse->body->failure)
                    ++$failed;
                $status = true;
            }
        } catch (\Exception $e) {
            throw new MobileException($e->getMessage(), $e->getCode());
        }
        if ($failed == $devices || !$status) {
            $response->status = "failed";
        } else {
            $response->status = "success";
            $response->failed = $failed;
        }
        return $response;
    }
    /**
     * Send notification to google cloud messaging system
     * @param string $url url for notification to be send
     * @param array $data notification data part
     * @param array $header notification header part
     * @return Unirest\Response response code unirest response
     * @throws Unirest\Exception
     */
    private function sendPushNotification($url, $data, $header)
    {
        $postData = Unirest\Request\Body::Json($data);
        $response = Unirest\Request::post($url, $header, $postData);
        return $response;
    }
}