2026-01-11 15:30:43 +00:00
|
|
|
basePath: /api/v1
|
2026-01-11 15:29:31 +00:00
|
|
|
definitions:
|
|
|
|
|
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_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
|
2026-02-27 19:23:10 +00:00
|
|
|
promo_code:
|
|
|
|
|
maxLength: 50
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
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:
|
2026-02-27 19:23:10 +00:00
|
|
|
bpm:
|
|
|
|
|
description: v0.401 M1
|
|
|
|
|
maximum: 300
|
|
|
|
|
minimum: 1
|
|
|
|
|
type: integer
|
|
|
|
|
category:
|
|
|
|
|
enum:
|
|
|
|
|
- sample
|
|
|
|
|
- beat
|
|
|
|
|
- preset
|
|
|
|
|
- pack
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
description:
|
|
|
|
|
maxLength: 2000
|
|
|
|
|
type: string
|
|
|
|
|
license_type:
|
|
|
|
|
enum:
|
|
|
|
|
- standard
|
|
|
|
|
- exclusive
|
|
|
|
|
- commercial
|
|
|
|
|
type: string
|
2026-02-27 19:23:10 +00:00
|
|
|
licenses:
|
|
|
|
|
description: 'v0.401 M2: Product licenses (streaming, personal, commercial,
|
|
|
|
|
exclusive)'
|
|
|
|
|
items:
|
|
|
|
|
properties:
|
|
|
|
|
license_type:
|
|
|
|
|
enum:
|
|
|
|
|
- streaming
|
|
|
|
|
- personal
|
|
|
|
|
- commercial
|
|
|
|
|
- exclusive
|
|
|
|
|
type: string
|
|
|
|
|
price_cents:
|
|
|
|
|
minimum: 0
|
|
|
|
|
type: integer
|
|
|
|
|
terms_text:
|
|
|
|
|
type: string
|
|
|
|
|
required:
|
|
|
|
|
- license_type
|
|
|
|
|
- price_cents
|
|
|
|
|
type: object
|
|
|
|
|
type: array
|
|
|
|
|
musical_key:
|
|
|
|
|
maxLength: 10
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
internal_handlers.DashboardResponse:
|
|
|
|
|
properties:
|
|
|
|
|
library_preview:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.LibraryPreview'
|
|
|
|
|
recent_activity:
|
|
|
|
|
items:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.RecentActivity'
|
|
|
|
|
type: array
|
|
|
|
|
stats:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.DashboardStats'
|
|
|
|
|
type: object
|
|
|
|
|
internal_handlers.DashboardStats:
|
|
|
|
|
properties:
|
|
|
|
|
active_friends:
|
|
|
|
|
type: integer
|
|
|
|
|
active_friends_change:
|
|
|
|
|
type: string
|
|
|
|
|
favorites:
|
|
|
|
|
type: integer
|
|
|
|
|
favorites_change:
|
|
|
|
|
type: string
|
|
|
|
|
messages_sent:
|
|
|
|
|
type: integer
|
|
|
|
|
messages_sent_change:
|
|
|
|
|
type: string
|
|
|
|
|
period:
|
|
|
|
|
type: string
|
|
|
|
|
tracks_played:
|
|
|
|
|
type: integer
|
|
|
|
|
tracks_played_change:
|
|
|
|
|
type: string
|
|
|
|
|
type: object
|
|
|
|
|
internal_handlers.DeleteAccountRequest:
|
|
|
|
|
properties:
|
|
|
|
|
confirm_text:
|
|
|
|
|
type: string
|
|
|
|
|
password:
|
|
|
|
|
type: string
|
|
|
|
|
reason:
|
|
|
|
|
type: string
|
|
|
|
|
required:
|
|
|
|
|
- confirm_text
|
|
|
|
|
- password
|
|
|
|
|
type: object
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
internal_handlers.LibraryPreview:
|
2026-01-11 15:29:31 +00:00
|
|
|
properties:
|
2026-02-27 19:23:10 +00:00
|
|
|
has_more:
|
|
|
|
|
type: boolean
|
|
|
|
|
items:
|
|
|
|
|
items:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.TrackPreview'
|
|
|
|
|
type: array
|
|
|
|
|
total_count:
|
|
|
|
|
type: integer
|
|
|
|
|
type: object
|
|
|
|
|
internal_handlers.RecentActivity:
|
|
|
|
|
properties:
|
|
|
|
|
description:
|
|
|
|
|
type: string
|
|
|
|
|
icon:
|
2026-01-11 15:29:31 +00:00
|
|
|
type: string
|
2026-02-27 19:23:10 +00:00
|
|
|
id:
|
|
|
|
|
type: string
|
|
|
|
|
metadata:
|
2026-01-11 15:29:31 +00:00
|
|
|
additionalProperties: true
|
|
|
|
|
type: object
|
2026-02-27 19:23:10 +00:00
|
|
|
timestamp:
|
|
|
|
|
type: string
|
|
|
|
|
title:
|
|
|
|
|
type: string
|
|
|
|
|
type:
|
2026-01-11 15:29:31 +00:00
|
|
|
type: string
|
|
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
internal_handlers.StreamTokenResponse:
|
|
|
|
|
properties:
|
|
|
|
|
expires_in:
|
|
|
|
|
description: seconds
|
|
|
|
|
type: integer
|
|
|
|
|
token:
|
|
|
|
|
type: string
|
|
|
|
|
type: object
|
|
|
|
|
internal_handlers.TrackPreview:
|
|
|
|
|
properties:
|
|
|
|
|
artist:
|
|
|
|
|
type: string
|
|
|
|
|
cover_art_path:
|
|
|
|
|
type: string
|
|
|
|
|
created_at:
|
|
|
|
|
type: string
|
|
|
|
|
duration:
|
|
|
|
|
type: integer
|
|
|
|
|
id:
|
|
|
|
|
type: string
|
|
|
|
|
like_count:
|
|
|
|
|
type: integer
|
|
|
|
|
play_count:
|
|
|
|
|
type: integer
|
|
|
|
|
title:
|
|
|
|
|
type: string
|
|
|
|
|
type: object
|
2026-01-11 15:29:31 +00:00
|
|
|
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:
|
2026-02-27 19:23:10 +00:00
|
|
|
bpm:
|
|
|
|
|
maximum: 300
|
|
|
|
|
minimum: 1
|
|
|
|
|
type: integer
|
|
|
|
|
category:
|
|
|
|
|
enum:
|
|
|
|
|
- sample
|
|
|
|
|
- beat
|
|
|
|
|
- preset
|
|
|
|
|
- pack
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
description:
|
|
|
|
|
maxLength: 2000
|
|
|
|
|
type: string
|
2026-02-27 19:23:10 +00:00
|
|
|
licenses:
|
|
|
|
|
description: 'v0.401 M2: Product licenses'
|
|
|
|
|
items:
|
|
|
|
|
properties:
|
|
|
|
|
license_type:
|
|
|
|
|
enum:
|
|
|
|
|
- streaming
|
|
|
|
|
- personal
|
|
|
|
|
- commercial
|
|
|
|
|
- exclusive
|
|
|
|
|
type: string
|
|
|
|
|
price_cents:
|
|
|
|
|
minimum: 0
|
|
|
|
|
type: integer
|
|
|
|
|
terms_text:
|
|
|
|
|
type: string
|
|
|
|
|
required:
|
|
|
|
|
- license_type
|
|
|
|
|
- price_cents
|
|
|
|
|
type: object
|
|
|
|
|
type: array
|
|
|
|
|
musical_key:
|
|
|
|
|
maxLength: 10
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
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:
|
2026-02-27 19:23:10 +00:00
|
|
|
banner_url:
|
|
|
|
|
maxLength: 2048
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
is_public:
|
|
|
|
|
type: boolean
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
internal_handlers.ValidateRequest:
|
|
|
|
|
properties:
|
|
|
|
|
data:
|
|
|
|
|
description: The data to validate
|
|
|
|
|
items:
|
|
|
|
|
type: integer
|
|
|
|
|
type: array
|
|
|
|
|
type:
|
|
|
|
|
description: e.g., "RegisterRequest", "LoginRequest"
|
|
|
|
|
type: string
|
|
|
|
|
required:
|
|
|
|
|
- data
|
|
|
|
|
- type
|
|
|
|
|
type: object
|
|
|
|
|
internal_handlers.ValidateResponse:
|
|
|
|
|
properties:
|
|
|
|
|
errors:
|
|
|
|
|
items:
|
|
|
|
|
$ref: '#/definitions/veza-backend-api_internal_dto.ValidationError'
|
|
|
|
|
type: array
|
|
|
|
|
message:
|
|
|
|
|
type: string
|
|
|
|
|
valid:
|
|
|
|
|
type: boolean
|
|
|
|
|
type: object
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
discount_amount_cents:
|
|
|
|
|
type: integer
|
|
|
|
|
hyperswitch_payment_id:
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
id:
|
|
|
|
|
type: string
|
|
|
|
|
items:
|
|
|
|
|
items:
|
|
|
|
|
$ref: '#/definitions/veza-backend-api_internal_core_marketplace.OrderItem'
|
|
|
|
|
type: array
|
|
|
|
|
payment_intent:
|
2026-02-27 19:23:10 +00:00
|
|
|
description: Legacy / Stripe PaymentIntent ID
|
|
|
|
|
type: string
|
|
|
|
|
payment_status:
|
|
|
|
|
description: Hyperswitch payment status
|
|
|
|
|
type: string
|
|
|
|
|
promo_code_id:
|
2026-01-11 15:29:31 +00:00
|
|
|
type: string
|
|
|
|
|
status:
|
2026-02-27 19:23:10 +00:00
|
|
|
description: pending, completed, failed, refunded
|
2026-01-11 15:29:31 +00:00
|
|
|
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:
|
2026-02-27 19:23:10 +00:00
|
|
|
avg_rating:
|
|
|
|
|
description: 'v0.403 R1: Computed from product_reviews (not stored in DB)'
|
|
|
|
|
type: number
|
|
|
|
|
bpm:
|
|
|
|
|
description: 'v0.401 M1: Métadonnées musicales et catégorie'
|
|
|
|
|
type: integer
|
|
|
|
|
category:
|
|
|
|
|
description: sample, beat, preset, pack
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
created_at:
|
|
|
|
|
type: string
|
|
|
|
|
currency:
|
|
|
|
|
type: string
|
|
|
|
|
description:
|
|
|
|
|
type: string
|
|
|
|
|
id:
|
|
|
|
|
type: string
|
2026-02-27 19:23:10 +00:00
|
|
|
images:
|
|
|
|
|
items:
|
|
|
|
|
$ref: '#/definitions/veza-backend-api_internal_core_marketplace.ProductImage'
|
|
|
|
|
type: array
|
2026-01-11 15:29:31 +00:00
|
|
|
license_type:
|
|
|
|
|
$ref: '#/definitions/veza-backend-api_internal_core_marketplace.LicenseType'
|
2026-02-27 19:23:10 +00:00
|
|
|
licenses:
|
|
|
|
|
items:
|
|
|
|
|
$ref: '#/definitions/veza-backend-api_internal_core_marketplace.ProductLicense'
|
|
|
|
|
type: array
|
|
|
|
|
musical_key:
|
|
|
|
|
type: string
|
|
|
|
|
previews:
|
|
|
|
|
description: Relations
|
|
|
|
|
items:
|
|
|
|
|
$ref: '#/definitions/veza-backend-api_internal_core_marketplace.ProductPreview'
|
|
|
|
|
type: array
|
2026-01-11 15:29:31 +00:00
|
|
|
price:
|
|
|
|
|
type: number
|
|
|
|
|
product_type:
|
|
|
|
|
description: '"track", "pack", "service"'
|
|
|
|
|
type: string
|
2026-02-27 19:23:10 +00:00
|
|
|
review_count:
|
|
|
|
|
type: integer
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
veza-backend-api_internal_core_marketplace.ProductImage:
|
|
|
|
|
properties:
|
|
|
|
|
created_at:
|
|
|
|
|
type: string
|
|
|
|
|
id:
|
|
|
|
|
type: string
|
|
|
|
|
product_id:
|
|
|
|
|
type: string
|
|
|
|
|
sort_order:
|
|
|
|
|
type: integer
|
|
|
|
|
url:
|
|
|
|
|
type: string
|
|
|
|
|
type: object
|
|
|
|
|
veza-backend-api_internal_core_marketplace.ProductLicense:
|
|
|
|
|
properties:
|
|
|
|
|
created_at:
|
|
|
|
|
type: string
|
|
|
|
|
id:
|
|
|
|
|
type: string
|
|
|
|
|
license_type:
|
|
|
|
|
description: streaming, personal, commercial, exclusive
|
|
|
|
|
type: string
|
|
|
|
|
price_cents:
|
|
|
|
|
type: integer
|
|
|
|
|
product_id:
|
|
|
|
|
type: string
|
|
|
|
|
terms_text:
|
|
|
|
|
type: string
|
|
|
|
|
type: object
|
|
|
|
|
veza-backend-api_internal_core_marketplace.ProductPreview:
|
|
|
|
|
properties:
|
|
|
|
|
created_at:
|
|
|
|
|
type: string
|
|
|
|
|
duration_sec:
|
|
|
|
|
type: integer
|
|
|
|
|
file_path:
|
|
|
|
|
type: string
|
|
|
|
|
id:
|
|
|
|
|
type: string
|
|
|
|
|
product_id:
|
|
|
|
|
type: string
|
|
|
|
|
type: object
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
veza-backend-api_internal_dto.ValidationError:
|
|
|
|
|
properties:
|
|
|
|
|
field:
|
|
|
|
|
type: string
|
|
|
|
|
message:
|
|
|
|
|
type: string
|
|
|
|
|
value:
|
|
|
|
|
type: string
|
|
|
|
|
type: object
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
bpm:
|
|
|
|
|
type: integer
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
musical_key:
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
tags:
|
|
|
|
|
items:
|
|
|
|
|
type: string
|
|
|
|
|
type: array
|
2026-01-11 15:29:31 +00:00
|
|
|
title:
|
|
|
|
|
type: string
|
|
|
|
|
updated_at:
|
|
|
|
|
type: string
|
|
|
|
|
waveform_path:
|
|
|
|
|
type: string
|
2026-02-27 19:23:10 +00:00
|
|
|
waveform_url:
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
banner_url:
|
|
|
|
|
type: string
|
2026-01-11 15:29:31 +00:00
|
|
|
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
|
2026-01-11 15:30:43 +00:00
|
|
|
host: localhost:8080
|
2026-01-11 15:29:31 +00:00
|
|
|
info:
|
2026-01-11 15:30:43 +00:00
|
|
|
contact:
|
|
|
|
|
email: support@veza.app
|
|
|
|
|
name: API Support
|
|
|
|
|
url: http://www.veza.app/support
|
2026-02-27 19:23:10 +00:00
|
|
|
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/dashboard:
|
2026-01-11 15:29:31 +00:00
|
|
|
get:
|
|
|
|
|
consumes:
|
|
|
|
|
- application/json
|
2026-02-27 19:23:10 +00:00
|
|
|
description: Get aggregated dashboard data including stats, recent activity,
|
|
|
|
|
and library preview
|
2026-01-11 15:29:31 +00:00
|
|
|
parameters:
|
2026-02-27 19:23:10 +00:00
|
|
|
- description: 'Number of recent activity items (default: 10)'
|
2026-01-11 15:29:31 +00:00
|
|
|
in: query
|
2026-02-27 19:23:10 +00:00
|
|
|
name: activity_limit
|
2026-01-11 15:29:31 +00:00
|
|
|
type: integer
|
2026-02-27 19:23:10 +00:00
|
|
|
- description: 'Number of library items (default: 5)'
|
2026-01-11 15:29:31 +00:00
|
|
|
in: query
|
2026-02-27 19:23:10 +00:00
|
|
|
name: library_limit
|
|
|
|
|
type: integer
|
|
|
|
|
- description: 'Time period for statistics: 7d, 30d, 90d, all (default: 30d)'
|
2026-01-11 15:29:31 +00:00
|
|
|
in: query
|
2026-02-27 19:23:10 +00:00
|
|
|
name: stats_period
|
2026-01-11 15:29:31 +00:00
|
|
|
type: string
|
|
|
|
|
produces:
|
|
|
|
|
- application/json
|
|
|
|
|
responses:
|
|
|
|
|
"200":
|
|
|
|
|
description: OK
|
|
|
|
|
schema:
|
|
|
|
|
allOf:
|
|
|
|
|
- $ref: '#/definitions/internal_handlers.APIResponse'
|
|
|
|
|
- properties:
|
|
|
|
|
data:
|
2026-02-27 19:23:10 +00:00
|
|
|
$ref: '#/definitions/internal_handlers.DashboardResponse'
|
2026-01-11 15:29:31 +00:00
|
|
|
type: object
|
2026-02-27 19:23:10 +00:00
|
|
|
"401":
|
|
|
|
|
description: Unauthorized
|
2026-01-11 15:29:31 +00:00
|
|
|
schema:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.APIResponse'
|
|
|
|
|
"500":
|
|
|
|
|
description: Internal server error
|
|
|
|
|
schema:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.APIResponse'
|
2026-02-27 19:23:10 +00:00
|
|
|
security:
|
|
|
|
|
- BearerAuth: []
|
|
|
|
|
summary: Get Dashboard Data
|
2026-01-11 15:29:31 +00:00
|
|
|
tags:
|
2026-02-27 19:23:10 +00:00
|
|
|
- Dashboard
|
2026-01-11 15:29:31 +00:00
|
|
|
/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
|
2026-02-27 19:23:10 +00:00
|
|
|
/auth/stream-token:
|
|
|
|
|
post:
|
|
|
|
|
description: Returns a 5-minute JWT for HLS and WebSocket authentication (httpOnly
|
|
|
|
|
cookies prevent direct token access)
|
|
|
|
|
responses:
|
|
|
|
|
"200":
|
|
|
|
|
description: OK
|
|
|
|
|
schema:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.StreamTokenResponse'
|
|
|
|
|
"401":
|
|
|
|
|
description: Unauthorized
|
|
|
|
|
schema:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.APIResponse'
|
|
|
|
|
security:
|
|
|
|
|
- BearerAuth: []
|
|
|
|
|
summary: Get ephemeral stream token
|
|
|
|
|
tags:
|
|
|
|
|
- Auth
|
2026-01-11 15:29:31 +00:00
|
|
|
/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:
|
|
|
|
|
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
|
2026-02-27 19:23:10 +00:00
|
|
|
type: file
|
2026-01-11 15:29:31 +00:00
|
|
|
produces:
|
|
|
|
|
- application/json
|
|
|
|
|
responses:
|
2026-02-27 19:23:10 +00:00
|
|
|
"201":
|
|
|
|
|
description: Created
|
2026-01-11 15:29:31 +00:00
|
|
|
schema:
|
|
|
|
|
allOf:
|
2026-02-27 19:23:10 +00:00
|
|
|
- $ref: '#/definitions/veza-backend-api_internal_response.APIResponse'
|
2026-01-11 15:29:31 +00:00
|
|
|
- properties:
|
|
|
|
|
data:
|
|
|
|
|
properties:
|
2026-02-27 19:23:10 +00:00
|
|
|
track:
|
|
|
|
|
$ref: '#/definitions/veza-backend-api_internal_models.Track'
|
2026-01-11 15:29:31 +00:00
|
|
|
type: object
|
|
|
|
|
type: object
|
|
|
|
|
"400":
|
2026-02-27 19:23:10 +00:00
|
|
|
description: No file or validation error
|
2026-01-11 15:29:31 +00:00
|
|
|
schema:
|
2026-02-27 19:23:10 +00:00
|
|
|
$ref: '#/definitions/veza-backend-api_internal_response.APIResponse'
|
|
|
|
|
"401":
|
|
|
|
|
description: Unauthorized
|
2026-01-11 15:29:31 +00:00
|
|
|
schema:
|
2026-02-27 19:23:10 +00:00
|
|
|
$ref: '#/definitions/veza-backend-api_internal_response.APIResponse'
|
|
|
|
|
"403":
|
|
|
|
|
description: Quota exceeded
|
|
|
|
|
schema:
|
|
|
|
|
$ref: '#/definitions/veza-backend-api_internal_response.APIResponse'
|
2026-01-11 15:29:31 +00:00
|
|
|
"500":
|
2026-02-27 19:23:10 +00:00
|
|
|
description: Internal Error
|
2026-01-11 15:29:31 +00:00
|
|
|
schema:
|
2026-02-27 19:23:10 +00:00
|
|
|
$ref: '#/definitions/veza-backend-api_internal_response.APIResponse'
|
|
|
|
|
security:
|
|
|
|
|
- BearerAuth: []
|
|
|
|
|
summary: Upload Track
|
2026-01-11 15:29:31 +00:00
|
|
|
tags:
|
2026-02-27 19:23:10 +00:00
|
|
|
- Track
|
2026-01-11 15:29:31 +00:00
|
|
|
/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}/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/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}/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
|
2026-02-27 19:23:10 +00:00
|
|
|
/users/me:
|
|
|
|
|
delete:
|
|
|
|
|
description: Permanently delete user account with anonymization, session revocation,
|
|
|
|
|
audit log
|
|
|
|
|
parameters:
|
|
|
|
|
- description: Password, reason, confirm_text (must be DELETE)
|
|
|
|
|
in: body
|
|
|
|
|
name: body
|
|
|
|
|
required: true
|
|
|
|
|
schema:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.DeleteAccountRequest'
|
|
|
|
|
responses:
|
|
|
|
|
"200":
|
|
|
|
|
description: OK
|
|
|
|
|
schema:
|
|
|
|
|
additionalProperties: true
|
|
|
|
|
type: object
|
|
|
|
|
"400":
|
|
|
|
|
description: Bad Request
|
|
|
|
|
schema:
|
|
|
|
|
additionalProperties: true
|
|
|
|
|
type: object
|
|
|
|
|
"401":
|
|
|
|
|
description: Unauthorized
|
|
|
|
|
schema:
|
|
|
|
|
additionalProperties: true
|
|
|
|
|
type: object
|
|
|
|
|
"500":
|
|
|
|
|
description: Internal Server Error
|
|
|
|
|
schema:
|
|
|
|
|
additionalProperties: true
|
|
|
|
|
type: object
|
|
|
|
|
security:
|
|
|
|
|
- BearerAuth: []
|
|
|
|
|
summary: Delete account
|
|
|
|
|
tags:
|
|
|
|
|
- Users
|
|
|
|
|
/users/me/privacy/opt-out:
|
|
|
|
|
post:
|
|
|
|
|
description: Saves the user's Do Not Sell preference (CCPA compliance)
|
|
|
|
|
responses:
|
|
|
|
|
"200":
|
|
|
|
|
description: OK
|
|
|
|
|
schema:
|
|
|
|
|
additionalProperties: true
|
|
|
|
|
type: object
|
|
|
|
|
"401":
|
|
|
|
|
description: Unauthorized
|
|
|
|
|
schema:
|
|
|
|
|
additionalProperties: true
|
|
|
|
|
type: object
|
|
|
|
|
"500":
|
|
|
|
|
description: Internal Server Error
|
|
|
|
|
schema:
|
|
|
|
|
additionalProperties: true
|
|
|
|
|
type: object
|
|
|
|
|
security:
|
|
|
|
|
- BearerAuth: []
|
|
|
|
|
summary: CCPA Do Not Sell opt-out
|
|
|
|
|
tags:
|
|
|
|
|
- Users
|
|
|
|
|
/validate:
|
|
|
|
|
post:
|
|
|
|
|
consumes:
|
|
|
|
|
- application/json
|
|
|
|
|
description: Validates request data against known DTO types without executing
|
|
|
|
|
the actual operation
|
|
|
|
|
parameters:
|
|
|
|
|
- description: Validation request with type and data
|
|
|
|
|
in: body
|
|
|
|
|
name: request
|
|
|
|
|
required: true
|
|
|
|
|
schema:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.ValidateRequest'
|
|
|
|
|
produces:
|
|
|
|
|
- application/json
|
|
|
|
|
responses:
|
|
|
|
|
"200":
|
|
|
|
|
description: Validation result
|
|
|
|
|
schema:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.ValidateResponse'
|
|
|
|
|
"400":
|
|
|
|
|
description: Invalid request format
|
|
|
|
|
schema:
|
|
|
|
|
$ref: '#/definitions/internal_handlers.APIResponse'
|
|
|
|
|
summary: Validate request body
|
|
|
|
|
tags:
|
|
|
|
|
- Validation
|
2026-01-11 15:29:31 +00:00
|
|
|
/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
|
2026-01-11 15:30:43 +00:00
|
|
|
securityDefinitions:
|
|
|
|
|
BearerAuth:
|
|
|
|
|
in: header
|
|
|
|
|
name: Authorization
|
|
|
|
|
type: apiKey
|
2026-01-11 15:29:31 +00:00
|
|
|
swagger: "2.0"
|