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