basePath: /api/v1
definitions:
  internal_core_track.BatchDeleteRequest:
    properties:
      track_ids:
        items:
          type: string
        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:
        type: string
      artist:
        type: string
      genre:
        type: string
      is_public:
        type: boolean
      title:
        type: string
      year:
        type: integer
    type: object
  internal_handlers.APIResponse:
    properties:
      data: {}
      error: {}
      success:
        type: boolean
    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:
        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.ReorderTracksRequest:
    properties:
      track_ids:
        description: Changed to []uuid.UUID
        items:
          type: string
        minItems: 1
        type: array
    required:
    - track_ids
    type: object
  internal_handlers.UpdatePlaylistRequest:
    properties:
      description:
        type: string
      is_public:
        type: boolean
      title:
        maxLength: 200
        minLength: 1
        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
      username:
        maxLength: 30
        minLength: 3
        type: string
    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:
      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_confirm:
        type: string
      username:
        maxLength: 50
        minLength: 3
        type: string
    required:
    - email
    - password
    - password_confirm
    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
      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
      duration:
        description: seconds
        type: integer
      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
      user_id:
        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_public:
        type: boolean
      is_verified:
        type: boolean
      last_login_at:
        type: string
      last_name:
        type: string
      location:
        type: string
      password:
        description: Virtual field for input
        type: string
      role:
        type: string
      slug:
        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:
  /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:
    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/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
      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
  /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/refresh tokens
      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: OK
          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:
                  properties:
                    email:
                      type: string
                    id:
                      type: string
                    role:
                      type: string
                  type: object
              type: object
        "401":
          description: Unauthorized
          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
  /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}/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/{id}:
    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}/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
securityDefinitions:
  BearerAuth:
    in: header
    name: Authorization
    type: apiKey
swagger: "2.0"
