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