public function process(File $file) { if (null == $file->getGoogleId() || $file->isOperationCreate()) { // create new file $response = $this->googleDriveApi->insertFile($file); // update file with googleId $file->setGoogleId($response['id']); $this->logger->info("File created", ['file' => $file->toArray(), 'response' => $response]); } else { // overwrite existing file try { $response = $this->googleDriveApi->updateFile($file); $this->logger->info("File updated", ['file' => $file->toArray(), 'response' => $response]); } catch (BadResponseException $e) { $statusCode = $e->getResponse()->getStatusCode(); if ($statusCode == 404) { // file not found - create new one and issue a warning $response = $this->googleDriveApi->insertFile($file); $file->setGoogleId($response['id']); $this->logger->info("File not found, created new one", ['file' => $file->toArray(), 'response' => $response]); } else { throw $e; } } } return $file; }
public function process(File $file) { if (null == $file->getGoogleId() || $file->isOperationCreate()) { // create new file $fileRes = $this->googleDriveApi->insertFile($file); // get list of worksheets in file, there shall be only one $sheets = $this->googleDriveApi->getWorksheets($fileRes['id']); $sheet = array_shift($sheets); // update file $file->setGoogleId($fileRes['id']); $file->setSheetId($sheet['wsid']); $this->logger->info("Sheet created", ['file' => $file->toArray()]); } else { if ($file->isOperationUpdate()) { if (null == $file->getSheetId()) { // create new sheet in existing file $response = $this->googleDriveApi->createWorksheet($file); $crawler = new Crawler($response->getBody()->getContents()); $uriArr = explode('/', $crawler->filter('default|id')->text()); $file->setSheetId(array_pop($uriArr)); $this->logger->info("Sheet created in existing file", ['file' => $file->toArray()]); } else { // update content of existing file try { // update metadata first - cols and rows count $this->googleDriveApi->updateWorksheet($file); $this->logger->debug("Worksheet metadata updated", ['file' => $file->toArray()]); // update cells content $timestart = microtime(true); $status = $this->googleDriveApi->updateCells($file); $timeend = microtime(true); $apiCallDuration = $timeend - $timestart; if (count($status['errors'])) { $this->logger->warning("Some cells might not be imported properly", ['errors' => $status['errors']]); } $this->logger->debug("Cells updated", ['file' => $file->toArray(), 'apiCallDuration' => $apiCallDuration, 'status' => $status]); } catch (RequestException $e) { $statusCode = $e->getResponse()->getStatusCode(); if ($statusCode >= 500 && $statusCode < 600) { throw new UserException(sprintf("Google Drive Server Error: %s - %s. Please try again later.", $statusCode, $e->getResponse()->getReasonPhrase()), $e, ['file' => $file->toArray()]); } throw new UserException("Cells update failed: " . $e->getMessage(), $e, ['file' => $file->toArray()]); } $this->logger->info("Sheet updated", ['file' => $file->toArray()]); } } else { // @TODO: append sheet } } return $file; }
private function insertResumable(File $file) { $convert = $file->getType() == File::TYPE_SHEET ? 'true' : 'false'; $title = $file->isOperationCreate() ? $file->getTitle() . ' (' . date('Y-m-d H:i:s') . ')' : $file->getTitle(); $url = sprintf('%s?uploadType=resumable', self::FILE_UPLOAD); $body = ['name' => $title]; if ($convert) { $body['mimeType'] = 'application/vnd.google-apps.spreadsheet'; } if ($file->getTargetFolder()) { $url .= '&addParents=' . $file->getTargetFolder(); } $response = $this->api->request($url, 'POST', ['Content-Type' => 'application/json; charset=UTF-8', 'Content-Length' => mb_strlen(serialize($body), '8bit'), 'X-Upload-Content-Type' => 'text/csv', 'X-Upload-Content-Length' => $file->getSize()], ['json' => $body]); $locationUri = $response->getHeaderLine('Location'); return $this->putFile($file, $locationUri); }