-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplumber.R
More file actions
84 lines (68 loc) · 2.66 KB
/
Copy pathplumber.R
File metadata and controls
84 lines (68 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#* @apiTitle Rappseq API
#* @filter cors
cors <- function(res) {
res$setHeader("Access-Control-Allow-Origin", "*")
plumber::forward()
}
#* Identify pathogens in a fastq file
#* @post /identify
#* @param fastq:[file]
#* @parser multi
function(req, res){
logger::log_info("Request received: /identify")
running_time <- system.time({
request_time <- as.POSIXct(Sys.time(), tz = "UTC")
request_id <- digest::digest(req)
logger::log_info(request_id, " parsing request for ", req$body$fastq$filename)
request_values <- suppressWarnings(mime::parse_multipart(req))
requested_classifiers <- strsplit(request_values$classifier, ",")[[1]]
file_hash <- digest::digest(request_values$fastq$datapath, "md5", file = TRUE)
logger::log_info(request_id, " generated hash ", file_hash, " for input file ", request_values$fastq$datapath)
logger::log_info(request_id, " storing request information")
request_info <- list(
data_filename = req$body$fastq$filename,
request_id = request_id,
request_time = request_time,
data_hash = file_hash,
# Extra element is just to make sure it's saved as an array even when a
# single classifier is requested. Horrible but I'm running out of time
requested_classifiers = c(requested_classifiers, "___"),
email = request_values$email,
match_completed = FALSE)
create_record(request_info, request_id)
logger::log_info(request_id, " storing requested sequence")
save_in_bucket(
path = request_values$fastq$datapath,
file_extension = tools::file_ext(req$body$fastq$filename),
data_hash = file_hash)
logger::log_info(request_id, " calling matching procedures")
classifiers_result <- lapply(
X = requested_classifiers,
FUN = process_classification,
file_hash = file_hash,
path = request_values$fastq$datapath)
})
results <- list(
running_time = as.numeric(running_time[3]),
matches = classifiers_result,
match_completed = TRUE)
logger::log_info(request_id, " updating request information")
update_record(results, request_id)
logger::log_success(request_id, " matching completed")
list(request_id = request_id)
}
#* Retrieve information about a previous request
#* @get /result
#* @serializer json list(force=TRUE)
function(request_id, res){
logger::log_info("Requested results for request_id ", request_id, " in /result endpoint")
record <- read_record(record_id = request_id)
if (is.null(record)){
res$status <- 501
return(list(error = "Request not found"))
} else {
record <- as.list(record)
record$request_time <- as.character(record$request_time)
}
return(record)
}