145 lines
4.4 KiB
YAML
145 lines
4.4 KiB
YAML
feature: "add label management system"
|
|
expanded_at: "2025-12-18T17:39:00"
|
|
mode: full_auto
|
|
|
|
analysis:
|
|
problem_statement: |
|
|
Record labels need a comprehensive management system to:
|
|
- View and manage their label profile
|
|
- Invite and manage signed artists
|
|
- View statistics about their artists and music catalog
|
|
- Browse and discover potential artists to sign
|
|
target_users: "Record label owners and managers"
|
|
core_value: "Centralized label management with artist roster control"
|
|
|
|
scope:
|
|
mvp_features:
|
|
- Label profile page showing label info and signed artists
|
|
- Label dashboard for label owners
|
|
- Artist roster management (view signed artists)
|
|
- Artist invitation system (invite artists to join label)
|
|
- Label profile editing
|
|
- Label statistics (total artists, songs, plays)
|
|
future_features:
|
|
- Revenue tracking and royalty management
|
|
- Contract management
|
|
- Release scheduling
|
|
- Analytics dashboard with charts
|
|
|
|
data_model:
|
|
entities:
|
|
- name: LabelInvitation
|
|
description: "Invitations from labels to artists"
|
|
fields:
|
|
- id (string, uuid)
|
|
- labelId (string, FK to Label)
|
|
- artistId (string, FK to Artist)
|
|
- status (enum: pending, accepted, declined, expired)
|
|
- message (string, optional invitation message)
|
|
- expiresAt (datetime)
|
|
- createdAt (datetime)
|
|
- updatedAt (datetime)
|
|
relations:
|
|
- label (Label, many-to-one)
|
|
- artist (Artist, many-to-one)
|
|
|
|
api_endpoints:
|
|
# Label CRUD (existing POST, need GET single and PUT)
|
|
- method: GET
|
|
path: /api/labels/[id]
|
|
purpose: Get label details with artists and stats
|
|
|
|
- method: PUT
|
|
path: /api/labels/[id]
|
|
purpose: Update label profile (name, description, logo, website)
|
|
|
|
# Label Invitations
|
|
- method: GET
|
|
path: /api/labels/[id]/invitations
|
|
purpose: List pending invitations from label
|
|
|
|
- method: POST
|
|
path: /api/labels/[id]/invitations
|
|
purpose: Create invitation for an artist
|
|
|
|
- method: DELETE
|
|
path: /api/labels/[id]/invitations/[invitationId]
|
|
purpose: Cancel/delete invitation
|
|
|
|
# Artist-side invitation handling
|
|
- method: GET
|
|
path: /api/artists/[id]/invitations
|
|
purpose: List invitations received by artist
|
|
|
|
- method: POST
|
|
path: /api/artists/[id]/invitations/[invitationId]/respond
|
|
purpose: Accept or decline invitation
|
|
|
|
# Label Statistics
|
|
- method: GET
|
|
path: /api/labels/[id]/stats
|
|
purpose: Get label statistics (artist count, song count, total plays)
|
|
|
|
# Artist removal from label
|
|
- method: DELETE
|
|
path: /api/labels/[id]/artists/[artistId]
|
|
purpose: Remove artist from label roster
|
|
|
|
ui_structure:
|
|
pages:
|
|
- name: LabelProfilePage
|
|
route: /label/[id]
|
|
purpose: Public view of label profile with artist roster
|
|
|
|
- name: LabelDashboardPage
|
|
route: /label/dashboard
|
|
purpose: Label owner dashboard with management tools
|
|
|
|
- name: LabelEditPage
|
|
route: /label/settings
|
|
purpose: Edit label profile settings
|
|
|
|
- name: LabelInvitationsPage
|
|
route: /label/invitations
|
|
purpose: Manage artist invitations
|
|
|
|
components:
|
|
- name: LabelCard
|
|
purpose: Card displaying label summary for browse/search results
|
|
|
|
- name: LabelHeader
|
|
purpose: Header banner for label profile page
|
|
|
|
- name: LabelStats
|
|
purpose: Statistics display (artists, songs, plays)
|
|
|
|
- name: ArtistRoster
|
|
purpose: Grid/list of signed artists
|
|
|
|
- name: InvitationCard
|
|
purpose: Card showing invitation with accept/decline actions
|
|
|
|
- name: InviteArtistModal
|
|
purpose: Modal form to send invitation to artist
|
|
|
|
- name: LabelProfileForm
|
|
purpose: Form for editing label profile
|
|
|
|
security:
|
|
authentication: "Required for label management operations"
|
|
authorization:
|
|
- Label profile view: public
|
|
- Label management (edit, invitations): owner only
|
|
- Artist roster management: label owner only
|
|
- Invitation response: artist who received invitation only
|
|
|
|
edge_cases:
|
|
- scenario: Artist already belongs to another label
|
|
handling: Prevent invitation, show error message
|
|
- scenario: Artist already has pending invitation from same label
|
|
handling: Prevent duplicate, show existing invitation
|
|
- scenario: Invitation expires
|
|
handling: Mark as expired, remove from active list
|
|
- scenario: Label owner removes themselves
|
|
handling: Prevent - must have at least the owner artist
|