Skip to content

Commit fa37692

Browse files
committed
support passing connect_user object to downstream functions
we still support GUID string for now
1 parent d22fbf6 commit fa37692

File tree

8 files changed

+111
-41
lines changed

8 files changed

+111
-41
lines changed

R/connect.R

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -495,8 +495,9 @@ Connect <- R6::R6Class(
495495
# users -----------------------------------------------
496496

497497
#' @description Get user details.
498-
#' @param guid The user GUID.
498+
#' @param guid The user GUID or a `connect_user` object.
499499
user = function(guid) {
500+
guid <- get_user_guid(guid)
500501
prepend_class(self$GET(v1_url("users", guid)), "connect_user")
501502
},
502503

@@ -589,8 +590,9 @@ Connect <- R6::R6Class(
589590
},
590591

591592
#' @description Lock a user.
592-
#' @param user_guid User GUID.
593-
users_lock = function(user_guid) {
593+
#' @param user User GUID or a `connect_user` object.
594+
users_lock = function(user) {
595+
user_guid <- get_user_guid(user)
594596
path <- v1_url("users", user_guid, "lock")
595597
message(path)
596598
self$POST(
@@ -600,8 +602,9 @@ Connect <- R6::R6Class(
600602
},
601603

602604
#' @description Unlock a user.
603-
#' @param user_guid User GUID.
604-
users_unlock = function(user_guid) {
605+
#' @param user User GUID or a `connect_user` object.
606+
users_unlock = function(user) {
607+
user_guid <- get_user_guid(user)
605608
path <- v1_url("users", user_guid, "lock")
606609
self$POST(
607610
path = path,
@@ -610,9 +613,10 @@ Connect <- R6::R6Class(
610613
},
611614

612615
#' @description Update a user.
613-
#' @param user_guid User GUID.
616+
#' @param user User GUID or a `connect_user` object.
614617
#' @param ... User fields.
615-
users_update = function(user_guid, ...) {
618+
users_update = function(user, ...) {
619+
user_guid <- get_user_guid(user)
616620
path <- v1_url("users", user_guid)
617621
self$PUT(
618622
path = path,
@@ -645,16 +649,18 @@ Connect <- R6::R6Class(
645649

646650
#' @description Add a group member.
647651
#' @param group_guid The group GUID.
648-
#' @param user_guid The user GUID.
649-
group_member_add = function(group_guid, user_guid) {
652+
#' @param user The user GUID or a `connect_user` object.
653+
group_member_add = function(group_guid, user) {
654+
user_guid <- get_user_guid(user)
650655
path <- v1_url("groups", group_guid, "members")
651656
self$POST(path, body = list(user_guid = user_guid))
652657
},
653658

654659
#' @description Remove a group member.
655660
#' @param group_guid The group GUID.
656-
#' @param user_guid The user GUID.
657-
group_member_remove = function(group_guid, user_guid) {
661+
#' @param user The user GUID or a `connect_user` object.
662+
group_member_remove = function(group_guid, user) {
663+
user_guid <- get_user_guid(user)
658664
path <- v1_url("groups", group_guid, "members", user_guid)
659665
self$DELETE(path)
660666
},

R/content.R

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,14 @@ Content <- R6::R6Class(
219219
self$connect$GET(url)
220220
},
221221
#' @description Add a principal to the ACL for this content.
222-
#' @param principal_guid GUID for the target user or group.
222+
#' @param principal_guid GUID for the target user or group. When
223+
#' `principal_type = "user"`, can also be a `connect_user` object.
223224
#' @param principal_type Acting on user or group.
224225
#' @param role The kind of content access.
225226
permissions_add = function(principal_guid, principal_type, role) {
227+
if (principal_type == "user") {
228+
principal_guid <- get_user_guid(principal_guid)
229+
}
226230
url <- v1_url("content", self$content$guid, "permissions")
227231
self$connect$POST(
228232
url,
@@ -235,10 +239,14 @@ Content <- R6::R6Class(
235239
},
236240
#' @description Alter a principal in the ACL for this content.
237241
#' @param id The target identifier.
238-
#' @param principal_guid GUID for the target user or group.
242+
#' @param principal_guid GUID for the target user or group. When
243+
#' `principal_type = "user"`, can also be a `connect_user` object.
239244
#' @param principal_type Acting on user or group.
240245
#' @param role The kind of content access.
241246
permissions_update = function(id, principal_guid, principal_type, role) {
247+
if (principal_type == "user") {
248+
principal_guid <- get_user_guid(principal_guid)
249+
}
242250
url <- v1_url("content", self$content$guid, "permissions", id)
243251
self$connect$PUT(
244252
url,
@@ -954,7 +962,6 @@ set_run_as <- function(content, run_as, run_as_current_user = FALSE) {
954962
return(content)
955963
}
956964

957-
958965
#' Delete Content
959966
#'
960967
#' Delete a content item. WARNING: This action deletes all history, configuration,
@@ -1007,8 +1014,8 @@ content_delete <- function(content, force = FALSE) {
10071014
#' @param content An R6 content item
10081015
#' @param ... Settings up update that are passed along to Posit Connect
10091016
#' @param access_type One of "all", "logged_in", or "acl"
1010-
#' @param owner_guid The GUID of a user who is a publisher, so that they can
1011-
#' become the new owner of the content
1017+
#' @param owner The GUID of a user who is a publisher, so that they can
1018+
#' become the new owner of the content. Can also be a `connect_user` object.
10121019
#'
10131020
#' @return An R6 content item
10141021
#'
@@ -1040,7 +1047,8 @@ content_update_access_type <- function(
10401047

10411048
#' @rdname content_update
10421049
#' @export
1043-
content_update_owner <- function(content, owner_guid) {
1050+
content_update_owner <- function(content, owner) {
1051+
owner_guid <- get_user_guid(owner)
10441052
content_update(content = content, owner_guid = owner_guid)
10451053
}
10461054

@@ -1103,7 +1111,6 @@ unlock_content <- function(content) {
11031111
return(content)
11041112
}
11051113

1106-
11071114
#' Verify Content Name
11081115
#'
11091116
#' Ensures that a content name fits the specifications / requirements of Posit
@@ -1178,7 +1185,6 @@ delete_bundle <- function(content, bundle_id) {
11781185
return(content)
11791186
}
11801187

1181-
11821188
#' Content permissions
11831189
#'
11841190
#' Get or set content permissions for a content item
@@ -1199,8 +1205,12 @@ delete_bundle <- function(content, bundle_id) {
11991205
#' This makes it easier to find / isolate this record.
12001206
#'
12011207
#' @param content An R6 content object
1202-
#' @param guid The guid associated with either a user (for `content_add_user`) or group (for `content_add_group`)
1203-
#' @param role The role to assign to a user. Either "viewer" or "owner." Defaults to "viewer"
1208+
#' @param user The guid associated with either a user (for `content_add_user`)
1209+
#' or group (for `content_add_group`). Can also be a list of `connect_user`
1210+
#' objects.
1211+
#' @param guid The guid associated with a group.
1212+
#' @param role The role to assign to a user. Either "viewer" or "owner."
1213+
#' Defaults to "viewer"
12041214
#' @param add_owner Optional. Whether to include the owner in returned
12051215
#' permission sets. Default is TRUE. The owner will have an NA_character_
12061216
#' permission "id"
@@ -1209,10 +1219,11 @@ delete_bundle <- function(content, bundle_id) {
12091219
#' @rdname permissions
12101220
#' @family content functions
12111221
#' @export
1212-
content_add_user <- function(content, guid, role = c("viewer", "owner")) {
1222+
content_add_user <- function(content, user, role = c("viewer", "owner")) {
12131223
validate_R6_class(content, "Content")
12141224
role <- .define_role(role)
12151225

1226+
guid <- purrr::map_chr(user, get_user_guid)
12161227
purrr::map(guid, ~ .content_add_permission_impl(content, "user", .x, role))
12171228

12181229
return(content)
@@ -1278,8 +1289,9 @@ content_add_group <- function(content, guid, role = c("viewer", "owner")) {
12781289

12791290
#' @rdname permissions
12801291
#' @export
1281-
content_delete_user <- function(content, guid) {
1292+
content_delete_user <- function(content, user) {
12821293
validate_R6_class(content, "Content")
1294+
guid <- purrr::map_chr(user, get_user_guid)
12831295
purrr::map(
12841296
guid,
12851297
~ .content_delete_permission_impl(
@@ -1331,8 +1343,9 @@ content_delete_group <- function(content, guid) {
13311343

13321344
#' @rdname permissions
13331345
#' @export
1334-
get_user_permission <- function(content, guid, add_owner = TRUE) {
1346+
get_user_permission <- function(content, user, add_owner = TRUE) {
13351347
validate_R6_class(content, "Content")
1348+
guid <- get_user_guid(user)
13361349
res <- .get_permission(content, "user", guid, add_owner = add_owner)
13371350
if (length(res) > 0) {
13381351
return(res[[1]])
@@ -1361,7 +1374,6 @@ get_group_permission <- function(content, guid) {
13611374
}
13621375
}
13631376

1364-
13651377
#' @rdname permissions
13661378
#' @export
13671379
get_content_permissions <- function(content, add_owner = TRUE) {

R/user.R

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,28 @@ user_guid_from_username <- function(client, username) {
3232
return(res[[1]]$guid)
3333
}
3434
}
35+
36+
#' Extract User GUID
37+
#'
38+
#' Helper function to extract a user GUID from either a character string or a
39+
#' `connect_user` object.
40+
#'
41+
#' @param user Either a character string containing a user GUID or a
42+
#' `connect_user` object (as returned by `Connect$user()` or `Connect$users()`)
43+
#'
44+
#' @return A character string containing the user GUID
45+
#'
46+
#' @keywords internal
47+
get_user_guid <- function(user) {
48+
if (is.character(user)) {
49+
return(user)
50+
} else if (inherits(user, "connect_user")) {
51+
if (!is.null(user$guid)) {
52+
return(user$guid)
53+
} else {
54+
stop("connect_user object does not contain a guid field")
55+
}
56+
} else {
57+
stop("user must be either a character string (GUID) or a connect_user object")
58+
}
59+
}

man/Content.Rd

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/PositConnect.Rd

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/content_update.Rd

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/get_user_guid.Rd

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/permissions.Rd

Lines changed: 10 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)