1 source("./R/custom_classes.R")
3 HttpRequest <- setRefClass(
8 send_method = "character",
9 server_base_url = "character",
10 server_relative_url = "character",
11 auth_token = "character",
12 allowed_methods = "list",
13 query_filters = "ANY",
14 response_limit = "ANY",
19 initialize = function(method,
27 send_method <<- method
29 server_base_url <<- base_url
30 server_relative_url <<- relative_url
31 query_filters <<- filters
32 response_limit <<- limit
33 query_offset <<- offset
38 http_method <- switch(send_method,
39 "GET" = .self$getRequest,
40 "POST" = .self$postRequest,
41 "PUT" = .self$putRequest,
42 "DELETE" = .self$deleteRequest,
43 "PATCH" = .self$pathcRequest)
47 getRequest = function()
49 requestHeaders <- httr::add_headers(Authorization = .self$getAuthHeader())
50 requestQuery <- .self$generateQuery()
51 url <- paste0(server_base_url, server_relative_url, requestQuery)
53 server_data <- httr::GET(url = url,
54 config = requestHeaders)
57 #Todo(Fudo): Try to make this more generic
58 postRequest = function()
60 #Todo(Fudo): Implement this later on.
64 putRequest = function()
66 #Todo(Fudo): Implement this later on.
70 deleteRequest = function()
72 #Todo(Fudo): Implement this later on.
73 print("DELETE method")
76 pathcRequest = function()
78 #Todo(Fudo): Implement this later on.
82 getAuthHeader = function()
84 auth_method <- "OAuth2"
85 auth_header <- paste(auth_method, auth_token)
88 generateQuery = function()
90 #Todo(Fudo): This function is a mess, refactor it
91 finalQuery <- "?alt=json"
93 if(!is.null(query_filters))
95 filters <- sapply(query_filters, function(filter)
97 if(length(filter) != 3)
98 stop("Filter list must have exacthey 3 elements.")
100 attributeAndOperator = filter[c(1, 2)]
101 filterList = filter[[3]]
102 filterListIsPrimitive = TRUE
103 if(length(filterList) > 1)
104 filterListIsPrimitive = FALSE
106 attributeAndOperator <- sapply(attributeAndOperator, function(component) {
107 component <- paste0("\"", component, "\"")
110 filterList <- sapply(unlist(filterList), function(filter) {
111 filter <- paste0("\"", filter, "\"")
114 filterList <- paste(filterList, collapse = ",+")
116 if(!filterListIsPrimitive)
117 filterList <- paste0("[", filterList, "]")
119 filter <- c(attributeAndOperator, filterList)
121 queryParameter <- paste(filter, collapse = ",+")
122 queryParameter <- paste0("[", queryParameter, "]")
126 filters <- paste(filters, collapse = ",+")
127 filters <- paste0("[", filters, "]")
129 encodedQuery <- URLencode(filters, reserved = T, repeated = T)
131 finalQuery <- paste0(finalQuery, "&filters=", encodedQuery)
133 #Todo(Fudo): This is a hack for now. Find a proper solution.
134 finalQuery <- stringr::str_replace_all(finalQuery, "%2B", "+")
137 if(!is.null(response_limit))
139 if(!is.numeric(response_limit))
140 stop("Limit must be a numeric type.")
142 finalQuery <- paste0(finalQuery, "&limit=", response_limit)
145 if(!is.null(query_offset))
147 if(!is.numeric(query_offset))
148 stop("Offset must be a numeric type.")
150 finalQuery <- paste0(finalQuery, "&offset=", query_offset)