basePath: /api/v1 definitions: internal_core_track.BatchDeleteRequest: properties: track_ids: items: type: string minItems: 1 type: array required: - track_ids type: object internal_core_track.CompleteChunkedUploadRequest: properties: upload_id: type: string required: - upload_id type: object internal_core_track.InitiateChunkedUploadRequest: properties: filename: type: string total_chunks: minimum: 1 type: integer total_size: minimum: 1 type: integer required: - filename - total_chunks - total_size type: object internal_core_track.UpdateTrackRequest: properties: album: maxLength: 255 type: string artist: maxLength: 255 type: string genre: maxLength: 100 type: string is_public: type: boolean title: maxLength: 255 minLength: 1 type: string year: maximum: 2100 minimum: 1900 type: integer type: object internal_handlers.APIResponse: properties: data: {} error: {} success: type: boolean type: object internal_handlers.CreateCommentRequest: properties: content: maxLength: 5000 minLength: 1 type: string parent_id: description: Changed to *uuid.UUID type: string required: - content type: object internal_handlers.CreateOrderRequest: properties: items: items: properties: product_id: type: string required: - product_id type: object minItems: 1 type: array required: - items type: object internal_handlers.CreatePlaylistRequest: properties: description: maxLength: 1000 type: string is_public: type: boolean title: maxLength: 200 minLength: 1 type: string required: - title type: object internal_handlers.CreateProductRequest: properties: description: maxLength: 2000 type: string license_type: enum: - standard - exclusive - commercial type: string price: minimum: 0 type: number product_type: enum: - track - pack - service type: string title: maxLength: 200 minLength: 3 type: string track_id: description: UUID string type: string required: - price - product_type - title type: object internal_handlers.DisableTwoFactorRequest: properties: password: type: string required: - password type: object internal_handlers.FrontendLogRequest: properties: context: additionalProperties: true type: object data: {} level: type: string message: type: string timestamp: type: string type: object internal_handlers.RecordEventRequest: properties: event_name: maxLength: 100 minLength: 1 type: string payload: additionalProperties: true type: object required: - event_name type: object internal_handlers.RecordPlayRequest: properties: device: maxLength: 100 type: string duration: minimum: 1 type: integer required: - duration type: object internal_handlers.ReorderTracksRequest: properties: track_ids: description: Changed to []uuid.UUID items: type: string minItems: 1 type: array required: - track_ids type: object internal_handlers.SetupTwoFactorResponse: properties: qr_code_url: type: string recovery_codes: items: type: string type: array secret: type: string type: object internal_handlers.UpdateCommentRequest: properties: content: maxLength: 5000 minLength: 1 type: string required: - content type: object internal_handlers.UpdatePlaylistRequest: properties: description: maxLength: 1000 type: string is_public: type: boolean title: maxLength: 200 minLength: 1 type: string type: object internal_handlers.UpdateProductRequest: properties: description: maxLength: 2000 type: string price: minimum: 0 type: number status: enum: - draft - active - archived type: string title: maxLength: 200 minLength: 3 type: string type: object internal_handlers.UpdateProfileRequest: properties: bio: maxLength: 500 type: string birthdate: type: string first_name: maxLength: 100 type: string gender: enum: - Male - Female - Other - Prefer not to say type: string last_name: maxLength: 100 type: string location: maxLength: 100 type: string social_links: additionalProperties: true type: object username: maxLength: 30 minLength: 3 type: string type: object internal_handlers.VerifyTwoFactorRequest: properties: code: description: TOTP code to verify type: string secret: description: Secret from setup step type: string required: - code - secret type: object veza-backend-api_internal_core_marketplace.LicenseType: enum: - basic - premium - exclusive type: string x-enum-varnames: - LicenseBasic - LicensePremium - LicenseExclusive veza-backend-api_internal_core_marketplace.Order: properties: buyer_id: type: string created_at: type: string currency: type: string id: type: string items: items: $ref: '#/definitions/veza-backend-api_internal_core_marketplace.OrderItem' type: array payment_intent: description: Stripe PaymentIntent ID type: string status: description: pending, paid, failed, refunded type: string total_amount: type: number updated_at: type: string type: object veza-backend-api_internal_core_marketplace.OrderItem: properties: id: type: string order_id: type: string price: type: number product_id: type: string type: object veza-backend-api_internal_core_marketplace.Product: properties: created_at: type: string currency: type: string description: type: string id: type: string license_type: $ref: '#/definitions/veza-backend-api_internal_core_marketplace.LicenseType' price: type: number product_type: description: '"track", "pack", "service"' type: string seller_id: type: string status: $ref: '#/definitions/veza-backend-api_internal_core_marketplace.ProductStatus' title: type: string track_id: description: Liaison optionnelle avec un Track (si ProductType == "track") type: string updated_at: type: string type: object veza-backend-api_internal_core_marketplace.ProductStatus: enum: - draft - active - archived type: string x-enum-varnames: - ProductStatusDraft - ProductStatusActive - ProductStatusArchived veza-backend-api_internal_dto.LoginRequest: properties: email: type: string password: type: string remember_me: type: boolean required: - email - password type: object veza-backend-api_internal_dto.LoginResponse: properties: requires_2fa: description: 'BE-API-001: Flag indicating 2FA is required' type: boolean token: $ref: '#/definitions/veza-backend-api_internal_dto.TokenResponse' user: $ref: '#/definitions/veza-backend-api_internal_dto.UserResponse' type: object veza-backend-api_internal_dto.RefreshRequest: properties: refresh_token: type: string required: - refresh_token type: object veza-backend-api_internal_dto.RegisterRequest: properties: email: type: string password: minLength: 12 type: string password_confirmation: type: string username: maxLength: 50 minLength: 3 type: string required: - email - password - password_confirmation type: object veza-backend-api_internal_dto.RegisterResponse: properties: token: $ref: '#/definitions/veza-backend-api_internal_dto.TokenResponse' user: $ref: '#/definitions/veza-backend-api_internal_dto.UserResponse' type: object veza-backend-api_internal_dto.ResendVerificationRequest: properties: email: type: string required: - email type: object veza-backend-api_internal_dto.TokenResponse: properties: access_token: type: string expires_in: type: integer refresh_token: type: string type: object veza-backend-api_internal_dto.UserResponse: properties: email: type: string id: type: string username: type: string type: object veza-backend-api_internal_models.Playlist: properties: collaborators: items: $ref: '#/definitions/veza-backend-api_internal_models.PlaylistCollaborator' type: array cover_url: type: string created_at: type: string description: type: string follower_count: type: integer id: type: string is_public: type: boolean title: type: string track_count: type: integer tracks: items: $ref: '#/definitions/veza-backend-api_internal_models.PlaylistTrack' type: array updated_at: type: string user_id: type: string type: object veza-backend-api_internal_models.PlaylistCollaborator: properties: created_at: type: string id: type: string permission: $ref: '#/definitions/veza-backend-api_internal_models.PlaylistPermission' playlist_id: type: string updated_at: type: string user: $ref: '#/definitions/veza-backend-api_internal_models.User' user_id: type: string type: object veza-backend-api_internal_models.PlaylistPermission: enum: - read - write - admin type: string x-enum-varnames: - PlaylistPermissionRead - PlaylistPermissionWrite - PlaylistPermissionAdmin veza-backend-api_internal_models.PlaylistTrack: properties: added_at: type: string added_by: type: string id: type: string playlist_id: type: string position: type: integer track: $ref: '#/definitions/veza-backend-api_internal_models.Track' track_id: type: string type: object veza-backend-api_internal_models.Track: properties: album: type: string artist: type: string bitrate: description: kbps type: integer cover_art_path: type: string created_at: type: string creator_id: type: string duration: description: seconds type: integer file_id: description: NULL temporairement avant création fichier type: string file_path: type: string file_size: description: bytes type: integer format: description: mp3, flac, wav, etc. type: string genre: type: string id: type: string is_public: type: boolean like_count: type: integer play_count: type: integer sample_rate: description: Hz type: integer status: $ref: '#/definitions/veza-backend-api_internal_models.TrackStatus' status_message: type: string stream_manifest_url: type: string stream_status: description: pending, processing, ready, error type: string title: type: string updated_at: type: string waveform_path: type: string year: type: integer type: object veza-backend-api_internal_models.TrackStatus: enum: - uploading - processing - completed - failed type: string x-enum-varnames: - TrackStatusUploading - TrackStatusProcessing - TrackStatusCompleted - TrackStatusFailed veza-backend-api_internal_models.User: properties: avatar: type: string bio: type: string birthdate: type: string created_at: type: string email: type: string first_name: type: string gender: type: string id: type: string is_active: type: boolean is_admin: type: boolean is_banned: type: boolean is_public: type: boolean is_verified: type: boolean last_login_at: type: string last_name: type: string location: type: string login_count: type: integer password: description: Virtual field for input type: string role: type: string slug: type: string social_links: type: string token_version: type: integer updated_at: type: string username: type: string username_changed_at: type: string type: object veza-backend-api_internal_response.APIResponse: properties: data: {} error: {} success: type: boolean type: object host: localhost:8080 info: contact: email: support@veza.app name: API Support url: http://www.veza.app/support description: Backend API for Veza platform. license: name: Apache 2.0 url: http://www.apache.org/licenses/LICENSE-2.0.html termsOfService: http://swagger.io/terms/ title: Veza Backend API version: 1.2.0 paths: /analytics: get: consumes: - application/json description: Get aggregated analytics data for tracks and playlists parameters: - description: 'Number of days (default: 30)' in: query name: days type: integer - description: Start date (ISO 8601) in: query name: start_date type: string - description: End date (ISO 8601) in: query name: end_date type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: period: type: object playlists: type: object tracks: type: object type: object type: object "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get Analytics Data tags: - Analytics /analytics/events: post: consumes: - application/json description: Record a custom analytics event parameters: - description: Event Data in: body name: request required: true schema: $ref: '#/definitions/internal_handlers.RecordEventRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "400": description: Validation Error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Record Analytics Event tags: - Analytics /analytics/tracks/{id}: get: consumes: - application/json description: Get comprehensive analytics dashboard for a track parameters: - description: Track ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: dashboard: type: object type: object type: object "400": description: Validation Error schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Track not found schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get Track Analytics Dashboard tags: - Analytics /analytics/tracks/top: get: consumes: - application/json description: Get list of top tracks by play count, optionally filtered by date range parameters: - default: 10 description: Number of tracks to return in: query maximum: 100 minimum: 1 name: limit type: integer - description: Start date filter (RFC3339 format) in: query name: start_date type: string - description: End date filter (RFC3339 format) in: query name: end_date type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: tracks: type: array type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Get top tracks tags: - Analytics /api/v1/logs/frontend: post: consumes: - application/json description: Receive and store a log entry from the frontend application parameters: - description: Frontend log entry in: body name: log required: true schema: $ref: '#/definitions/internal_handlers.FrontendLogRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: received: type: boolean type: object type: object "400": description: Invalid log entry schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Receive frontend log tags: - Logging /api/v1/marketplace/download/{product_id}: get: consumes: - application/json description: Get a secure download URL for a purchased product parameters: - description: Product ID in: path name: product_id required: true type: string produces: - application/json responses: "200": description: OK schema: additionalProperties: type: string type: object "403": description: No license schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "404": description: Not Found schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Get download URL tags: - Marketplace /api/v1/marketplace/orders: get: consumes: - application/json description: Get all orders for the authenticated user produces: - application/json responses: "200": description: OK schema: items: $ref: '#/definitions/veza-backend-api_internal_core_marketplace.Order' type: array "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: List user orders tags: - Marketplace post: consumes: - application/json description: Purchase products parameters: - description: Order items in: body name: order required: true schema: $ref: '#/definitions/internal_handlers.CreateOrderRequest' produces: - application/json responses: "201": description: Created schema: $ref: '#/definitions/veza-backend-api_internal_core_marketplace.Order' "400": description: Validation Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Create a new order tags: - Marketplace /api/v1/marketplace/orders/{id}: get: consumes: - application/json description: Get details of a specific order (only order owner can access) parameters: - description: Order ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: $ref: '#/definitions/veza-backend-api_internal_core_marketplace.Order' "400": description: Validation Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "403": description: Forbidden - Not order owner schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "404": description: Order not found schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Get order details tags: - Marketplace /api/v1/marketplace/products: get: consumes: - application/json description: List marketplace products with filters parameters: - description: Product status in: query name: status type: string - description: Seller ID in: query name: seller_id type: string - description: Search query in: query name: q type: string - description: Product type (track, pack, service) in: query name: type type: string - description: Minimum price in: query name: min_price type: number - description: Maximum price in: query name: max_price type: number - description: Page number in: query name: page type: integer - description: Items per page in: query name: limit type: integer produces: - application/json responses: "200": description: OK schema: items: $ref: '#/definitions/veza-backend-api_internal_core_marketplace.Product' type: array summary: List products tags: - Marketplace post: consumes: - application/json description: Create a product (Track, Pack, Service) for sale parameters: - description: Product info in: body name: product required: true schema: $ref: '#/definitions/internal_handlers.CreateProductRequest' produces: - application/json responses: "201": description: Created schema: $ref: '#/definitions/veza-backend-api_internal_core_marketplace.Product' "400": description: Validation Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Create a new product tags: - Marketplace /api/v1/marketplace/products/{id}: put: consumes: - application/json description: Update product details (only seller can update) parameters: - description: Product ID in: path name: id required: true type: string - description: Product updates in: body name: product required: true schema: $ref: '#/definitions/internal_handlers.UpdateProductRequest' produces: - application/json responses: "200": description: OK schema: $ref: '#/definitions/veza-backend-api_internal_core_marketplace.Product' "400": description: Validation Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "403": description: Forbidden - Not product owner schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "404": description: Product not found schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Update a product tags: - Marketplace /audit/activity: get: consumes: - application/json description: Get recent activity logs for the current user parameters: - default: 50 description: Number of activities to return in: query name: limit type: integer produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: activities: type: array type: object type: object "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get user activity tags: - Audit /audit/logs: get: consumes: - application/json description: Search and filter audit logs with pagination support. Supports filtering by action, resource, date range, IP address, and user agent. parameters: - description: Filter by action type in: query name: action type: string - description: Filter by resource type in: query name: resource type: string - description: Filter by resource ID (UUID) in: query name: resource_id type: string - description: Filter by IP address in: query name: ip_address type: string - description: Filter by user agent in: query name: user_agent type: string - description: Start date filter (YYYY-MM-DD) in: query name: start_date type: string - description: End date filter (YYYY-MM-DD) in: query name: end_date type: string - default: 1 description: Page number in: query name: page type: integer - default: 20 description: Items per page in: query name: limit type: integer - description: Offset for pagination in: query name: offset type: integer produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: logs: type: array pagination: type: object type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Search audit logs tags: - Audit /audit/stats: get: consumes: - application/json description: Get audit statistics for the current user, optionally filtered by date range parameters: - description: Start date (YYYY-MM-DD) in: query name: start_date type: string - description: End date (YYYY-MM-DD) in: query name: end_date type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: stats: type: object type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get audit statistics tags: - Audit /auth/2fa/disable: post: consumes: - application/json description: Disable 2FA for user (requires password confirmation) parameters: - description: Password Confirmation in: body name: request required: true schema: $ref: '#/definitions/internal_handlers.DisableTwoFactorRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "400": description: Invalid password or 2FA not enabled schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Disable 2FA tags: - Auth /auth/2fa/setup: post: consumes: - application/json description: Generate 2FA secret and QR code for setup produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: $ref: '#/definitions/internal_handlers.SetupTwoFactorResponse' type: object "400": description: 2FA already enabled schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Setup 2FA tags: - Auth /auth/2fa/status: get: consumes: - application/json description: Get 2FA enabled status for authenticated user produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: enabled: type: boolean type: object type: object "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get 2FA Status tags: - Auth /auth/2fa/verify: post: consumes: - application/json description: Verify 2FA code and enable 2FA for user parameters: - description: 2FA Code in: body name: request required: true schema: $ref: '#/definitions/internal_handlers.VerifyTwoFactorRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "400": description: Invalid code schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Verify and Enable 2FA tags: - Auth /auth/check-username: get: consumes: - application/json description: Check if a username is already taken parameters: - description: Username to check in: query name: username required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: available: type: boolean username: type: string type: object type: object "400": description: Missing Username schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Check Username Availability tags: - Auth /auth/login: post: consumes: - application/json description: Authenticate user and return access token. Refresh token is set in httpOnly cookie. parameters: - description: Login Credentials in: body name: request required: true schema: $ref: '#/definitions/veza-backend-api_internal_dto.LoginRequest' produces: - application/json responses: "200": description: Access token returned in body, refresh token in httpOnly cookie schema: $ref: '#/definitions/veza-backend-api_internal_dto.LoginResponse' "400": description: Validation or Bad Request schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Invalid credentials schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: User Login tags: - Auth /auth/logout: post: consumes: - application/json description: Revoke refresh token and current session parameters: - description: Refresh Token to revoke in: body name: request required: true schema: properties: refresh_token: type: string type: object produces: - application/json responses: "200": description: Success message schema: $ref: '#/definitions/internal_handlers.APIResponse' "400": description: Validation Error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Logout tags: - Auth /auth/me: get: consumes: - application/json description: Get profile information of the currently logged-in user produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: type: object type: object "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: User not found schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get Current User tags: - Auth /auth/refresh: post: consumes: - application/json description: Get a new access token using a refresh token parameters: - description: Refresh Token in: body name: request required: true schema: $ref: '#/definitions/veza-backend-api_internal_dto.RefreshRequest' produces: - application/json responses: "200": description: OK schema: $ref: '#/definitions/veza-backend-api_internal_dto.TokenResponse' "400": description: Validation Error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Invalid/Expired Refresh Token schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Refresh Token tags: - Auth /auth/register: post: consumes: - application/json description: Register a new user account parameters: - description: Registration Data in: body name: request required: true schema: $ref: '#/definitions/veza-backend-api_internal_dto.RegisterRequest' produces: - application/json responses: "201": description: Created schema: $ref: '#/definitions/veza-backend-api_internal_dto.RegisterResponse' "400": description: Validation Error schema: $ref: '#/definitions/internal_handlers.APIResponse' "409": description: User already exists schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: User Registration tags: - Auth /auth/resend-verification: post: consumes: - application/json description: Resend the email verification link parameters: - description: Email in: body name: request required: true schema: $ref: '#/definitions/veza-backend-api_internal_dto.ResendVerificationRequest' produces: - application/json responses: "200": description: Success message schema: $ref: '#/definitions/internal_handlers.APIResponse' "400": description: Validation Error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Resend Verification Email tags: - Auth /auth/verify-email: post: consumes: - application/json description: Verify user email address using a token parameters: - description: Verification Token in: query name: token required: true type: string produces: - application/json responses: "200": description: Success message schema: $ref: '#/definitions/internal_handlers.APIResponse' "400": description: Invalid Token schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Verify Email tags: - Auth /chat/token: get: consumes: - application/json description: Generate a short-lived token for chat authentication produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: token: type: string type: object type: object "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get Chat Token tags: - Chat /comments/{id}: put: consumes: - application/json description: Update a comment (only by owner) parameters: - description: Comment ID (UUID) in: path name: id required: true type: string - description: Updated comment content in: body name: comment required: true schema: $ref: '#/definitions/internal_handlers.UpdateCommentRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: comment: type: object type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "403": description: Forbidden - can only edit own comments schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Comment not found schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Update comment tags: - Comment /comments/{id}/replies: get: consumes: - application/json description: Get paginated list of replies to a comment parameters: - description: Parent Comment ID (UUID) in: path name: id required: true type: string - default: 1 description: Page number in: query minimum: 1 name: page type: integer - default: 20 description: Items per page in: query maximum: 100 minimum: 1 name: limit type: integer produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: pagination: type: object replies: type: array type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Parent comment not found schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Get comment replies tags: - Comment /playlists: get: consumes: - application/json description: Get a paginated list of playlists parameters: - default: 1 description: Page number in: query name: page type: integer - default: 20 description: Items per page in: query name: limit type: integer - description: Filter by User ID in: query name: user_id type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: pagination: type: object playlists: items: $ref: '#/definitions/veza-backend-api_internal_models.Playlist' type: array type: object type: object "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get Playlists tags: - Playlist post: consumes: - application/json description: Create a new playlist parameters: - description: Playlist Metadata in: body name: request required: true schema: $ref: '#/definitions/internal_handlers.CreatePlaylistRequest' produces: - application/json responses: "201": description: Created schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: playlist: $ref: '#/definitions/veza-backend-api_internal_models.Playlist' type: object type: object "400": description: Validation Error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Create Playlist tags: - Playlist /playlists/{id}: delete: consumes: - application/json description: Permanently delete a playlist parameters: - description: Playlist ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "403": description: Forbidden schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Playlist not found schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Delete Playlist tags: - Playlist get: consumes: - application/json description: Get detailed information about a playlist parameters: - description: Playlist ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: playlist: $ref: '#/definitions/veza-backend-api_internal_models.Playlist' type: object type: object "400": description: Invalid ID schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Playlist not found schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get Playlist by ID tags: - Playlist put: consumes: - application/json description: Update playlist metadata parameters: - description: Playlist ID in: path name: id required: true type: string - description: Playlist Metadata in: body name: playlist required: true schema: $ref: '#/definitions/internal_handlers.UpdatePlaylistRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: playlist: $ref: '#/definitions/veza-backend-api_internal_models.Playlist' type: object type: object "400": description: Validation Error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "403": description: Forbidden schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Playlist not found schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Update Playlist tags: - Playlist /playlists/{id}/tracks: post: consumes: - application/json description: Add a track to the playlist parameters: - description: Playlist ID in: path name: id required: true type: string - description: Track ID (in body) in: body name: trackId required: true schema: properties: track_id: type: string type: object produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "400": description: Track already present or invalid ID schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Playlist or Track not found schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Add Track to Playlist tags: - Playlist /playlists/{id}/tracks/{trackId}: delete: consumes: - application/json description: Remove a track from the playlist parameters: - description: Playlist ID in: path name: id required: true type: string - description: Track ID in: path name: trackId required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "404": description: Playlist or Track not found schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Remove Track from Playlist tags: - Playlist /playlists/{id}/tracks/reorder: put: consumes: - application/json description: Reorder tracks in the playlist parameters: - description: Playlist ID in: path name: id required: true type: string - description: New Track Order in: body name: order required: true schema: $ref: '#/definitions/internal_handlers.ReorderTracksRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "400": description: Validation Error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Reorder Tracks tags: - Playlist /tracks: get: consumes: - application/json description: Get a paginated list of tracks with filters parameters: - default: 1 description: Page number in: query name: page type: integer - default: 20 description: Items per page in: query name: limit type: integer - description: Filter by User ID in: query name: user_id type: string - description: Filter by Genre in: query name: genre type: string - description: Filter by Format in: query name: format type: string - default: created_at description: Sort field in: query name: sort_by type: string - default: desc description: Sort order (asc/desc) in: query name: sort_order type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: pagination: type: object tracks: items: $ref: '#/definitions/veza-backend-api_internal_models.Track' type: array type: object type: object "500": description: Internal Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' summary: List Tracks tags: - Track post: consumes: - multipart/form-data description: Upload a new track (audio file) parameters: - description: Audio File (MP3, WAV, FLAC, OGG) in: formData name: file required: true type: file produces: - application/json responses: "201": description: Created schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: track: $ref: '#/definitions/veza-backend-api_internal_models.Track' type: object type: object "400": description: No file or validation error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "403": description: Quota exceeded schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Upload Track tags: - Track /tracks/{id}: delete: consumes: - application/json description: Permanently delete a track parameters: - description: Track ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: message: type: string type: object type: object "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "403": description: Forbidden schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "404": description: Track not found schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Delete Track tags: - Track get: consumes: - application/json description: Get detailed information about a track parameters: - description: Track ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: track: $ref: '#/definitions/veza-backend-api_internal_models.Track' type: object type: object "400": description: Invalid ID schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "404": description: Track not found schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' summary: Get Track by ID tags: - Track put: consumes: - application/json description: Update track metadata parameters: - description: Track ID in: path name: id required: true type: string - description: Track Metadata in: body name: track required: true schema: $ref: '#/definitions/internal_core_track.UpdateTrackRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: track: $ref: '#/definitions/veza-backend-api_internal_models.Track' type: object type: object "400": description: Validation Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "403": description: Forbidden schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "404": description: Track not found schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Update Track tags: - Track /tracks/{id}/analytics/plays: get: consumes: - application/json description: Get play statistics over time for a track, grouped by time period parameters: - description: Track ID (UUID) in: path name: id required: true type: string - description: Start date (RFC3339 format) in: query name: start_date type: string - description: End date (RFC3339 format) in: query name: end_date type: string - default: day description: Time period grouping (hour, day, week, month) in: query name: interval type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: points: type: array type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Track not found schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Get plays over time tags: - Analytics /tracks/{id}/comments: get: consumes: - application/json description: Get paginated list of comments for a track parameters: - description: Track ID in: path name: id required: true type: string - default: 1 description: Page number in: query name: page type: integer - default: 20 description: Items per page in: query name: limit type: integer produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: comments: type: array pagination: type: object type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Track not found schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Get track comments tags: - Comment post: consumes: - application/json description: Create a new comment on a track. Can be a top-level comment or a reply to another comment (using parent_id). parameters: - description: Track ID (UUID) in: path name: id required: true type: string - description: Comment data in: body name: comment required: true schema: $ref: '#/definitions/internal_handlers.CreateCommentRequest' produces: - application/json responses: "201": description: Created schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: comment: type: object type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Track not found schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Create comment tags: - Comment /tracks/{id}/comments/{comment_id}: delete: consumes: - application/json description: Delete a comment (only by owner or admin) parameters: - description: Track ID in: path name: id required: true type: string - description: Comment ID in: path name: comment_id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "403": description: Forbidden - not comment owner schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Comment not found schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Delete comment tags: - Comment /tracks/{id}/play: post: consumes: - application/json description: Record a play event for a track. Can be called anonymously or with authentication. parameters: - description: Track ID (UUID) in: path name: id required: true type: string - description: Play event data in: body name: request required: true schema: $ref: '#/definitions/internal_handlers.RecordPlayRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Track not found schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Record play tags: - Analytics /tracks/{id}/stats: get: consumes: - application/json description: Get statistics for a track (plays, likes, etc.) parameters: - description: Track ID (UUID) in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: stats: type: object type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Track not found schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Get track statistics tags: - Analytics /tracks/{id}/status: get: consumes: - application/json description: Get the processing status of an uploaded track parameters: - description: Track ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: progress: type: integer type: object type: object "400": description: Invalid ID schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "404": description: Track not found schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Get Upload Status tags: - Track /tracks/batch/delete: post: consumes: - application/json description: Delete multiple tracks at once parameters: - description: List of Track IDs in: body name: request required: true schema: $ref: '#/definitions/internal_core_track.BatchDeleteRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: deleted: items: type: string type: array failed: type: object type: object type: object "400": description: Validation Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "500": description: Internal Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Batch Delete Tracks tags: - Track /tracks/chunk: post: consumes: - multipart/form-data description: Upload a single chunk of a file parameters: - description: Chunk Data in: formData name: chunk required: true type: file - description: Upload ID in: formData name: upload_id required: true type: string - description: Chunk Number in: formData name: chunk_number required: true type: integer - description: Total Chunks in: formData name: total_chunks required: true type: integer - description: Total Size format: int64 in: formData name: total_size required: true type: integer - description: Filename in: formData name: filename required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: message: type: string progress: format: float64 type: number received_chunks: type: integer upload_id: type: string type: object type: object "400": description: Validation Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Upload Chunk tags: - Track /tracks/complete: post: consumes: - application/json description: Finish upload session and assemble file parameters: - description: Upload ID in: body name: request required: true schema: $ref: '#/definitions/internal_core_track.CompleteChunkedUploadRequest' produces: - application/json responses: "201": description: Created schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: md5: type: string message: type: string track: $ref: '#/definitions/veza-backend-api_internal_models.Track' type: object type: object "400": description: Validation or Assemblage Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Complete Chunked Upload tags: - Track /tracks/initiate: post: consumes: - application/json description: Start a new chunked upload session parameters: - description: Upload Metadata in: body name: request required: true schema: $ref: '#/definitions/internal_core_track.InitiateChunkedUploadRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: message: type: string upload_id: type: string type: object type: object "400": description: Validation Error schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Initiate Chunked Upload tags: - Track /tracks/quota/{id}: get: consumes: - application/json description: Get remaining upload quota for the user parameters: - description: User ID (optional, defaults to current user) in: path name: id type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: quota: type: object type: object type: object "401": description: Unauthorized schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' "403": description: Forbidden schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Get Upload Quota tags: - Track /tracks/resume/{uploadId}: get: consumes: - application/json description: Get state of an interrupted upload parameters: - description: Upload ID in: path name: uploadId required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' - properties: data: properties: chunks_received: type: integer upload_id: type: string type: object type: object "404": description: Upload session not found schema: $ref: '#/definitions/veza-backend-api_internal_response.APIResponse' security: - BearerAuth: [] summary: Resume Upload tags: - Track /users: get: consumes: - application/json description: Get a paginated list of users with optional filtering parameters: - default: 1 description: Page number in: query name: page type: integer - default: 20 description: Items per page in: query name: limit type: integer - description: Filter by role in: query name: role type: string - description: Filter by active status in: query name: is_active type: boolean - description: Filter by verified status in: query name: is_verified type: boolean - description: Search by username, email, first_name, last_name in: query name: search type: string - default: created_at description: Sort field (created_at, username, email, last_login_at) in: query name: sort_by type: string - default: desc description: Sort order (asc, desc) in: query name: sort_order type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: pagination: type: object users: type: array type: object type: object "500": description: Internal Error schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: List Users tags: - User /users/{id}: delete: consumes: - application/json description: Soft delete a user (only user owner or admin can delete) parameters: - description: User ID in: path name: id required: true type: string produces: - application/json responses: "200": description: User deleted successfully schema: $ref: '#/definitions/internal_handlers.APIResponse' "400": description: Invalid ID schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "403": description: Forbidden - Not user owner or admin schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: User not found schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Delete user tags: - User get: consumes: - application/json description: Get public profile information for a user parameters: - description: User ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: profile: type: object type: object type: object "400": description: Invalid ID schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: User not found schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Get Profile by ID tags: - User put: consumes: - application/json description: Update user profile details parameters: - description: User ID in: path name: id required: true type: string - description: Profile Data in: body name: profile required: true schema: $ref: '#/definitions/internal_handlers.UpdateProfileRequest' produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: profile: type: object type: object type: object "400": description: Validation Error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "403": description: Forbidden schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Update Profile tags: - User /users/{id}/analytics/stats: get: consumes: - application/json description: Get analytics statistics for a user (total plays, tracks, etc.) parameters: - description: User ID (UUID) in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: stats: type: object type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "403": description: Forbidden - can only view own stats schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: User not found schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get user statistics tags: - Analytics /users/{id}/completion: get: consumes: - application/json description: Get profile completion percentage and missing fields parameters: - description: User ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: type: object type: object "400": description: Invalid ID schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "403": description: Forbidden schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Get Profile Completion tags: - User /users/by-username/{username}: get: consumes: - application/json description: Get public profile information for a user by username parameters: - description: Username in: path name: username required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: profile: type: object type: object type: object "400": description: Missing username schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: User not found schema: $ref: '#/definitions/internal_handlers.APIResponse' summary: Get Profile by Username tags: - User /webhooks: get: consumes: - application/json description: Get a list of all webhooks registered by the current user produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: webhooks: type: array type: object type: object "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: List webhooks tags: - Webhook post: consumes: - application/json description: Register a new webhook for receiving events parameters: - description: Webhook registration data in: body name: webhook required: true schema: type: object produces: - application/json responses: "201": description: Created schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: webhook: type: object type: object type: object "400": description: Validation error schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Register webhook tags: - Webhook /webhooks/{id}: delete: consumes: - application/json description: Delete a webhook by ID parameters: - description: Webhook ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "400": description: Invalid webhook ID schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Webhook not found schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Delete webhook tags: - Webhook /webhooks/{id}/regenerate-key: post: consumes: - application/json description: Generate a new API key for a webhook (invalidates the old one) parameters: - description: Webhook ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: api_key: type: string message: type: string type: object type: object "400": description: Invalid webhook ID schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Webhook not found schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Regenerate webhook API key tags: - Webhook /webhooks/{id}/test: post: consumes: - application/json description: Send a test event to a webhook to verify it's working parameters: - description: Webhook ID in: path name: id required: true type: string produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: message: type: string type: object type: object "400": description: Invalid webhook ID schema: $ref: '#/definitions/internal_handlers.APIResponse' "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "404": description: Webhook not found schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Test webhook tags: - Webhook /webhooks/stats: get: consumes: - application/json description: Get statistics for webhook delivery and performance produces: - application/json responses: "200": description: OK schema: allOf: - $ref: '#/definitions/internal_handlers.APIResponse' - properties: data: properties: stats: type: object type: object type: object "401": description: Unauthorized schema: $ref: '#/definitions/internal_handlers.APIResponse' "500": description: Internal server error schema: $ref: '#/definitions/internal_handlers.APIResponse' security: - BearerAuth: [] summary: Get webhook statistics tags: - Webhook securityDefinitions: BearerAuth: description: Type "Bearer" followed by a space and JWT token. in: header name: Authorization type: apiKey swagger: "2.0"