Added methods listAllCollections and listAllProjects.
[arvados.git] / sdk / R / R / HttpRequest.R
index ddb8f71c649e5a8bf6d8af5fc99fc2fc9345efa0..a1e1f61275263ec63910f5d48a5d017621fb02ff 100644 (file)
-source("./R/custom_classes.R")
-
-HttpRequest <- setRefClass(
+HttpRequest <- R6::R6Class(
 
     "HttrRequest",
 
-    fields = list(
+    public = list(
 
-        GET    = "function",
-        PUT    = "function",
-        POST   = "function",
-        DELETE = "function"
-    ),
+        validContentTypes = NULL,
 
-    methods = list(
         initialize = function() 
         {
-            # Public methods
-            GET <<- function(url, headers = NULL, body = NULL,
-                             queryFilters = NULL, limit = NULL, offset = NULL)
-            {
-                headers <- httr::add_headers(unlist(headers))
-                query <- .createQuery(queryFilters, limit, offset)
-                url <- paste0(url, query)
-                print(url)
+            self$validContentTypes <- c("text", "raw")
+        },
 
-                serverResponse <- httr::GET(url = url, config = headers)
-            }
+        GET = function(url, headers = NULL, queryFilters = NULL, limit = NULL, offset = NULL)
+        {
+            headers <- httr::add_headers(unlist(headers))
+            query <- private$createQuery(queryFilters, limit, offset)
+            url <- paste0(url, query)
 
-            PUT <<- function(url, headers = NULL, body = NULL,
-                             queryFilters = NULL, limit = 100, offset = 0)
-            {
-                headers <- httr::add_headers(unlist(headers))
-                query <- .createQuery(queryFilters, limit, offset)
-                url <- paste0(url, query)
+            serverResponse <- httr::GET(url = url, config = headers)
+        },
 
-                serverResponse <- httr::PUT(url = url, config = headers, body = body)
-            }
+        PUT = function(url, headers = NULL, body = NULL,
+                       queryFilters = NULL, limit = 100, offset = 0)
+        {
+            headers <- httr::add_headers(unlist(headers))
+            query <- private$createQuery(queryFilters, limit, offset)
+            url <- paste0(url, query)
 
-            POST <<- function(url, headers = NULL, body = NULL,
-                              queryFilters = NULL, limit = 100, offset = 0)
-            {
-                headers <- httr::add_headers(unlist(headers))
-                query <- .createQuery(queryFilters, limit, offset)
-                url <- paste0(url, query)
+            serverResponse <- httr::PUT(url = url, config = headers, body = body)
+        },
 
-                serverResponse <- httr::POST(url = url, config = headers, body = body)
-            }
+        POST = function(url, headers = NULL, body = NULL,
+                        queryFilters = NULL, limit = 100, offset = 0)
+        {
+            headers <- httr::add_headers(unlist(headers))
+            query <- private$createQuery(queryFilters, limit, offset)
+            url <- paste0(url, query)
 
-            DELETE <<- function(url, headers = NULL, body = NULL,
-                             queryFilters = NULL, limit = NULL, offset = NULL)
-            {
-                headers <- httr::add_headers(unlist(headers))
-                query <- .createQuery(queryFilters, limit, offset)
-                url <- paste0(url, query)
+            serverResponse <- httr::POST(url = url, config = headers, body = body)
+        },
 
-                serverResponse <- httr::DELETE(url = url, config = headers)
-            }
+        DELETE = function(url, headers = NULL, body = NULL,
+                          queryFilters = NULL, limit = NULL, offset = NULL)
+        {
+            headers <- httr::add_headers(unlist(headers))
+            query <- private$createQuery(queryFilters, limit, offset)
+            url <- paste0(url, query)
 
-            # Private methods
-            .createQuery <- function(filters, limit, offset)
-            {
-                finalQuery <- "?alt=json"
+            serverResponse <- httr::DELETE(url = url, config = headers)
+        },
 
-                if(!is.null(filters))
-                {
-                    filters <- sapply(filters, function(filter)
-                    {
-                        if(length(filter) != 3)
-                            stop("Filter list must have exacthey 3 elements.")
+        PROPFIND = function(url, headers = NULL)
+        {
+            h <- curl::new_handle()
+            curl::handle_setopt(h, customrequest = "PROPFIND")
+            curl::handle_setheaders(h, .list = headers)
 
-                        attributeAndOperator = filter[c(1, 2)]
-                        filterList = filter[[3]]
-                        filterListIsPrimitive = TRUE
-                        if(length(filterList) > 1)
-                            filterListIsPrimitive = FALSE
+            propfindResponse <- curl::curl_fetch_memory(url, h)
+        },
 
-                        attributeAndOperator <- sapply(attributeAndOperator, function(component) {
-                            component <- paste0("\"", component, "\"")
-                        })
+        MOVE = function(url, headers = NULL)
+        {
+            h <- curl::new_handle()
+            curl::handle_setopt(h, customrequest = "MOVE")
+            curl::handle_setheaders(h, .list = headers)
 
-                        filterList <- sapply(unlist(filterList), function(filter) {
-                            filter <- paste0("\"", filter, "\"")
-                        })
+            propfindResponse <- curl::curl_fetch_memory(url, h)
+        }
+    ),
 
-                        filterList <- paste(filterList, collapse = ",+")
+    private = list(
 
-                        if(!filterListIsPrimitive)
-                            filterList <- paste0("[", filterList, "]")
+        createQuery = function(filters, limit, offset)
+        {
+            finalQuery <- NULL
 
-                        filter <- c(attributeAndOperator, filterList)
+            if(!is.null(filters))
+            {
+                filters <- sapply(filters, function(filter)
+                {
+                    if(length(filter) != 3)
+                        stop("Filter list must have exactly 3 elements.")
+
+                    attributeAndOperator = filter[c(1, 2)]
+                    filterList = filter[[3]]
+                    filterListIsPrimitive = TRUE
+                    if(length(filterList) > 1)
+                        filterListIsPrimitive = FALSE
+
+                    attributeAndOperator <- sapply(attributeAndOperator, function(component) {
+                        component <- paste0("\"", component, "\"")
+                    })
 
-                        queryParameter <- paste(filter, collapse = ",+")
-                        queryParameter <- paste0("[", queryParameter, "]")
-            
+                    filterList <- sapply(unlist(filterList), function(filter) {
+                        filter <- paste0("\"", filter, "\"")
                     })
 
-                    filters <- paste(filters, collapse = ",+")
-                    filters <- paste0("[", filters, "]")
+                    filterList <- paste(filterList, collapse = ",+")
 
-                    encodedQuery <- URLencode(filters, reserved = T, repeated = T)
+                    if(!filterListIsPrimitive)
+                        filterList <- paste0("[", filterList, "]")
 
-                    finalQuery <- paste0(finalQuery, "&filters=", encodedQuery)
+                    filter <- c(attributeAndOperator, filterList)
 
-                    #Todo(Fudo): This is a hack for now. Find a proper solution.
-                    finalQuery <- stringr::str_replace_all(finalQuery, "%2B", "+")
-                }
+                    queryParameter <- paste(filter, collapse = ",+")
+                    queryParameter <- paste0("[", queryParameter, "]")
+        
+                })
 
-                if(!is.null(limit))
-                {
-                    if(!is.numeric(limit))
-                        stop("Limit must be a numeric type.")
-                    
-                    finalQuery <- paste0(finalQuery, "&limit=", limit)
-                }
+                filters <- paste(filters, collapse = ",+")
+                filters <- paste0("[", filters, "]")
 
-                if(!is.null(offset))
-                {
-                    if(!is.numeric(offset))
-                        stop("Offset must be a numeric type.")
-                    
-                    finalQuery <- paste0(finalQuery, "&offset=", offset)
-                }
+                encodedQuery <- URLencode(filters, reserved = T, repeated = T)
+
+                encodedQuery <- stringr::str_replace_all(encodedQuery, "%2B", "+")
+
+                finalQuery <- c(finalQuery, paste0("filters=", encodedQuery))
 
                 finalQuery
             }
+
+            if(!is.null(limit))
+            {
+                if(!is.numeric(limit))
+                    stop("Limit must be a numeric type.")
+                
+                finalQuery <- c(finalQuery, paste0("limit=", limit))
+            }
+
+            if(!is.null(offset))
+            {
+                if(!is.numeric(offset))
+                    stop("Offset must be a numeric type.")
+                
+                finalQuery <- c(finalQuery, paste0("offset=", offset))
+            }
+
+            if(length(finalQuery) > 1)
+            {
+                finalQuery <- paste0(finalQuery, collapse = "&")
+            }
+
+            finalQuery <- paste0("/?", finalQuery)
+
+            finalQuery
         }
-    )
+    ),
+
+    cloneable = FALSE
 )