/**
  * refresh OAuth token
  * @param ShopInterface $shop
  * @return TokenInterface
  * @throws Exception
  */
 public function refresh(ShopInterface $shop)
 {
     if (!$this->client) {
         throw new Exception('No client specified');
     }
     $token = $shop->getToken();
     $refreshToken = $token->getRefreshToken();
     try {
         $this->client->setRefreshToken($refreshToken);
         $newToken = $this->client->refreshTokens();
         $token->setExpiresAt(new \DateTime('+' . (int) $newToken['expires_in'] . ' seconds'));
         $token->setAccessToken($newToken['access_token']);
         $token->setRefreshToken($newToken['refresh_token']);
         $this->manager->save($token);
     } catch (ClientException $ex) {
         throw new Exception('', 0, $ex);
     }
     return $token;
 }
 /**
  * shop installed an upgraded version
  * @param UpgradeEvent $event
  * @return bool
  */
 public function onUpgrade(UpgradeEvent $event)
 {
     $shop = $this->getShopByEvent($event);
     if (!$shop) {
         return false;
     }
     // todo: refactor this on major change: push application object thru event
     $appData = $event->getApplication();
     $app = new Application($event->getApplicationName(), $appData['app_id'], $appData['app_secret'], $appData['appstore_secret'], null, $this->skipSsl);
     $app->setUserAgent($appData['user_agent']);
     $this->tokenRefresher->setClient($app->getClient($shop));
     $this->tokenRefresher->refresh($shop);
     $shop->setVersion($event->getPayload()['application_version']);
     $this->objectManager->save($shop);
 }