JezK
Edit File: Client.php
<?php /** * This file is part of Krizalys' OneDrive SDK for PHP. * * For the full copyright and license information, please view the LICENSE file * that was distributed with this source code. * * @author Christophe Vidal * @copyright 2008-2021 Christophe Vidal (http://www.krizalys.com) * @license https://opensource.org/licenses/BSD-3-Clause 3-Clause BSD License * @link https://github.com/krizalys/onedrive-php-sdk */ namespace Krizalys\Onedrive; use GuzzleHttp\ClientInterface; use Krizalys\Onedrive\Constant\AccessTokenStatus; use Krizalys\Onedrive\Constant\SpecialFolderName; use Krizalys\Onedrive\Definition\ServiceDefinitionInterface; use Krizalys\Onedrive\Proxy\DriveItemProxy; use Krizalys\Onedrive\Proxy\DriveProxy; use Microsoft\Graph\Graph; use Microsoft\Graph\Model; /** * A client interface to communicate with the OneDrive API. * * `Client` instances act as entry points allowing client applications to * perform currently implemented OneDrive operations programmatically. * * For example, assuming you have instantiated a client and the user has logged * successfully and authorized your client application: * * ```php * $client->getRoot()->upload('hello.txt', 'Hello World!'); * ``` * * Applications are managed via the Microsoft identity platform (v2.0); see * {@link https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade "App registrations" in Microsoft Azure}. * * @since 1.0.0 * * @api */ class Client { /** * @var string * The base URL for authorization requests. */ const AUTH_URL = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize'; /** * @var string * The base URL for token requests. */ const TOKEN_URL = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'; /** * @var string * The legacy date/time format. * * @deprecated 2.0.0 Non-standard format. Use ISO-8601 date/times instead. */ const LEGACY_DATETIME_FORMAT = 'Y-m-d\TH:i:sO'; /** * @var string * The client ID. */ private $clientId; /** * @var \Microsoft\Graph\Graph * The Microsoft Graph. */ private $graph; /** * @var \GuzzleHttp\ClientInterface * The Guzzle HTTP client. */ private $httpClient; /** * @var \Krizalys\Onedrive\Definition\ServiceDefinitionInterface * The service definition. */ private $serviceDefinition; /** * @var object * The OAuth state (token, etc...). */ private $state; /** * Constructor. * * @param string $clientId * The client ID. * @param \Microsoft\Graph\Graph $graph * The Microsoft Graph. * @param \GuzzleHttp\ClientInterface $httpClient * The Guzzle HTTP client. * @param mixed $serviceDefinition * The service definition. Not passing a * \Krizalys\Onedrive\Definition\ServiceDefinitionInterface via this * parameter is deprecated and will be disallowed in version 3. * Passing a logger via this parameter is deprecated and will be * disallowed in version 3. * @param mixed[string] $options * The options to use while creating this object. Supported options: * - `'state'` *(object)*: the OneDrive client state, as returned * by `getState()`. Default: `[]`. * * @throws \Exception * Thrown if `$clientId` is `null`. * * @since 1.0.0 */ public function __construct( $clientId, Graph $graph, ClientInterface $httpClient, $serviceDefinition = null, array $options = [] ) { switch (func_num_args()) { case 3: $serviceDefinition = null; break; case 4: if (is_array($serviceDefinition)) { $options = $serviceDefinition; $logger = null; $serviceDefinition = null; } elseif ($serviceDefinition instanceof ServiceDefinitionInterface) { $logger = null; } else { $logger = $serviceDefinition; $serviceDefinition = null; } break; case 5: if ($serviceDefinition instanceof ServiceDefinitionInterface) { $logger = null; } else { $logger = $serviceDefinition; $serviceDefinition = null; } break; } if ($serviceDefinition === null) { $message = 'Not passing a' . ' \Krizalys\Onedrive\Definition\ServiceDefinitionInterface' . ' instance via $serviceDefinition is deprecated and will be' . ' disallowed in version 3; pass this parameter'; @trigger_error($message, E_USER_DEPRECATED); $serviceDefinition = Onedrive::buildServiceDefinition(); } if ($logger !== null) { $message = 'Passing a logger via $serviceDefinition is deprecated' . ' and will be disallowed in version 3; omit this parameter,' . ' or pass null or options instead'; @trigger_error($message, E_USER_DEPRECATED); } if ($clientId === null) { throw new \Exception('The client ID must be set'); } $this->clientId = $clientId; $this->graph = $graph; $this->httpClient = $httpClient; $this->serviceDefinition = $serviceDefinition; $this->state = array_key_exists('state', $options) ? $options['state'] : (object) [ 'redirect_uri' => null, 'token' => null, ]; if ($this->state->token !== null) { $this->graph->setAccessToken($this->state->token->data->access_token); } } /** * Gets the current state of this Client instance. * * Typically saved in the session and passed back to the `Client` * constructor for further requests. * * @return object * The state of this `Client` instance. * * @since 1.0.0 * * @api */ public function getState() { return $this->state; } /** * Gets the URL of the log in form. * * Users should visit this URL in their browser to first be presented a form * where the user is first allowed to log in to their OneDrive account, and * then to grant the requested permissions to the OneDrive application. * * After login, the browser is redirected to the given redirect URI, and a * code is passed as a query string parameter to this URI. * * A user-defined value may also be passed back to this URI as a query * string parameter via the `$state` parameter; see * {@link https://docs.microsoft.com/en-us/azure/active-directory/develop/reply-url#use-a-state-parameter "Use a state parameter" in Microsoft Azure documentation} * for example use * cases. * * The browser is also directly redirected to the given redirect URI if the * user is already logged in. * * @param string[] $scopes * The OneDrive scopes requested by the application. Supported * values: * - `'offline_access'` ; * - `'files.read'` ; * - `'files.read.all'` ; * - `'files.readwrite'` ; * - `'files.readwrite.all'`. * @param string $redirectUri * The URI to which to redirect to upon successful log in. * @param string $state * The state to pass as a query string value to the redirect URI * upon successful log in. * * @return string * The log in URL. * * @since 1.0.0 * * @api */ public function getLogInUrl(array $scopes, $redirectUri, $state = null) { $redirectUri = (string) $redirectUri; $this->state->redirect_uri = $redirectUri; $values = [ 'client_id' => $this->clientId, 'response_type' => 'code', 'redirect_uri' => $redirectUri, 'scope' => implode(' ', $scopes), 'response_mode' => 'query', ]; if ($state !== null) { $values['state'] = (string) $state; } $query = http_build_query($values, '', '&', PHP_QUERY_RFC3986); // When visiting this URL and authenticating successfully, the agent is // redirected to the redirect URI, with a code passed in the query // string (the name of the variable is "code"). This is suitable for // PHP. return self::AUTH_URL . "?$query"; } /** * Gets the access token expiration delay. * * @return int * The token expiration delay, in seconds. * * @since 1.0.0 * * @api */ public function getTokenExpire() { return $this->state->token->obtained + $this->state->token->data->expires_in - time(); } /** * Gets the status of the current access token. * * See {@see \Krizalys\Onedrive\Constant\AccessTokenStatus * AccessTokenStatus} for the possible values returned. * * @return int * The status of the current access token. * * @since 1.0.0 * * @api */ public function getAccessTokenStatus() { if ($this->state->token === null) { return AccessTokenStatus::MISSING; } $remaining = $this->getTokenExpire(); if ($remaining <= 0) { return AccessTokenStatus::EXPIRED; } if ($remaining <= 60) { return AccessTokenStatus::EXPIRING; } return AccessTokenStatus::VALID; } /** * Obtains a new access token from OAuth. * * This token is valid for one hour. * * @param string $clientSecret * The OneDrive client secret. * @param string $code * The code returned by OneDrive after successful log in. * * @throws \Exception * Thrown if the redirect URI of this `Client` instance's state is * not set. * @throws \Exception * Thrown if the HTTP response body cannot be JSON-decoded. * * @since 1.0.0 * * @api */ public function obtainAccessToken($clientSecret, $code) { if ($this->state->redirect_uri === null) { throw new \Exception( 'The state\'s redirect URI must be set to call' . ' obtainAccessToken()' ); } $values = [ 'client_id' => $this->clientId, 'redirect_uri' => $this->state->redirect_uri, 'client_secret' => (string) $clientSecret, 'code' => (string) $code, 'grant_type' => 'authorization_code', ]; $response = $this->httpClient->post( self::TOKEN_URL, ['form_params' => $values] ); $body = (string) $response->getBody(); $data = json_decode($body); if ($data === null) { throw new \Exception('json_decode() failed'); } $this->state->redirect_uri = null; $this->state->token = (object) [ 'obtained' => time(), 'data' => $data, ]; $this->graph->setAccessToken($this->state->token->data->access_token); } /** * Renews the access token from OAuth. * * This token is valid for one hour. * * @param string $clientSecret * The client secret. * * @since 1.1.0 * * @api */ public function renewAccessToken($clientSecret) { if ($this->state->token->data->refresh_token === null) { throw new \Exception( 'The refresh token is not set or no permission for' . ' \'offline_access\' was given to renew the token' ); } $values = [ 'client_id' => $this->clientId, 'client_secret' => $clientSecret, 'grant_type' => 'refresh_token', 'refresh_token' => $this->state->token->data->refresh_token, ]; $response = $this->httpClient->post( self::TOKEN_URL, ['form_params' => $values] ); $body = (string) $response->getBody(); $data = json_decode($body); if ($data === null) { throw new \Exception('json_decode() failed'); } $this->state->token = (object) [ 'obtained' => time(), 'data' => $data, ]; $this->graph->setAccessToken($this->state->token->data->access_token); } /** * Gets the current user's drive. * * @return \Krizalys\Onedrive\Proxy\DriveProxy[] * The drives. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/drive_list?view=odsp-graph-online#list-the-current-users-drives * List the current user's drives */ public function getDrives() { $driveLocator = '/me/drives'; $endpoint = "$driveLocator"; $response = $this ->graph ->createCollectionRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $drives = $response->getResponseAsObject(Model\Drive::class); if (!is_array($drives)) { return []; } return array_map(function (Model\Drive $drive) { return new DriveProxy( $this->graph, $drive, $this->serviceDefinition->getResourceDefinition('driveItem') ); }, $drives); } /** * Gets the signed in user's drive. * * @return \Krizalys\Onedrive\Proxy\DriveProxy * The drive. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/drive_get?view=odsp-graph-online#get-current-users-onedrive * Get current user's OneDrive */ public function getMyDrive() { $driveLocator = '/me/drive'; $endpoint = "$driveLocator"; $response = $this ->graph ->createRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $drive = $response->getResponseAsObject(Model\Drive::class); return new DriveProxy( $this->graph, $drive, $this->serviceDefinition->getResourceDefinition('driveItem') ); } /** * Gets a drive by ID. * * @param string $driveId * The drive ID. * * @return \Krizalys\Onedrive\Proxy\DriveProxy * The drive. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/drive_get?view=odsp-graph-online#get-a-drive-by-id * Get a drive by ID */ public function getDriveById($driveId) { $driveLocator = "/drives/$driveId"; $endpoint = "$driveLocator"; $response = $this ->graph ->createRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $drive = $response->getResponseAsObject(Model\Drive::class); return new DriveProxy( $this->graph, $drive, $this->serviceDefinition->getResourceDefinition('driveItem') ); } /** * Gets a user's OneDrive. * * @param string $idOrUserPrincipalName * The ID or user principal name. * * @return \Krizalys\Onedrive\Proxy\DriveProxy * The drive. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/drive_get?view=odsp-graph-online#get-a-users-onedrive * Get a user's OneDrive */ public function getDriveByUser($idOrUserPrincipalName) { $userLocator = "/users/$idOrUserPrincipalName"; $driveLocator = '/drive'; $endpoint = "$userLocator$driveLocator"; $response = $this ->graph ->createRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $drive = $response->getResponseAsObject(Model\Drive::class); return new DriveProxy( $this->graph, $drive, $this->serviceDefinition->getResourceDefinition('driveItem') ); } /** * Gets the document library associated with a group. * * @param string $groupId * The group ID. * * @return \Krizalys\Onedrive\Proxy\DriveProxy * The drive. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/drive_get?view=odsp-graph-online#get-the-document-library-associated-with-a-group * Get the document library associated with a group */ public function getDriveByGroup($groupId) { $groupLocator = "/groups/$groupId"; $driveLocator = '/drive'; $endpoint = "$groupLocator$driveLocator"; $response = $this ->graph ->createRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $drive = $response->getResponseAsObject(Model\Drive::class); return new DriveProxy( $this->graph, $drive, $this->serviceDefinition->getResourceDefinition('driveItem') ); } /** * Gets the document library for a site. * * @param string $siteId * The site ID. * * @return \Krizalys\Onedrive\Proxy\DriveProxy * The drive. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/drive_get?view=odsp-graph-online#get-the-document-library-for-a-site * Get the document library for a site */ public function getDriveBySite($siteId) { $siteLocator = "/sites/$siteId"; $driveLocator = '/drive'; $endpoint = "$siteLocator$driveLocator"; $response = $this ->graph ->createRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $drive = $response->getResponseAsObject(Model\Drive::class); return new DriveProxy( $this->graph, $drive, $this->serviceDefinition->getResourceDefinition('driveItem') ); } /** * Gets a drive item by ID. * * @param string $driveId * The drive ID. Deprecated and will change in version 3; pass the * drive item ID instead. * @param mixed $itemId * The drive item ID. Deprecated and will be removed in version 3; * Omit this parameter. * * @return \Krizalys\Onedrive\Proxy\DriveItemProxy * The drive item. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_get?view=odsp-graph-online * Get a DriveItem resource */ public function getDriveItemById($driveId, $itemId = null) { if (func_num_args() == 1) { $itemId = $driveId; $driveId = null; } if ($driveId === null) { $driveLocator = '/me/drive'; } else { $message = sprintf( '%s()\'s behavior will change in version 3: the $driveId' . ' argument will be removed and the method will get a' . ' drive item from the default drive;' . ' use' . ' \Krizalys\Onedrive\Proxy\DriveProxy::getDriveItemById()' . ' for to retrieve a drive item ID from a given drive', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $driveLocator = "/drives/$driveId"; } $itemLocator = "/items/$itemId"; $endpoint = "$driveLocator$itemLocator"; $response = $this ->graph ->createRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $driveItem = $response->getResponseAsObject(Model\DriveItem::class); return new DriveItemProxy( $this->graph, $driveItem, $this->serviceDefinition->getResourceDefinition('driveItem') ); } /** * Gets a drive item by path. * * The path is given as an absolute path from the root of the drive, for * example: * * ```php * $driveItem = $client->getDriveItemByPath('/path/to/file.txt'); * ``` * * @param string $path * The path. * * @return \Krizalys\Onedrive\Proxy\DriveItemProxy * The drive item. * * @since 2.2.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_get?view=odsp-graph-online * Get a DriveItem resource */ public function getDriveItemByPath($path) { $driveLocator = '/me/drive'; $itemLocator = "/root:$path"; $endpoint = "$driveLocator$itemLocator"; $response = $this ->graph ->createRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $driveItem = $response->getResponseAsObject(Model\DriveItem::class); return new DriveItemProxy( $this->graph, $driveItem, $this->serviceDefinition->getResourceDefinition('driveItem') ); } /** * Gets the root drive item. * * @return \Krizalys\Onedrive\Proxy\DriveItemProxy * The root drive item. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_get?view=odsp-graph-online * Get a DriveItem resource */ public function getRoot() { $driveLocator = '/me/drive'; $itemLocator = '/root'; $endpoint = "$driveLocator$itemLocator"; $response = $this ->graph ->createRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $driveItem = $response->getResponseAsObject(Model\DriveItem::class); return new DriveItemProxy( $this->graph, $driveItem, $this->serviceDefinition->getResourceDefinition('driveItem') ); } /** * Gets a special folder by name. * * See {@see \Krizalys\Onedrive\Constant\SpecialFolderName SpecialFolderName} * for the parameter `$specialFolderName`' supported values. * * @param string $specialFolderName * The special folder name. * * @return \Krizalys\Onedrive\Proxy\DriveItemProxy * The root drive item. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/drive_get_specialfolder?view=odsp-graph-online * Get a special folder by name */ public function getSpecialFolder($specialFolderName) { $driveLocator = '/me/drive'; $specialFolderLocator = "/special/$specialFolderName"; $endpoint = "$driveLocator$specialFolderLocator"; $response = $this ->graph ->createRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $driveItem = $response->getResponseAsObject(Model\DriveItem::class); return new DriveItemProxy( $this->graph, $driveItem, $this->serviceDefinition->getResourceDefinition('driveItem') ); } /** * Gets items shared with the signed-in user. * * @return \Krizalys\Onedrive\Proxy\DriveItemProxy[] * The shared drive items. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/drive_sharedwithme?view=odsp-graph-online * List items shared with the signed-in user */ public function getShared() { $driveLocator = '/me/drive'; $endpoint = "$driveLocator/sharedWithMe"; $response = $this ->graph ->createCollectionRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $driveItems = $response->getResponseAsObject(Model\DriveItem::class); if (!is_array($driveItems)) { return []; } return array_map(function (Model\DriveItem $driveItem) { return new DriveItemProxy( $this->graph, $driveItem, $this->serviceDefinition->getResourceDefinition('driveItem') ); }, $driveItems); } /** * Gets recent files. * * @return \Krizalys\Onedrive\Proxy\DriveItemProxy[] * The recent drive items. * * @since 2.0.0 * * @api * * @link https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/drive_recent?view=odsp-graph-online * List recent files */ public function getRecent() { $driveLocator = '/me/drive'; $endpoint = "$driveLocator/recent"; $response = $this ->graph ->createCollectionRequest('GET', $endpoint) ->execute(); $status = $response->getStatus(); if ($status != 200) { throw new \Exception("Unexpected status code produced by 'GET $endpoint': $status"); } $driveItems = $response->getResponseAsObject(Model\DriveItem::class); if (!is_array($driveItems)) { return []; } return array_map(function (Model\DriveItem $driveItem) { return new DriveItemProxy( $this->graph, $driveItem, $this->serviceDefinition->getResourceDefinition('driveItem') ); }, $driveItems); } // Legacy support ////////////////////////////////////////////////////////// /** * Creates a folder in the current OneDrive account. * * This operation is supported only on folders (as opposed to files): it * fails if `$parentId` does not refer to a folder. * * @param string $name * The name of the OneDrive folder to be created. * @param null|string $parentId * The ID of the OneDrive folder into which to create the OneDrive * folder, or `null` to create it in the OneDrive root folder. * Default: `null`. * @param null|string $description * The description of the OneDrive folder to be created, or `null` to * create it without a description. Default: `null`. * * @return \Krizalys\Onedrive\Folder * The folder created, as a Folder instance referencing to the * OneDrive folder created. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Proxy\DriveItemProxy::createFolder(). * * @see \Krizalys\Onedrive\Proxy\DriveItemProxy::createFolder() */ public function createFolder($name, $parentId = null, $description = null) { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Proxy\DriveItemProxy::createFolder()' . ' instead', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $drive = $this->getMyDrive(); $item = $parentId !== null ? $this->getDriveItemById($drive->id, $parentId) : $drive->getRoot(); $options = []; if ($description !== null) { $options += [ 'description' => (string) $description, ]; } $item = $item->createFolder($name, $options); $options = $this->buildOptions($item, ['parent_id' => $parentId]); return new Folder($this, $item->id, $options); } /** * Creates a file in the current OneDrive account. * * This operation is supported only on folders (as opposed to files): it * fails if `$parentId` does not refer to a folder. * * @param string $name * The name of the OneDrive file to be created. * @param null|string $parentId * The ID of the OneDrive folder into which to create the OneDrive * file, or `null` to create it in the OneDrive root folder. Default: * `null`. * @param string|resource|\GuzzleHttp\Psr7\Stream $content * The content of the OneDrive file to be created, as a string or as * a resource to an already opened file. Default: `''`. * @param mixed[string] $options * The options. Unused. * * @return \Krizalys\Onedrive\File * The file created, as File instance referencing to the OneDrive * file created. * * @throws \Exception * Thrown on I/O errors. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Proxy\DriveItemProxy::upload(). * * @see \Krizalys\Onedrive\Proxy\DriveItemProxy::upload() * * @todo Support name conflict behavior. * @todo Support content type in options. */ public function createFile( $name, $parentId = null, $content = '', array $options = [] ) { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Proxy\DriveItemProxy::upload()' . ' instead', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $drive = $this->getMyDrive(); $item = $parentId !== null ? $this->getDriveItemById($drive->id, $parentId) : $drive->getRoot(); $item = $item->upload($name, $content); $options = $this->buildOptions($item, ['parent_id' => $parentId]); return new File($this, $item->id, $options); } /** * Fetches a drive item from the current OneDrive account. * * @param null|string $driveItemId * The unique ID of the OneDrive drive item to fetch, or `null` to * fetch the OneDrive root folder. Default: `null`. * * @return object * The drive item fetched, as a DriveItem instance referencing to * the OneDrive drive item fetched. * * @since 2.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Client::getDriveItemById().. * * @see \Krizalys\Onedrive\Client::getDriveItemById() */ public function fetchDriveItem($driveItemId = null) { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Client::getDriveItemById() instead.', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $drive = $this->getMyDrive(); $item = $driveItemId !== null ? $this->getDriveItemById($drive->id, $driveItemId) : $drive->getRoot(); $options = $this->buildOptions($item, ['parent_id' => $driveItemId]); return $this->isFolder($item) ? new Folder($this, $item->id, $options) : new File($this, $item->id, $options); } /** * Fetches the root folder from the current OneDrive account. * * @return \Krizalys\Onedrive\Folder * The root folder, as a Folder instance referencing to the OneDrive * root folder. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Client::getRoot(). * * @see \Krizalys\Onedrive\Client::getRoot() */ public function fetchRoot() { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Client::getRoot() instead.', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $item = $this->getRoot(); $options = $this->buildOptions($item); return new Folder($this, $item->id, $options); } /** * Fetches the "Camera Roll" folder from the current OneDrive account. * * @return \Krizalys\Onedrive\Folder * The "Camera Roll" folder, as a Folder instance referencing to the * OneDrive "Camera Roll" folder. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Client::getSpecialFolder(\Krizalys\Onedrive\Constant\SpecialFolderName::CAMERA_ROLL). * * @see \Krizalys\Onedrive\Client::getSpecialFolder() */ public function fetchCameraRoll() { $message = sprintf( '%s() is deprecated and will be removed in version 3; use' . ' \Krizalys\Onedrive\Client::getSpecialFolder(\Krizalys\Onedrive\Constant\SpecialFolderName::CAMERA_ROLL)' . ' instead.', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $item = $this->getSpecialFolder(SpecialFolderName::CAMERA_ROLL); $options = $this->buildOptions($item); return new Folder($this, $item->id, $options); } /** * Fetches the "Documents" folder from the current OneDrive account. * * @return \Krizalys\Onedrive\Folder * The "Documents" folder, as a Folder instance referencing to the * OneDrive "Documents" folder. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Client::getSpecialFolder(\Krizalys\Onedrive\Constant\SpecialFolderName::DOCUMENTS). * * @see \Krizalys\Onedrive\Client::getSpecialFolder() */ public function fetchDocs() { $message = sprintf( '%s() is deprecated and will be removed in version 3; use' . ' \Krizalys\Onedrive\Client::getSpecialFolder(\Krizalys\Onedrive\Constant\SpecialFolderName::DOCUMENTS)' . ' instead.', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $item = $this->getSpecialFolder(SpecialFolderName::DOCUMENTS); $options = $this->buildOptions($item); return new Folder($this, $item->id, $options); } /** * Fetches the "Pictures" folder from the current OneDrive account. * * @return \Krizalys\Onedrive\Folder * The "Pictures" folder, as a Folder instance referencing to the * OneDrive "Pictures" folder. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Client::getSpecialFolder(\Krizalys\Onedrive\Constant\SpecialFolderName::PHOTOS). * * @see \Krizalys\Onedrive\Client::getSpecialFolder() */ public function fetchPics() { $message = sprintf( '%s() is deprecated and will be removed in version 3; use' . ' \Krizalys\Onedrive\Client::getSpecialFolder(\Krizalys\Onedrive\Constant\SpecialFolderName::PHOTOS)' . ' instead.', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $item = $this->getSpecialFolder(SpecialFolderName::PHOTOS); $options = $this->buildOptions($item); return new Folder($this, $item->id, $options); } /** * Fetches the properties of a drive item in the current OneDrive account. * * @param null|string $driveItemId * The drive item ID, or `null` to fetch the OneDrive root folder. * Default: `null`. * * @return object * The properties of the drive item fetched. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Client::getDriveItemById(). * * @see \Krizalys\Onedrive\Client::getDriveItemById() */ public function fetchProperties($driveItemId = null) { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Client::getDriveItemById() instead', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $drive = $this->getMyDrive(); $item = $driveItemId !== null ? $this->getDriveItemById($drive->id, $driveItemId) : $drive->getRoot(); $options = $this->buildOptions( $item, [ 'id' => $item->id, 'parent_id' => $driveItemId, ] ); return (object) $options; } /** * Fetches the drive items in a folder in the current OneDrive account. * * This operation is supported only on folders (as opposed to files): it * fails if `$parentId` does not refer to a folder. * * @param null|string $driveItemId * The drive item ID, or `null` to fetch the OneDrive root folder. * Default: `null`. * * @return \Krizalys\Onedrive\DriveItem * The drive items in the folder fetched, as DriveItem instances * referencing OneDrive drive items. * * @since 2.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Proxy\DriveItemProxy::children. * * @see \Krizalys\Onedrive\Proxy\DriveItemProxy::children */ public function fetchDriveItems($driveItemId = null) { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Proxy\DriveItemProxy::children' . ' instead.', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $drive = $this->getMyDrive(); $item = $driveItemId !== null ? $this->getDriveItemById($drive->id, $driveItemId) : $drive->getRoot(); return array_map(function (DriveItemProxy $item) use ($driveItemId) { $options = $this->buildOptions($item, ['parent_id' => $driveItemId]); return $this->isFolder($item) ? new Folder($this, $item->id, $options) : new File($this, $item->id, $options); }, $item->children); } /** * Updates the properties of a drive item in the current OneDrive account. * * @param string $driveItemId * The unique ID of the drive item to update. * @param mixed[]|object $properties * The properties to update. Default: `[]`. * @param bool $temp * Option to allow save to a temporary file in case of large files. * * @throws \Exception * Thrown on I/O errors. * * @since 2.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Proxy\DriveItemProxy::rename(). * * @see \Krizalys\Onedrive\Proxy\DriveItemProxy::rename() */ public function updateDriveItem($driveItemId, $properties = [], $temp = false) { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Proxy\DriveItemProxy::rename()' . ' instead', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $drive = $this->getMyDrive(); $item = $driveItemId !== null ? $this->getDriveItemById($drive->id, $driveItemId) : $drive->getRoot(); $options = (array) $properties; if (array_key_exists('name', $options)) { $name = $options['name']; unset($options['name']); } else { $name = $item->name; } $item = $item->rename($name, $options); $options = $this->buildOptions($item, ['parent_id' => $driveItemId]); return new Folder($this, $item->id, $options); } /** * Moves a drive item into another folder. * * `$destinationId` must refer to a folder. * * @param string $driveItemId * The unique ID of the drive item to move. * @param null|string $destinationId * The unique ID of the folder into which to move the drive item, or * `null` to move it to the OneDrive root folder. Default: `null`. * * @since 2.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Proxy\DriveItemProxy::move(). * * @see \Krizalys\Onedrive\Proxy\DriveItemProxy::move() */ public function moveDriveItem($driveItemId, $destinationId = null) { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Proxy\DriveItemProxy::move()' . ' instead.', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $drive = $this->getMyDrive(); $item = $this->getDriveItemById($drive->id, $driveItemId); $destination = $destinationId !== null ? $this->getDriveItemById($drive->id, $destinationId) : $drive->getRoot(); $item->move($destination); } /** * Copies a file into another folder. * * This operation is supported only on files (as opposed to folders): it * fails if `$driveItemId` does not refer to a file. * * Additionally, `$destinationId` must refer to a folder. * * @param string $driveItemId * The unique ID of the file to copy. * @param null|string $destinationId * The unique ID of the folder into which to copy the file, or `null` * to copy it to the OneDrive root folder. Default: `null`. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Proxy\DriveItemProxy::copy(). * * @see \Krizalys\Onedrive\Proxy\DriveItemProxy::copy() */ public function copyFile($driveItemId, $destinationId = null) { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Proxy\DriveItemProxy::copy()' . ' instead.', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $drive = $this->getMyDrive(); $item = $this->getDriveItemById($drive->id, $driveItemId); $destination = $destinationId !== null ? $this->getDriveItemById($drive->id, $destinationId) : $drive->getRoot(); $item->copy($destination); } /** * Deletes a drive item in the current OneDrive account. * * @param string $driveItemId * The unique ID of the drive item to delete. * * @since 2.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Proxy\DriveItemProxy::delete(). * * @see \Krizalys\Onedrive\Proxy\DriveItemProxy::delete() */ public function deleteDriveItem($driveItemId) { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Proxy\DriveItemProxy::delete()' . ' instead', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $drive = $this->getMyDrive(); $item = $this->getDriveItemById($drive->id, $driveItemId); $item->delete(); } /** * Fetches the quota of the current OneDrive account. * * @return object * An object with the following properties: * - 'quota' (int) The total space, in bytes ; * - 'available' (int) The available space, in bytes. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Proxy\DriveProxy::quota. * * @see \Krizalys\Onedrive\Proxy\DriveProxy::quota */ public function fetchQuota() { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Proxy\DriveProxy::quota instead', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $drive = $this->getMyDrive(); $quota = $drive->quota; return (object) [ 'quota' => $quota->total, 'available' => $quota->remaining, ]; } /** * Fetches the recent documents uploaded to the current OneDrive account. * * @return object * An object with the following properties: * - 'data' (array) The list of the recent documents uploaded. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Client::getRecent(). * * @see \Krizalys\Onedrive\Client::getRecent() */ public function fetchRecentDocs() { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Client::getRecent() instead', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $items = $this->getRecent(); return (object) [ 'data' => array_map(function (DriveItemProxy $item) { return (object) $this->buildOptions($item); }, $items), ]; } /** * Fetches the drive items shared with the current OneDrive account. * * @return object * An object with the following properties: * - 'data' (array) The list of the shared drive items. * * @since 1.0.0 * * @deprecated 2.0.0 Superseded by * \Krizalys\Onedrive\Client::getShared(). * * @see \Krizalys\Onedrive\Client::getShared() */ public function fetchShared() { $message = sprintf( '%s() is deprecated and will be removed in version 3;' . ' use \Krizalys\Onedrive\Client::getShared() instead', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $items = $this->getShared(); return (object) [ 'data' => array_map(function (DriveItemProxy $item) { return (object) $this->buildOptions($item); }, $items), ]; } /** * Checks whether a given drive item is a folder. * * @param \Krizalys\Onedrive\Proxy\DriveItemProxy $item * The drive item. * * @return bool * Whether the drive item is a folder. * * @since 2.0.0 * * @deprecated 2.0.0 Deprecated dependency. */ public function isFolder(DriveItemProxy $item) { $message = sprintf( '%s() is deprecated and will be removed in version 3', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); return $item->folder !== null || $item->specialFolder !== null; } /** * Builds options for legacy File and Folder constructors. * * @param \Krizalys\Onedrive\Proxy\DriveItemProxy $item * The drive item. * @param mixed[string] $options * The options. * * @return mixed[] * The options. * * @since 2.0.0 * * @deprecated 2.0.0 Deprecated dependency. */ public function buildOptions(DriveItemProxy $item, array $options = []) { $message = sprintf( '%s() is deprecated and will be removed in version 3', __METHOD__ ); @trigger_error($message, E_USER_DEPRECATED); $defaultOptions = [ 'from' => (object) [ 'name' => null, 'id' => null, ], ]; if ($item->id !== null) { $defaultOptions['id'] = $item->id; } if ($item->parentReference->id !== null) { $defaultOptions['parent_id'] = $item->parentReference->id; } if ($item->name !== null) { $defaultOptions['name'] = $item->name; } if ($item->description !== null) { $defaultOptions['description'] = $item->description; } if ($item->size !== null) { $defaultOptions['size'] = $item->size; } if ($item->createdDateTime !== null) { $defaultOptions['created_time'] = $item->createdDateTime->format(self::LEGACY_DATETIME_FORMAT); } if ($item->lastModifiedDateTime !== null) { $defaultOptions['updated_time'] = $item->lastModifiedDateTime->format(self::LEGACY_DATETIME_FORMAT); } return $defaultOptions + $options; } }