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",
14 query_filters = "ANY",
15 response_limit = "ANY",
20 initialize = function(method,
29 send_method <<- method
31 server_base_url <<- base_url
32 server_relative_url <<- relative_url
34 query_filters <<- filters
35 response_limit <<- limit
36 query_offset <<- offset
41 #Todo(Fudo): Get rid of the switch and make this module more general.
42 http_method <- switch(send_method,
43 "GET" = .self$getRequest,
44 "POST" = .self$postRequest,
45 "PUT" = .self$putRequest,
46 "DELETE" = .self$deleteRequest,
47 "PATCH" = .self$pathcRequest)
51 getRequest = function()
53 requestHeaders <- httr::add_headers(Authorization = .self$getAuthHeader())
54 requestQuery <- .self$generateQuery()
55 url <- paste0(server_base_url, server_relative_url, requestQuery)
57 server_data <- httr::GET(url = url,
58 config = requestHeaders)
61 #Todo(Fudo): Try to make this more generic
62 postRequest = function()
64 url <- paste0(server_base_url, server_relative_url)
65 requestHeaders <- httr::add_headers("Authorization" = .self$getAuthHeader(),
66 "Content-Type" = "application/json")
67 response <- POST(url, body = request_body, config = requestHeaders)
70 putRequest = function()
72 url <- paste0(server_base_url, server_relative_url)
73 requestHeaders <- httr::add_headers("Authorization" = .self$getAuthHeader(),
74 "Content-Type" = "application/json")
76 response <- PUT(url, body = request_body, config = requestHeaders)
79 deleteRequest = function()
81 url <- paste0(server_base_url, server_relative_url)
82 requestHeaders <- httr::add_headers("Authorization" = .self$getAuthHeader(),
83 "Content-Type" = "application/json")
84 response <- DELETE(url, config = requestHeaders)
87 pathcRequest = function()
89 #Todo(Fudo): Implement this later on.
93 getAuthHeader = function()
95 auth_method <- "OAuth2"
96 auth_header <- paste(auth_method, auth_token)
99 generateQuery = function()
101 #Todo(Fudo): This function is a mess, refactor it
102 finalQuery <- "?alt=json"
104 if(!is.null(query_filters))
106 filters <- sapply(query_filters, function(filter)
108 if(length(filter) != 3)
109 stop("Filter list must have exacthey 3 elements.")
111 attributeAndOperator = filter[c(1, 2)]
112 filterList = filter[[3]]
113 filterListIsPrimitive = TRUE
114 if(length(filterList) > 1)
115 filterListIsPrimitive = FALSE
117 attributeAndOperator <- sapply(attributeAndOperator, function(component) {
118 component <- paste0("\"", component, "\"")
121 filterList <- sapply(unlist(filterList), function(filter) {
122 filter <- paste0("\"", filter, "\"")
125 filterList <- paste(filterList, collapse = ",+")
127 if(!filterListIsPrimitive)
128 filterList <- paste0("[", filterList, "]")
130 filter <- c(attributeAndOperator, filterList)
132 queryParameter <- paste(filter, collapse = ",+")
133 queryParameter <- paste0("[", queryParameter, "]")
137 filters <- paste(filters, collapse = ",+")
138 filters <- paste0("[", filters, "]")
140 encodedQuery <- URLencode(filters, reserved = T, repeated = T)
142 finalQuery <- paste0(finalQuery, "&filters=", encodedQuery)
144 #Todo(Fudo): This is a hack for now. Find a proper solution.
145 finalQuery <- stringr::str_replace_all(finalQuery, "%2B", "+")
148 if(!is.null(response_limit))
150 if(!is.numeric(response_limit))
151 stop("Limit must be a numeric type.")
153 finalQuery <- paste0(finalQuery, "&limit=", response_limit)
156 if(!is.null(query_offset))
158 if(!is.numeric(query_offset))
159 stop("Offset must be a numeric type.")
161 finalQuery <- paste0(finalQuery, "&offset=", query_offset)