---
title: "trud"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{trud}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  eval = Sys.getenv("IN_PKGDOWN") == "true" & Sys.getenv("TRUD_API_KEY") != ""
)
```

```{r setup}
library(trud)
```

The [National Health Service (NHS) England Technology Reference data Update Distribution (TRUD)](https://isd.digital.nhs.uk/trud/users/guest/filters/0/api) enables programmatic access to retrieve metadata for and download NHS TRUD release items. The `trud` package wraps this API, facilitating programmatic retrieval and updating of NHS TRUD resources:

Having installed `trud`, you will also need to:

-   [Sign up for a free account](https://isd.digital.nhs.uk/trud/users/guest/filters/0/account/form) with NHS TRUD
-   Set your API key (shown on your account information page) as an environmental variable named `TRUD_API_KEY`. The best way to do this is by placing your API key in a [`.Renviron` file](https://rstats.wtf/r-startup.html#renviron). For example, create or edit your project `.Renviron` file with `usethis::edit_r_environ()`, then populate as follows (replacing `e963cc518cc41500e1a8940a93ffc3c0915e2983` with your own API key):[^1]

[^1]: You will also need to restart your R session to set any environmental variables that have been newly-added to your project `.Renviron` file.

```
TRUD_API_KEY=e963cc518cc41500e1a8940a93ffc3c0915e2983
```

> **Optional**: You can customise the user agent header used in API requests by setting the `TRUD_USER_AGENT` environment variable. This can be useful for CI/CD environments or organisational tracking.

## Understanding TRUD Subscriptions

**Important**: NHS TRUD operates on a subscription-based model. Having an API key allows you to authenticate, but you must also subscribe to individual items through the NHS TRUD website before you can access them.

**The subscription workflow:**

1. Create your NHS TRUD account and get your API key (as described above)
2. Browse available items on the [NHS TRUD website](https://isd.digital.nhs.uk/trud/users/guest/filters/0/categories/1)
3. Subscribe to the specific items you need
4. Use the `trud` package to access your subscribed items

## Examples

### Check your current subscriptions

Start by seeing what items you're already subscribed to:

```{r get-subscribed-metadata}
get_subscribed_metadata()
```

### Browse all available items

You can see all available TRUD items, though you'll need to subscribe to access them:

```{r trud-items}
trud_items()
```

> Note that item numbers can also be found in the URLs of releases pages, between `items` and `releases`. For example, the URL for the [Community Services Data Set pre-deadline extract XML Schema](https://isd.digital.nhs.uk/trud/users/guest/filters/0/categories/1/items/394/releases) releases page is `https://isd.digital.nhs.uk/trud/users/guest/filters/0/categories/1/items/394/releases` and the item number is `394`.

To subscribe to an item, visit its page on the NHS TRUD website and click the "Subscribe" button.

### Get metadata for a specific item

Once subscribed to an item, you can retrieve its metadata:

```{r get-item-metadata}
get_item_metadata(394) |>
  # Display structure without showing sensitive API keys in URLs
  purrr::map_at("releases", \(release) purrr::map(release, names))
```

### Download an item

```{r download-item}
# by default the latest release will be downloaded to the current working directory
x <- download_item(394, directory = tempdir())
unzip(x, list = TRUE)
```

### Working with specific releases

To download a specific release (rather than the latest), you need the release ID. Release IDs are found in the `id` field of each release:

```{r specific-releases}
# Get metadata for all releases (not just latest)
metadata <- get_item_metadata(394, release_scope = "all")

# Release IDs are in the `id` field of each release
metadata$releases |> purrr::map("id")

# The same IDs are also used to name the releases list
metadata$releases |> names()

# Use a specific release ID with download_item()
release_id <- metadata$releases[[1]]$id  # Get ID of first release
download_item(394, directory = tempdir(), file_type = "checksum", release = release_id)
```
