Reputation Faction Hierarchy
Blizzard-synced reputation faction tree used to group character reputations by expansion on the character detail page.
Architecture
Reputation factions form a tree hierarchy:
flowchart TD
R["Root — expansion header<br/>(e.g. The War Within)"]
R --> S["Sub-header<br/>(e.g. Hallowfall)"]
S --> L1["Leaf: The Assembly of the Deeps"]
S --> L2["Leaf: Council of Dornogal"]
R --> L3["Leaf: The Severed Threads"]
Root factions are expansion-level headers. Leaf factions are the actual factions players earn reputation with. Some expansions have intermediate sub-headers.
Data Model
Follows the journal locale pattern — structural data in one table, localized text in a separate locale table.
ReputationFaction (GDL catalog)
| Field | Description |
|---|---|
id | Blizzard faction ID |
parentFactionId | Self-relation to parent header (nullable) |
isHeader | True for expansion/category groups |
sortOrder | Position in the Blizzard index (lower = older) |
isRenown | True for renown-based factions |
canParagon | Whether faction supports paragon levels |
maxRenownLevel | Cap for renown factions (nullable) |
ReputationFactionLocale
| Field | Description |
|---|---|
reputationFactionId | FK to ReputationFaction |
locale | e.g. en_US, de_DE |
name | Localized faction name |
Composite PK: (reputationFactionId, locale). en_US is the mandatory default.
Sync Process
Triggered via admin endpoint or cron. Runs inside GDL (Rust).
- Fetch
/data/wow/reputation-faction/index— returnsroot_factionsand flatfactionslist - For each root faction:
- Fetch per-locale detail (
/data/wow/reputation-faction/{id}) - Insert root into
wow_reputation_factionswithis_header = true - Insert children with
parent_faction_idpointing to root - Insert locales into
wow_reputation_faction_locales
- Fetch per-locale detail (
- For each child:
- Fetch detail for renown fields (
is_renown,can_paragon,max_renown_level) - If it has sub-factions, mark as header and insert sub-factions recursively
- Fetch detail for renown fields (
- Ensure all leaf factions from the flat index exist (catch orphans)
Reputation Categories
Character reputations fall into three categories, distinguished by their standing and renownLevel values:
| Category | Detection | Examples |
|---|---|---|
| Classic | renownLevel is null, standing is standard tier name | Friendly, Honored, Revered, Exalted |
| Renown | renownLevel is non-null | Renown 1–25 (Dragonflight+) |
| Friendship | renownLevel is null, standing is custom name | "Appreciative", "True Friend" |
Character Reputations Endpoint
GET /characters/:id/reputations?standing=&locale=
- Load character reputations from GDL enrichment data
- Optionally filter by
standing(e.g.EXALTED) - Load faction hierarchy via
gameDataService.getReputationFactions(locale) - Build a flat
factionMapfrom the GDL tree - For each reputation:
resolveRoot(factionId)— walk upparentIdto the root expansion headerresolveSubGroup(factionId)— find intermediate header between leaf and root
- Group reputations by root expansion
- Sort groups by
sortOrder(miscellaneous like "Guild" sorted last) - Return
{ groups: [{ expansion, reputations }], ungrouped }
Admin Endpoints
| Method | Path | Description |
|---|---|---|
| POST | /admin/sync-reputation-factions | Trigger faction sync via GDL |