{"openapi":"3.1.0","info":{"title":"SpinWish API","description":"SpinWish - A platform for music artists and fans with payment integration","contact":{"name":"SpinWish Team","url":"https://spinwish.com","email":"support@spinwish.com"},"license":{"name":"MIT License","url":"https://opensource.org/licenses/MIT"},"version":"v1.0"},"servers":[{"url":"http://localhost:9000","description":"Development Server"},{"url":"https://spinwish.onrender.com","description":"Production Server"}],"security":[{"Bearer Authentication":[]}],"tags":[{"name":"Club Management","description":"APIs for managing clubs and venues"},{"name":"Rating Controller","description":"DJ Rating management endpoints"},{"name":"Database","description":"Database verification and analysis endpoints"},{"name":"Payout Management","description":"APIs for managing DJ payout methods and requests"},{"name":"Logging","description":"Log management and viewing endpoints"},{"name":"Monitoring","description":"Server monitoring and metrics endpoints"},{"name":"Favorites Management","description":"APIs for managing user favorites (DJs, songs, genres, artists)"},{"name":"Song Requests","description":"APIs for managing song requests between users and DJs"},{"name":"Data Population","description":"Admin endpoints for populating test data"},{"name":"Background Jobs","description":"Background job management endpoints"},{"name":"Metrics","description":"Application metrics and performance data"},{"name":"Traffic Analytics","description":"User traffic tracking and analytics"},{"name":"Alerts","description":"Alert management and monitoring endpoints"},{"name":"Status","description":"Status.gg style status page endpoints"},{"name":"DJ Management","description":"APIs for managing DJs and DJ-specific operations"},{"name":"Earnings Management","description":"APIs for managing DJ earnings and payouts"},{"name":"Health","description":"Health check and monitoring endpoints"},{"name":"User Management","description":"APIs for user registration, authentication, and management"},{"name":"Session Management","description":"APIs for managing DJ sessions"},{"name":"Email Testing","description":"APIs for testing email functionality (Development only)"}],"paths":{"/api/v1/users/me":{"get":{"tags":["User Management"],"summary":"Get current user data","description":"Retrieve current authenticated user's data with favorites and preferences","operationId":"getCurrentUser","responses":{"200":{"description":"Current user data retrieved successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]},"put":{"tags":["User Management"],"summary":"Update current user profile","description":"Update current authenticated user's profile information","operationId":"updateCurrentUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DjProfileUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Profile updated successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/songs/{id}":{"get":{"tags":["song-controller"],"operationId":"getById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SongResponse"}}}}}},"put":{"tags":["song-controller"],"operationId":"update","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SongRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SongResponse"}}}}}},"delete":{"tags":["song-controller"],"operationId":"delete","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/sessions/{sessionId}":{"get":{"tags":["Session Management"],"summary":"Get session by ID","description":"Retrieve a specific session by its ID","operationId":"getSessionById","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Session found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Session"}}}},"404":{"description":"Session not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]},"put":{"tags":["Session Management"],"summary":"Update session","description":"Update session details","operationId":"updateSession","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]},"delete":{"tags":["Session Management"],"summary":"Delete session","description":"Delete a session","operationId":"deleteSession","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/{sessionId}/start":{"put":{"tags":["Session Management"],"summary":"Start session","description":"Change session status to LIVE","operationId":"startSession","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/{sessionId}/pause":{"put":{"tags":["Session Management"],"summary":"Pause session","description":"Change session status to PAUSED","operationId":"pauseSession","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/{sessionId}/listeners/{count}":{"put":{"tags":["Session Management"],"summary":"Update listener count","description":"Update the number of listeners for a session","operationId":"updateListenerCount","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"count","in":"path","description":"Listener count","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/{sessionId}/end":{"put":{"tags":["Session Management"],"summary":"End session","description":"Change session status to ENDED","operationId":"endSession","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/roles/{id}":{"get":{"tags":["role-controller"],"operationId":"getRoleById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RoleResponse"}}}}}},"put":{"tags":["role-controller"],"operationId":"updateRole","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RoleResponse"}}}}}},"delete":{"tags":["role-controller"],"operationId":"deleteRole","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/requests/{id}":{"get":{"tags":["Song Requests"],"summary":"Get request by ID","description":"Retrieve a specific song request by its ID","operationId":"getById_1","parameters":[{"name":"id","in":"path","description":"Request ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Request retrieved successfully","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Request not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]},"put":{"tags":["Song Requests"],"operationId":"update_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaySongRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}},"delete":{"tags":["Song Requests"],"operationId":"delete_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/requests/{id}/reject":{"put":{"tags":["Song Requests"],"summary":"Reject a request","description":"Reject a song request (DJ only)","operationId":"rejectRequest","parameters":[{"name":"id","in":"path","description":"Request ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Request rejected successfully","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Request not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}},"403":{"description":"Forbidden - DJ role required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/{id}/done":{"put":{"tags":["Song Requests"],"summary":"Mark request as done","description":"Mark a song request as completed/played (DJ only)","operationId":"markAsDone","parameters":[{"name":"id","in":"path","description":"Request ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Request marked as done successfully","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Request not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}},"403":{"description":"Forbidden - DJ role required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/{id}/accept":{"put":{"tags":["Song Requests"],"summary":"Accept a request","description":"Accept a song request (DJ only)","operationId":"acceptRequest","parameters":[{"name":"id","in":"path","description":"Request ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Request accepted successfully","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Request not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}},"403":{"description":"Forbidden - DJ role required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/queue/{djId}/reorder":{"put":{"tags":["Song Requests"],"summary":"Reorder queue manually","description":"Manually reorder the request queue by providing new order of request IDs","operationId":"reorderQueue","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}},"required":true},"responses":{"200":{"description":"Queue reordered successfully","content":{"*/*":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request data","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}},"403":{"description":"Forbidden - DJ role required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/profile":{"get":{"tags":["profile-controller"],"operationId":"fetchProfile","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}}}},"put":{"tags":["profile-controller"],"operationId":"updateProfile","parameters":[{"name":"profileRequest","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ProfileRequest"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}}}},"post":{"tags":["profile-controller"],"operationId":"addProfile","parameters":[{"name":"profileRequest","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ProfileRequest"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}}}}},"/api/v1/profile/payment-methods/{id}/set-default":{"put":{"tags":["profile-controller"],"operationId":"setDefaultPaymentMethod","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/profile/image":{"put":{"tags":["profile-controller"],"operationId":"uploadProfileImage","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"binary"}},"required":["image"]}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/payouts/methods/{methodId}/default":{"put":{"tags":["Payout Management"],"summary":"Set default payout method","description":"Set a payout method as the default for the current DJ","operationId":"setDefaultPayoutMethod","parameters":[{"name":"methodId","in":"path","description":"Payout method ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/{djId}/rating/{rating}":{"put":{"tags":["DJ Management"],"summary":"Update DJ rating","description":"Update a DJ's rating (0.0 to 5.0)","operationId":"updateDJRating","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"rating","in":"path","description":"New rating (0.0 to 5.0)","required":true,"schema":{"type":"number","format":"double"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/{djId}/profile":{"put":{"tags":["DJ Management"],"summary":"Update DJ profile","description":"Update DJ-specific profile information","operationId":"updateDJProfile","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Users"}}},"required":true},"responses":{"200":{"description":"DJ profile updated successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Users"}}}},"400":{"description":"Invalid DJ data","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"DJ not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/{djId}/live/{isLive}":{"put":{"tags":["DJ Management"],"summary":"Set DJ live status","description":"Update whether a DJ is currently live","operationId":"setDJLiveStatus","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"isLive","in":"path","description":"Live status","required":true,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/clubs/{clubId}":{"get":{"tags":["Club Management"],"summary":"Get club by ID","description":"Retrieve a specific club by its ID","operationId":"getClubById","parameters":[{"name":"clubId","in":"path","description":"Club ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Club found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Club"}}}},"404":{"description":"Club not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]},"put":{"tags":["Club Management"],"summary":"Update club","description":"Update club details","operationId":"updateClub","parameters":[{"name":"clubId","in":"path","description":"Club ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Club"}}},"required":true},"responses":{"200":{"description":"Club updated successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Club"}}}},"400":{"description":"Invalid club data or club name conflict","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Club not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]},"delete":{"tags":["Club Management"],"summary":"Delete club","description":"Delete a club","operationId":"deleteClub","parameters":[{"name":"clubId","in":"path","description":"Club ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/clubs/{clubId}/deactivate":{"put":{"tags":["Club Management"],"summary":"Deactivate club","description":"Set club status to inactive","operationId":"deactivateClub","parameters":[{"name":"clubId","in":"path","description":"Club ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/clubs/{clubId}/activate":{"put":{"tags":["Club Management"],"summary":"Activate club","description":"Set club status to active","operationId":"activateClub","parameters":[{"name":"clubId","in":"path","description":"Club ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/artists/{id}":{"get":{"tags":["artist-controller"],"operationId":"getArtistById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ArtistResponse"}}}}}},"put":{"tags":["artist-controller"],"operationId":"updateArtist","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"artistRequest","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ArtistRequest"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ArtistResponse"}}}}}},"delete":{"tags":["artist-controller"],"operationId":"deleteArtist","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/users/verify":{"post":{"tags":["User Management"],"summary":"Verify user account","description":"Verify user account with the provided verification code","operationId":"verifyAccount","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationRequest"}}},"required":true},"responses":{"200":{"description":"Verification successful","content":{"*/*":{"schema":{"$ref":"#/components/schemas/VerificationResponse"}}}},"400":{"description":"Invalid verification code or expired","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/users/signup":{"post":{"tags":["User Management"],"summary":"Register a new user","description":"Create a new user account with the provided registration details","operationId":"signUp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"User registered successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"401":{"description":"Registration failed - unauthorized","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/users/send-verification":{"post":{"tags":["User Management"],"summary":"Send verification code","description":"Send verification code via email or SMS to the user","operationId":"sendVerificationCode","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Verification code sent successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SendVerificationResponse"}}}},"400":{"description":"Invalid request or user not found","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/users/reset-password":{"post":{"tags":["User Management"],"summary":"Reset password","description":"Reset password using the 6-digit code sent via email","operationId":"resetPassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Password reset successfully","content":{"*/*":{"schema":{"type":"object"}}}},"400":{"description":"Invalid or expired reset code","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/users/resend-verification":{"post":{"tags":["User Management"],"summary":"Resend verification email","description":"Resend verification email to an existing unverified user","operationId":"resendVerificationEmail","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"description":"Email address to resend verification"}}},"required":true},"responses":{"200":{"description":"Verification email sent successfully","content":{"*/*":{"schema":{"type":"string"}}}},"400":{"description":"User not found or already verified","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/users/profile-image":{"post":{"tags":["User Management"],"summary":"Upload profile image","description":"Upload a profile image for the current user","operationId":"uploadProfileImage_1","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"binary","description":"Image file to upload"}},"required":["image"]}}}},"responses":{"200":{"description":"Image uploaded successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"400":{"description":"Invalid image file","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/users/login":{"post":{"tags":["User Management"],"summary":"User login","description":"Authenticate user and return JWT token","operationId":"login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Login successful","content":{"*/*":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"401":{"description":"Invalid credentials","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/users/forgot-password":{"post":{"tags":["User Management"],"summary":"Request password reset","description":"Send a 6-digit password reset code to the user's email","operationId":"forgotPassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Reset code sent (always returns 200 for security)","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/users/dj-signup":{"post":{"tags":["User Management"],"summary":"Register a new DJ","description":"Create a new DJ account with DJ-specific information including bio, genres, and profile details","operationId":"djSignUp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DJRegisterRequest"}}},"required":true},"responses":{"201":{"description":"DJ registration successful","content":{"*/*":{"schema":{"$ref":"#/components/schemas/DJRegisterResponse"}}}},"400":{"description":"Invalid registration data","content":{"*/*":{"schema":{"type":"string"}}}},"409":{"description":"User already exists","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/users/cover-image":{"post":{"tags":["User Management"],"summary":"Upload cover image","description":"Upload a background cover image for the current user","operationId":"uploadCoverImage","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"binary","description":"Image file to upload"}},"required":["image"]}}}},"responses":{"200":{"description":"Image uploaded successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"400":{"description":"Invalid image file","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/users/check-verification-status":{"post":{"tags":["User Management"],"summary":"Check user verification status","description":"Check if a user exists and their verification status","operationId":"checkVerificationStatus","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"description":"Email address to check"}}},"required":true},"responses":{"200":{"description":"Verification status checked successfully","content":{"*/*":{"schema":{"type":"string"}}}},"400":{"description":"Invalid request","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/traffic/pageview":{"post":{"tags":["Traffic Analytics"],"summary":"Record a page view","operationId":"recordPageView","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageViewRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/songs":{"get":{"tags":["song-controller"],"operationId":"getAll","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":50}},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string","default":"name"}},{"name":"sortDirection","in":"query","required":false,"schema":{"type":"string","default":"asc"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageSongResponse"}}}}}},"post":{"tags":["song-controller"],"operationId":"create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SongRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SongResponse"}}}}}}},"/api/v1/sessions":{"get":{"tags":["Session Management"],"summary":"Get all sessions","description":"Retrieve all sessions","operationId":"getAllSessions","responses":{"200":{"description":"Sessions retrieved successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Session"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}}},"security":[{"Bearer Authentication":[]}]},"post":{"tags":["Session Management"],"summary":"Create a new session","description":"Create a new DJ session","operationId":"createSession","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}},"required":true},"responses":{"201":{"description":"Session created successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Session"}}}},"400":{"description":"Invalid session data","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/{sessionId}/upload-image":{"post":{"tags":["Session Management"],"summary":"Upload session image","description":"Upload an image for a DJ session. Only the DJ who owns the session can upload images.","operationId":"uploadSessionImage","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"binary","description":"Image file to upload"}},"required":["image"]}}}},"responses":{"200":{"description":"Image uploaded successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Session"}}}},"400":{"description":"Invalid image file or session not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}},"413":{"description":"File size exceeds maximum allowed size","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/{sessionId}/like":{"post":{"tags":["Session Management"],"summary":"Like a session","description":"Toggle like on a session","operationId":"toggleLikeSession","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/{sessionId}/leave":{"post":{"tags":["Session Management"],"summary":"Leave a session","description":"Decrement the listener count for a session","operationId":"leaveSession","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/{sessionId}/join":{"post":{"tags":["Session Management"],"summary":"Join a session","description":"Increment the listener count for a session","operationId":"joinSession","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/roles":{"get":{"tags":["role-controller"],"operationId":"getAllRoles","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RoleResponse"}}}}}}},"post":{"tags":["role-controller"],"operationId":"createNewRole","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RoleResponse"}}}}}}},"/api/v1/requests":{"get":{"tags":["Song Requests"],"summary":"Get all requests","description":"Retrieve all song requests (admin/DJ access)","operationId":"getAll_1","responses":{"200":{"description":"Requests retrieved successfully","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}}},"security":[{"Bearer Authentication":[]}]},"post":{"tags":["Song Requests"],"summary":"Create a song request","description":"Create a new song request from a user to a DJ","operationId":"create_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaySongRequest"}}},"required":true},"responses":{"201":{"description":"Request created successfully","content":{"*/*":{"schema":{"type":"object"}}}},"400":{"description":"Invalid request data","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}},"500":{"description":"Internal server error","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/ratings/dj":{"post":{"tags":["Rating Controller"],"summary":"Submit or update DJ rating","operationId":"submitDJRating","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitRatingRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/profile/payment-methods":{"get":{"tags":["profile-controller"],"operationId":"getPaymentMethods","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}},"post":{"tags":["profile-controller"],"operationId":"addPaymentMethod","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/payouts/requests":{"get":{"tags":["Payout Management"],"summary":"Get payout requests","description":"Get all payout requests for the current DJ","operationId":"getPayoutRequests","parameters":[{"name":"page","in":"query","description":"Page number","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","description":"Page size","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]},"post":{"tags":["Payout Management"],"summary":"Create payout request","description":"Create a new payout request for the current DJ","operationId":"createPayoutRequest","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePayoutRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/payouts/requests/{requestId}/process":{"post":{"tags":["Payout Management"],"summary":"Process payout request (Demo)","description":"Process a payout request using PayMe simulation","operationId":"processPayoutRequest","parameters":[{"name":"requestId","in":"path","description":"Payout request ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/payouts/methods":{"get":{"tags":["Payout Management"],"summary":"Get payout methods","description":"Get all payout methods for the current DJ","operationId":"getPayoutMethods","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]},"post":{"tags":["Payout Management"],"summary":"Add payout method","description":"Add a new payout method (bank account or M-Pesa) for the current DJ","operationId":"addPayoutMethod","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPayoutMethodRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/payment/payme/demo":{"post":{"tags":["payment-controller"],"operationId":"initiatePaymeDemo","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/payment/mpesa/stkpush":{"post":{"tags":["payment-controller"],"operationId":"initiateStkPush","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MpesaRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/payment/mpesa/callback":{"post":{"tags":["payment-controller"],"operationId":"handleCallback","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MpesaCallbackResponse"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/musicbrainz/store/{mbid}":{"post":{"tags":["music-brainz-controller"],"operationId":"storeTrack","parameters":[{"name":"mbid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Songs"}}}}}}},"/api/v1/musicbrainz/search-and-store":{"post":{"tags":["music-brainz-controller"],"operationId":"searchAndStore","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Songs"}}}}}}},"/api/v1/musicbrainz/extract/genre/{genre}":{"post":{"tags":["music-brainz-controller"],"operationId":"extractSongsByGenre","parameters":[{"name":"genre","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/musicbrainz/extract/artist/{mbid}":{"post":{"tags":["music-brainz-controller"],"operationId":"extractSongsByArtist","parameters":[{"name":"mbid","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/lastfm/store":{"post":{"tags":["last-fm-controller"],"operationId":"storeTrack_1","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Songs"}}}}}}},"/api/v1/jobs/{taskId}/cancel":{"post":{"tags":["Background Jobs"],"summary":"Cancel a job","description":"Attempts to cancel a running job","operationId":"cancelJob","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/favorites":{"get":{"tags":["Favorites Management"],"summary":"Get all user favorites","description":"Retrieve all favorites for the current user","operationId":"getAllFavorites","responses":{"200":{"description":"Favorites retrieved successfully","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FavoriteResponse"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FavoriteResponse"}}}}}},"security":[{"Bearer Authentication":[]}]},"post":{"tags":["Favorites Management"],"summary":"Add item to favorites","description":"Add a DJ, song, genre, or artist to user's favorites","operationId":"addFavorite","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddFavoriteRequest"}}},"required":true},"responses":{"201":{"description":"Item added to favorites successfully","content":{"*/*":{"schema":{"type":"object"}}}},"400":{"description":"Item already in favorites or invalid request","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/email-test/send-welcome":{"post":{"tags":["Email Testing"],"summary":"Test welcome email sending","description":"Send a test welcome email to verify SMTP configuration is working","operationId":"testWelcomeEmail","parameters":[{"name":"email","in":"query","description":"Email address to send test to (optional, defaults to configured test recipient)","required":false,"schema":{"type":"string"}},{"name":"username","in":"query","description":"Username for the test email (optional)","required":false,"schema":{"type":"string","default":"Test User"}}],"responses":{"200":{"description":"Test welcome email sent successfully","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"400":{"description":"Email testing is disabled","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"500":{"description":"Failed to send test welcome email","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/email-test/send-verification":{"post":{"tags":["Email Testing"],"summary":"Test verification email sending","description":"Send a test verification email to verify SMTP configuration is working","operationId":"testVerificationEmail","parameters":[{"name":"email","in":"query","description":"Email address to send test to (optional, defaults to configured test recipient)","required":false,"schema":{"type":"string"}},{"name":"username","in":"query","description":"Username for the test email (optional)","required":false,"schema":{"type":"string","default":"Test User"}}],"responses":{"200":{"description":"Test email sent successfully","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"400":{"description":"Email testing is disabled","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"500":{"description":"Failed to send test email","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/djs/{djId}/unfollow":{"post":{"tags":["DJ Management"],"summary":"Unfollow DJ","description":"Remove a follower from a DJ and remove from favorites","operationId":"unfollowDJ","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/{djId}/rate":{"post":{"tags":["DJ Management"],"summary":"Rate DJ","description":"Rate a DJ (POST format for app compatibility)","operationId":"rateDJ","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"number","format":"double"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/{djId}/follow":{"post":{"tags":["DJ Management"],"summary":"Follow DJ","description":"Add a follower to a DJ and add to favorites","operationId":"followDJ","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/clubs":{"get":{"tags":["Club Management"],"summary":"Get all clubs","description":"Retrieve all clubs","operationId":"getAllClubs","responses":{"200":{"description":"Clubs retrieved successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Club"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Club"}}}}}},"security":[{"Bearer Authentication":[]}]},"post":{"tags":["Club Management"],"summary":"Create a new club","description":"Create a new club or venue","operationId":"createClub","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Club"}}},"required":true},"responses":{"201":{"description":"Club created successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Club"}}}},"400":{"description":"Invalid club data or club name already exists","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/artists":{"get":{"tags":["artist-controller"],"operationId":"getAllArtists","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ArtistResponse"}}}}}}},"post":{"tags":["artist-controller"],"operationId":"createArtist","parameters":[{"name":"artistRequest","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ArtistRequest"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ArtistResponse"}}}}}}},"/api/v1/alerts":{"post":{"tags":["Alerts"],"summary":"Create new alert","description":"Create a new system alert","operationId":"createAlert","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/alerts/{alertId}/resolve":{"post":{"tags":["Alerts"],"summary":"Resolve alert","description":"Mark an alert as resolved","operationId":"resolveAlert","parameters":[{"name":"alertId","in":"path","required":true,"schema":{"type":"string"}},{"name":"resolvedBy","in":"query","required":false,"schema":{"type":"string"}},{"name":"resolution","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/alerts/{alertId}/acknowledge":{"post":{"tags":["Alerts"],"summary":"Acknowledge alert","description":"Acknowledge an active alert","operationId":"acknowledgeAlert","parameters":[{"name":"alertId","in":"path","required":true,"schema":{"type":"string"}},{"name":"acknowledgedBy","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/admin/songs/sync":{"post":{"tags":["song-sync-controller"],"operationId":"triggerManualSync","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/admin/data/populate":{"post":{"tags":["Data Population"],"summary":"Populate test data","description":"Populate the database with sample DJs, artists, and songs for testing purposes","operationId":"populateTestData","responses":{"200":{"description":"Data populated successfully","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"500":{"description":"Error during data population","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/uploads/session-images/{filename}":{"get":{"tags":["file-controller"],"operationId":"serveSessionImage","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","format":"binary"}}}}}}},"/uploads/profile-images/{filename}":{"get":{"tags":["file-controller"],"operationId":"serveProfileImage","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","format":"binary"}}}}}}},"/uploads/artists-images/{filename}":{"get":{"tags":["file-controller"],"operationId":"serveArtistImage","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","format":"binary"}}}}}}},"/api/v1/users":{"get":{"tags":["User Management"],"summary":"Get all users","description":"Retrieve a list of all registered users (requires authentication)","operationId":"fetchUsers","responses":{"200":{"description":"Users retrieved successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProfileResponse"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/traffic/stats":{"get":{"tags":["Traffic Analytics"],"summary":"Get current traffic statistics","operationId":"getTrafficStats","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/traffic/realtime":{"get":{"tags":["Traffic Analytics"],"summary":"Get real-time traffic data","operationId":"getRealtimeTraffic","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/traffic/history":{"get":{"tags":["Traffic Analytics"],"summary":"Get traffic history","operationId":"getTrafficHistory","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":24}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/traffic/dashboard":{"get":{"tags":["Traffic Analytics"],"summary":"Get traffic dashboard data","operationId":"getDashboard","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/status":{"get":{"tags":["Status"],"summary":"Status page overview","description":"Returns status.gg style status overview","operationId":"getStatus","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/status/summary":{"get":{"tags":["Status"],"summary":"Status summary","description":"Returns a brief status summary for badges/widgets","operationId":"getSummary","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/status/metrics/uptime":{"get":{"tags":["Status"],"summary":"Uptime metrics","description":"Returns uptime percentage for various time periods","operationId":"getUptimeMetrics","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/status/incidents":{"get":{"tags":["Status"],"summary":"Incident information","description":"Returns current and recent incidents","operationId":"getIncidents","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/status/history":{"get":{"tags":["Status"],"summary":"Status history","description":"Returns historical status data for the last 24 hours","operationId":"getHistory","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/status/components":{"get":{"tags":["Status"],"summary":"Component statuses","description":"Returns detailed component status information","operationId":"getComponents","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/songs/search":{"get":{"tags":["song-controller"],"operationId":"searchByName","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SongResponse"}}}}}}}},"/api/v1/songs/popular":{"get":{"tags":["song-controller"],"operationId":"getPopularSongs","parameters":[{"name":"minPopularity","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SongResponse"}}}}}}}},"/api/v1/songs/count":{"get":{"tags":["song-controller"],"operationId":"getTotalSongCount","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"integer","format":"int64"}}}}}}},"/api/v1/songs/artist/{artistId}":{"get":{"tags":["song-controller"],"operationId":"getSongsByArtist","parameters":[{"name":"artistId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SongResponse"}}}}}}}},"/api/v1/sessions/{sessionId}/analytics":{"get":{"tags":["Session Management"],"summary":"Get session analytics","description":"Get comprehensive analytics for a specific session including earnings, requests, and performance metrics","operationId":"getSessionAnalytics","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Analytics retrieved successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SessionAnalyticsResponse"}}}},"404":{"description":"Session not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/type/{type}":{"get":{"tags":["Session Management"],"summary":"Get sessions by type","description":"Retrieve sessions with a specific type","operationId":"getSessionsByType","parameters":[{"name":"type","in":"path","description":"Session type","required":true,"schema":{"type":"string","enum":["CLUB","ONLINE"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/today/live":{"get":{"tags":["Session Management"],"summary":"Get today's live sessions","description":"Retrieve all live sessions for today","operationId":"getTodaysLiveSessions","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/status/{status}":{"get":{"tags":["Session Management"],"summary":"Get sessions by status","description":"Retrieve sessions with a specific status","operationId":"getSessionsByStatus","parameters":[{"name":"status","in":"path","description":"Session status","required":true,"schema":{"type":"string","enum":["PREPARING","LIVE","PAUSED","ENDED"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/me":{"get":{"tags":["Session Management"],"summary":"Get user's sessions","description":"Retrieve all sessions for the currently authenticated user","operationId":"getMySessions","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{}}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/live":{"get":{"tags":["Session Management"],"summary":"Get live sessions","description":"Retrieve all live sessions","operationId":"getLiveSessions","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/genre/{genre}":{"get":{"tags":["Session Management"],"summary":"Get sessions by genre","description":"Retrieve sessions that include a specific genre","operationId":"getSessionsByGenre","parameters":[{"name":"genre","in":"path","description":"Genre name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/dj/{djId}":{"get":{"tags":["Session Management"],"summary":"Get sessions by DJ","description":"Retrieve all sessions for a specific DJ","operationId":"getSessionsByDj","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/date-range":{"get":{"tags":["Session Management"],"summary":"Get sessions by date range","description":"Retrieve sessions within a specific date range","operationId":"getSessionsByDateRange","parameters":[{"name":"startDate","in":"query","description":"Start date (ISO format: yyyy-MM-dd)","required":true,"schema":{"type":"string"}},{"name":"endDate","in":"query","description":"End date (ISO format: yyyy-MM-dd)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/club/{clubId}":{"get":{"tags":["Session Management"],"summary":"Get sessions by club","description":"Retrieve all sessions for a specific club","operationId":"getSessionsByClub","parameters":[{"name":"clubId","in":"path","description":"Club ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/active":{"get":{"tags":["Session Management"],"summary":"Get active sessions","description":"Retrieve all active sessions (LIVE or PREPARING status)","operationId":"getActiveSessions","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{}}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/sessions/accepting-requests":{"get":{"tags":["Session Management"],"summary":"Get sessions accepting requests","description":"Retrieve sessions that are currently accepting song requests","operationId":"getSessionsAcceptingRequests","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/session/{sessionId}":{"get":{"tags":["Song Requests"],"summary":"Get requests by session","description":"Retrieve all song requests for a specific session","operationId":"getRequestsBySession","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Session requests retrieved successfully","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/session/{sessionId}/queue":{"get":{"tags":["Song Requests"],"summary":"Get session queue","description":"Retrieve accepted song requests for a session ordered by queue position","operationId":"getSessionQueue","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Session queue retrieved successfully","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/session/{sessionId}/pending":{"get":{"tags":["Song Requests"],"summary":"Get pending requests for a session","description":"Get all pending song requests for a specific session (DJ only)","operationId":"getPendingRequestsForSession","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Pending requests retrieved successfully","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/queue/{djId}/statistics":{"get":{"tags":["Song Requests"],"summary":"Get queue statistics","description":"Get analytics and statistics for DJ's request queue","operationId":"getQueueStatistics","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Statistics retrieved successfully","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"403":{"description":"Forbidden - DJ role required","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/queue/{djId}/priority":{"get":{"tags":["Song Requests"],"summary":"Get DJ's priority queue","description":"Get DJ's request queue ordered by priority (tip amount + time decay)","operationId":"getPriorityQueue","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Queue retrieved successfully","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}},"403":{"description":"Forbidden - DJ role required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/queue/{djId}/duplicate-check":{"get":{"tags":["Song Requests"],"summary":"Check for duplicate song","description":"Check if a song is already in the DJ's pending queue","operationId":"checkDuplicateSong","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"songId","in":"query","description":"Song ID to check","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Duplicate check completed","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"boolean"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"boolean"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/my-requests":{"get":{"tags":["Song Requests"],"summary":"Get current user's requests","description":"Retrieve all song requests made by the current user","operationId":"getMyRequests","responses":{"200":{"description":"User requests retrieved successfully","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/my-requests/status/{status}":{"get":{"tags":["Song Requests"],"summary":"Get requests by status","description":"Retrieve requests filtered by status for the current user","operationId":"getMyRequestsByStatus","parameters":[{"name":"status","in":"path","description":"Request status (PENDING, ACCEPTED, REJECTED, PLAYED)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Filtered requests retrieved successfully","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/requests/dj-requests":{"get":{"tags":["Song Requests"],"summary":"Get requests for current DJ","description":"Retrieve all song requests for the current DJ's sessions","operationId":"getDJRequests","responses":{"200":{"description":"DJ requests retrieved successfully","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}},"403":{"description":"Forbidden - DJ role required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlaySongResponse"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/ratings/user":{"get":{"tags":["Rating Controller"],"summary":"Get user's all ratings (paginated)","operationId":"getUserRatings","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/ratings/dj/{djId}":{"get":{"tags":["Rating Controller"],"summary":"Get all ratings for a DJ (paginated)","operationId":"getDJRatings","parameters":[{"name":"djId","in":"path","required":true,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}},"delete":{"tags":["Rating Controller"],"summary":"Delete user's rating for a DJ","operationId":"deleteRating","parameters":[{"name":"djId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/ratings/dj/{djId}/user":{"get":{"tags":["Rating Controller"],"summary":"Get user's rating for a specific DJ","operationId":"getUserRatingForDJ","parameters":[{"name":"djId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/ratings/dj/{djId}/stats":{"get":{"tags":["Rating Controller"],"summary":"Get rating statistics for a DJ","operationId":"getDJRatingStats","parameters":[{"name":"djId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/profile/request-history":{"get":{"tags":["profile-controller"],"operationId":"getRequestHistory","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"search","in":"query","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/profile/request-history/{id}":{"get":{"tags":["profile-controller"],"operationId":"getRequestHistoryItem","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/payouts/requests/{requestId}":{"get":{"tags":["Payout Management"],"summary":"Get payout request","description":"Get a specific payout request by ID","operationId":"getPayoutRequest","parameters":[{"name":"requestId","in":"path","description":"Payout request ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/payouts/methods/default":{"get":{"tags":["Payout Management"],"summary":"Get default payout method","description":"Get the default payout method for the current DJ","operationId":"getDefaultPayoutMethod","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/payment":{"get":{"tags":["payment-controller"],"operationId":"getPayments","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PaymentResponse"}}}}}}}},"/api/v1/payment/{id}":{"get":{"tags":["payment-controller"],"operationId":"getPayment","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PaymentResponse"}}}}}}},"/api/v1/payment/stk/query/{checkoutRequestId}":{"get":{"tags":["payment-controller"],"operationId":"queryStkPush","parameters":[{"name":"checkoutRequestId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MpesaCallbackResponse"}}}}}}},"/api/v1/payment/requests/dj/{djId}":{"get":{"tags":["payment-controller"],"operationId":"getDjRequestPayments","parameters":[{"name":"djId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{}}}}}}}}},"/api/v1/payment/receipt/tip/{paymentId}":{"get":{"tags":["payment-controller"],"operationId":"getTipPaymentReceipt","parameters":[{"name":"paymentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/payment/receipt/request/{paymentId}":{"get":{"tags":["payment-controller"],"operationId":"getRequestPaymentReceipt","parameters":[{"name":"paymentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/payment/receipt/html/tip/{paymentId}":{"get":{"tags":["payment-controller"],"operationId":"getTipPaymentReceiptHtml","parameters":[{"name":"paymentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/payment/receipt/html/request/{paymentId}":{"get":{"tags":["payment-controller"],"operationId":"getRequestPaymentReceiptHtml","parameters":[{"name":"paymentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/payment/payme/status/{transactionId}":{"get":{"tags":["payment-controller"],"operationId":"queryPaymeStatus","parameters":[{"name":"transactionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/musicbrainz/search/tracks":{"get":{"tags":["music-brainz-controller"],"operationId":"searchTracks","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/musicbrainz/search/artists":{"get":{"tags":["music-brainz-controller"],"operationId":"searchArtists","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/musicbrainz/recording/{mbid}":{"get":{"tags":["music-brainz-controller"],"operationId":"getRecordingByMbid","parameters":[{"name":"mbid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/musicbrainz/quick-search":{"get":{"tags":["music-brainz-controller"],"operationId":"quickSearch","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":5}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{}}}}}}}}},"/api/v1/musicbrainz/price/{mbid}":{"get":{"tags":["music-brainz-controller"],"operationId":"getPriceByMbid","parameters":[{"name":"mbid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/musicbrainz/artist/{mbid}":{"get":{"tags":["music-brainz-controller"],"operationId":"getArtistByMbid","parameters":[{"name":"mbid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/monitoring/status":{"get":{"tags":["Monitoring"],"summary":"Service status overview","description":"Returns high-level service status","operationId":"status","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/monitoring/performance":{"get":{"tags":["Monitoring"],"summary":"Performance statistics","description":"Returns performance statistics and trends","operationId":"performance","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/monitoring/metrics":{"get":{"tags":["Monitoring"],"summary":"Application metrics","description":"Returns detailed application performance metrics","operationId":"metrics","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/monitoring/dashboard":{"get":{"tags":["Monitoring"],"summary":"Server monitoring dashboard","description":"Returns comprehensive server monitoring data","operationId":"dashboard","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/metrics/system":{"get":{"tags":["Metrics"],"summary":"System metrics","description":"Returns system resource metrics","operationId":"getSystemMetrics","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/metrics/real-time":{"get":{"tags":["Metrics"],"summary":"Real-time metrics","description":"Returns real-time metrics for live monitoring","operationId":"getRealTimeMetrics","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/metrics/performance":{"get":{"tags":["Metrics"],"summary":"Performance metrics","description":"Returns detailed performance metrics","operationId":"getPerformanceMetrics","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/metrics/export":{"get":{"tags":["Metrics"],"summary":"Export metrics","description":"Returns metrics in exportable format","operationId":"exportMetrics","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/metrics/errors":{"get":{"tags":["Metrics"],"summary":"Error metrics","description":"Returns error and exception metrics","operationId":"getErrorMetrics","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/metrics/dashboard":{"get":{"tags":["Metrics"],"summary":"Metrics dashboard","description":"Returns comprehensive metrics for dashboard display","operationId":"getDashboard_1","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/metrics/business":{"get":{"tags":["Metrics"],"summary":"Business metrics","description":"Returns business-related metrics","operationId":"getBusinessMetrics","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/metrics/alerts":{"get":{"tags":["Metrics"],"summary":"Alert metrics","description":"Returns current alerts and thresholds","operationId":"getAlerts","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/logs/stream":{"get":{"tags":["Logging"],"summary":"Stream logs in real-time","description":"Stream application logs in real-time using Server-Sent Events","operationId":"streamLogs","parameters":[{"name":"level","in":"query","description":"Log level filter for streaming","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SseEmitter"}}}}}}},"/api/v1/logs/stats":{"get":{"tags":["Logging"],"summary":"Get log statistics","description":"Retrieve statistics about application logs","operationId":"getLogStats","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/logs/search":{"get":{"tags":["Logging"],"summary":"Search logs","description":"Search through application logs with various criteria","operationId":"searchLogs","parameters":[{"name":"query","in":"query","description":"Search query string","required":true,"schema":{"type":"string"}},{"name":"level","in":"query","description":"Log level filter","required":false,"schema":{"type":"string"}},{"name":"startDate","in":"query","description":"Start date (yyyy-MM-dd HH:mm:ss)","required":false,"schema":{"type":"string"}},{"name":"endDate","in":"query","description":"End date (yyyy-MM-dd HH:mm:ss)","required":false,"schema":{"type":"string"}},{"name":"maxResults","in":"query","description":"Maximum results (default: 100)","required":false,"schema":{"type":"integer","format":"int32","default":100}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/logs/recent":{"get":{"tags":["Logging"],"summary":"Get recent logs","description":"Retrieve recent application logs with optional filtering","operationId":"getRecentLogs","parameters":[{"name":"level","in":"query","description":"Log level filter (DEBUG, INFO, WARN, ERROR)","required":false,"schema":{"type":"string"}},{"name":"lines","in":"query","description":"Number of lines to retrieve (default: 100)","required":false,"schema":{"type":"integer","format":"int32","default":100}},{"name":"logger","in":"query","description":"Logger name filter","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Recent logs retrieved successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/logs/files":{"get":{"tags":["Logging"],"summary":"Get available log files","description":"List all available log files in the system","operationId":"getLogFiles","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/lastfm/track":{"get":{"tags":["last-fm-controller"],"operationId":"getTrackInfo","parameters":[{"name":"artist","in":"query","required":true,"schema":{"type":"string"}},{"name":"track","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/lastfm/search/tracks":{"get":{"tags":["last-fm-controller"],"operationId":"searchTracks_1","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":1}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/lastfm/quick-search":{"get":{"tags":["last-fm-controller"],"operationId":"quickSearch_1","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":5}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{}}}}}}}}},"/api/v1/jobs":{"get":{"tags":["Background Jobs"],"summary":"List all active jobs","description":"Returns all currently active background jobs","operationId":"listActiveJobs","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/jobs/{taskId}":{"get":{"tags":["Background Jobs"],"summary":"Get job status","description":"Returns the status of a specific job","operationId":"getJobStatus","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TaskInfo"}}}}}}},"/api/v1/jobs/type/{taskType}":{"get":{"tags":["Background Jobs"],"summary":"List jobs by type","description":"Returns all jobs of a specific type","operationId":"getJobsByType","parameters":[{"name":"taskType","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaskInfo"}}}}}}}},"/api/v1/jobs/status/{status}":{"get":{"tags":["Background Jobs"],"summary":"List jobs by status","description":"Returns all jobs with a specific status","operationId":"getJobsByStatus","parameters":[{"name":"status","in":"path","required":true,"schema":{"type":"string","enum":["PENDING","RUNNING","COMPLETED","FAILED","CANCELLED","RETRYING"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaskInfo"}}}}}}}},"/api/v1/jobs/statistics":{"get":{"tags":["Background Jobs"],"summary":"Get job statistics","description":"Returns job statistics summary","operationId":"getStatistics","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/jobs/health":{"get":{"tags":["Background Jobs"],"summary":"Worker health check","description":"Returns worker system health status","operationId":"healthCheck","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/jobs/completed":{"get":{"tags":["Background Jobs"],"summary":"List recent completed jobs","description":"Returns recently completed jobs","operationId":"getRecentCompletedJobs","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaskInfo"}}}}}}}},"/api/v1/health":{"get":{"tags":["Health"],"summary":"Basic health check","description":"Returns basic application health status","operationId":"health","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/health/ready":{"get":{"tags":["Health"],"summary":"Readiness check","description":"Returns readiness status for load balancers","operationId":"ready","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/health/ping":{"get":{"tags":["Health"],"summary":"Simple connectivity test","description":"Simple endpoint to test if the backend is reachable","operationId":"ping","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}}}}},"/api/v1/health/live":{"get":{"tags":["Health"],"summary":"Liveness check","description":"Returns liveness status for container orchestration","operationId":"live","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/health/detailed":{"get":{"tags":["Health"],"summary":"Detailed health check","description":"Returns detailed health information including dependencies","operationId":"detailedHealth","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/favorites/{favoriteType}":{"get":{"tags":["Favorites Management"],"summary":"Get favorites by type","description":"Retrieve user favorites filtered by type (DJ, SONG, GENRE, ARTIST)","operationId":"getFavoritesByType","parameters":[{"name":"favoriteType","in":"path","description":"Type of favorite (DJ, SONG, GENRE, ARTIST)","required":true,"schema":{"type":"string","enum":["DJ","SONG","GENRE","ARTIST"]}}],"responses":{"200":{"description":"Favorites retrieved successfully","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FavoriteResponse"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FavoriteResponse"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/favorites/ids/{favoriteType}":{"get":{"tags":["Favorites Management"],"summary":"Get favorite IDs by type","description":"Get list of favorite IDs for a specific type","operationId":"getFavoriteIds","parameters":[{"name":"favoriteType","in":"path","description":"Type of favorite (DJ, SONG, GENRE, ARTIST)","required":true,"schema":{"type":"string","enum":["DJ","SONG","GENRE","ARTIST"]}}],"responses":{"200":{"description":"Favorite IDs retrieved successfully","content":{"*/*":{"schema":{"type":"array","items":{"type":"string","format":"uuid"}}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"type":"string","format":"uuid"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/favorites/check/{favoriteType}/{favoriteId}":{"get":{"tags":["Favorites Management"],"summary":"Check if item is favorite","description":"Check if a specific item is in user's favorites","operationId":"isFavorite","parameters":[{"name":"favoriteType","in":"path","description":"Type of favorite (DJ, SONG, GENRE, ARTIST)","required":true,"schema":{"type":"string","enum":["DJ","SONG","GENRE","ARTIST"]}},{"name":"favoriteId","in":"path","description":"ID of the item to check","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Check completed successfully","content":{"*/*":{"schema":{"type":"boolean"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"boolean"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/email-test/config-status":{"get":{"tags":["Email Testing"],"summary":"Get email configuration status","description":"Check if email configuration is properly set up","operationId":"getEmailConfigStatus","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/earnings/me/tips":{"get":{"tags":["Earnings Management"],"summary":"Get current DJ tip history","description":"Get tip payment history for the currently authenticated DJ","operationId":"getCurrentDJTipHistory","parameters":[{"name":"page","in":"query","description":"Page number","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","description":"Page size","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/earnings/me/summary":{"get":{"tags":["Earnings Management"],"summary":"Get current DJ earnings summary","description":"Get earnings summary for the currently authenticated DJ","operationId":"getCurrentDJEarningsSummary","parameters":[{"name":"period","in":"query","description":"Period (today, week, month, all)","required":false,"schema":{"type":"string","default":"month"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/earnings/me/requests":{"get":{"tags":["Earnings Management"],"summary":"Get current DJ request payment history","description":"Get request payment history for the currently authenticated DJ","operationId":"getCurrentDJRequestPaymentHistory","parameters":[{"name":"page","in":"query","description":"Page number","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","description":"Page size","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/earnings/dj/{djId}/tips":{"get":{"tags":["Earnings Management"],"summary":"Get DJ tip history","description":"Get tip payment history for a specific DJ","operationId":"getDJTipHistory","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"page","in":"query","description":"Page number","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","description":"Page size","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/earnings/dj/{djId}/summary":{"get":{"tags":["Earnings Management"],"summary":"Get DJ earnings summary","description":"Get earnings summary for a specific DJ","operationId":"getDJEarningsSummary","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"period","in":"query","description":"Period (today, week, month, all)","required":false,"schema":{"type":"string","default":"month"}}],"responses":{"200":{"description":"Earnings summary retrieved successfully","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"DJ not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/earnings/dj/{djId}/requests":{"get":{"tags":["Earnings Management"],"summary":"Get DJ request payment history","description":"Get request payment history for a specific DJ","operationId":"getDJRequestPaymentHistory","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"page","in":"query","description":"Page number","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","description":"Page size","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs":{"get":{"tags":["DJ Management"],"summary":"Get all DJs","description":"Retrieve all registered DJs","operationId":"getAllDJs","responses":{"200":{"description":"DJs retrieved successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Users"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Users"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/{djId}":{"get":{"tags":["DJ Management"],"summary":"Get DJ by ID","description":"Retrieve a specific DJ by their ID","operationId":"getDJById","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"DJ found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Users"}}}},"404":{"description":"DJ not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/{djId}/stats":{"get":{"tags":["DJ Management"],"summary":"Get DJ statistics","description":"Get statistics for a specific DJ","operationId":"getDJStats","parameters":[{"name":"djId","in":"path","description":"DJ ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/top-rated":{"get":{"tags":["DJ Management"],"summary":"Get top rated DJs","description":"Retrieve top rated DJs with a specified limit","operationId":"getTopRatedDJs","parameters":[{"name":"limit","in":"query","description":"Maximum number of DJs to return","required":false,"schema":{"type":"integer","format":"int32","default":10}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Users"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/search/{name}":{"get":{"tags":["DJ Management"],"summary":"Search DJs by name","description":"Search for DJs by username (case-insensitive partial match)","operationId":"searchDJsByName","parameters":[{"name":"name","in":"path","description":"DJ name to search for","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Users"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/rating/{minRating}/{maxRating}":{"get":{"tags":["DJ Management"],"summary":"Get DJs by rating range","description":"Retrieve DJs within a specific rating range","operationId":"getDJsByRatingRange","parameters":[{"name":"minRating","in":"path","description":"Minimum rating","required":true,"schema":{"type":"number","format":"double"}},{"name":"maxRating","in":"path","description":"Maximum rating","required":true,"schema":{"type":"number","format":"double"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Users"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/most-followed":{"get":{"tags":["DJ Management"],"summary":"Get most followed DJs","description":"Retrieve DJs with the most followers","operationId":"getMostFollowedDJs","parameters":[{"name":"limit","in":"query","description":"Maximum number of DJs to return","required":false,"schema":{"type":"integer","format":"int32","default":10}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Users"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/me":{"get":{"tags":["DJ Management"],"summary":"Get current DJ profile","description":"Get the DJ profile of the currently authenticated user","operationId":"getCurrentDJProfile","responses":{"200":{"description":"Current DJ profile retrieved successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Users"}}}},"404":{"description":"Current user is not a DJ","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/me/stats":{"get":{"tags":["DJ Management"],"summary":"Get current DJ statistics","description":"Get statistics for the currently authenticated DJ","operationId":"getCurrentDJStats","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/live":{"get":{"tags":["DJ Management"],"summary":"Get live DJs","description":"Retrieve all DJs that are currently live","operationId":"getLiveDJs","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Users"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/genre/{genre}":{"get":{"tags":["DJ Management"],"summary":"Get DJs by genre","description":"Retrieve DJs that play a specific genre","operationId":"getDJsByGenre","parameters":[{"name":"genre","in":"path","description":"Genre name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Users"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/followers/{minFollowers}/{maxFollowers}":{"get":{"tags":["DJ Management"],"summary":"Get DJs by follower range","description":"Retrieve DJs within a specific follower count range","operationId":"getDJsByFollowerRange","parameters":[{"name":"minFollowers","in":"path","description":"Minimum followers","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"maxFollowers","in":"path","description":"Maximum followers","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Users"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/djs/favorites":{"get":{"tags":["DJ Management"],"summary":"Get favorite DJs","description":"Retrieve all DJs that the current user has favorited","operationId":"getFavoriteDJs","responses":{"200":{"description":"Favorite DJs retrieved successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Users"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Users"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/database/verify":{"get":{"tags":["Database"],"summary":"Verify database connection","description":"Test PostgreSQL database connection and return connection details","operationId":"verifyDatabase","responses":{"200":{"description":"Database connection verified successfully","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"500":{"description":"Database connection failed","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/database/tables":{"get":{"tags":["Database"],"summary":"Get table details","description":"Get detailed information about specific application tables","operationId":"getTableDetails","responses":{"200":{"description":"Table details retrieved successfully","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"500":{"description":"Failed to retrieve table details","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/database/schema":{"get":{"tags":["Database"],"summary":"Get database schema information","description":"Retrieve information about database tables and their structure","operationId":"getDatabaseSchema","responses":{"200":{"description":"Schema information retrieved successfully","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"500":{"description":"Failed to retrieve schema information","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/clubs/stats/count":{"get":{"tags":["Club Management"],"summary":"Get club statistics","description":"Get count of active clubs","operationId":"getActiveClubCount","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"integer","format":"int64"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/clubs/search/name/{name}":{"get":{"tags":["Club Management"],"summary":"Search clubs by name","description":"Search for clubs by name (case-insensitive partial match)","operationId":"searchClubsByName","parameters":[{"name":"name","in":"path","description":"Club name to search for","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Club"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/clubs/search/location/{location}":{"get":{"tags":["Club Management"],"summary":"Search clubs by location","description":"Search for clubs by location (case-insensitive partial match)","operationId":"searchClubsByLocation","parameters":[{"name":"location","in":"path","description":"Location to search for","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Club"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/clubs/capacity/{minCapacity}/{maxCapacity}":{"get":{"tags":["Club Management"],"summary":"Get clubs by capacity range","description":"Retrieve clubs within a specific capacity range","operationId":"getClubsByCapacityRange","parameters":[{"name":"minCapacity","in":"path","description":"Minimum capacity","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"maxCapacity","in":"path","description":"Maximum capacity","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Club"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/clubs/area":{"get":{"tags":["Club Management"],"summary":"Get clubs in geographical area","description":"Retrieve clubs within a geographical bounding box","operationId":"getClubsInArea","parameters":[{"name":"minLat","in":"query","description":"Minimum latitude","required":true,"schema":{"type":"number","format":"double"}},{"name":"maxLat","in":"query","description":"Maximum latitude","required":true,"schema":{"type":"number","format":"double"}},{"name":"minLng","in":"query","description":"Minimum longitude","required":true,"schema":{"type":"number","format":"double"}},{"name":"maxLng","in":"query","description":"Maximum longitude","required":true,"schema":{"type":"number","format":"double"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Club"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/clubs/active":{"get":{"tags":["Club Management"],"summary":"Get active clubs","description":"Retrieve all active clubs","operationId":"getActiveClubs","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Club"}}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/alerts/stream":{"get":{"tags":["Alerts"],"summary":"Stream alerts in real-time","description":"Stream system alerts in real-time using Server-Sent Events","operationId":"streamAlerts","parameters":[{"name":"minSeverity","in":"query","description":"Minimum severity level for streaming","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SseEmitter"}}}}}}},"/api/v1/alerts/stats":{"get":{"tags":["Alerts"],"summary":"Get alert statistics","description":"Retrieve statistics about system alerts","operationId":"getAlertStats","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/alerts/history":{"get":{"tags":["Alerts"],"summary":"Get alert history","description":"Retrieve historical alerts with optional filtering","operationId":"getAlertHistory","parameters":[{"name":"hours","in":"query","description":"Number of hours to look back (default: 24)","required":false,"schema":{"type":"integer","format":"int32","default":24}},{"name":"severity","in":"query","description":"Filter by severity","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","description":"Filter by alert type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/alerts/active":{"get":{"tags":["Alerts"],"summary":"Get active alerts","description":"Retrieve current active alerts in the system","operationId":"getActiveAlerts","parameters":[{"name":"severity","in":"query","description":"Filter by severity (LOW, MEDIUM, HIGH, CRITICAL)","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","description":"Filter by alert type","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Active alerts retrieved successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/admin/songs/sync/status":{"get":{"tags":["song-sync-controller"],"operationId":"getSyncStatus","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/admin/data/stats":{"get":{"tags":["Data Population"],"summary":"Get data statistics","description":"Get current count of DJs, songs, and artists in the database","operationId":"getDataStats","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}}}},"/api/v1/sessions/{sessionId}/image":{"delete":{"tags":["Session Management"],"summary":"Delete session image","description":"Delete the image associated with a DJ session","operationId":"deleteSessionImage","parameters":[{"name":"sessionId","in":"path","description":"Session ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Image deleted successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Session"}}}},"404":{"description":"Session not found","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/profile/payment-methods/{id}":{"delete":{"tags":["profile-controller"],"operationId":"deletePaymentMethod","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/payouts/methods/{methodId}":{"delete":{"tags":["Payout Management"],"summary":"Delete payout method","description":"Delete a payout method for the current DJ","operationId":"deletePayoutMethod","parameters":[{"name":"methodId","in":"path","description":"Payout method ID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}},"/api/v1/favorites/{favoriteType}/{favoriteId}":{"delete":{"tags":["Favorites Management"],"summary":"Remove item from favorites","description":"Remove a DJ, song, genre, or artist from user's favorites","operationId":"removeFavorite","parameters":[{"name":"favoriteType","in":"path","description":"Type of favorite (DJ, SONG, GENRE, ARTIST)","required":true,"schema":{"type":"string","enum":["DJ","SONG","GENRE","ARTIST"]}},{"name":"favoriteId","in":"path","description":"ID of the favorite item","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Item removed from favorites successfully","content":{"*/*":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized - JWT token required","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"Bearer Authentication":[]}]}}},"components":{"schemas":{"DjProfileUpdateRequest":{"type":"object","description":"Updated user profile data","properties":{"username":{"type":"string"},"phoneNumber":{"type":"string"},"bio":{"type":"string"},"djName":{"type":"string"},"genres":{"type":"array","items":{"type":"string"}},"instagramHandle":{"type":"string"}}},"UserResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"emailAddress":{"type":"string"},"username":{"type":"string"},"role":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"emailVerified":{"type":"boolean"},"isActive":{"type":"boolean"},"credits":{"type":"number","format":"double"},"followers":{"type":"integer","format":"int32"},"rating":{"type":"number","format":"double"},"genres":{"type":"array","items":{"type":"string"}},"bio":{"type":"string"},"djName":{"type":"string"},"profileImage":{"type":"string"},"backgroundImage":{"type":"string"},"instagramHandle":{"type":"string"},"isLive":{"type":"boolean"}}},"SongRequest":{"type":"object","properties":{"name":{"type":"string"},"album":{"type":"string"},"artistId":{"type":"string","format":"uuid"}}},"SongResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"title":{"type":"string"},"album":{"type":"string"},"genre":{"type":"string"},"duration":{"type":"integer","format":"int32"},"artworkUrl":{"type":"string"},"albumArtUrl":{"type":"string"},"baseRequestPrice":{"type":"number","format":"double"},"popularity":{"type":"integer","format":"int32"},"isExplicit":{"type":"boolean"},"artistId":{"type":"string","format":"uuid"},"artistName":{"type":"string"},"artist":{"type":"string"},"musicBrainzUrl":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Session":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"version":{"type":"integer","format":"int32"},"djId":{"type":"string","format":"uuid"},"clubId":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["CLUB","ONLINE"]},"status":{"type":"string","enum":["PREPARING","LIVE","PAUSED","ENDED"]},"title":{"type":"string"},"description":{"type":"string"},"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"listenerCount":{"type":"integer","format":"int32"},"requestQueue":{"type":"array","items":{"type":"string"}},"totalEarnings":{"type":"number","format":"double"},"totalTips":{"type":"number","format":"double"},"totalRequests":{"type":"integer","format":"int32"},"likeCount":{"type":"integer","format":"int32"},"acceptedRequests":{"type":"integer","format":"int32"},"rejectedRequests":{"type":"integer","format":"int32"},"currentSongId":{"type":"string"},"isAcceptingRequests":{"type":"boolean"},"minTipAmount":{"type":"number","format":"double"},"genres":{"type":"array","items":{"type":"string"}},"shareableLink":{"type":"string"},"imageUrl":{"type":"string"},"thumbnailUrl":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"RoleRequest":{"type":"object","properties":{"roleName":{"type":"string"}}},"RoleResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"roleName":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"PlaySongRequest":{"type":"object","properties":{"djId":{"type":"string"},"djEmailAddress":{"type":"string"},"songId":{"type":"string"},"songIds":{"type":"array","items":{"type":"string"}},"sessionId":{"type":"string"},"message":{"type":"string"},"amount":{"type":"number","format":"double"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"djIdAsUuid":{"type":"string","format":"uuid"},"sessionIdAsUuid":{"type":"string","format":"uuid"}}},"ProfileRequest":{"type":"object","properties":{"phoneNumber":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"image":{"type":"string","format":"binary"}}},"ProfileResponse":{"type":"object","properties":{"id":{"type":"string"},"emailAddress":{"type":"string"},"username":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"phoneNumber":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"imageUrl":{"type":"string"},"profileImage":{"type":"string"},"credits":{"type":"number","format":"double"},"favoriteGenres":{"type":"array","items":{"type":"string"}},"favoriteDJs":{"type":"array","items":{"type":"string"}},"role":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"bio":{"type":"string"},"rating":{"type":"number","format":"double"},"instagramHandle":{"type":"string"},"isLive":{"type":"boolean"},"followers":{"type":"integer","format":"int32"}}},"GrantedAuthority":{"type":"object","properties":{"authority":{"type":"string"}}},"Roles":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"roleName":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Users":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"version":{"type":"integer","format":"int32"},"emailAddress":{"type":"string"},"actualUsername":{"type":"string"},"password":{"type":"string"},"phoneNumber":{"type":"string"},"isActive":{"type":"boolean"},"emailVerified":{"type":"boolean"},"phoneVerified":{"type":"boolean"},"verificationCode":{"type":"string"},"verificationCodeExpiry":{"type":"string","format":"date-time"},"passwordResetCode":{"type":"string"},"passwordResetCodeExpiry":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"bio":{"type":"string"},"djName":{"type":"string"},"profileImage":{"type":"string"},"backgroundImage":{"type":"string"},"genres":{"type":"array","items":{"type":"string"}},"rating":{"type":"number","format":"double"},"instagramHandle":{"type":"string"},"isLive":{"type":"boolean"},"followers":{"type":"integer","format":"int32"},"credits":{"type":"number","format":"double"},"role":{"$ref":"#/components/schemas/Roles"},"enabled":{"type":"boolean"},"authorities":{"type":"array","items":{"$ref":"#/components/schemas/GrantedAuthority"}},"username":{"type":"string"},"accountNonExpired":{"type":"boolean"},"accountNonLocked":{"type":"boolean"},"credentialsNonExpired":{"type":"boolean"}}},"Club":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"location":{"type":"string"},"address":{"type":"string"},"description":{"type":"string"},"imageUrl":{"type":"string"},"phoneNumber":{"type":"string"},"email":{"type":"string"},"website":{"type":"string"},"capacity":{"type":"integer","format":"int32"},"isActive":{"type":"boolean"},"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"ArtistRequest":{"type":"object","properties":{"name":{"type":"string"},"bio":{"type":"string"},"imageUrl":{"type":"string"},"image":{"type":"string","format":"binary"},"createdAt":{"type":"string","format":"date-time"}}},"ArtistResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"bio":{"type":"string"},"imageUrl":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"VerificationRequest":{"type":"object","description":"Verification code details","properties":{"emailAddress":{"type":"string"},"verificationCode":{"type":"string"},"verificationType":{"type":"string"}}},"VerificationResponse":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"userDetails":{"$ref":"#/components/schemas/UserResponse"},"token":{"type":"string"},"refreshToken":{"type":"string"}}},"RegisterRequest":{"type":"object","description":"User registration details","properties":{"emailAddress":{"type":"string","minLength":1},"username":{"type":"string","maxLength":50,"minLength":3,"pattern":"^[a-zA-Z0-9_\\s-]+$"},"password":{"type":"string","minLength":1},"confirmPassword":{"type":"string","minLength":1},"phoneNumber":{"type":"string","pattern":"^(\\+|0)?\\d{9,15}$"},"roleName":{"type":"string","minLength":1}},"required":["confirmPassword","emailAddress","password","roleName","username"]},"RegisterResponse":{"type":"object","properties":{"emailAddress":{"type":"string"},"username":{"type":"string"}}},"SendVerificationRequest":{"type":"object","description":"Verification request details","properties":{"emailAddress":{"type":"string"},"verificationType":{"type":"string"}}},"SendVerificationResponse":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"verificationType":{"type":"string"},"destination":{"type":"string"}}},"ResetPasswordRequest":{"type":"object","description":"Reset password details","properties":{"emailAddress":{"type":"string","minLength":1},"resetCode":{"type":"string","maxLength":6,"minLength":6},"newPassword":{"type":"string","minLength":1},"confirmPassword":{"type":"string","minLength":1}},"required":["confirmPassword","emailAddress","newPassword","resetCode"]},"LoginRequest":{"type":"object","description":"User login credentials","properties":{"emailAddress":{"type":"string","minLength":1},"password":{"type":"string","minLength":1},"portalType":{"type":"string"}},"required":["emailAddress","password"]},"LoginResponse":{"type":"object","properties":{"userDetails":{"$ref":"#/components/schemas/UserResponse"},"token":{"type":"string"},"refreshToken":{"type":"string"}}},"ForgotPasswordRequest":{"type":"object","description":"Email address for password reset","properties":{"emailAddress":{"type":"string","minLength":1}},"required":["emailAddress"]},"DJRegisterRequest":{"type":"object","description":"DJ registration details with DJ-specific information","properties":{"username":{"type":"string","description":"User's full name","example":"John Smith","maxLength":50,"minLength":3,"pattern":"^[a-zA-Z0-9_\\s-]+$"},"emailAddress":{"type":"string","description":"User's email address","example":"john.smith@example.com","minLength":1},"password":{"type":"string","description":"User's password","example":"securePassword123","minLength":1},"confirmPassword":{"type":"string","description":"Password confirmation","example":"securePassword123","minLength":1},"phoneNumber":{"type":"string","description":"User's phone number","example":"+254712345678","pattern":"^(\\+|0)?\\d{9,15}$"},"djName":{"type":"string","description":"DJ's stage name","example":"DJ Nexus","maxLength":50,"minLength":2},"bio":{"type":"string","description":"DJ's biography and description","example":"Electronic music producer with 8+ years of experience...","maxLength":1000,"minLength":0},"genres":{"type":"array","description":"List of music genres the DJ specializes in","example":["House","Techno","Electronic"],"items":{"type":"string"},"minItems":1},"instagramHandle":{"type":"string","description":"DJ's Instagram handle","example":"@dj_nexus_official"},"profileImage":{"type":"string","description":"DJ's profile image URL","example":"https://example.com/profile.jpg"}},"required":["confirmPassword","djName","emailAddress","genres","password","username"]},"DJRegisterResponse":{"type":"object","description":"DJ registration response with DJ profile information","properties":{"emailAddress":{"type":"string","description":"User's email address","example":"john.smith@example.com"},"username":{"type":"string","description":"User's full name","example":"John Smith"},"djName":{"type":"string","description":"DJ's stage name","example":"DJ Nexus"},"bio":{"type":"string","description":"DJ's biography","example":"Electronic music producer with 8+ years of experience..."},"genres":{"type":"array","description":"List of music genres","example":["House","Techno","Electronic"],"items":{"type":"string"}},"instagramHandle":{"type":"string","description":"DJ's Instagram handle","example":"@dj_nexus_official"},"profileImage":{"type":"string","description":"DJ's profile image URL","example":"https://example.com/profile.jpg"},"rating":{"type":"number","format":"double","description":"Initial rating (0.0 for new DJs)","example":0.0},"followers":{"type":"integer","format":"int32","description":"Initial followers count","example":0},"emailVerified":{"type":"boolean","description":"Account verification status","example":false},"message":{"type":"string","description":"Success message","example":"DJ registration successful. Please check your email for verification."}}},"PageViewRequest":{"type":"object","properties":{"sessionId":{"type":"string"},"visitorId":{"type":"string"},"path":{"type":"string"},"referrer":{"type":"string"},"userAgent":{"type":"string"}}},"SubmitRatingRequest":{"type":"object","properties":{"djId":{"type":"string"},"rating":{"type":"number","format":"double","maximum":5.0,"minimum":1.0},"comment":{"type":"string","maxLength":500,"minLength":0}},"required":["djId","rating"]},"CreatePayoutRequest":{"type":"object","properties":{"payoutMethodId":{"type":"string","format":"uuid"},"amount":{"type":"number","format":"double"},"notes":{"type":"string"}}},"AddPayoutMethodRequest":{"type":"object","properties":{"methodType":{"type":"string","enum":["BANK_ACCOUNT","MPESA"]},"displayName":{"type":"string"},"bankName":{"type":"string"},"accountNumber":{"type":"string"},"accountHolderName":{"type":"string"},"bankBranch":{"type":"string"},"bankCode":{"type":"string"},"mpesaPhoneNumber":{"type":"string"},"mpesaAccountName":{"type":"string"},"setAsDefault":{"type":"boolean"},"notes":{"type":"string"}}},"MpesaRequest":{"type":"object","properties":{"phoneNumber":{"type":"string"},"amount":{"type":"string"},"requestId":{"type":"string"},"djName":{"type":"string"},"requestIdAsUuid":{"type":"string","format":"uuid"},"tipPayment":{"type":"boolean"},"requestPayment":{"type":"boolean"}}},"Body":{"type":"object","properties":{"stkCallback":{"$ref":"#/components/schemas/StkCallback"}}},"CallbackMetadata":{"type":"object","properties":{"Item":{"type":"array","items":{"$ref":"#/components/schemas/Item"}}}},"Item":{"type":"object","properties":{"Name":{"type":"string"},"Value":{}}},"MpesaCallbackResponse":{"type":"object","properties":{"Body":{"$ref":"#/components/schemas/Body"}}},"StkCallback":{"type":"object","properties":{"ResultCode":{"type":"integer","format":"int32"},"ResultDesc":{"type":"string"},"MerchantRequestID":{"type":"string"},"CheckoutRequestID":{"type":"string"},"CallbackMetadata":{"$ref":"#/components/schemas/CallbackMetadata"}}},"Artists":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"bio":{"type":"string"},"imageUrl":{"type":"string"},"musicBrainzId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"Songs":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"artistId":{"type":"string","format":"uuid"},"album":{"type":"string"},"genre":{"type":"string"},"duration":{"type":"integer","format":"int32"},"artworkUrl":{"type":"string"},"baseRequestPrice":{"type":"number","format":"double"},"popularity":{"type":"integer","format":"int32"},"isExplicit":{"type":"boolean"},"musicBrainzUrl":{"type":"string"},"lastfmUrl":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"artist":{"$ref":"#/components/schemas/Artists"}}},"AddFavoriteRequest":{"type":"object","properties":{"favoriteType":{"type":"string","enum":["DJ","SONG","GENRE","ARTIST"]},"favoriteId":{"type":"string","format":"uuid"},"favoriteName":{"type":"string"}},"required":["favoriteId","favoriteType"]},"MessageResponse":{"type":"object","properties":{"type":{"type":"string","enum":["SUCCESS","INFO","WARNING"]},"message":{"type":"string"},"details":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"data":{},"action":{"type":"string"},"actionUrl":{"type":"string"}}},"PageSongResponse":{"type":"object","properties":{"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"pageable":{"$ref":"#/components/schemas/PageableObject"},"last":{"type":"boolean"},"size":{"type":"integer","format":"int32"},"content":{"type":"array","items":{"$ref":"#/components/schemas/SongResponse"}},"number":{"type":"integer","format":"int32"},"sort":{"$ref":"#/components/schemas/SortObject"},"numberOfElements":{"type":"integer","format":"int32"},"empty":{"type":"boolean"}}},"PageableObject":{"type":"object","properties":{"paged":{"type":"boolean"},"pageNumber":{"type":"integer","format":"int32"},"pageSize":{"type":"integer","format":"int32"},"offset":{"type":"integer","format":"int64"},"sort":{"$ref":"#/components/schemas/SortObject"},"unpaged":{"type":"boolean"}}},"SortObject":{"type":"object","properties":{"sorted":{"type":"boolean"},"empty":{"type":"boolean"},"unsorted":{"type":"boolean"}}},"SessionAnalyticsResponse":{"type":"object","properties":{"sessionId":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"},"startTime":{"type":"string","format":"date-time"},"endTime":{"type":"string","format":"date-time"},"activeListeners":{"type":"integer","format":"int32"},"peakListeners":{"type":"integer","format":"int32"},"totalRequests":{"type":"integer","format":"int32"},"pendingRequests":{"type":"integer","format":"int32"},"acceptedRequests":{"type":"integer","format":"int32"},"rejectedRequests":{"type":"integer","format":"int32"},"totalEarnings":{"type":"number","format":"double"},"totalTips":{"type":"number","format":"double"},"totalRequestPayments":{"type":"number","format":"double"},"averageTipAmount":{"type":"number","format":"double"},"averageRequestAmount":{"type":"number","format":"double"},"engagementHistory":{"type":"array","items":{"type":"number","format":"double"}},"acceptanceRate":{"type":"number","format":"double"},"sessionDurationMinutes":{"type":"integer","format":"int64"},"earningsPerHour":{"type":"number","format":"double"},"requestsPerHour":{"type":"number","format":"double"}}},"PlaySongResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"clientName":{"type":"string"},"djName":{"type":"string"},"status":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"songResponse":{"type":"array","items":{"$ref":"#/components/schemas/SongResponse"}},"amount":{"type":"number","format":"double"},"message":{"type":"string"},"queuePosition":{"type":"integer","format":"int32"},"sessionId":{"type":"string","format":"uuid"}}},"PaymentResponse":{"type":"object","properties":{"amount":{"type":"number","format":"double"},"phoneNumber":{"type":"string"},"receiptNumber":{"type":"string"},"payerName":{"type":"string"},"type":{"type":"string"},"transactionDate":{"type":"string","format":"date-time"},"requestId":{"type":"string","format":"uuid"},"djName":{"type":"string"}}},"SseEmitter":{"type":"object","properties":{"timeout":{"type":"integer","format":"int64"}}},"TaskInfo":{"type":"object","properties":{"taskId":{"type":"string"},"taskType":{"type":"string"},"taskName":{"type":"string"},"status":{"type":"string","enum":["PENDING","RUNNING","COMPLETED","FAILED","CANCELLED","RETRYING"]},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"},"retryCount":{"type":"integer","format":"int32"},"maxRetries":{"type":"integer","format":"int32"},"errorMessage":{"type":"string"},"executionTimeMs":{"type":"integer","format":"int64"},"priority":{"type":"integer","format":"int32"},"correlationId":{"type":"string"},"userId":{"type":"string"},"completed":{"type":"boolean"},"running":{"type":"boolean"},"runningDurationMs":{"type":"integer","format":"int64"}}},"FavoriteResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"favoriteType":{"type":"string","enum":["DJ","SONG","GENRE","ARTIST"]},"favoriteId":{"type":"string","format":"uuid"},"favoriteName":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}}},"securitySchemes":{"Bearer Authentication":{"type":"http","description":"Enter JWT token","scheme":"bearer","bearerFormat":"JWT"}}}}