1414 lines
49 KiB
JSON
1414 lines
49 KiB
JSON
|
|
{
|
|
"openapi": "3.0.3",
|
|
"info": {
|
|
"title": "HotTRDeals API",
|
|
"version": "1.0.0",
|
|
"description": "Backend endpoints documented from current Express routes. Each operation includes auth/api-key requirements and data sources (db/redis)."
|
|
},
|
|
"servers": [
|
|
{ "url": "http://localhost:3000" }
|
|
],
|
|
"components": {
|
|
"securitySchemes": {
|
|
"bearerAuth": { "type": "http", "scheme": "bearer", "bearerFormat": "JWT" },
|
|
"cookieAuth": { "type": "apiKey", "in": "cookie", "name": "at" },
|
|
"apiKeyAuth": { "type": "apiKey", "in": "header", "name": "x-api-key" }
|
|
},
|
|
"schemas": {
|
|
"ErrorResponse": {
|
|
"type": "object",
|
|
"properties": {
|
|
"error": { "type": "string" },
|
|
"message": { "type": "string" }
|
|
}
|
|
},
|
|
"UserPublic": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": { "type": "integer" },
|
|
"username": { "type": "string" },
|
|
"avatarUrl": { "type": "string", "nullable": true }
|
|
}
|
|
},
|
|
"AuthUser": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": { "type": "integer" },
|
|
"username": { "type": "string" },
|
|
"email": { "type": "string" },
|
|
"role": { "type": "string" },
|
|
"avatarUrl": { "type": "string", "nullable": true }
|
|
}
|
|
},
|
|
"AuthResponse": {
|
|
"type": "object",
|
|
"properties": {
|
|
"user": { "$ref": "#/components/schemas/AuthUser" }
|
|
}
|
|
},
|
|
"DealCard": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": { "type": "integer" },
|
|
"title": { "type": "string" },
|
|
"description": { "type": "string", "nullable": true },
|
|
"price": { "type": "number", "nullable": true },
|
|
"originalPrice": { "type": "number", "nullable": true },
|
|
"shippingPrice": { "type": "number", "nullable": true },
|
|
"couponCode": { "type": "string", "nullable": true },
|
|
"location": { "type": "string", "nullable": true },
|
|
"discountType": { "type": "string", "nullable": true },
|
|
"discountValue": { "type": "number", "nullable": true },
|
|
"score": { "type": "integer" },
|
|
"commentsCount": { "type": "integer" },
|
|
"status": { "type": "string" },
|
|
"saleType": { "type": "string" },
|
|
"affiliateType": { "type": "string" },
|
|
"myVote": { "type": "integer" },
|
|
"isSaved": { "type": "boolean" },
|
|
"createdAt": { "type": "string" },
|
|
"updatedAt": { "type": "string" },
|
|
"user": { "$ref": "#/components/schemas/UserPublic" },
|
|
"seller": { "type": "object", "nullable": true }
|
|
}
|
|
},
|
|
"DealDetail": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": { "type": "integer" },
|
|
"title": { "type": "string" },
|
|
"description": { "type": "string", "nullable": true },
|
|
"url": { "type": "string", "nullable": true },
|
|
"price": { "type": "number", "nullable": true },
|
|
"originalPrice": { "type": "number", "nullable": true },
|
|
"shippingPrice": { "type": "number", "nullable": true },
|
|
"couponCode": { "type": "string", "nullable": true },
|
|
"location": { "type": "string", "nullable": true },
|
|
"discountType": { "type": "string", "nullable": true },
|
|
"discountValue": { "type": "number", "nullable": true },
|
|
"score": { "type": "integer" },
|
|
"commentsCount": { "type": "integer" },
|
|
"status": { "type": "string" },
|
|
"saleType": { "type": "string" },
|
|
"affiliateType": { "type": "string" },
|
|
"createdAt": { "type": "string" },
|
|
"updatedAt": { "type": "string" },
|
|
"user": { "$ref": "#/components/schemas/UserPublic" },
|
|
"seller": { "type": "object", "nullable": true },
|
|
"images": { "type": "array", "items": { "type": "object" } },
|
|
"comments": { "type": "array", "items": { "type": "object" } }
|
|
}
|
|
},
|
|
"PaginatedDeals": {
|
|
"type": "object",
|
|
"properties": {
|
|
"page": { "type": "integer" },
|
|
"total": { "type": "integer" },
|
|
"totalPages": { "type": "integer" },
|
|
"results": { "type": "array", "items": { "$ref": "#/components/schemas/DealCard" } }
|
|
}
|
|
},
|
|
"Notification": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": { "type": "integer" },
|
|
"message": { "type": "string" },
|
|
"type": { "type": "string" },
|
|
"createdAt": { "type": "string" },
|
|
"readAt": { "type": "string", "nullable": true },
|
|
"unread": { "type": "boolean" }
|
|
}
|
|
},
|
|
"Badge": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": { "type": "integer" },
|
|
"name": { "type": "string" },
|
|
"iconUrl": { "type": "string", "nullable": true },
|
|
"description": { "type": "string", "nullable": true }
|
|
}
|
|
},
|
|
"UserBadge": {
|
|
"type": "object",
|
|
"properties": {
|
|
"badge": { "$ref": "#/components/schemas/Badge" },
|
|
"earnedAt": { "type": "string" }
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"paths": {
|
|
"/api/auth/register": {
|
|
"post": {
|
|
"tags": ["Auth"],
|
|
"summary": "Register",
|
|
"description": "Creates user; sets access/refresh cookies.",
|
|
"x-auth": "none",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"username": { "type": "string", "minLength": 5, "maxLength": 18 },
|
|
"email": { "type": "string" },
|
|
"password": { "type": "string", "minLength": 8 }
|
|
},
|
|
"required": ["username", "email", "password"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Auth response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthResponse" } } } },
|
|
"400": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/auth/login": {
|
|
"post": {
|
|
"tags": ["Auth"],
|
|
"summary": "Login",
|
|
"description": "Login with email/password; sets access/refresh cookies.",
|
|
"x-auth": "none",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"email": { "type": "string" },
|
|
"password": { "type": "string" }
|
|
},
|
|
"required": ["email", "password"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Auth response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthResponse" } } } },
|
|
"401": { "description": "Invalid credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/auth/refresh": {
|
|
"post": {
|
|
"tags": ["Auth"],
|
|
"summary": "Refresh tokens",
|
|
"description": "Rotates refresh token from cookie `rt`.",
|
|
"x-auth": "cookie-only",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"responses": {
|
|
"200": { "description": "Auth response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthResponse" } } } },
|
|
"401": { "description": "Invalid/expired refresh", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/auth/logout": {
|
|
"post": {
|
|
"tags": ["Auth"],
|
|
"summary": "Logout",
|
|
"description": "Revokes refresh token if present; clears cookies.",
|
|
"x-auth": "cookie-only",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"responses": {
|
|
"204": { "description": "No content" },
|
|
"500": { "description": "Server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/auth/me": {
|
|
"get": {
|
|
"tags": ["Auth"],
|
|
"summary": "Get current user",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Auth user", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuthUser" } } } },
|
|
"401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
|
|
}
|
|
}
|
|
},
|
|
|
|
"/api/account/avatar": {
|
|
"post": {
|
|
"tags": ["Account"],
|
|
"summary": "Update avatar",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"file": { "type": "string", "format": "binary" }
|
|
},
|
|
"required": ["file"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Avatar updated", "content": { "application/json": { "schema": { "type": "object", "properties": { "message": { "type": "string" }, "user": { "$ref": "#/components/schemas/UserPublic" } } } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/account/me": {
|
|
"get": {
|
|
"tags": ["Account"],
|
|
"summary": "Account profile",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "User + recent notifications",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": { "type": "integer" },
|
|
"username": { "type": "string" },
|
|
"avatarUrl": { "type": "string", "nullable": true },
|
|
"createdAt": { "type": "string" },
|
|
"notifications": { "type": "array", "items": { "$ref": "#/components/schemas/Notification" } },
|
|
"badges": { "type": "array", "items": { "$ref": "#/components/schemas/UserBadge" } }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/account/notifications/read": {
|
|
"get": {
|
|
"tags": ["Account"],
|
|
"summary": "Mark all notifications read",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": false, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "OK" }
|
|
}
|
|
}
|
|
},
|
|
"/api/account/notifications": {
|
|
"get": {
|
|
"tags": ["Account"],
|
|
"summary": "Notifications list",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Paginated notifications",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"page": { "type": "integer" },
|
|
"total": { "type": "integer" },
|
|
"totalPages": { "type": "integer" },
|
|
"results": { "type": "array", "items": { "$ref": "#/components/schemas/Notification" } }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/account/password": {
|
|
"post": {
|
|
"tags": ["Account"],
|
|
"summary": "Change password",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"currentPassword": { "type": "string" },
|
|
"newPassword": { "type": "string", "minLength": 8 }
|
|
},
|
|
"required": ["currentPassword", "newPassword"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Password changed", "content": { "application/json": { "schema": { "type": "object", "properties": { "message": { "type": "string" } } } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/badges": {
|
|
"get": {
|
|
"tags": ["Badges"],
|
|
"summary": "List badges",
|
|
"x-auth": "none",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"responses": {
|
|
"200": {
|
|
"description": "Badges",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": { "type": "array", "items": { "$ref": "#/components/schemas/Badge" } }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"/api/deals/users/{userName}/deals": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "User deals (public or my)",
|
|
"x-auth": "optional",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{},
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "userName", "in": "path", "required": true, "schema": { "type": "string" } },
|
|
{ "name": "q", "in": "query", "schema": { "type": "string" } },
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 10 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated deals", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedDeals" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/me/deals": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "My deals",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 10 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated deals", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedDeals" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/new": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "New deals",
|
|
"x-auth": "optional",
|
|
"x-api-key": "required",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "apiKeyAuth": [], "bearerAuth": [] },
|
|
{ "apiKeyAuth": [], "cookieAuth": [] },
|
|
{ "apiKeyAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 10 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated deals", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedDeals" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/hot": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "Hot deals",
|
|
"x-auth": "optional",
|
|
"x-api-key": "required",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "apiKeyAuth": [], "bearerAuth": [] },
|
|
{ "apiKeyAuth": [], "cookieAuth": [] },
|
|
{ "apiKeyAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 10 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated deals", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedDeals" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/trending": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "Trending deals",
|
|
"x-auth": "optional",
|
|
"x-api-key": "required",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "apiKeyAuth": [], "bearerAuth": [] },
|
|
{ "apiKeyAuth": [], "cookieAuth": [] },
|
|
{ "apiKeyAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 10 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated deals", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedDeals" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals": {
|
|
"post": {
|
|
"tags": ["Deals"],
|
|
"summary": "Create deal",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": { "type": "string" },
|
|
"description": { "type": "string" },
|
|
"url": { "type": "string" },
|
|
"price": { "type": "number" },
|
|
"originalPrice": { "type": "number" },
|
|
"shippingPrice": { "type": "number" },
|
|
"couponCode": { "type": "string" },
|
|
"location": { "type": "string" },
|
|
"discountType": { "type": "string" },
|
|
"discountValue": { "type": "number" },
|
|
"sellerName": { "type": "string" },
|
|
"customSeller": { "type": "string" },
|
|
"images": { "type": "array", "items": { "type": "string", "format": "binary" } }
|
|
},
|
|
"required": ["title"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Deal detail", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DealDetail" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/search/suggest": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "Deal search suggestions",
|
|
"x-auth": "optional",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": false, "redis": true },
|
|
"security": [
|
|
{},
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "q", "in": "query", "schema": { "type": "string" } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 8 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "DealCard[]", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/DealCard" } } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/url": {
|
|
"post": {
|
|
"tags": ["Deals"],
|
|
"summary": "Resolve deal URL",
|
|
"x-auth": "optional",
|
|
"x-api-key": "required",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "apiKeyAuth": [], "bearerAuth": [] },
|
|
{ "apiKeyAuth": [], "cookieAuth": [] },
|
|
{ "apiKeyAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": { "dealId": { "type": "integer" } },
|
|
"required": ["dealId"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "URL", "content": { "application/json": { "schema": { "type": "object", "properties": { "url": { "type": "string", "nullable": true } } } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/{id}/report": {
|
|
"post": {
|
|
"tags": ["Deals"],
|
|
"summary": "Report deal",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": { "type": "object", "properties": { "reason": { "type": "string" }, "note": { "type": "string" } } }
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Report created", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/{id}/save": {
|
|
"post": {
|
|
"tags": ["Deals"],
|
|
"summary": "Save deal",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Saved", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": ["Deals"],
|
|
"summary": "Unsave deal",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "OK" }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/saved": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "Saved deals",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated deals", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedDeals" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/widgets/best": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "Best deals widget",
|
|
"x-auth": "optional",
|
|
"x-api-key": "required",
|
|
"x-deps": { "db": false, "redis": true },
|
|
"security": [
|
|
{ "apiKeyAuth": [], "bearerAuth": [] },
|
|
{ "apiKeyAuth": [], "cookieAuth": [] },
|
|
{ "apiKeyAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 5 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Widget data", "content": { "application/json": { "schema": { "type": "object", "properties": { "hotDay": { "type": "array", "items": { "$ref": "#/components/schemas/DealCard" } }, "hotWeek": { "type": "array", "items": { "$ref": "#/components/schemas/DealCard" } }, "hotMonth": { "type": "array", "items": { "$ref": "#/components/schemas/DealCard" } } } } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/search": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "Search deals",
|
|
"x-auth": "optional",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{},
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "q", "in": "query", "schema": { "type": "string" } },
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 10 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated deals", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedDeals" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/top": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "Top deals by range",
|
|
"x-auth": "optional",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{},
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "range", "in": "query", "schema": { "type": "string", "enum": ["day", "week", "month"], "default": "day" } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 6 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "DealCard[]", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/DealCard" } } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/engagement": {
|
|
"post": {
|
|
"tags": ["Deals"],
|
|
"summary": "Engagement (my votes)",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": { "type": "object", "properties": { "ids": { "type": "array", "items": { "type": "integer" } } }, "required": ["ids"] }
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Engagement list", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "integer" }, "myVote": { "type": "integer" } } } } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/deals/{id}": {
|
|
"get": {
|
|
"tags": ["Deals"],
|
|
"summary": "Deal detail",
|
|
"x-auth": "optional",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{},
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Deal detail", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DealDetail" } } } },
|
|
"404": { "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
|
|
}
|
|
}
|
|
},
|
|
|
|
"/api/comments/{dealId}": {
|
|
"get": {
|
|
"tags": ["Comments"],
|
|
"summary": "List comments",
|
|
"x-auth": "optional",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{},
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "dealId", "in": "path", "required": true, "schema": { "type": "integer" } },
|
|
{ "name": "parentId", "in": "query", "schema": { "type": "integer", "nullable": true } },
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 10 } },
|
|
{ "name": "sort", "in": "query", "schema": { "type": "string", "enum": ["NEW", "TOP"], "default": "NEW" } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated comments", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/comments": {
|
|
"post": {
|
|
"tags": ["Comments"],
|
|
"summary": "Create comment",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": { "type": "object", "properties": { "dealId": { "type": "integer" }, "text": { "type": "string" }, "parentId": { "type": "integer", "nullable": true } }, "required": ["dealId", "text"] }
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Comment", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/comments/{id}": {
|
|
"delete": {
|
|
"tags": ["Comments"],
|
|
"summary": "Delete comment",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Deleted" },
|
|
"403": { "description": "Forbidden" },
|
|
"404": { "description": "Not found" }
|
|
}
|
|
}
|
|
},
|
|
|
|
"/api/comment-likes": {
|
|
"post": {
|
|
"tags": ["Comments"],
|
|
"summary": "Like/unlike comment",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": { "type": "object", "properties": { "commentId": { "type": "integer" }, "like": { "type": "boolean" } }, "required": ["commentId", "like"] }
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Like result", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
|
|
"/api/vote": {
|
|
"post": {
|
|
"tags": ["Votes"],
|
|
"summary": "Vote deal",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": { "type": "object", "properties": { "dealId": { "type": "integer" }, "voteType": { "type": "integer" }, "dealVote": { "type": "integer" } }, "required": ["dealId", "voteType"] }
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Vote result", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/vote/{dealId}": {
|
|
"get": {
|
|
"tags": ["Votes"],
|
|
"summary": "List votes for deal",
|
|
"x-auth": "none",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"parameters": [
|
|
{ "name": "dealId", "in": "path", "required": true, "schema": { "type": "integer" } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Votes", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
|
|
"/api/deal-votes": {
|
|
"post": { "$ref": "#/paths/~1api~1vote/post" }
|
|
},
|
|
"/api/deal-votes/{dealId}": {
|
|
"get": { "$ref": "#/paths/~1api~1vote~1{dealId}/get" }
|
|
},
|
|
|
|
"/api/users/{userName}": {
|
|
"get": {
|
|
"tags": ["Users"],
|
|
"summary": "User profile",
|
|
"x-auth": "none",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"parameters": [
|
|
{ "name": "userName", "in": "path", "required": true, "schema": { "type": "string" } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Profile", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/users/{userName}/comments": {
|
|
"get": {
|
|
"tags": ["Users"],
|
|
"summary": "User comments",
|
|
"x-auth": "none",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"parameters": [
|
|
{ "name": "userName", "in": "path", "required": true, "schema": { "type": "string" } },
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated comments", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/users/{userName}/deals": {
|
|
"get": {
|
|
"tags": ["Users"],
|
|
"summary": "User deals",
|
|
"x-auth": "optional",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{},
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "userName", "in": "path", "required": true, "schema": { "type": "string" } },
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated deals", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedDeals" } } } }
|
|
}
|
|
}
|
|
},
|
|
|
|
"/api/user/{userName}": { "get": { "$ref": "#/paths/~1api~1users~1{userName}/get" } },
|
|
"/api/user/{userName}/comments": { "get": { "$ref": "#/paths/~1api~1users~1{userName}~1comments/get" } },
|
|
"/api/user/{userName}/deals": { "get": { "$ref": "#/paths/~1api~1users~1{userName}~1deals/get" } },
|
|
|
|
"/api/seller/from-link": {
|
|
"post": {
|
|
"tags": ["Seller"],
|
|
"summary": "Resolve seller from URL",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": { "schema": { "type": "object", "properties": { "url": { "type": "string" } }, "required": ["url"] } }
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Seller lookup", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/seller": {
|
|
"get": {
|
|
"tags": ["Seller"],
|
|
"summary": "Active sellers",
|
|
"x-auth": "none",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"responses": {
|
|
"200": { "description": "Seller list", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object" } } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/seller/{sellerName}": {
|
|
"get": {
|
|
"tags": ["Seller"],
|
|
"summary": "Seller detail",
|
|
"x-auth": "none",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"parameters": [
|
|
{ "name": "sellerName", "in": "path", "required": true, "schema": { "type": "string" } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Seller detail", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/seller/{sellerName}/deals": {
|
|
"get": {
|
|
"tags": ["Seller"],
|
|
"summary": "Seller deals",
|
|
"x-auth": "optional",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{},
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "sellerName", "in": "path", "required": true, "schema": { "type": "string" } },
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 10 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated deals", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedDeals" } } } }
|
|
}
|
|
}
|
|
},
|
|
|
|
"/api/category/{slug}": {
|
|
"get": {
|
|
"tags": ["Category"],
|
|
"summary": "Category detail",
|
|
"x-auth": "none",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"parameters": [
|
|
{ "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Category detail", "content": { "application/json": { "schema": { "type": "object" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/category/{slug}/deals": {
|
|
"get": {
|
|
"tags": ["Category"],
|
|
"summary": "Category deals",
|
|
"x-auth": "optional",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{},
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } },
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 10 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "Paginated deals", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedDeals" } } } }
|
|
}
|
|
}
|
|
},
|
|
|
|
"/api/mod/deals/pending": {
|
|
"get": {
|
|
"tags": ["Mod"],
|
|
"summary": "Pending deals",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "q", "in": "query", "schema": { "type": "string" } },
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "limit", "in": "query", "schema": { "type": "integer", "default": 10 } }
|
|
],
|
|
"responses": {
|
|
"200": { "description": "DealCard[]", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/DealCard" } } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/mod/deals/{id}/approve": {
|
|
"post": {
|
|
"tags": ["Mod"],
|
|
"summary": "Approve deal",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }
|
|
],
|
|
"responses": { "200": { "description": "Status updated" } }
|
|
}
|
|
},
|
|
"/api/mod/deals/{id}/reject": { "post": { "$ref": "#/paths/~1api~1mod~1deals~1{id}~1approve/post" } },
|
|
"/api/mod/deals/{id}/expire": { "post": { "$ref": "#/paths/~1api~1mod~1deals~1{id}~1approve/post" } },
|
|
"/api/mod/deals/{id}/unexpire": { "post": { "$ref": "#/paths/~1api~1mod~1deals~1{id}~1approve/post" } },
|
|
"/api/mod/deals/{id}/detail": {
|
|
"get": {
|
|
"tags": ["Mod"],
|
|
"summary": "Deal detail for mod",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }
|
|
],
|
|
"responses": { "200": { "description": "Deal detail + aiReview", "content": { "application/json": { "schema": { "type": "object" } } } } }
|
|
}
|
|
},
|
|
"/api/mod/deals/{id}": {
|
|
"patch": {
|
|
"tags": ["Mod"],
|
|
"summary": "Update deal (mod)",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": true },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }
|
|
],
|
|
"requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object" } } } },
|
|
"responses": { "200": { "description": "Updated deal", "content": { "application/json": { "schema": { "type": "object" } } } } }
|
|
}
|
|
},
|
|
"/api/mod/sellers": {
|
|
"get": {
|
|
"tags": ["Mod"],
|
|
"summary": "List sellers",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"responses": { "200": { "description": "Seller list", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object" } } } } } }
|
|
}
|
|
},
|
|
"/api/mod/categories": {
|
|
"get": {
|
|
"tags": ["Mod"],
|
|
"summary": "List categories",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"responses": { "200": { "description": "Category list", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object" } } } } } }
|
|
}
|
|
},
|
|
"/api/mod/badges": {
|
|
"post": {
|
|
"tags": ["Mod"],
|
|
"summary": "Create badge",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": { "type": "string" },
|
|
"iconUrl": { "type": "string", "nullable": true },
|
|
"description": { "type": "string", "nullable": true }
|
|
},
|
|
"required": ["name"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Badge", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Badge" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/mod/badges/{id}": {
|
|
"patch": {
|
|
"tags": ["Mod"],
|
|
"summary": "Update badge",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": { "type": "string" },
|
|
"iconUrl": { "type": "string", "nullable": true },
|
|
"description": { "type": "string", "nullable": true }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Badge", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Badge" } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/mod/badges/assign": {
|
|
"post": {
|
|
"tags": ["Mod"],
|
|
"summary": "Assign badge to user",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"userId": { "type": "integer" },
|
|
"badgeId": { "type": "integer" },
|
|
"earnedAt": { "type": "string" }
|
|
},
|
|
"required": ["userId", "badgeId"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Assignment",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"userId": { "type": "integer" },
|
|
"badgeId": { "type": "integer" },
|
|
"earnedAt": { "type": "string" }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": ["Mod"],
|
|
"summary": "Remove badge from user",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"userId": { "type": "integer" },
|
|
"badgeId": { "type": "integer" }
|
|
},
|
|
"required": ["userId", "badgeId"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": { "description": "Removed", "content": { "application/json": { "schema": { "type": "object", "properties": { "removed": { "type": "boolean" } } } } } }
|
|
}
|
|
}
|
|
},
|
|
"/api/mod/deals/reports": {
|
|
"get": {
|
|
"tags": ["Mod"],
|
|
"summary": "Deal reports",
|
|
"description": "Requires MOD role.",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": true, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"parameters": [
|
|
{ "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
|
|
{ "name": "status", "in": "query", "schema": { "type": "string" } },
|
|
{ "name": "dealId", "in": "query", "schema": { "type": "integer" } },
|
|
{ "name": "userId", "in": "query", "schema": { "type": "integer" } }
|
|
],
|
|
"responses": { "200": { "description": "Reports", "content": { "application/json": { "schema": { "type": "object" } } } } }
|
|
}
|
|
},
|
|
|
|
"/api/uploads/image": {
|
|
"post": {
|
|
"tags": ["Uploads"],
|
|
"summary": "Upload image",
|
|
"x-auth": "required",
|
|
"x-api-key": "none",
|
|
"x-deps": { "db": false, "redis": false },
|
|
"security": [
|
|
{ "bearerAuth": [] },
|
|
{ "cookieAuth": [] }
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": { "file": { "type": "string", "format": "binary" } },
|
|
"required": ["file"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": { "200": { "description": "URL", "content": { "application/json": { "schema": { "type": "object", "properties": { "url": { "type": "string" } } } } } } }
|
|
}
|
|
}
|
|
}
|
|
}
|