2854 lines
69 KiB
JSON
2854 lines
69 KiB
JSON
{
|
||
"tags": [
|
||
{
|
||
"name": "health",
|
||
"description": "Health operations",
|
||
"endpoints": [
|
||
{
|
||
"operationId": "healthCheck",
|
||
"method": "GET",
|
||
"path": "/healthz",
|
||
"summary": "Health check",
|
||
"description": "Returns server health status",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Healthy",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "HealthStatus"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getVersion",
|
||
"method": "GET",
|
||
"path": "/version",
|
||
"summary": "Build version information",
|
||
"description": "Returns the running build version, commit SHA and build date",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Version information",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "VersionInfo"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "tools",
|
||
"description": "Tool management",
|
||
"endpoints": [
|
||
{
|
||
"operationId": "listTools",
|
||
"method": "GET",
|
||
"path": "/tools",
|
||
"summary": "List all tools",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "category",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "search",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "sort",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"description": "",
|
||
"constraints": "newest, top_rated, most_reviewed, name_asc, name_desc, recently_updated"
|
||
},
|
||
{
|
||
"name": "tags",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"description": "Comma-separated tags; tool must include all of them",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "features",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"description": "Comma-separated features; tool must include all of them",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "minRating",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number"
|
||
},
|
||
"description": "Minimum average combined rating (0-5)",
|
||
"constraints": "0–5"
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "List of tools",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "ToolWithStats"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "createTool",
|
||
"method": "POST",
|
||
"path": "/tools",
|
||
"summary": "Create a new tool",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ToolInput"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "201",
|
||
"description": "Created tool",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "Tool"
|
||
}
|
||
},
|
||
{
|
||
"status": "400",
|
||
"description": "Validation error",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "listCompareTools",
|
||
"method": "GET",
|
||
"path": "/compare",
|
||
"summary": "Compare tools side by side (premium)",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "ids",
|
||
"in": "query",
|
||
"required": true,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"description": "Comma-separated tool ids",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Tools in requested order",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "ToolWithStats"
|
||
}
|
||
},
|
||
{
|
||
"status": "401",
|
||
"description": "Authentication required",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "403",
|
||
"description": "Premium feature required",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getToolRatingHistory",
|
||
"method": "GET",
|
||
"path": "/tools/{id}/rating-history",
|
||
"summary": "Get a tool's rating history over time",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "id",
|
||
"in": "path",
|
||
"required": true,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Rating history",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "RatingHistoryItem"
|
||
}
|
||
},
|
||
{
|
||
"status": "400",
|
||
"description": "Invalid id",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getTool",
|
||
"method": "GET",
|
||
"path": "/tools/{id}",
|
||
"summary": "Get a tool by ID",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "id",
|
||
"in": "path",
|
||
"required": true,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Tool details",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ToolWithStats"
|
||
}
|
||
},
|
||
{
|
||
"status": "404",
|
||
"description": "Not found",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "updateTool",
|
||
"method": "PATCH",
|
||
"path": "/tools/{id}",
|
||
"summary": "Update a tool",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "id",
|
||
"in": "path",
|
||
"required": true,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ToolUpdate"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Updated tool",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "Tool"
|
||
}
|
||
},
|
||
{
|
||
"status": "404",
|
||
"description": "Not found",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "deleteTool",
|
||
"method": "DELETE",
|
||
"path": "/tools/{id}",
|
||
"summary": "Delete a tool",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "id",
|
||
"in": "path",
|
||
"required": true,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "204",
|
||
"description": "Deleted",
|
||
"schema": {
|
||
"kind": "type",
|
||
"value": "any"
|
||
}
|
||
},
|
||
{
|
||
"status": "404",
|
||
"description": "Not found",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "listTrashedTools",
|
||
"method": "GET",
|
||
"path": "/tools/trash",
|
||
"summary": "List trashed (soft-deleted) tools",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "search",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "List of trashed tools",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "Tool"
|
||
}
|
||
},
|
||
{
|
||
"status": "403",
|
||
"description": "Feature \"trash\" requires a higher tier",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "trashTools",
|
||
"method": "POST",
|
||
"path": "/tools/trash",
|
||
"summary": "Move tools to trash (admin)",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "TrashToolsInput"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Tools trashed",
|
||
"schema": {
|
||
"kind": "type",
|
||
"value": "object"
|
||
}
|
||
},
|
||
{
|
||
"status": "403",
|
||
"description": "Admin required",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "deleteTrashedTools",
|
||
"method": "DELETE",
|
||
"path": "/tools/trash",
|
||
"summary": "Permanently delete trashed tools (admin)",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "TrashToolsInput"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "204",
|
||
"description": "Deleted",
|
||
"schema": {
|
||
"kind": "type",
|
||
"value": "any"
|
||
}
|
||
},
|
||
{
|
||
"status": "403",
|
||
"description": "Admin required",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "restoreTools",
|
||
"method": "POST",
|
||
"path": "/tools/trash/restore",
|
||
"summary": "Restore trashed tools",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "TrashToolsInput"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Tools restored",
|
||
"schema": {
|
||
"kind": "type",
|
||
"value": "object"
|
||
}
|
||
},
|
||
{
|
||
"status": "403",
|
||
"description": "Feature \"trash\" requires a higher tier",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "emptyTrash",
|
||
"method": "POST",
|
||
"path": "/tools/trash/empty",
|
||
"summary": "Permanently delete all trashed tools (admin)",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Trash emptied",
|
||
"schema": {
|
||
"kind": "type",
|
||
"value": "object"
|
||
}
|
||
},
|
||
{
|
||
"status": "403",
|
||
"description": "Admin required",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "listCategories",
|
||
"method": "GET",
|
||
"path": "/categories",
|
||
"summary": "List all distinct tool categories",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Categories list",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "listAllFeatures",
|
||
"method": "GET",
|
||
"path": "/features/all",
|
||
"summary": "List all distinct feature strings across all tools",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "All known features",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "listAllTags",
|
||
"method": "GET",
|
||
"path": "/tags/all",
|
||
"summary": "List all distinct tag strings across all tools",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "All known tags",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "ratings",
|
||
"description": "Tool ratings",
|
||
"endpoints": [
|
||
{
|
||
"operationId": "listToolRatings",
|
||
"method": "GET",
|
||
"path": "/tools/{id}/ratings",
|
||
"summary": "List ratings for a tool",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "id",
|
||
"in": "path",
|
||
"required": true,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Ratings list",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "Rating"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "createRating",
|
||
"method": "POST",
|
||
"path": "/tools/{id}/ratings",
|
||
"summary": "Submit a rating for a tool",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "id",
|
||
"in": "path",
|
||
"required": true,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "RatingInput"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "201",
|
||
"description": "Created rating",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "Rating"
|
||
}
|
||
},
|
||
{
|
||
"status": "400",
|
||
"description": "Validation error",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "404",
|
||
"description": "Tool not found",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "analytics",
|
||
"description": "Analytics and aggregated statistics",
|
||
"endpoints": [
|
||
{
|
||
"operationId": "getAnalyticsSummary",
|
||
"method": "GET",
|
||
"path": "/analytics/summary",
|
||
"summary": "Overall platform statistics",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Platform-level summary stats",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "AnalyticsSummary"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getTopTools",
|
||
"method": "GET",
|
||
"path": "/analytics/top-tools",
|
||
"summary": "Top-rated tools",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "limit",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "metric",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"description": "",
|
||
"constraints": "usefulness, usability, combined"
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Top tools list",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "TopToolEntry"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getAnalyticsByCategory",
|
||
"method": "GET",
|
||
"path": "/analytics/by-category",
|
||
"summary": "Rating statistics grouped by category",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Per-category statistics",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "CategoryStats"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getRatingDistribution",
|
||
"method": "GET",
|
||
"path": "/analytics/rating-distribution",
|
||
"summary": "Distribution of rating scores across the platform",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "toolId",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Rating score distribution",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "RatingDistribution"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "auth",
|
||
"description": "Authentication",
|
||
"endpoints": [
|
||
{
|
||
"operationId": "getAuthMode",
|
||
"method": "GET",
|
||
"path": "/auth/mode",
|
||
"summary": "Get authentication mode (oidc or local)",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Auth mode",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "AuthMode"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getCsrfToken",
|
||
"method": "GET",
|
||
"path": "/auth/csrf",
|
||
"summary": "Get a CSRF token for state-changing requests",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "CSRF token",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "CsrfToken"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "localLogin",
|
||
"method": "POST",
|
||
"path": "/auth/login",
|
||
"summary": "Local username/password login",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "LocalLoginInput"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Logged in successfully",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "AuthUser"
|
||
}
|
||
},
|
||
{
|
||
"status": "401",
|
||
"description": "Invalid credentials",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getMe",
|
||
"method": "GET",
|
||
"path": "/auth/me",
|
||
"summary": "Get current authenticated user",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Current user info",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "AuthUser"
|
||
}
|
||
},
|
||
{
|
||
"status": "401",
|
||
"description": "Not authenticated",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "changeMyPassword",
|
||
"method": "POST",
|
||
"path": "/auth/me/password",
|
||
"summary": "Change own password (local users only)",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ChangePasswordInput"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "204",
|
||
"description": "Password changed",
|
||
"schema": {
|
||
"kind": "type",
|
||
"value": "any"
|
||
}
|
||
},
|
||
{
|
||
"status": "400",
|
||
"description": "Invalid input or wrong current password",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "401",
|
||
"description": "Not authenticated",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "422",
|
||
"description": "OIDC user - password is managed by the identity provider",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "429",
|
||
"description": "Too many attempts",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getPasswordRedirect",
|
||
"method": "GET",
|
||
"path": "/auth/password-redirect",
|
||
"summary": "Get redirect URL for managing credentials in the identity provider",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Redirect URL (null in local mode)",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "PasswordRedirect"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getMePreferences",
|
||
"method": "GET",
|
||
"path": "/auth/me/preferences",
|
||
"summary": "Get current user's browse preferences",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "User preferences",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "UserPreferences"
|
||
}
|
||
},
|
||
{
|
||
"status": "401",
|
||
"description": "Not authenticated",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "updateMePreferences",
|
||
"method": "PUT",
|
||
"path": "/auth/me/preferences",
|
||
"summary": "Update current user's browse preferences",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "UserPreferences"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Updated preferences",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "UserPreferences"
|
||
}
|
||
},
|
||
{
|
||
"status": "401",
|
||
"description": "Not authenticated",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "getMeWatchlist",
|
||
"method": "GET",
|
||
"path": "/auth/me/watchlist",
|
||
"summary": "Get current user's watchlist tools (premium)",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Watchlist tools in saved order",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "ToolWithStats"
|
||
}
|
||
},
|
||
{
|
||
"status": "401",
|
||
"description": "Not authenticated",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "403",
|
||
"description": "Premium feature required",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "users",
|
||
"description": "User management (admin only)",
|
||
"endpoints": [
|
||
{
|
||
"operationId": "listUsers",
|
||
"method": "GET",
|
||
"path": "/users",
|
||
"summary": "List all local users (admin only)",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "User list",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "User"
|
||
}
|
||
},
|
||
{
|
||
"status": "401",
|
||
"description": "Not authenticated",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "403",
|
||
"description": "Forbidden",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "createUser",
|
||
"method": "POST",
|
||
"path": "/users",
|
||
"summary": "Create a new local user (admin only)",
|
||
"description": "",
|
||
"parameters": [],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "UserCreateInput"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "201",
|
||
"description": "Created user",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "User"
|
||
}
|
||
},
|
||
{
|
||
"status": "400",
|
||
"description": "Validation error",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "409",
|
||
"description": "Username already exists",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "updateUser",
|
||
"method": "PATCH",
|
||
"path": "/users/{id}",
|
||
"summary": "Update user role (admin only)",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "id",
|
||
"in": "path",
|
||
"required": true,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "UserRoleUpdate"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Updated user",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "User"
|
||
}
|
||
},
|
||
{
|
||
"status": "404",
|
||
"description": "User not found",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "deleteUser",
|
||
"method": "DELETE",
|
||
"path": "/users/{id}",
|
||
"summary": "Delete a user (admin only)",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "id",
|
||
"in": "path",
|
||
"required": true,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "204",
|
||
"description": "Deleted",
|
||
"schema": {
|
||
"kind": "type",
|
||
"value": "any"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"operationId": "setUserPassword",
|
||
"method": "PATCH",
|
||
"path": "/users/{id}/password",
|
||
"summary": "Set/reset a user's password (admin only, local users only)",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "id",
|
||
"in": "path",
|
||
"required": true,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": {
|
||
"required": true,
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "SetPasswordInput"
|
||
}
|
||
},
|
||
"responses": [
|
||
{
|
||
"status": "204",
|
||
"description": "Password updated",
|
||
"schema": {
|
||
"kind": "type",
|
||
"value": "any"
|
||
}
|
||
},
|
||
{
|
||
"status": "400",
|
||
"description": "Validation error",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "404",
|
||
"description": "User not found",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "422",
|
||
"description": "OIDC user - password is managed by the identity provider",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
},
|
||
{
|
||
"status": "429",
|
||
"description": "Too many attempts",
|
||
"schema": {
|
||
"kind": "ref",
|
||
"value": "ErrorResponse"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "audit",
|
||
"description": "Audit log",
|
||
"endpoints": [
|
||
{
|
||
"operationId": "listAuditLogs",
|
||
"method": "GET",
|
||
"path": "/audit-logs",
|
||
"summary": "List audit log entries (admin only)",
|
||
"description": "",
|
||
"parameters": [
|
||
{
|
||
"name": "entityType",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "entityId",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "limit",
|
||
"in": "query",
|
||
"required": false,
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
],
|
||
"requestBody": null,
|
||
"responses": [
|
||
{
|
||
"status": "200",
|
||
"description": "Audit log entries",
|
||
"schema": {
|
||
"kind": "array",
|
||
"value": "AuditLog"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"schemas": [
|
||
{
|
||
"name": "HealthStatus",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "status",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "VersionInfo",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "version",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "commitSha",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "buildDate",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "trashRetentionDays",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "AuthMode",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "mode",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "oidc, local"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "CsrfToken",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "token",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "LocalLoginInput",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "username",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "password",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "User",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "id",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "username",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "email",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "role",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "admin, user"
|
||
},
|
||
{
|
||
"name": "tier",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "free, premium, enterprise"
|
||
},
|
||
{
|
||
"name": "authProvider",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "local, oidc"
|
||
},
|
||
{
|
||
"name": "createdAt",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "date-time"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "UserCreateInput",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "username",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "min 2 chars"
|
||
},
|
||
{
|
||
"name": "password",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "min 6 chars"
|
||
},
|
||
{
|
||
"name": "email",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "role",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "admin, user"
|
||
},
|
||
{
|
||
"name": "tier",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "free, premium, enterprise"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "UserRoleUpdate",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "role",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "admin, user"
|
||
},
|
||
{
|
||
"name": "tier",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "free, premium, enterprise"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "ChangePasswordInput",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "currentPassword",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "min 1 chars"
|
||
},
|
||
{
|
||
"name": "newPassword",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "min 6 chars"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "SetPasswordInput",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "password",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "min 6 chars"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "PasswordRedirect",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "url",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "AuditLog",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "id",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "entityType",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "entityId",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "action",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "userId",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "username",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "changes",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "createdAt",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "date-time"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "Tool",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "id",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "name",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "description",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "category",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "websiteUrl",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "iconUrl",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "createdBy",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "features",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "tags",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "createdAt",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "date-time"
|
||
},
|
||
{
|
||
"name": "updatedAt",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "date-time"
|
||
},
|
||
{
|
||
"name": "deletedAt",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "date-time"
|
||
},
|
||
{
|
||
"name": "deletedBy",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "RatingHistoryItem",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "date",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "date-time"
|
||
},
|
||
{
|
||
"name": "usefulness",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "usability",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "combined",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "ToolWithStats",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "id",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "name",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "description",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "category",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "websiteUrl",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "iconUrl",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "createdBy",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "features",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "tags",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "createdAt",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "date-time"
|
||
},
|
||
{
|
||
"name": "updatedAt",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "date-time"
|
||
},
|
||
{
|
||
"name": "ratingCount",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "avgUsefulness",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number | null"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "avgUsability",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number | null"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "avgCombined",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number | null"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "ToolInput",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "name",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "min 1 chars"
|
||
},
|
||
{
|
||
"name": "description",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "min 1 chars"
|
||
},
|
||
{
|
||
"name": "category",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "min 1 chars"
|
||
},
|
||
{
|
||
"name": "websiteUrl",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "iconUrl",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "features",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "tags",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "ToolImportBody",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "format",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "auto, csv, json, yaml"
|
||
},
|
||
{
|
||
"name": "delimiter",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "auto, comma, semicolon, tab"
|
||
},
|
||
{
|
||
"name": "data",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "ToolImportResponse",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "imported",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "total",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "errors",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "object"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "ToolUpdate",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "name",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "min 1 chars"
|
||
},
|
||
{
|
||
"name": "description",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "category",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "websiteUrl",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "iconUrl",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "features",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "tags",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "TrashToolsInput",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "ids",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "min 1 items, max 500 items"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "Rating",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "id",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "toolId",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "usefulness",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "1–5"
|
||
},
|
||
{
|
||
"name": "usability",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "1–5"
|
||
},
|
||
{
|
||
"name": "comment",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "reviewerName",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "createdAt",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "date-time"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "RatingInput",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "usefulness",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "1–5"
|
||
},
|
||
{
|
||
"name": "usability",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": "1–5"
|
||
},
|
||
{
|
||
"name": "comment",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "reviewerName",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "AnalyticsSummary",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "totalTools",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "totalRatings",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "avgUsefulness",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number | null"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "avgUsability",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number | null"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "avgCombined",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number | null"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "categoriesCount",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "mostRatedTool",
|
||
"type": {
|
||
"kind": "ref",
|
||
"value": "ToolWithStats"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "TopToolEntry",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "tool",
|
||
"type": {
|
||
"kind": "ref",
|
||
"value": "ToolWithStats"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "score",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "ratingCount",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "CategoryStats",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "category",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "toolCount",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "totalRatings",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "avgUsefulness",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number | null"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "avgUsability",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "number | null"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "RatingDistribution",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "usefulness",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "ScoreBucket"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "usability",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "ScoreBucket"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "ScoreBucket",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "score",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "count",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "integer"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "AuthUser",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "sub",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "email",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "name",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "preferredUsername",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string | null"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "role",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "admin, user"
|
||
},
|
||
{
|
||
"name": "tier",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "free, premium, enterprise"
|
||
},
|
||
{
|
||
"name": "entitlements",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
},
|
||
{
|
||
"name": "isLocal",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "boolean"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "UserPreferences",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "view",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "grid, table, rows"
|
||
},
|
||
{
|
||
"name": "density",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": "cozy, compact"
|
||
},
|
||
{
|
||
"name": "watchlist",
|
||
"type": {
|
||
"kind": "array",
|
||
"value": "integer"
|
||
},
|
||
"required": false,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"name": "ErrorResponse",
|
||
"description": "",
|
||
"fields": [
|
||
{
|
||
"name": "error",
|
||
"type": {
|
||
"kind": "type",
|
||
"value": "string"
|
||
},
|
||
"required": true,
|
||
"description": "",
|
||
"constraints": ""
|
||
}
|
||
]
|
||
}
|
||
]
|
||
} |