Skip to main content

DDD Ubiquitous Language

This document defines the ubiquitous language for each bounded context, ensuring consistent terminology across code, documentation, and team communication.


Guild Management Context​

Guild Management - Terms​

Guild​

  • A group of players organized for cooperative gameplay
  • Can be Blizzard-synced (WoW guilds) or Standalone (template-based, manually managed)
  • Has identity: name, realm, faction
  • Contains settings, roles, and members

Realm​

  • The game server where a guild exists
  • For Blizzard-synced guilds: actual WoW realm name
  • For standalone guilds: "N/A" or custom identifier

Faction​

  • The allegiance of a guild: alliance or horde
  • Inherited from the founding character's faction

Sync Source​

  • How a guild's roster is managed:
    • blizzard: Roster synced from Battle.net API
    • standalone: Manually managed, no external sync

Role​

  • A position within the guild hierarchy (e.g., Guild Master, Officer, Raider, Member)
  • Contains permissions defining what actions the role can perform
  • Blizzard-synced guilds: Roles map to WoW ranks (0-9, where 0 = Guild Master)
  • Standalone guilds: Custom roles with no WoW rank mapping

WoW Rank​

  • Numeric rank from World of Warcraft (0-9)
  • Lower number = higher authority (0 = Guild Master)
  • Only applies to Blizzard-synced guilds

Founder Role​

  • The initial Guild Master role created at guild creation
  • Cannot be deleted (prevents guilds from becoming leaderless)
  • Marked with isFounder: true

Archive​

  • Soft-delete a guild (marks active: false, sets archivedAt)
  • Archived guilds are hidden by default but can be restored
  • Preserves all data and relationships

Restore​

  • Unarchive a guild (marks active: true, clears archivedAt)
  • Makes the guild visible and active again

Hard Delete​

  • Permanently delete a guild from the database
  • Only allowed for standalone guilds
  • Cascades to all related data (roles, memberships, events)

Logo Management​

  • Synced Logo: Guild emblem from Battle.net API
  • Custom Logo: User-uploaded image
  • Use Custom Logo: Toggle between synced and custom logo
  • Standalone guilds only have custom logos

Guild Settings​

  • JSON object containing feature flags and preferences:
    • template: Character template (wow, ffxiv, gw2, custom)
    • allowCrossFranchise: Allow characters from different games
    • privacy: Guild visibility settings (future)

Guild Management - Verbs​

  • Create Guild: Establish a new guild with a founding character as Guild Master
  • Archive Guild: Soft-delete a guild (can be restored)
  • Restore Guild: Reactivate an archived guild
  • Delete Guild: Permanently remove a standalone guild
  • Update Settings: Modify guild configuration
  • Upload Logo: Add a custom guild emblem
  • Toggle Logo: Switch between synced and custom logo
  • Define Role: Create a new role with permissions
  • Update Role: Change role name or permissions

Member Management Context​

Member Management - Terms​

Membership​

  • The link between a Character and a Guild
  • Represents a character's membership in a guild with a specific role and status
  • One character can have multiple memberships (in different guilds)

Membership Status​

  • Current state of a member within the guild:
    • trial: New member on probation
    • active: Full member in good standing
    • benched: Temporarily not participating in activities
    • removed: No longer a member

Role Assignment​

  • Linking a membership to a specific guild role
  • Determines the member's permissions within the guild

Role Change History​

  • Audit trail of role changes for a membership
  • Tracks:
    • Previous role
    • New role
    • Who made the change (or "system" if automatic)
    • When it happened
    • Optional reason

Joined Date (firstSyncedAt)

  • When the character first joined the guild
  • Set at membership creation

Left Date (leftAt)

  • When the character left the guild
  • Soft-delete mechanism (null = still a member)

Member Management - Verbs​

  • Add Member: Create a new membership (manual addition to standalone guilds)
  • Remove Member: Soft-delete a membership by setting leftAt
  • Assign Role: Link a membership to a specific guild role
  • Change Role: Update a member's role (tracked in history)
  • Promote: Assign a member to a higher-authority role
  • Demote: Assign a member to a lower-authority role
  • Set Status: Update membership status (trial → active → benched → removed)

Member Management - Rules​

  • Cannot manually add/remove members from Blizzard-synced guilds
  • Role changes are always tracked in history
  • Memberships are soft-deleted (never hard-deleted)

Roster Sync Context​

Roster Sync - Terms​

Guild Member (distinct from Membership)

  • Lightweight roster entry from external sync (Battle.net API)
  • Represents a character as it appears in the game's guild roster
  • Not directly linked to user accounts until "claimed"

Roster​

  • The list of characters in a guild as reported by Battle.net
  • Includes character name, realm, and WoW rank

Roster Sync​

  • The process of fetching guild roster data from Battle.net
  • Runs on schedule (daily at 3 AM)
  • Updates/creates GuildMember entries

Claim​

  • Linking a GuildMember (roster entry) to a Character (user-owned)
  • Establishes ownership: "This roster entry is my character"
  • One-to-one relationship (one character claims one roster entry)

Auto-Claim​

  • Automatic linking of a GuildMember to an existing Character
  • Happens during sync if name/realm match and character isn't already claimed

Unclaimed Roster Entry​

  • A GuildMember that no user has claimed ownership of yet
  • Visible in roster but not linked to any user account

Last Seen In Roster​

  • Timestamp of when a character was last observed in Battle.net roster
  • Updated every sync

Left Guild​

  • When a character no longer appears in the roster during sync
  • Marked with leftGuildAt timestamp

Avatar​

  • Character portrait/image from Battle.net
  • Fetched asynchronously via background job queue

Roster Sync - Verbs​

  • Sync Roster: Fetch current guild roster from Battle.net
  • Upsert Member: Create or update a GuildMember entry
  • Claim Member: Link a roster entry to a user-owned character
  • Auto-Claim: Automatically link matching roster entries during sync
  • Mark As Left: Set leftGuildAt when character no longer in roster
  • Fetch Avatar: Queue background job to retrieve character portrait

Roster Sync - Rules​

  • Roster entries are created/updated from external source (read-only from user perspective)
  • Only Blizzard-synced guilds have roster entries
  • Claiming requires character ownership verification
  • Requires valid Battle.net access token from at least one guild member

Event Scheduling Context​

Event Scheduling - Terms​

Event​

  • A scheduled guild activity (raid, mythic+, social, PvP)
  • Has a type, title, scheduled time, and metadata

Event Type​

  • Category of event:
    • raid: PvE raid content
    • mythic_plus: Mythic+ dungeon runs
    • social: Guild gatherings, meetings
    • pvp: Player vs Player activities

Participation​

  • A user's involvement in an event
  • Tracks invitation, confirmation, and attendance

Participation Status​

  • Current state of a user's participation:
    • invited: User has been invited
    • confirmed: User confirmed they'll attend
    • attended: User showed up (marked by officer)
    • benched: User was on standby
    • absent: User didn't show up (no-show)

Event Metadata​

  • JSON object with event-specific details:
    • difficulty: Raid difficulty (normal, heroic, mythic)
    • instance: Which raid/dungeon
    • notes: Additional information

Event Creator​

  • The user who created the event
  • Typically an officer or raid leader

Event Scheduling - Verbs​

  • Schedule Event: Create a new event with date/time
  • Invite Member: Add a participation with invited status
  • Confirm Attendance: User confirms they'll attend
  • Mark Attended: Officer marks user as present
  • Mark Absent: Officer marks user as no-show
  • Bench Member: Place user on standby

Event Scheduling - Rules​

  • Events belong to a guild
  • Events must have a creator
  • Participations track individual users (not characters)
  • Attendance data used for trial evaluation

Identity & Authentication Context​

Identity & Authentication - Terms​

User​

  • A real human using the platform
  • Authenticated via OAuth (Battle.net, Discord)
  • Can own multiple characters

Character​

  • A player avatar in a game (WoW, FFXIV, GW2, custom)
  • Owned by a user
  • Can be Blizzard-synced or manually created

Sync Source (Character)

  • How the character was created:
    • blizzard: Synced from Battle.net API
    • manual: Manually created in the app

Character Template​

  • The type of character: wow, wow_classic, ffxiv, gw2, custom
  • Determines available attributes (class, race, level, etc.)
  • Extensible for new games

Battle.net ID​

  • Unique identifier from Battle.net API
  • Used for character sync and OAuth

Discord ID​

  • Unique identifier from Discord
  • Used for Discord OAuth integration

OAuth Tokens​

  • Access token, refresh token, and expiry
  • Encrypted at rest for security
  • Required for Battle.net API calls

Display Name​

  • User's visible name on the platform
  • Set from OAuth provider (Battle.net or Discord)

Active Character​

  • Character that is not deleted/transferred
  • Marked with active: true

Identity & Authentication - Verbs​

  • Authenticate: Log in via OAuth (Battle.net or Discord)
  • Create Character: Manually create a character
  • Sync Character: Fetch character data from Battle.net
  • Deactivate Character: Mark character as inactive (server transfer, deletion)
  • Refresh Token: Get new access token using refresh token

Identity & Authentication - Rules​

  • Users must authenticate to access the platform
  • OAuth tokens are encrypted at rest
  • Battle.net ID and Discord ID are unique per user
  • One user can own multiple characters
  • Characters can only be claimed by their owner

Cross-Context Terms​

These terms are used across multiple contexts and have shared meanings:

Aggregate​

  • A cluster of domain objects treated as a single unit for data changes
  • Has a root entity and boundary

Aggregate Root​

  • The main entity in an aggregate
  • Controls access to aggregate internals
  • Enforces invariants

Value Object​

  • Immutable object defined by its attributes (no identity)
  • Examples: GuildSettings, OAuthTokens, EventType

Entity​

  • Object with identity that persists over time
  • Examples: Guild, User, Character, Membership

Domain Event​

  • Something that happened in the domain that domain experts care about
  • Examples: GuildCreated, MemberJoined, RosterSynced (future)

Invariant​

  • A business rule that must always be true
  • Enforced by the aggregate root

Repository​

  • Interface for accessing and persisting aggregates
  • Abstracts database details from domain logic

Anti-Patterns to Avoid​

Don't Say​

  • "User" when you mean "Character" (users own characters, characters have memberships)
  • "Delete" when you mean "Archive" (use soft-delete by default)
  • "Permission" when you mean "Role" (roles have permissions)
  • "Rank" without context (WoW rank vs. custom role priority)
  • "Member" without context (Membership vs. GuildMember are different!)

Do Say​

  • "Membership" for the character-guild-role link
  • "GuildMember" for the lightweight roster entry
  • "Archive" for soft-delete of guilds
  • "WoW Rank" for the numeric 0-9 rank from Blizzard
  • "Role" for the guild position with permissions

Usage in Code​

The ubiquitous language should appear consistently in:

  • Class names: Guild, Membership, GuildMember, ParticipationStatus
  • Method names: archiveGuild(), assignRole(), claimRosterEntry()
  • Variable names: syncSource, wowRank, useCustomLogo
  • Comments and documentation
  • API endpoint names: /guilds/:id/archive, /memberships/:id/assign-role
  • Domain events: GuildCreated, MemberJoined, RosterSynced

This ensures that developers, stakeholders, and documentation all speak the same language.