Skip to main content

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)

FieldDescription
idBlizzard faction ID
parentFactionIdSelf-relation to parent header (nullable)
isHeaderTrue for expansion/category groups
sortOrderPosition in the Blizzard index (lower = older)
isRenownTrue for renown-based factions
canParagonWhether faction supports paragon levels
maxRenownLevelCap for renown factions (nullable)

ReputationFactionLocale

FieldDescription
reputationFactionIdFK to ReputationFaction
localee.g. en_US, de_DE
nameLocalized faction name

Composite PK: (reputationFactionId, locale). en_US is the mandatory default.

Sync Process

Triggered via admin endpoint or cron. Runs inside GDL (Rust).

  1. Fetch /data/wow/reputation-faction/index — returns root_factions and flat factions list
  2. For each root faction:
    • Fetch per-locale detail (/data/wow/reputation-faction/{id})
    • Insert root into wow_reputation_factions with is_header = true
    • Insert children with parent_faction_id pointing to root
    • Insert locales into wow_reputation_faction_locales
  3. 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
  4. 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:

CategoryDetectionExamples
ClassicrenownLevel is null, standing is standard tier nameFriendly, Honored, Revered, Exalted
RenownrenownLevel is non-nullRenown 1–25 (Dragonflight+)
FriendshiprenownLevel is null, standing is custom name"Appreciative", "True Friend"

Character Reputations Endpoint

GET /characters/:id/reputations?standing=&locale=

  1. Load character reputations from GDL enrichment data
  2. Optionally filter by standing (e.g. EXALTED)
  3. Load faction hierarchy via gameDataService.getReputationFactions(locale)
  4. Build a flat factionMap from the GDL tree
  5. For each reputation:
    • resolveRoot(factionId) — walk up parentId to the root expansion header
    • resolveSubGroup(factionId) — find intermediate header between leaf and root
  6. Group reputations by root expansion
  7. Sort groups by sortOrder (miscellaneous like "Guild" sorted last)
  8. Return { groups: [{ expansion, reputations }], ungrouped }

Admin Endpoints

MethodPathDescription
POST/admin/sync-reputation-factionsTrigger faction sync via GDL