project-standalo-sonic-cloud/.workflow/versions/v003/requirements/expanded.yml

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