Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 83 |
| GoogleAPIService | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
420.00 | |
0.00% |
0 / 83 |
| __construct | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 2 |
|||
| __clone | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 2 |
|||
| getInstance | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 5 |
|||
| addGoogleApiAccessToken | |
0.00% |
0 / 1 |
56.00 | |
0.00% |
0 / 26 |
|||
| getLastCreatedAccessToken | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 18 |
|||
| shareFile | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 19 |
|||
| getGoogleApiClient | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 11 |
|||
| <?php | |
| namespace com\linways\core\ams\professional\service; | |
| use com\linways\core\ams\professional\exception\ProfessionalException; | |
| use com\linways\core\ams\professional\request\AddGoogleApiAccessTokenRequest; | |
| use com\linways\core\ams\professional\request\GetPublicUrlRequest; | |
| use com\linways\core\ams\professional\request\ShareGoogleDriveFileRequest; | |
| /** | |
| * | |
| * @Date 20/04/20 | |
| * @author JithinVijayan <jithin@linways.com> | |
| */ | |
| class GoogleAPIService extends BaseService | |
| { | |
| /** | |
| * Presence of a static member variable | |
| * | |
| * @var null | |
| */ | |
| private static $_instance = null; | |
| /** | |
| * Mapper variable | |
| * @var array | |
| */ | |
| private $mapper = []; | |
| /** | |
| * Initialise mapper, logger, hooks here | |
| * | |
| * ReportGenderService constructor. | |
| */ | |
| private function __construct() | |
| { | |
| // $this->mapper = MapperService::getInstance()->getMapper(); | |
| } | |
| /** | |
| * Prevent any object or instance of that class to be cloned | |
| */ | |
| private function __clone() | |
| { | |
| } | |
| /** | |
| * Have a single globally accessible static method | |
| * | |
| * @return GoogleAPIService|null | |
| */ | |
| public static function getInstance() | |
| { | |
| if (!is_object(self::$_instance)) | |
| self::$_instance = new self (); | |
| return self::$_instance; | |
| } | |
| /** | |
| * Storing google api access tokens | |
| * | |
| * @param AddGoogleApiAccessTokenRequest $request | |
| * @return Object | |
| * @throws ProfessionalException | |
| */ | |
| public function addGoogleApiAccessToken(AddGoogleApiAccessTokenRequest $request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| if (!empty($request->expirationTime)) { | |
| $request->expirationTime = date('Y-m-d H:i:s', $request->expirationTime); | |
| } | |
| if (empty($request->userId)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_USER_ID, "Invalid user details given"); | |
| } | |
| if (empty($request->userType)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_USER_TYPE, "Invalid user details given"); | |
| } | |
| if (empty($request->feature)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Google feature not mentioned"); | |
| } | |
| if (empty($request->accessToken)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid access token given"); | |
| } | |
| $sql = "INSERT INTO google_api_access_tokens (user_id, user_type, feature, access_token, created_date, expiration_date) | |
| VALUES ($request->userId,'$request->userType','$request->feature','$request->accessToken',UTC_TIMESTAMP(), | |
| '$request->expirationTime')"; | |
| try { | |
| return $this->executeQueryForObject($sql, true); | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Returns last created token of user | |
| * | |
| * @param $userId | |
| * @param $userType | |
| * @return string | |
| * @throws ProfessionalException | |
| */ | |
| public function getLastCreatedAccessToken($userId, $userType) | |
| { | |
| $userId = (int)$this->realEscapeString($userId); | |
| $userType = $this->realEscapeString($userType); | |
| if (empty($userId)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_USER_ID, "Invalid user details given"); | |
| } | |
| if (empty($userType)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_USER_TYPE, "Invalid user details given"); | |
| } | |
| $sql = "SELECT access_token as token FROM google_api_access_tokens | |
| WHERE user_type = '$userType' AND user_id = $userId AND CURRENT_TIMESTAMP()<expiration_date | |
| ORDER BY created_date DESC"; | |
| try { | |
| return $this->executeQueryFOrObject($sql)->token; | |
| } catch (\Exception $e) { | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Sharing google drive files | |
| * | |
| * @param ShareGoogleDriveFileRequest $request | |
| * @return \Google_Service_Drive_Permission | |
| * @throws ProfessionalException | |
| */ | |
| public function shareFile(ShareGoogleDriveFileRequest $request) | |
| { | |
| $request = $this->realEscapeObject($request); | |
| if (empty($request->documentId)) { | |
| throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid document details given"); | |
| } | |
| try { | |
| $client = $this->getGoogleApiClient($request->userId, $request->userType); | |
| $service = new \Google_Service_Drive($client); | |
| $permission = new \Google_Service_Drive_Permission(); | |
| $permission->setType($request->permission); | |
| $permission->setRole($request->role); | |
| return $service->permissions->create($request->documentId, $permission); | |
| } catch (\Exception $e) { | |
| if ($e->getCode() === 403) { | |
| throw new ProfessionalException(ProfessionalException::INSUFFICIENT_PERMISSION, "You dont have enough permission to make this file publicly available."); | |
| } | |
| throw new ProfessionalException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * @param $userId | |
| * @param $userType | |
| * @return \Google_Client | |
| * @throws ProfessionalException | |
| */ | |
| private function getGoogleApiClient($userId, $userType) | |
| { | |
| $clientId = $GLOBALS['GDRIVE_CLIENT_ID']; | |
| $developerKey = $GLOBALS['GDRIVE_DEVELOPER_KEY']; | |
| $accessToken = $this->getLastCreatedAccessToken($userId, $userType); | |
| $client = new \Google_Client(); | |
| $client->setScopes(\Google_Service_Drive::DRIVE); | |
| $client->setClientId($clientId); | |
| $client->setDeveloperKey($developerKey); | |
| $client->setAccessToken($accessToken); | |
| // $client->setAccessType('online'); | |
| // if ($client->isAccessTokenExpired()) { | |
| // throw new ProfessionalException(ProfessionalException::ACCESS_TOKEN_EXPIRED, "Your access token is expired. Login with google to continue this process"); | |
| // } | |
| return $client; | |
| } | |
| } |