-source("./R/custom_classes.R")
-
-HttpRequest <- setRefClass(
+HttpRequest <- R6::R6Class(
"HttrRequest",
- fields = list(
- send_method = "character",
- server_base_url = "character",
- server_relative_url = "character",
- auth_token = "character",
- allowed_methods = "list",
- query_filters = "ANY",
- response_limit = "ANY",
- query_offset = "ANY"
- ),
+ public = list(
- methods = list(
- initialize = function(method,
- token,
- base_url,
- relative_url,
- filters = NULL,
- limit = 100,
- offset = 0)
- {
- send_method <<- method
- auth_token <<- token
- server_base_url <<- base_url
- server_relative_url <<- relative_url
- query_filters <<- filters
- response_limit <<- limit
- query_offset <<- offset
- },
+ validContentTypes = NULL,
- execute = function()
+ initialize = function()
{
- http_method <- switch(send_method,
- "GET" = .self$getRequest,
- "POST" = .self$postRequest,
- "PUT" = .self$putRequest,
- "DELETE" = .self$deleteRequest,
- "PATCH" = .self$pathcRequest)
- http_method()
+ self$validContentTypes <- c("text", "raw")
},
- getRequest = function()
+ GET = function(url, headers = NULL, queryFilters = NULL, limit = NULL, offset = NULL)
{
- requestHeaders <- httr::add_headers(Authorization = .self$getAuthHeader())
- requestQuery <- .self$generateQuery()
- url <- paste0(server_base_url, server_relative_url, requestQuery)
+ headers <- httr::add_headers(unlist(headers))
+ query <- private$createQuery(queryFilters, limit, offset)
+ url <- paste0(url, query)
- server_data <- httr::GET(url = url,
- config = requestHeaders)
+ serverResponse <- httr::GET(url = url, config = headers)
},
- #Todo(Fudo): Try to make this more generic
- postRequest = function()
+ PUT = function(url, headers = NULL, body = NULL,
+ queryFilters = NULL, limit = 100, offset = 0)
{
- #Todo(Fudo): Implement this later on.
- print("POST method")
+ headers <- httr::add_headers(unlist(headers))
+ query <- private$createQuery(queryFilters, limit, offset)
+ url <- paste0(url, query)
+
+ serverResponse <- httr::PUT(url = url, config = headers, body = body)
},
- putRequest = function()
+ POST = function(url, headers = NULL, body = NULL,
+ queryFilters = NULL, limit = 100, offset = 0)
{
- #Todo(Fudo): Implement this later on.
- print("PUT method")
+ headers <- httr::add_headers(unlist(headers))
+ query <- private$createQuery(queryFilters, limit, offset)
+ url <- paste0(url, query)
+
+ serverResponse <- httr::POST(url = url, config = headers, body = body)
},
- deleteRequest = function()
+ DELETE = function(url, headers = NULL, body = NULL,
+ queryFilters = NULL, limit = NULL, offset = NULL)
{
- #Todo(Fudo): Implement this later on.
- print("DELETE method")
+ headers <- httr::add_headers(unlist(headers))
+ query <- private$createQuery(queryFilters, limit, offset)
+ url <- paste0(url, query)
+
+ serverResponse <- httr::DELETE(url = url, config = headers)
},
- pathcRequest = function()
+ PROPFIND = function(url, headers = NULL)
{
- #Todo(Fudo): Implement this later on.
- print("PATCH method")
+ h <- curl::new_handle()
+ curl::handle_setopt(h, customrequest = "PROPFIND")
+ curl::handle_setheaders(h, .list = headers)
+
+ propfindResponse <- curl::curl_fetch_memory(url, h)
},
- getAuthHeader = function()
+ MOVE = function(url, headers = NULL)
{
- auth_method <- "OAuth2"
- auth_header <- paste(auth_method, auth_token)
- },
+ h <- curl::new_handle()
+ curl::handle_setopt(h, customrequest = "MOVE")
+ curl::handle_setheaders(h, .list = headers)
- generateQuery = function()
+ propfindResponse <- curl::curl_fetch_memory(url, h)
+ }
+ ),
+
+ private = list(
+
+ createQuery = function(filters, limit, offset)
{
- finalQuery <- ""
+ finalQuery <- NULL
- if(!is.null(query_filters))
+ if(!is.null(filters))
{
- filters <- sapply(query_filters, function(filter)
+ filters <- sapply(filters, function(filter)
{
- filter <- sapply(filter, function(component)
- {
+ 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, "\"")
})
-
+
+ filterList <- sapply(unlist(filterList), function(filter) {
+ filter <- paste0("\"", filter, "\"")
+ })
+
+ filterList <- paste(filterList, collapse = ",+")
+
+ if(!filterListIsPrimitive)
+ filterList <- paste0("[", filterList, "]")
+
+ filter <- c(attributeAndOperator, filterList)
+
queryParameter <- paste(filter, collapse = ",+")
- queryParameter <- paste0("[[", queryParameter, "]]")
+ queryParameter <- paste0("[", queryParameter, "]")
+
})
+ filters <- paste(filters, collapse = ",+")
+ filters <- paste0("[", filters, "]")
+
encodedQuery <- URLencode(filters, reserved = T, repeated = T)
- #Todo(Fudo): Hardcoded for now. Look for a better solution.
- finalQuery <- paste0("?alt=json&filters=", encodedQuery)
+ encodedQuery <- stringr::str_replace_all(encodedQuery, "%2B", "+")
+
+ finalQuery <- c(finalQuery, paste0("filters=", encodedQuery))
- #Todo(Fudo): This is a hack for now. Find a proper solution.
- finalQuery <- str_replace_all(finalQuery, "%2B", "+")
+ 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
)