# Collections

Four submodules, same shape: **mounts**, **battle pets**, **toys**, **titles**. Each provides a catalog of what exists in-game and tracks which items each character has collected.

## Mounts — `wow_mount`

- **Catalog:** mount name, description, source (vendor/drop/quest/etc.), faction restrictions, and icon.
- **Per-character:** which mounts are collected, favorites, and usability flags.

```
drush en wow_mount -y
drush wow:sync-mounts --force
```

## Battle pets — `wow_pet`

- **Catalog:** pet name, battle-pet type (Beast, Dragonkin, Mechanical, etc.), source, abilities.
- **Per-character:** collected pet instances with nickname, level, quality (rarity), breed, favorite flag.

```
drush en wow_pet -y
drush wow:sync-pets --force
```

## Toys — `wow_toy`

- **Catalog:** toy name, source, item reference.
- **Per-character:** which toys are unlocked.

```
drush en wow_toy -y
drush wow:sync-toys --force
```

## Titles — `wow_title`

- **Catalog:** title name (including gender-specific forms) and display order.
- **Per-character:** which titles are earned and which one is currently active.

```
drush en wow_title -y
drush wow:sync-titles --force
```

## How per-character collection works

Each collection module registers a `CharacterDataProvider` plugin. When `wow_character` syncs a character, the plugin runs automatically and fills in that character's collection from the matching `/profile/wow/character/{realm}/{name}/collections/{type}` endpoint.

There's no "collection sync" step separate from character sync. Enable the collection module → run the catalog sync → refresh characters.

If the catalog hasn't been synced yet, **unknown items are silently skipped** in the per-character sync. Catalogs always sync first.

## Dashboard actions

Each collection module exposes catalog actions on the dashboard (**Sync now**, **Force resync**, **Wipe**). There is no per-character collection button — collection freshness is tied to character refresh.

## Storage model

Collections use owner-agnostic junction entities (`wow_mount_collection`, `wow_collected_pet`, `wow_title_award`, `wow_toy_collection`). The `character` owner reference is projected in only when `wow_character` is enabled. Disabling `wow_character` doesn't orphan the junction rows, but character-specific queries stop working. See [lifecycle](../architecture/lifecycle.md#owner-projection).
