diff --git a/NAMESPACE b/NAMESPACE index 9abd8b71..fee66833 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -84,6 +84,7 @@ export(get_aws_content_credentials) export(get_aws_credentials) export(get_bundles) export(get_content) +export(get_content_list) export(get_content_packages) export(get_content_permissions) export(get_content_tags) diff --git a/NEWS.md b/NEWS.md index 5ed138ec..7b980239 100644 --- a/NEWS.md +++ b/NEWS.md @@ -9,6 +9,8 @@ - New functions allow you to manage the OAuth integrations on your Connect server: `create_integration()`, `update_integration()` and `delete_integration()`. (#434) +- New `get_content_list()` function retrieves a list of content items associated with + a specific OAuth integration. (#433) # connectapi 0.8.0 diff --git a/R/integrations.R b/R/integrations.R index ad833bbc..a703f653 100644 --- a/R/integrations.R +++ b/R/integrations.R @@ -286,6 +286,57 @@ set_integrations <- function(content, integrations) { invisible(NULL) } + +#' Get content items using an OAuth integration +#' +#' @description +#' Retrieves a list of content items that are associated with a specific OAuth +#' integration. +#' +#' You must have administrator privileges to use this function. +#' +#' @param x A `connect_integration` object (as returned by [get_integrations()], +#' [get_integration()], [create_integration()], or [update_integration()]). +#' +#' @return A list of `Content` R6 objects representing all pieces of content +#' that use the specified OAuth integration. See [content_item()] for details +#' on the object. +#' +#' @seealso +#' [get_integrations()], [get_integration()], [get_associations()], +#' [content_item()] +#' +#' @examples +#' \dontrun{ +#' client <- connect() +#' +#' # Get an integration +#' integration <- get_integration(client, "12345678-90ab-cdef-1234-567890abcdef") +#' +#' # Find all content using this integration +#' content_using_integration <- get_content_list(integration) +#' } +#' +#' @family oauth integration functions +#' @export +get_content_list <- function(x) { + if (!inherits(x, "connect_integration")) { + stop("'x' must be a 'connect_integration' object") + } + client <- attr(x, "client") + error_if_less_than(client$version, "2024.12.0") + assoc <- client$GET(v1_url( + "oauth", + "integrations", + x$guid, + "associations" + )) + purrr::map( + assoc, + ~ content_item(client, .x$content_guid) + ) +} + #' Get OAuth associations for a piece of content #' #' @description diff --git a/man/create_integration.Rd b/man/create_integration.Rd index f7f72a07..69aec3ed 100644 --- a/man/create_integration.Rd +++ b/man/create_integration.Rd @@ -74,6 +74,7 @@ custom_integration <- create_integration( Other oauth integration functions: \code{\link{delete_integration}()}, \code{\link{get_associations}()}, +\code{\link{get_content_list}()}, \code{\link{get_integration}()}, \code{\link{get_integrations}()}, \code{\link{set_integrations}()}, diff --git a/man/delete_integration.Rd b/man/delete_integration.Rd index 416e6384..441e57dc 100644 --- a/man/delete_integration.Rd +++ b/man/delete_integration.Rd @@ -42,6 +42,7 @@ delete_integration(integration) Other oauth integration functions: \code{\link{create_integration}()}, \code{\link{get_associations}()}, +\code{\link{get_content_list}()}, \code{\link{get_integration}()}, \code{\link{get_integrations}()}, \code{\link{set_integrations}()}, diff --git a/man/get_associations.Rd b/man/get_associations.Rd index c2c762ad..2afd9611 100644 --- a/man/get_associations.Rd +++ b/man/get_associations.Rd @@ -50,6 +50,7 @@ my_app_integrations <- purrr::map( Other oauth integration functions: \code{\link{create_integration}()}, \code{\link{delete_integration}()}, +\code{\link{get_content_list}()}, \code{\link{get_integration}()}, \code{\link{get_integrations}()}, \code{\link{set_integrations}()}, diff --git a/man/get_content_list.Rd b/man/get_content_list.Rd new file mode 100644 index 00000000..2461145b --- /dev/null +++ b/man/get_content_list.Rd @@ -0,0 +1,49 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/integrations.R +\name{get_content_list} +\alias{get_content_list} +\title{Get content items using an OAuth integration} +\usage{ +get_content_list(x) +} +\arguments{ +\item{x}{A \code{connect_integration} object (as returned by \code{\link[=get_integrations]{get_integrations()}}, +\code{\link[=get_integration]{get_integration()}}, \code{\link[=create_integration]{create_integration()}}, or \code{\link[=update_integration]{update_integration()}}).} +} +\value{ +A list of \code{Content} R6 objects representing all pieces of content +that use the specified OAuth integration. See \code{\link[=content_item]{content_item()}} for details +on the object. +} +\description{ +Retrieves a list of content items that are associated with a specific OAuth +integration. + +You must have administrator privileges to use this function. +} +\examples{ +\dontrun{ +client <- connect() + +# Get an integration +integration <- get_integration(client, "12345678-90ab-cdef-1234-567890abcdef") + +# Find all content using this integration +content_using_integration <- get_content_list(integration) +} + +} +\seealso{ +\code{\link[=get_integrations]{get_integrations()}}, \code{\link[=get_integration]{get_integration()}}, \code{\link[=get_associations]{get_associations()}}, +\code{\link[=content_item]{content_item()}} + +Other oauth integration functions: +\code{\link{create_integration}()}, +\code{\link{delete_integration}()}, +\code{\link{get_associations}()}, +\code{\link{get_integration}()}, +\code{\link{get_integrations}()}, +\code{\link{set_integrations}()}, +\code{\link{update_integration}()} +} +\concept{oauth integration functions} diff --git a/man/get_integration.Rd b/man/get_integration.Rd index b7a8055b..7bb73ca7 100644 --- a/man/get_integration.Rd +++ b/man/get_integration.Rd @@ -49,6 +49,7 @@ Other oauth integration functions: \code{\link{create_integration}()}, \code{\link{delete_integration}()}, \code{\link{get_associations}()}, +\code{\link{get_content_list}()}, \code{\link{get_integrations}()}, \code{\link{set_integrations}()}, \code{\link{update_integration}()} diff --git a/man/get_integrations.Rd b/man/get_integrations.Rd index 25b354a0..7d779ca0 100644 --- a/man/get_integrations.Rd +++ b/man/get_integrations.Rd @@ -69,6 +69,7 @@ Other oauth integration functions: \code{\link{create_integration}()}, \code{\link{delete_integration}()}, \code{\link{get_associations}()}, +\code{\link{get_content_list}()}, \code{\link{get_integration}()}, \code{\link{set_integrations}()}, \code{\link{update_integration}()} diff --git a/man/set_integrations.Rd b/man/set_integrations.Rd index 615f8ebd..82f2ded0 100644 --- a/man/set_integrations.Rd +++ b/man/set_integrations.Rd @@ -51,6 +51,7 @@ Other oauth integration functions: \code{\link{create_integration}()}, \code{\link{delete_integration}()}, \code{\link{get_associations}()}, +\code{\link{get_content_list}()}, \code{\link{get_integration}()}, \code{\link{get_integrations}()}, \code{\link{update_integration}()} diff --git a/man/update_integration.Rd b/man/update_integration.Rd index a4ca7aaa..9d8bbbc9 100644 --- a/man/update_integration.Rd +++ b/man/update_integration.Rd @@ -72,6 +72,7 @@ Other oauth integration functions: \code{\link{create_integration}()}, \code{\link{delete_integration}()}, \code{\link{get_associations}()}, +\code{\link{get_content_list}()}, \code{\link{get_integration}()}, \code{\link{get_integrations}()}, \code{\link{set_integrations}()} diff --git a/tests/testthat/2025.07.0/__api__/v1/oauth/integrations/0000001/associations.json b/tests/testthat/2025.07.0/__api__/v1/oauth/integrations/0000001/associations.json new file mode 100644 index 00000000..dc3d3d93 --- /dev/null +++ b/tests/testthat/2025.07.0/__api__/v1/oauth/integrations/0000001/associations.json @@ -0,0 +1,12 @@ +[ + { + "app_guid": "12345678", + "content_guid": "12345678", + "oauth_integration_guid": "0000001", + "oauth_integration_name": "Integration 1", + "oauth_integration_description": "This is the first description", + "oauth_integration_template": "template1", + "oauth_integration_auth_type": "Viewer", + "created_time": "2025-08-05T20:02:39Z" + } +] diff --git a/tests/testthat/test-integrations.R b/tests/testthat/test-integrations.R index b82ef388..5a492818 100644 --- a/tests/testthat/test-integrations.R +++ b/tests/testthat/test-integrations.R @@ -285,3 +285,23 @@ with_mock_dir("2025.07.0", { expect_null(delete_integration(created)) }) }) + +with_mock_dir("2025.07.0", { + test_that("get_content_list() gets content items for integration", { + client <- Connect$new(server = "https://connect.example", api_key = "fake") + integration <- get_integration(client, "0000001") + result <- get_content_list(integration) + expect_equal(length(result), 1) + expect_true(validate_R6_class(result[[1]], "Content")) + expect_equal(result[[1]]$content$name, "fake-app-2000") + }) +}) + +test_that("get_content_list() errs with too-old Connect", { + client <- MockConnect$new("2024.11.1") + client$version + expect_error( + get_integrations(client), + "This feature requires Posit Connect version 2024.12.0 but you are using 2024.11.1" + ) +})