🎼 Creators Context — Models & Schema¶
Last updated: 2025-10-09 (Europe/Paris)
This page documents the core tables that power artist management, team membership, and roster metadata. Use it as a companion to the Creators overview when designing migrations or integrating with other contexts.
🗺️ Database Diagram¶
%%{init: {'themeVariables': {'fontSize': '15px'}, 'class': {'useMaxWidth': true}}}%%
classDiagram
direction LR
class Artist {
UUID id
string name
string slug (unique)
text bio (nullable)
UUID organization_id (nullable)
string country_code (nullable)
json links (nullable)
json visuals (nullable)
timestamps
}
class ArtistProfile {
UUID id
UUID artist_id
text about (nullable)
json socials (nullable)
json press_kits (nullable)
timestamps
}
class ArtistMember {
UUID id
UUID artist_id
UUID user_id
string role (enum)
string status (enum)
json permissions (nullable)
timestamp joined_at (nullable)
timestamps
}
class ArtistInvitation {
UUID id
UUID artist_id
UUID inviter_id
string email
string role
string status (enum)
string token (unique)
timestamp expires_at
timestamps
}
class ArtistAlias {
UUID id
UUID artist_id
string name
string slug (unique)
string status (enum)
timestamps
}
Artist "1" -- "many" ArtistMember : has
Artist "1" -- "many" ArtistInvitation : invites
Artist "1" -- "many" ArtistAlias : alias
Artist "1" -- "1" ArtistProfile : profile
note for Artist "organization_id references Accounts.Organizations when rostered"
note for ArtistMember "role maps to creator-level permissions"
🧱 Domain Models in Scope¶
| Model | Stored in | Description |
|---|---|---|
App\Models\Creators\Artist |
artists |
Canonical artist entity, optionally rostered under an organization. |
App\Models\Creators\ArtistProfile |
artist_profiles |
Extended profile content (bio, socials, press kits). |
App\Models\Creators\ArtistMember |
artist_members |
Pivot linking users/collaborators to artists with roles. |
App\Models\Creators\ArtistInvitation |
artist_invitations |
Pending invitations for future collaborators. |
App\Models\Creators\ArtistAlias |
artist_aliases |
Additional performer or project names under the same artist. |
📋 Table Details¶
artists¶
artists holds the canonical entry for every creator, including optional linkage to a label (organization) for roster management.
| Column | Type | Notes |
|---|---|---|
id |
UUID | Primary key. |
name |
string | Canonical creator name. |
slug |
string | URL-safe identifier; unique per artist. |
bio |
text (nullable) | Narrative biography for public pages. |
organization_id |
UUID (nullable) | Links artist to an Accounts organization for roster management. |
country_code |
string (nullable) | ISO code for search filters and compliance. |
links |
JSON (nullable) | External links (Bandcamp, socials). |
visuals |
JSON (nullable) | Artwork references (cover, banner, gallery). Each entry typically stores a Spatie Media Library identifier/conversion for first-party assets. |
timestamps |
— | Laravel managed. |
artist_profiles¶
Extended profile information (long-form text, socials, media kits) lives in artist_profiles to keep the core artist row lean.
| Column | Type | Notes |
|---|---|---|
id |
UUID | Primary key. |
artist_id |
UUID | FK to artists. |
about |
text (nullable) | Long-form story, EPK blurbs. |
socials |
JSON (nullable) | Structured social handles. |
press_kits |
JSON (nullable) | Links/assets for media kits (references to Spatie media items or external URLs). |
timestamps |
— | Audit metadata changes. |
artist_members¶
artist_members map users to artists, recording their role, status, and any creator-level permission overrides.
| Column | Type | Notes |
|---|---|---|
id |
UUID | Primary key. |
artist_id |
UUID | FK to artists. |
user_id |
UUID | FK to Accounts users. |
role |
string | owner, admin, member, collaborator. |
status |
string | pending, active, removed. |
permissions |
JSON (nullable) | Overrides for specific actions (release.publish). Label managers creating artists can seed additional abilities here when necessary. |
joined_at |
timestamp (nullable) | When invite was accepted. |
timestamps |
— | Track membership updates. |
artist_invitations¶
Pending collaborator invites are stored in artist_invitations until the recipient accepts and an ArtistMember is created.
| Column | Type | Notes |
|---|---|---|
id |
UUID | Primary key. |
artist_id |
UUID | FK to artists. |
inviter_id |
UUID | FK to users (sender). |
email |
string | Recipient; supports non-registered collaborators. |
role |
string | Proposed role on acceptance. |
status |
string | pending, accepted, declined, revoked. |
token |
string | Signed token for acceptance flows. |
expires_at |
timestamp | Invite validity window. |
timestamps |
— | Invite lifecycle tracking. |
artist_aliases¶
Use artist_aliases to capture alternate project names, side projects, or transliterations under a single artist.
| Column | Type | Notes |
|---|---|---|
id |
UUID | Primary key. |
artist_id |
UUID | FK to artists. |
name |
string | Alternate or project name. |
slug |
string | Unique handle for alias routes. |
status |
string | active, archived. |
timestamps |
— | Alias history. |
🧪 Migration Notes¶
- Use UUID primary keys for parity with Accounts context. Add composite uniqueness on (
artist_id,user_id) inartist_members. - Index
statuscolumns for quick roster filtering; indexorganization_idonartistsfor label-level queries. - Consider soft deletes on
artist_profilesonly if versioning is required; otherwise rely on audit events. - Invitations should cascade delete when artists are removed to avoid orphaned tokens.
Related Docs¶
docs/contexts/creators/index.md— Overview and flows for the Creators context.docs/contexts/auth/roles-permissions.md— Permission resolution involving artist members.docs/contexts/diagrams/index.md— Central directory of ER diagrams.