R/datasource-airtable.R

Defines functions read_dataset.datafire_airtable_connection is_connected.datafire_airtable_connection disconnect.datafire_airtable_connection connect.datafire_airtable_driver airtable check_airtable

Documented in airtable

check_airtable <- function(check_dots = TRUE, env = parent.frame()) {
  if (check_dots) {
    ellipsis::check_dots_used(env)
  }
  stopifnot(requireNamespace("httr", quietly = TRUE))
  stopifnot(requireNamespace("tidyr", quietly = TRUE))
  stopifnot(requireNamespace("tibble", quietly = TRUE))
}

#' Airtable driver
#'
#' @export
airtable <- function() {
  check_airtable(check_dots = FALSE)
  new_driver("Airtable", "datafire_airtable_driver")
}

#' @export
connect.datafire_airtable_driver <- function(x, api_key, base_id, ...) {
  check_airtable()
  header <- httr::add_headers(Authorization = paste("Bearer", api_key))
  url <- paste0("https://api.airtable.com/v0/", base_id)
  endpoint <- function(...) {
    paste0(url, ...)
  }
  new_connection(
    driver = x,
    header = header,
    endpoint = endpoint,
    class = "datafire_airtable_connection"
  )
}

#' @export
disconnect.datafire_airtable_connection <- function(x, ...) {
  check_airtable()
  rm("header", "endpoint", envir = x)
  invisible(x)
}

#' @export
is_connected.datafire_airtable_connection <- function(x, ...) {
  check_airtable()
  exists("header", envir = x)
}

#' @export
read_dataset.datafire_airtable_connection <- function(src, name, ...) {
  check_airtable()
  res <- httr::GET(src$endpoint("/", name), src$header)
  httr::stop_for_status(res, paste("read dataset", name))
  data <- tibble::tibble(record = httr::content(res)$records)
  data <- tidyr::hoist(data, .data[["record"]],
    `_id` = "id",
    `_createdTime` = "createdTime",
    fields = "fields"
  )
  data <- tidyr::unnest_wider(data, .data[["fields"]])
  data
}
shunsambongi/datafire documentation built on Aug. 19, 2022, 9:57 a.m.