Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions R/list_user_activity_stream.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#' List User Activity Stream
#'
#' Retrieves the activity stream (recent activities/stories) for a specified user from the Canvas LMS API.
#' The activity stream contains recent activities such as assignments, discussions, announcements, and other course interactions.
#'
#' @param canvas A list containing the 'api_key' and 'base_url' for authentication.
#' @param user_id The ID of the user whose activity stream to retrieve. Defaults to "self" for the authenticated user.
#' @param per_page Number of activity items to retrieve per page. Default is 100.
#' @param ... Additional parameters to pass to the API request.
#'
#' @return A data frame of activity stream objects retrieved from the Canvas LMS API. Each row represents a story/activity. Uses pagination to retrieve all available results.
#'
#' @details
#' The activity stream returns Canvas "stories" which are activity objects that represent recent user activities.
#' These may include course activities, announcements, assignment submissions, discussion posts, and other interactions.
#'
#' This function uses pagination to automatically retrieve all available activity stream items across multiple pages.
#'
#' The API endpoint used is: \code{GET /api/v1/users/:user_id/activity_stream}
#'
#' @examples
#' \dontrun{
#' # Get activity stream for the authenticated user
#' canvas <- canvas_authenticate()
#' activities <- list_user_activity_stream(canvas)
#'
#' # Get activity stream for a specific user
#' activities <- list_user_activity_stream(canvas, user_id = "12345")
#'
#' # Get activity stream with custom pagination
#' activities <- list_user_activity_stream(canvas, per_page = 50)
#' }
#'
#' @seealso
#' \url{https://canvas.instructure.com/doc/api/users.html#method.users.activity_stream}
#'
#' @export
list_user_activity_stream <- function(canvas, user_id = "self", per_page = 100, ...) {
# Construct the base API endpoint URL
url <- paste0(canvas$base_url, "/api/v1/users/", user_id, "/activity_stream")

# Build query parameters
query_params <- list(per_page = per_page, ...)

# Make the API request
response <- httr::GET(url, query = query_params, httr::add_headers(Authorization = paste("Bearer", canvas$api_key)))

# Use pagination helper to get all pages
responses <- paginate(response, canvas$api_key)

# Parse and combine all results
activity_list <- lapply(responses, function(resp) {
httr::content(resp, "text", encoding = "UTF-8") %>%
jsonlite::fromJSON(flatten = TRUE) %>%
as.data.frame()
})
activity_stream <- dplyr::bind_rows(activity_list)

# Return the activity stream
return(activity_stream)
}
4 changes: 2 additions & 2 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -2632,10 +2632,10 @@
- [ ] List users in account UsersController#api_index ;
GET /api/v1/accounts/:account_id/users

- [ ] List the activity stream UsersController#activity_stream ;
- [x] List the activity stream UsersController#activity_stream ;
GET /api/v1/users/self/activity_stream

- [ ] List the activity stream UsersController#activity_stream ;
- [x] List the activity stream UsersController#activity_stream ;
GET /api/v1/users/activity_stream

- [ ] Activity stream summary UsersController#activity_stream_summary ;
Expand Down
5 changes: 5 additions & 0 deletions _pkgdown.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1304,6 +1304,11 @@ reference:
# - get_document_annotations_read_state
# - mark_document_annotations_as_read
# - submission_summary
- title: Users
desc: >
Manage users and user activities.
contents:
- list_user_activity_stream
# title: Custom Data
# desc: >
# Manage custom data.
Expand Down