Merge branch '21535-multi-wf-delete'
[arvados.git] / sdk / R / R / RESTService.R
index 12e6591ee8f4b3e3cafa6f187bf85886eb6e4914..5cbcb65f753b769ec108fa9f757ba6b1f219443d 100644 (file)
@@ -1,30 +1,29 @@
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+
 RESTService <- R6::R6Class(
 
     "RESTService",
 
     public = list(
 
-        hostName   = NULL,
         token      = NULL,
         http       = NULL,
         httpParser = NULL,
         numRetries = NULL,
 
-        initialize = function(token, hostName,
+        initialize = function(token, rawHost,
                               http, httpParser,
                               numRetries     = 0,
                               webDavHostName = NULL)
         {
-            version <- "v1"
-
-            self$token       <- token
-            self$hostName    <- paste0("https://", hostName,
-                                       "/arvados/", version, "/")
-            self$http        <- http
-            self$httpParser  <- httpParser
-            self$numRetries  <- numRetries
+            self$token      <- token
+            self$http       <- http
+            self$httpParser <- httpParser
+            self$numRetries <- numRetries
 
-            private$rawHostName    <- hostName
+            private$rawHostName    <- rawHost
             private$webDavHostName <- webDavHostName
         },
 
@@ -37,16 +36,13 @@ RESTService <- R6::R6Class(
         {
             if(is.null(private$webDavHostName))
             {
-                discoveryDocumentURL <- paste0("https://", private$rawHostName,
-                                               "/discovery/v1/apis/arvados/v1/rest")
+                publicConfigURL <- paste0("https://", private$rawHostName,
+                                               "/arvados/v1/config")
 
-                headers <- list(Authorization = paste("OAuth2", self$token))
+                serverResponse <- self$http$exec("GET", publicConfigURL, retryTimes = self$numRetries)
 
-                serverResponse <- self$http$execute("GET", discoveryDocumentURL, headers,
-                                                    retryTimes = self$numRetries)
-
-                discoveryDocument <- self$httpParser$parseJSONResponse(serverResponse)
-                private$webDavHostName <- discoveryDocument$keepWebServiceUrl
+                configDocument <- self$httpParser$parseJSONResponse(serverResponse)
+                private$webDavHostName <- configDocument$Services$WebDAVDownload$ExternalURL
 
                 if(is.null(private$webDavHostName))
                     stop("Unable to find WebDAV server.")
@@ -55,126 +51,6 @@ RESTService <- R6::R6Class(
             private$webDavHostName
         },
 
-        getResource = function(resource, uuid)
-        {
-            resourceURL <- paste0(self$hostName, resource, "/", uuid)
-            headers <- list(Authorization = paste("OAuth2", self$token))
-
-            serverResponse <- self$http$execute("GET", resourceURL, headers,
-                                                retryTimes = self$numRetries)
-
-            resource <- self$httpParser$parseJSONResponse(serverResponse)
-
-            if(!is.null(resource$errors))
-                stop(resource$errors)
-
-            resource
-        },
-
-        listResources = function(resource, filters = NULL, limit = 100, offset = 0)
-        {
-            resourceURL <- paste0(self$hostName, resource)
-            headers <- list(Authorization = paste("OAuth2", self$token))
-            body <- NULL
-
-            serverResponse <- self$http$execute("GET", resourceURL, headers, body,
-                                                filters, limit, offset,
-                                                self$numRetries)
-
-            resources <- self$httpParser$parseJSONResponse(serverResponse)
-
-            if(!is.null(resources$errors))
-                stop(resources$errors)
-
-            resources
-        },
-
-        fetchAllItems = function(resourceURL, filters)
-        {
-            headers <- list(Authorization = paste("OAuth2", self$token))
-
-            offset <- 0
-            itemsAvailable <- .Machine$integer.max
-            items <- c()
-            while(length(items) < itemsAvailable)
-            {
-                serverResponse <- self$http$execute(verb       = "GET",
-                                                    url        = resourceURL,
-                                                    headers    = headers,
-                                                    body       = NULL,
-                                                    query      = filters,
-                                                    limit      = NULL,
-                                                    offset     = offset,
-                                                    retryTimes = self$numRetries)
-
-                parsedResponse <- self$httpParser$parseJSONResponse(serverResponse)
-
-                if(!is.null(parsedResponse$errors))
-                    stop(parsedResponse$errors)
-
-                items          <- c(items, parsedResponse$items)
-                offset         <- length(items)
-                itemsAvailable <- parsedResponse$items_available
-            }
-
-            items
-        },
-
-        deleteResource = function(resource, uuid)
-        {
-            collectionURL <- paste0(self$hostName, resource, "/", uuid)
-            headers <- list("Authorization" = paste("OAuth2", self$token),
-                            "Content-Type"  = "application/json")
-
-            serverResponse <- self$http$execute("DELETE", collectionURL, headers,
-                                                retryTimes = self$numRetries)
-
-            removedResource <- self$httpParser$parseJSONResponse(serverResponse)
-
-            if(!is.null(removedResource$errors))
-                stop(removedResource$errors)
-
-            removedResource
-        },
-
-        updateResource = function(resource, uuid, newContent)
-        {
-            resourceURL <- paste0(self$hostName, resource, "/", uuid)
-            headers <- list("Authorization" = paste("OAuth2", self$token),
-                            "Content-Type"  = "application/json")
-
-            newContent <- jsonlite::toJSON(newContent, auto_unbox = T)
-
-            serverResponse <- self$http$execute("PUT", resourceURL, headers, newContent,
-                                                retryTimes = self$numRetries)
-
-            updatedResource <- self$httpParser$parseJSONResponse(serverResponse)
-
-            if(!is.null(updatedResource$errors))
-                stop(updatedResource$errors)
-
-            updatedResource
-        },
-
-        createResource = function(resource, content)
-        {
-            resourceURL <- paste0(self$hostName, resource)
-            headers <- list("Authorization" = paste("OAuth2", self$token),
-                            "Content-Type"  = "application/json")
-
-            content <- jsonlite::toJSON(content, auto_unbox = T)
-
-            serverResponse <- self$http$execute("POST", resourceURL, headers, content,
-                                                retryTimes = self$numRetries)
-
-            newResource <- self$httpParser$parseJSONResponse(serverResponse)
-
-            if(!is.null(newResource$errors))
-                stop(newResource$errors)
-
-            newResource
-        },
-
         create = function(files, uuid)
         {
             sapply(files, function(filePath)
@@ -187,10 +63,10 @@ RESTService <- R6::R6Class(
         {
             fileURL <- paste0(self$getWebDavHostName(), "c=",
                               uuid, "/", relativePath);
-            headers <- list(Authorization = paste("OAuth2", self$token)) 
+            headers <- list(Authorization = paste("OAuth2", self$token))
 
-            serverResponse <- self$http$execute("DELETE", fileURL, headers,
-                                                retryTimes = self$numRetries)
+            serverResponse <- self$http$exec("DELETE", fileURL, headers,
+                                             retryTimes = self$numRetries)
 
             if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
                 stop(paste("Server code:", serverResponse$status_code))
@@ -202,13 +78,13 @@ RESTService <- R6::R6Class(
         {
             collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
             fromURL <- paste0(collectionURL, from)
-            toURL <- paste0(collectionURL, to)
+            toURL <- paste0(collectionURL, trimFromStart(to, "/"))
 
             headers <- list("Authorization" = paste("OAuth2", self$token),
-                           "Destination" = toURL)
+                            "Destination" = toURL)
 
-            serverResponse <- self$http$execute("MOVE", fromURL, headers,
-                                                retryTimes = self$numRetries)
+            serverResponse <- self$http$exec("MOVE", fromURL, headers,
+                                             retryTimes = self$numRetries)
 
             if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
                 stop(paste("Server code:", serverResponse$status_code))
@@ -216,15 +92,34 @@ RESTService <- R6::R6Class(
             serverResponse
         },
 
-        getCollectionContent = function(uuid)
+        copy = function(from, to, uuid)
+        {
+            collectionURL <- paste0(self$getWebDavHostName(), "c=", uuid, "/")
+            fromURL <- paste0(collectionURL, from)
+            toURL <- paste0(collectionURL, trimFromStart(to, "/"))
+
+            headers <- list("Authorization" = paste("OAuth2", self$token),
+                            "Destination" = toURL)
+
+            serverResponse <- self$http$exec("COPY", fromURL, headers,
+                                             retryTimes = self$numRetries)
+
+            if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
+                stop(paste("Server code:", serverResponse$status_code))
+
+            serverResponse
+        },
+
+       getCollectionContent = function(uuid, relativePath = NULL)
+
         {
             collectionURL <- URLencode(paste0(self$getWebDavHostName(),
-                                              "c=", uuid))
+                                             "c=", uuid, "/", relativePath))
 
-            headers <- list("Authorization" = paste("OAuth2", self$token))
+            headers <- list("Authorization" = paste("Bearer", self$token))
 
-            response <- self$http$execute("PROPFIND", collectionURL, headers,
-                                          retryTimes = self$numRetries)
+            response <- self$http$exec("PROPFIND", collectionURL, headers,
+                                       retryTimes = self$numRetries)
 
             if(all(response == ""))
                 stop("Response is empty, request may be misconfigured")
@@ -244,8 +139,8 @@ RESTService <- R6::R6Class(
 
             headers <- list("Authorization" = paste("OAuth2", self$token))
 
-            response <- self$http$execute("PROPFIND", subcollectionURL, headers,
-                                          retryTimes = self$numRetries)
+            response <- self$http$exec("PROPFIND", subcollectionURL, headers,
+                                       retryTimes = self$numRetries)
 
             if(all(response == ""))
                 stop("Response is empty, request may be misconfigured")
@@ -281,8 +176,8 @@ RESTService <- R6::R6Class(
             if(!(contentType %in% self$httpParser$validContentTypes))
                 stop("Invalid contentType. Please use text or raw.")
 
-            serverResponse <- self$http$execute("GET", fileURL, headers,
-                                                retryTimes = self$numRetries)
+            serverResponse <- self$http$exec("GET", fileURL, headers,
+                                             retryTimes = self$numRetries)
 
             if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
                 stop(paste("Server code:", serverResponse$status_code))
@@ -298,8 +193,8 @@ RESTService <- R6::R6Class(
                             "Content-Type" = contentType)
             body <- content
 
-            serverResponse <- self$http$execute("PUT", fileURL, headers, body,
-                                                retryTimes = self$numRetries)
+            serverResponse <- self$http$exec("PUT", fileURL, headers, body,
+                                             retryTimes = self$numRetries)
 
             if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
                 stop(paste("Server code:", serverResponse$status_code))
@@ -307,18 +202,13 @@ RESTService <- R6::R6Class(
             self$httpParser$parseResponse(serverResponse, "text")
         },
 
-        getConnection = function(uuid, relativePath, openMode)
+        getConnection = function(relativePath, uuid, openMode)
         {
-            fileURL <- paste0(self$getWebDavHostName(), 
+            fileURL <- paste0(self$getWebDavHostName(),
                               "c=", uuid, "/", relativePath);
             headers <- list(Authorization = paste("OAuth2", self$token))
 
-            h <- curl::new_handle()
-            curl::handle_setheaders(h, .list = headers)
-
-            conn <- curl::curl(url = fileURL, open = openMode, handle = h)
-
-            conn
+            conn <- self$http$getConnection(fileURL, headers, openMode)
         }
     ),
 
@@ -331,15 +221,19 @@ RESTService <- R6::R6Class(
         {
             fileURL <- paste0(self$getWebDavHostName(), "c=",
                               uuid, "/", relativePath)
-            headers <- list(Authorization = paste("OAuth2", self$token), 
+            headers <- list(Authorization = paste("OAuth2", self$token),
                             "Content-Type" = contentType)
             body <- NULL
 
-            serverResponse <- self$http$execute("PUT", fileURL, headers, body,
-                                                retryTimes = self$numRetries)
+            serverResponse <- self$http$exec("PUT", fileURL, headers, body,
+                                             retryTimes = self$numRetries)
 
-            if(serverResponse$status_code < 200 || serverResponse$status_code >= 300)
-                stop(paste("Server code:", serverResponse$status_code))
+            if (serverResponse$status_code < 200){ # to wyrzuca błędy
+                stop(paste("Server code:", serverResponse$status_code))}
+            else if (serverResponse$status_code >= 300 & serverResponse$status_code < 422) {
+                stop(paste("Server code:", serverResponse$status_code))}
+            else if (serverResponse$status_code == 422 ) {
+                stop(paste("Project of that name already exists. If you want to change it use project_update() instead"))}
 
             paste("File created:", relativePath)
         }