R/gtm_containers_methods.R

Defines functions gtm_containers_update gtm_containers_delete gtm_containers_create gtm_containers_get gtm_containers_list

Documented in gtm_containers_create gtm_containers_delete gtm_containers_get gtm_containers_list gtm_containers_update

#' gtm_containers_list
#'
#' Get a list of all of the Google Tag Manager containers in a specific account
#' @param account_id The ID of the account that you need a container list for
#' @param token An OAuth token object
#' @param verbose If you want a message letting you know that your results have been successfully retrieved. Defaults to FALSE
#' @export

gtm_containers_list <- function(account_id,token,verbose = FALSE) {

  require(neugelbtools)
  require(httr)
  require(tidyverse)
  require(purrr)

  "
  NOTE: The documentation suggests that you can use a pageToken to paginate your requests, but it doesn't provide any more detail about how it works.
  So I have left it out!
  "
  token_status(token)

  api_url <- paste('https://www.googleapis.com/tagmanager/v2/accounts/',account_id,'/containers',sep='')

  call <- easy_call('get',api_url,token)

  call_content <- content(call,'parsed')

  verbose_calls(call,call_content,verbose)

  container_tbl <- tibble()

  for (i in 1:length(call_content$container)) {

    new_tbl <- as_tibble(call_content$container[[i]]) %>%
      unnest(usageContext)

    if (length(new_tbl$domainName) == 1) {

      new_tbl <- new_tbl %>%
        unnest(domainName)

    } else if (is_empty(new_tbl$domainName) == TRUE | length(new_tbl$domainName) < 1) {

      new_tbl$domainName <- NA

    } else {

      new_tbl$domainName <- str_c(new_tbl$domainName,collapse=', ')
    }

    container_tbl <- bind_rows(container_tbl,new_tbl)

  }

  container_tbl <- container_tbl %>%
    tidycols() %>%
    usage_context_fix()

  return(container_tbl)

}

#' gtm_containers_get
#'
#' Get a data frame of information on a specific GTM container
#' @param account_id The ID for the GTM account where the desired container sits
#' @param container_id The ID for the GTM container that you want to see
#' @param token An OAuth token object
#' @param verbose If you want a message letting you know that your results have been successfully retrieved. Defaults to FALSE
#' @export

gtm_containers_get <- function(account_id,container_id,token,verbose=FALSE) {

  require(neugelbtools)
  require(httr)
  require(tidyverse)

  token_status(token)

  api_slug <- 'https://www.googleapis.com/tagmanager/v2'

  #check to see if the container id is the public ID

  if (str_detect(str_to_upper(container_id),'GTM')==TRUE) {

    #I don't know why this is necessary, but it is

    conid <- container_id

    account_list <- gtm_containers_list(account_id,token) %>%
      filter(public_id == conid)

  cid <- account_list[['container_id']]

  path <- paste('accounts',account_id,'containers',cid,sep='/')

  } else {

    path <- paste('accounts',account_id,'containers',container_id,sep='/')

  }

  api_url <- paste(api_slug,path,sep='/')

  call <- GET(api_url,
              add_headers(Authorization = paste("Bearer", token$credentials$access_token)),
              encode = 'json')

  call_content <- content(call,'parsed')

  verbose_calls(call,call_content,verbose)

  containers_tbl <- as_tibble(call_content) %>%
    unnest(usageContext) %>%
    tidycols() %>%
    select(-path) %>%
    usage_context_fix()

  return(containers_tbl)

}

#' gtm_containers_create
#'
#' Create a new Google Tag Manager container from scratch
#' @param account_id The ID for the GTM account where the desired container sits
#' @param container_name The name of the new container
#' @param usage_context The type of container you want to create. Valid values are: 'web', 'android', 'ios'
#' @param token An OAuth token object
#' @param domain_name Domain name(s) that you want to associate with the container. Optional.
#' @param notes A string of notes that you want to write to the container. Optional.
#' @param verbose If you want a message letting you know that your container has been successfully created. Defaults to FALSE
#' @export

gtm_containers_create <- function(account_id,container_name,usage_context,token,domain_name=NULL,notes=NULL,verbose=FALSE) {

  require(neugelbtools)
  require(httr)
  require(tidyverse)
  require(purrr)

  token_status(token)
  "
  Problem: only creates legacy containers (as far as I can tell)
  Also, domain name and notes are not perfect
  "
  #check the usage context is correct
  uc <- str_to_lower(usage_context)

  if (!str_to_lower(uc) %in% c('web','android','ios')) {

    stop('Error: Incorrect usage context; it must be one of "web", "android", or "ios"')

  }

  #create the post url
  api_url <- paste('https://www.googleapis.com/tagmanager/v2/accounts/',account_id,'/containers',sep='')

  #create the list with required components

  call_body <- list(accountId = account_id,
                    name = container_name,
                    usageContext = list(usage_context))

  #check for the optional components

  if (is_empty(domain_name) == FALSE) {

    if (class(domain_name) == 'list') {

      call_body$domainName <- domain_name
    } else if (class(domain_name) == 'character') {

      call_body$domainName <- list(domain_name)

    } else {

      stop('Error: If you want to include a domain name (or names), please provide it/them as a list or a character vector')
    }

  }

  if (is_empty(notes) == FALSE) {

    call_body$notes <- notes

  }

  call <- easy_call('post',api_url,token,call_body = call_body)

  call_content <- content(call,'parsed')

  verbose_calls(call,call_content,verbose)

}

#' gtm_containers_delete
#'
#' Delete a Google Tag Manager container
#' @param account_id The ID for the GTM account where the desired container sits
#' @param container_id The ID for the GTM container that you want to see
#' @param token An OAuth token object
#' @param verbose If you want a message letting you know that your container has been successfully created. Defaults to FALSE
#' @export

gtm_containers_delete <- function(account_id,container_id,token,verbose=FALSE) {

  require(neugelbtools)
  require(httr)
  require(tidyverse)
  require(purrr)

  token_status(token)

  api_slug <- 'https://www.googleapis.com/tagmanager/v2'

  path <- paste('accounts',account_id,'containers',container_id,sep='/')

  api_url <- paste(api_slug,path,sep='/')

  call <- easy_call('delete',api_url,token)

  call_content <- content(call,'parsed')

  verbose_calls(call,call_content,verbose)

}

#' gtm_containers_update
#'
#' Update an existing GTM container
#' @param account_id The ID for the GTM account where the desired container sits
#' @param container_id The id of the container to be updated
#' @param container_name The new name for the container
#' @param usage_context The type of container you want to create. Valid values are: 'web', 'android', 'ios'
#' @param token An OAuth token object, should be set to 'edit containers'
#' @param domain_name Domain name(s) that you want to associate with the container. Can be a list or a character vector
#' @param notes A string of notes that you want to write to the container
#' @param verbose If you want a message letting you know that your container has been successfully created. Defaults to FALSE
#' @export

gtm_containers_update <- function(account_id,container_id,container_name,usage_context,domain_name,notes,token,verbose=FALSE) {

  require(neugelbtools)
  require(httr)
  require(tidyverse)
  require(purrr)

  token_status(token)
  "
  Problem: only creates legacy containers (as far as I can tell)
  "

  #check the usage context is correct
  uc <- str_to_lower(usage_context)

  if (!str_to_lower(uc) %in% c('web','android','ios')) {

    stop('Error: Incorrect usage context; it must be one of "web", "android", or "ios"')

  }

  if (str_detect(str_to_upper(container_id),'GTM')==TRUE) {

    #I don't know why this is necessary, but it is

    conid <- container_id

    account_list <- gtm_containers_list(account_id,token) %>%
      filter(public_id == conid)

    if ('domain_name' %in% names(account_list)) {
      account_list <- account_list %>%
        select(-domain_name) %>%
        distinct()
    }

  cid <- account_list[['container_id']]

  path <- paste('accounts',account_id,'containers',cid,sep='/')

  } else {

    path <- paste('accounts',account_id,'containers',container_id,sep='/')

  }

  #create the post url
  api_url <- paste('https://www.googleapis.com/tagmanager/v2',path,sep='/')

  #create the list with required components

  call_body <- list(accountId = account_id,
                    name = container_name,
                    usageContext = list(uc),
                    notes = notes)

  #check for the optional components

  if (class(domain_name) == 'list') {

      call_body$domainName <- domain_name
    } else if (class(domain_name) == 'character') {

      call_body$domainName <- list(domain_name)

    } else {

      stop('Error: If you want to include a domain name (or names), please provide it/them as a list or a character vector')

    }

  call <- easy_call('put',api_url,token,call_body = call_body)

  call_content <- content(call,'parsed')

  verbose_calls(call,call_content,verbose)

}
neugelb/gtmr documentation built on June 25, 2020, 10:06 a.m.