veza/veza-backend-api/docs/docs.go

5742 lines
209 KiB
Go
Raw Normal View History

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