The OpenAPI spec only listed `limit` for GET /monitors/team/with-checks, but the route's Zod schema (getMonitorsWithChecksQueryValidation) also accepts page, rowsPerPage, filter, field, order, type, and explain. Users hitting the endpoint via Swagger UI would either get rejected with "page is not allowed" (when guessing param names) or miss pagination entirely. Adds the missing parameters with constraints mirrored from the validation schema. Also bumps `limit` max from 50 to 100 to match the schema (was 100 in code, 50 in spec). Closes #3354
4715 lines
98 KiB
JSON
4715 lines
98 KiB
JSON
{
|
|
"openapi": "3.1.0",
|
|
"info": {
|
|
"title": "Checkmate API",
|
|
"summary": "Checkmate OpenAPI Specifications",
|
|
"description": "Checkmate is an open source monitoring tool used to track the operational status and performance of servers and websites. It regularly checks whether a server/website is accessible and performs optimally, providing real-time alerts and reports on the monitored services' availability, downtime, and response time.",
|
|
"contact": {
|
|
"name": "API Support",
|
|
"url": "mailto:support@bluewavelabs.ca",
|
|
"email": "support@bluewavelabs.ca"
|
|
},
|
|
"license": {
|
|
"name": "AGPLv3",
|
|
"url": "https://github.com/bluewave-labs/checkmate/tree/HEAD/LICENSE"
|
|
},
|
|
"version": "2.3"
|
|
},
|
|
"servers": [
|
|
{
|
|
"url": "http://localhost:{PORT}/{API_PATH}",
|
|
"description": "Local Development Server",
|
|
"variables": {
|
|
"PORT": {
|
|
"default": "52345"
|
|
},
|
|
"API_PATH": {
|
|
"default": "api/v1"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"url": "https://checkmate-demo.bluewavelabs.ca/{API_PATH}",
|
|
"description": "Checkmate Demo Server",
|
|
"variables": {
|
|
"API_PATH": {
|
|
"default": "api/v1"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"tags": [
|
|
{
|
|
"name": "auth",
|
|
"description": "Authentication and user management"
|
|
},
|
|
{
|
|
"name": "invite",
|
|
"description": "Team invitation management"
|
|
},
|
|
{
|
|
"name": "monitors",
|
|
"description": "Monitor management (uptime, page speed, hardware)"
|
|
},
|
|
{
|
|
"name": "checks",
|
|
"description": "Monitor check results and history"
|
|
},
|
|
{
|
|
"name": "maintenance-window",
|
|
"description": "Scheduled maintenance windows"
|
|
},
|
|
{
|
|
"name": "queue",
|
|
"description": "Job queue management"
|
|
},
|
|
{
|
|
"name": "status-page",
|
|
"description": "Public status page management"
|
|
},
|
|
{
|
|
"name": "settings",
|
|
"description": "Application configuration settings"
|
|
},
|
|
{
|
|
"name": "logs",
|
|
"description": "Application logs and diagnostics"
|
|
},
|
|
{
|
|
"name": "notifications",
|
|
"description": "Notification integrations (email, slack, discord, etc.)"
|
|
},
|
|
{
|
|
"name": "diagnostic",
|
|
"description": "System health and performance diagnostics"
|
|
},
|
|
{
|
|
"name": "incidents",
|
|
"description": "Incident management and resolution"
|
|
}
|
|
],
|
|
"paths": {
|
|
"/auth/register": {
|
|
"post": {
|
|
"tags": ["auth"],
|
|
"summary": "Register new user",
|
|
"description": "Register a new user account with profile information",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RegisterRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "User registered successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AuthResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/auth/login": {
|
|
"post": {
|
|
"tags": ["auth"],
|
|
"summary": "User login",
|
|
"description": "Authenticate user with email and password",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/LoginRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Login successful",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AuthResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/auth/user/{userId}": {
|
|
"put": {
|
|
"tags": ["auth"],
|
|
"summary": "Update user profile",
|
|
"description": "Update user information including profile image",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserUpdateRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"tags": ["auth"],
|
|
"summary": "Delete user account",
|
|
"description": "Permanently delete user account and associated data",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/auth/users": {
|
|
"get": {
|
|
"tags": ["auth"],
|
|
"summary": "Get all users",
|
|
"description": "Retrieve all users (admin/superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Users retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/User"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/auth/users/superadmin": {
|
|
"get": {
|
|
"tags": ["auth"],
|
|
"summary": "Check superadmin exists",
|
|
"description": "Check if a superadmin account exists in the system",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Check completed",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"type": "object",
|
|
"properties": {
|
|
"exists": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/auth/recovery/request": {
|
|
"post": {
|
|
"tags": ["auth"],
|
|
"summary": "Request password reset",
|
|
"description": "Send password reset email to user",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["email"],
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email",
|
|
"description": "User email address"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"description": "User not found"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/auth/recovery/validate": {
|
|
"post": {
|
|
"tags": ["auth"],
|
|
"summary": "Validate recovery token",
|
|
"description": "Validate password reset token",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["recoveryToken"],
|
|
"properties": {
|
|
"recoveryToken": {
|
|
"type": "string",
|
|
"description": "Password reset token"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"400": {
|
|
"description": "Invalid or expired token"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/auth/recovery/reset": {
|
|
"post": {
|
|
"tags": ["auth"],
|
|
"summary": "Reset password",
|
|
"description": "Reset user password with recovery token",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["recoveryToken", "password"],
|
|
"properties": {
|
|
"recoveryToken": {
|
|
"type": "string",
|
|
"description": "Password reset token"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"format": "password",
|
|
"description": "New password"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"400": {
|
|
"description": "Invalid token or password requirements not met"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/monitors": {
|
|
"post": {
|
|
"tags": ["monitors"],
|
|
"summary": "Create monitor",
|
|
"description": "Create a new monitoring endpoint",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateMonitorRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Monitor created successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"$ref": "#/components/schemas/Monitor"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"tags": ["monitors"],
|
|
"summary": "Delete all monitors",
|
|
"description": "Delete all monitors (superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/team": {
|
|
"get": {
|
|
"tags": ["monitors"],
|
|
"summary": "Get monitors by team",
|
|
"description": "Get monitors filtered by team with optional parameters",
|
|
"parameters": [
|
|
{
|
|
"name": "type",
|
|
"in": "query",
|
|
"description": "Filter by monitor type",
|
|
"schema": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"enum": ["http", "ping", "pagespeed", "docker", "hardware", "port", "game", "grpc", "websocket"]
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["http", "ping", "pagespeed", "docker", "hardware", "port", "game", "grpc", "websocket"]
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "filter",
|
|
"in": "query",
|
|
"description": "Search filter value",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Team monitors retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"type": "object",
|
|
"properties": {
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Monitor"
|
|
}
|
|
},
|
|
"totalCount": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/team/with-checks": {
|
|
"get": {
|
|
"tags": ["monitors"],
|
|
"summary": "Get monitors with recent checks",
|
|
"description": "Get team monitors with their most recent check results",
|
|
"parameters": [
|
|
{
|
|
"name": "limit",
|
|
"in": "query",
|
|
"description": "Number of recent checks to include per monitor",
|
|
"schema": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 100
|
|
}
|
|
},
|
|
{
|
|
"name": "page",
|
|
"in": "query",
|
|
"description": "Zero-based page index for pagination",
|
|
"schema": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
}
|
|
},
|
|
{
|
|
"name": "rowsPerPage",
|
|
"in": "query",
|
|
"description": "Number of monitors per page",
|
|
"schema": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 100
|
|
}
|
|
},
|
|
{
|
|
"name": "filter",
|
|
"in": "query",
|
|
"description": "Search filter value",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "field",
|
|
"in": "query",
|
|
"description": "Field to sort by",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "order",
|
|
"in": "query",
|
|
"description": "Sort order",
|
|
"schema": {
|
|
"type": "string",
|
|
"enum": ["asc", "desc"]
|
|
}
|
|
},
|
|
{
|
|
"name": "type",
|
|
"in": "query",
|
|
"description": "Filter by monitor type",
|
|
"schema": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"enum": ["http", "ping", "pagespeed", "docker", "hardware", "port", "game", "grpc", "websocket"]
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["http", "ping", "pagespeed", "docker", "hardware", "port", "game", "grpc", "websocket"]
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"name": "explain",
|
|
"in": "query",
|
|
"description": "Include MongoDB query explain output (debug)",
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Monitors with checks retrieved successfully"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/team/groups": {
|
|
"get": {
|
|
"tags": ["monitors"],
|
|
"summary": "Get monitor groups by team",
|
|
"description": "Get all monitor groups for the authenticated user's team",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Monitor groups retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "Monitor groups retrieved successfully"
|
|
},
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"_id": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/{monitorId}": {
|
|
"get": {
|
|
"tags": ["monitors"],
|
|
"summary": "Get monitor by ID",
|
|
"description": "Retrieve a specific monitor by its ID",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "Monitor ID",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Monitor retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"$ref": "#/components/schemas/Monitor"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"patch": {
|
|
"tags": ["monitors"],
|
|
"summary": "Update monitor",
|
|
"description": "Update an existing monitor",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateMonitorRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"tags": ["monitors"],
|
|
"summary": "Delete monitor",
|
|
"description": "Delete a specific monitor",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/uptime/details/{monitorId}": {
|
|
"get": {
|
|
"tags": ["monitors"],
|
|
"summary": "Get uptime details",
|
|
"description": "Get detailed uptime statistics for a monitor",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Uptime details retrieved successfully"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/hardware/details/{monitorId}": {
|
|
"get": {
|
|
"tags": ["monitors"],
|
|
"summary": "Get hardware monitoring details",
|
|
"description": "Get hardware performance metrics for a monitor",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Hardware details retrieved successfully"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/pause/{monitorId}": {
|
|
"post": {
|
|
"tags": ["monitors"],
|
|
"summary": "Pause/unpause monitor",
|
|
"description": "Toggle monitor active status",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/pagespeed/details/{monitorId}": {
|
|
"get": {
|
|
"tags": ["monitors"],
|
|
"summary": "Get PageSpeed monitor details",
|
|
"description": "Get detailed PageSpeed monitoring data including performance metrics and Core Web Vitals",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "The PageSpeed monitor ID",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "sortOrder",
|
|
"in": "query",
|
|
"description": "Sort order for results",
|
|
"schema": {
|
|
"type": "string",
|
|
"enum": ["asc", "desc"],
|
|
"default": "desc"
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"in": "query",
|
|
"description": "Number of results to return",
|
|
"schema": {
|
|
"type": "integer",
|
|
"default": 50
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "PageSpeed details retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "PageSpeed details retrieved successfully"
|
|
},
|
|
"data": {
|
|
"type": "object",
|
|
"properties": {
|
|
"monitor": {
|
|
"$ref": "#/components/schemas/Monitor"
|
|
},
|
|
"checks": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Check"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/certificate/{monitorId}": {
|
|
"get": {
|
|
"tags": ["monitors"],
|
|
"summary": "Get SSL certificate info",
|
|
"description": "Get SSL certificate information for a monitor",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Certificate information retrieved successfully"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/demo": {
|
|
"post": {
|
|
"tags": ["monitors"],
|
|
"summary": "Add demo monitors",
|
|
"description": "Add preconfigured demo monitors for testing",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/export/json": {
|
|
"get": {
|
|
"tags": ["monitors"],
|
|
"summary": "Export monitors to JSON",
|
|
"description": "Export all monitors to JSON format (admin/superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"description": "JSON file generated successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "Monitors exported successfully"
|
|
},
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Monitor"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/bulk": {
|
|
"post": {
|
|
"tags": ["monitors"],
|
|
"summary": "Bulk import monitors",
|
|
"description": "Import monitors from CSV file",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"csvFile": {
|
|
"type": "string",
|
|
"format": "binary",
|
|
"description": "CSV file containing monitor data"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Monitors imported successfully"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/test-email": {
|
|
"post": {
|
|
"tags": ["monitors"],
|
|
"summary": "Send test email",
|
|
"description": "Send a test email notification",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/settings": {
|
|
"get": {
|
|
"tags": ["settings"],
|
|
"summary": "Get application settings",
|
|
"description": "Retrieve current application configuration",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Settings retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"$ref": "#/components/schemas/AppSettings"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"tags": ["settings"],
|
|
"summary": "Update application settings",
|
|
"description": "Update application configuration (admin/superadmin only)",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/AppSettings"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/settings/test-email": {
|
|
"post": {
|
|
"tags": ["settings"],
|
|
"summary": "Send test email",
|
|
"description": "Send test email to verify email configuration",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/notifications": {
|
|
"post": {
|
|
"tags": ["notifications"],
|
|
"summary": "Create notification",
|
|
"description": "Create a new notification integration",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateNotificationRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Notification created successfully"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/notifications/team": {
|
|
"get": {
|
|
"tags": ["notifications"],
|
|
"summary": "Get team notifications",
|
|
"description": "Get all notification configurations for the team",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Notifications retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Notification"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/notifications/{id}": {
|
|
"get": {
|
|
"tags": ["notifications"],
|
|
"summary": "Get notification by ID",
|
|
"description": "Retrieve a specific notification configuration",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Notification retrieved successfully"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"tags": ["notifications"],
|
|
"summary": "Update notification",
|
|
"description": "Update an existing notification configuration",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateNotificationRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"tags": ["notifications"],
|
|
"summary": "Delete notification",
|
|
"description": "Delete a notification configuration",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/notifications/test": {
|
|
"post": {
|
|
"tags": ["notifications"],
|
|
"summary": "Test notification",
|
|
"description": "Send a test notification to verify configuration",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/notifications/test/all": {
|
|
"post": {
|
|
"tags": ["notifications"],
|
|
"summary": "Test all notifications",
|
|
"description": "Send test notifications to all configured integrations",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/logs": {
|
|
"get": {
|
|
"tags": ["logs"],
|
|
"summary": "Get application logs",
|
|
"description": "Retrieve application logs (admin/superadmin only)",
|
|
"parameters": [
|
|
{
|
|
"name": "level",
|
|
"in": "query",
|
|
"description": "Log level filter",
|
|
"schema": {
|
|
"type": "string",
|
|
"enum": ["error", "warn", "info", "debug"]
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"in": "query",
|
|
"description": "Number of log entries to return",
|
|
"schema": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 1000,
|
|
"default": 100
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Logs retrieved successfully"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/diagnostic/system": {
|
|
"get": {
|
|
"tags": ["diagnostic"],
|
|
"summary": "Get system diagnostics",
|
|
"description": "Get system health and performance metrics (admin/superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"description": "System diagnostics retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"$ref": "#/components/schemas/SystemDiagnostics"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/auth/user": {
|
|
"put": {
|
|
"tags": ["auth"],
|
|
"summary": "Update current user profile",
|
|
"description": "Update authenticated user's profile information",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserUpdateRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"tags": ["auth"],
|
|
"summary": "Delete current user account",
|
|
"description": "Delete authenticated user's account and associated data",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/auth/users/{userId}": {
|
|
"get": {
|
|
"tags": ["auth"],
|
|
"summary": "Get user by ID",
|
|
"description": "Get a specific user by ID (superadmin only)",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "User retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"$ref": "#/components/schemas/User"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"tags": ["auth"],
|
|
"summary": "Update user by ID",
|
|
"description": "Update a specific user by ID (superadmin only)",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserUpdateRequest"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/auth/users/{userId}/password": {
|
|
"put": {
|
|
"tags": ["auth"],
|
|
"summary": "Update user password by ID",
|
|
"description": "Update a specific user's password by ID (superadmin only)",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["password"],
|
|
"properties": {
|
|
"password": {
|
|
"type": "string",
|
|
"format": "password",
|
|
"minLength": 8,
|
|
"description": "New password for the user"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/invite": {
|
|
"post": {
|
|
"tags": ["invite"],
|
|
"summary": "Create invite token",
|
|
"description": "Create a new invitation token",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["email", "role"],
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email"
|
|
},
|
|
"role": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["user", "admin"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Invite token created successfully"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/invite/send": {
|
|
"post": {
|
|
"tags": ["invite"],
|
|
"summary": "Send invitation email",
|
|
"description": "Send invitation email to user",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["email"],
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/invite/verify": {
|
|
"post": {
|
|
"tags": ["invite"],
|
|
"summary": "Verify invitation token",
|
|
"description": "Verify an invitation token",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["token"],
|
|
"properties": {
|
|
"token": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"400": {
|
|
"description": "Invalid or expired token"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/checks/{monitorId}": {
|
|
"get": {
|
|
"tags": ["checks"],
|
|
"summary": "Get checks by monitor",
|
|
"description": "Get all checks for a specific monitor",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Checks retrieved successfully"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"tags": ["checks"],
|
|
"summary": "Delete checks by monitor",
|
|
"description": "Delete all checks for a specific monitor",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/checks/team": {
|
|
"get": {
|
|
"tags": ["checks"],
|
|
"summary": "Get checks by team",
|
|
"description": "Get all checks for team monitors",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Team checks retrieved successfully"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"tags": ["checks"],
|
|
"summary": "Delete team checks",
|
|
"description": "Delete all checks for team (admin/superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/checks/team/summary": {
|
|
"get": {
|
|
"tags": ["checks"],
|
|
"summary": "Get team checks summary",
|
|
"description": "Get summary statistics for team checks",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Team checks summary retrieved successfully"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/checks/team/ttl": {
|
|
"put": {
|
|
"tags": ["checks"],
|
|
"summary": "Update checks TTL",
|
|
"description": "Update time-to-live for checks (admin/superadmin only)",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["ttl"],
|
|
"properties": {
|
|
"ttl": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"description": "Time to live in days"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/checks/check/{checkId}": {
|
|
"put": {
|
|
"tags": ["checks"],
|
|
"summary": "Acknowledge check",
|
|
"description": "Acknowledge a specific check",
|
|
"parameters": [
|
|
{
|
|
"name": "checkId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"ack": {
|
|
"type": "boolean",
|
|
"description": "Acknowledgement status"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/checks/{action}": {
|
|
"put": {
|
|
"tags": ["checks"],
|
|
"summary": "Acknowledge all checks for all monitors",
|
|
"description": "Acknowledge all checks across all monitors for the team",
|
|
"parameters": [
|
|
{
|
|
"name": "action",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "Action to perform (e.g., 'ack')",
|
|
"schema": {
|
|
"type": "string",
|
|
"enum": ["ack"]
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["ack"],
|
|
"properties": {
|
|
"ack": {
|
|
"type": "boolean",
|
|
"description": "Acknowledgement status to set"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Checks acknowledged successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "All checks acknowledged successfully"
|
|
},
|
|
"data": {
|
|
"type": "object",
|
|
"description": "Updated checks information"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/checks/{action}/{monitorId}": {
|
|
"put": {
|
|
"tags": ["checks"],
|
|
"summary": "Acknowledge all checks for a specific monitor",
|
|
"description": "Acknowledge all checks for a specific monitor",
|
|
"parameters": [
|
|
{
|
|
"name": "action",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "Action to perform (e.g., 'ack')",
|
|
"schema": {
|
|
"type": "string",
|
|
"enum": ["ack"]
|
|
}
|
|
},
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "Monitor ID to acknowledge checks for",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["ack"],
|
|
"properties": {
|
|
"ack": {
|
|
"type": "boolean",
|
|
"description": "Acknowledgement status to set"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Checks acknowledged successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "All checks acknowledged successfully"
|
|
},
|
|
"data": {
|
|
"type": "object",
|
|
"description": "Updated checks information"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/maintenance-window": {
|
|
"post": {
|
|
"tags": ["maintenance-window"],
|
|
"summary": "Create maintenance window",
|
|
"description": "Create a new maintenance window",
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["name", "startTime", "endTime"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"maxLength": 100
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"maxLength": 500
|
|
},
|
|
"startTime": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"endTime": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"description": "Maintenance window created successfully"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/maintenance-window/team": {
|
|
"get": {
|
|
"tags": ["maintenance-window"],
|
|
"summary": "Get team maintenance windows",
|
|
"description": "Get all maintenance windows for the team",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Maintenance windows retrieved successfully"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/maintenance-window/monitor/{monitorId}": {
|
|
"get": {
|
|
"tags": ["maintenance-window"],
|
|
"summary": "Get maintenance windows by monitor",
|
|
"description": "Get all maintenance windows for a specific monitor",
|
|
"parameters": [
|
|
{
|
|
"name": "monitorId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Monitor maintenance windows retrieved successfully"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/maintenance-window/{id}": {
|
|
"get": {
|
|
"tags": ["maintenance-window"],
|
|
"summary": "Get maintenance window by ID",
|
|
"description": "Get a specific maintenance window",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Maintenance window retrieved successfully"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"tags": ["maintenance-window"],
|
|
"summary": "Update maintenance window",
|
|
"description": "Update an existing maintenance window",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"required": true,
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"maxLength": 100
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"maxLength": 500
|
|
},
|
|
"startTime": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"endTime": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"monitors": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"422": {
|
|
"$ref": "#/components/responses/ValidationError"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"delete": {
|
|
"tags": ["maintenance-window"],
|
|
"summary": "Delete maintenance window",
|
|
"description": "Delete a specific maintenance window",
|
|
"parameters": [
|
|
{
|
|
"name": "id",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/queue/jobs": {
|
|
"get": {
|
|
"tags": ["queue"],
|
|
"summary": "Get queue jobs",
|
|
"description": "Retrieve all jobs in the queue (admin/superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Queue jobs retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "Queue jobs fetched successfully"
|
|
},
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/QueueJob"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"post": {
|
|
"tags": ["queue"],
|
|
"summary": "Add job to queue",
|
|
"description": "Add a new job to the queue (admin/superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Job added successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "Job added to queue successfully"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/queue/metrics": {
|
|
"get": {
|
|
"tags": ["queue"],
|
|
"summary": "Get queue metrics",
|
|
"description": "Retrieve queue metrics (admin/superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Queue metrics retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "Queue metrics fetched successfully"
|
|
},
|
|
"data": {
|
|
"$ref": "#/components/schemas/QueueMetrics"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/queue/health": {
|
|
"get": {
|
|
"tags": ["queue"],
|
|
"summary": "Check queue health",
|
|
"description": "Check the health status of the job queue (admin/superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Queue health status retrieved successfully"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/queue/all-metrics": {
|
|
"get": {
|
|
"tags": ["queue"],
|
|
"summary": "Get all queue metrics",
|
|
"description": "Get comprehensive queue metrics (admin/superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"description": "All queue metrics retrieved successfully"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/queue/flush": {
|
|
"post": {
|
|
"tags": ["queue"],
|
|
"summary": "Flush queue",
|
|
"description": "Clear all jobs from the queue (admin/superadmin only)",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/monitors/games": {
|
|
"get": {
|
|
"tags": ["monitors"],
|
|
"summary": "Get game server list",
|
|
"description": "Get available game servers for monitoring",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Game servers retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/status-page": {
|
|
"get": {
|
|
"tags": ["status-page"],
|
|
"summary": "Get status page",
|
|
"description": "Get default status page information",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": ["status-page"],
|
|
"summary": "Create status page",
|
|
"description": "Create a new status page with optional logo upload",
|
|
"requestBody": {
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"logo": {
|
|
"type": "string",
|
|
"format": "binary",
|
|
"description": "Logo file for the status page"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Status page title"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Status page description"
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"description": "Custom URL for the status page"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"201": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
},
|
|
"put": {
|
|
"tags": ["status-page"],
|
|
"summary": "Update status page",
|
|
"description": "Update an existing status page with optional logo upload",
|
|
"requestBody": {
|
|
"content": {
|
|
"multipart/form-data": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"logo": {
|
|
"type": "string",
|
|
"format": "binary",
|
|
"description": "Logo file for the status page"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Status page title"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Status page description"
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"description": "Custom URL for the status page"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"400": {
|
|
"$ref": "#/components/responses/BadRequest"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/status-page/team": {
|
|
"get": {
|
|
"tags": ["status-page"],
|
|
"summary": "Get status pages by team",
|
|
"description": "Get all status pages for the authenticated user's team",
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/status-page/{url}": {
|
|
"get": {
|
|
"tags": ["status-page"],
|
|
"summary": "Get status page by URL",
|
|
"description": "Get a specific status page by its custom URL",
|
|
"parameters": [
|
|
{
|
|
"name": "url",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
},
|
|
"description": "Custom URL of the status page"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": ["status-page"],
|
|
"summary": "Delete status page",
|
|
"description": "Delete a status page by its custom URL",
|
|
"parameters": [
|
|
{
|
|
"name": "url",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
},
|
|
"description": "Custom URL of the status page (supports wildcards)"
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"$ref": "#/components/responses/Success"
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/incidents/team": {
|
|
"get": {
|
|
"tags": ["incidents"],
|
|
"summary": "Get incidents by team",
|
|
"description": "Retrieve all incidents for the authenticated user's team with optional filtering",
|
|
"parameters": [
|
|
{
|
|
"name": "status",
|
|
"in": "query",
|
|
"description": "Filter by incident status (true = ongoing, false = resolved)",
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
{
|
|
"name": "monitorId",
|
|
"in": "query",
|
|
"description": "Filter by monitor ID",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "page",
|
|
"in": "query",
|
|
"description": "Page number for pagination",
|
|
"schema": {
|
|
"type": "integer",
|
|
"default": 1
|
|
}
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"in": "query",
|
|
"description": "Number of items per page",
|
|
"schema": {
|
|
"type": "integer",
|
|
"default": 10
|
|
}
|
|
},
|
|
{
|
|
"name": "sortOrder",
|
|
"in": "query",
|
|
"description": "Sort order for results",
|
|
"schema": {
|
|
"type": "string",
|
|
"enum": ["asc", "desc"],
|
|
"default": "desc"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Incidents retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "Incidents retrieved successfully"
|
|
},
|
|
"data": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Incident"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/incidents/team/summary": {
|
|
"get": {
|
|
"tags": ["incidents"],
|
|
"summary": "Get incident summary",
|
|
"description": "Retrieve a summary of incidents for the authenticated user's team",
|
|
"parameters": [
|
|
{
|
|
"name": "dateRange",
|
|
"in": "query",
|
|
"description": "Date range for summary",
|
|
"schema": {
|
|
"type": "string",
|
|
"enum": ["day", "week", "month"],
|
|
"default": "week"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Incident summary retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "Incident summary retrieved successfully"
|
|
},
|
|
"data": {
|
|
"$ref": "#/components/schemas/IncidentSummary"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/incidents/{incidentId}": {
|
|
"get": {
|
|
"tags": ["incidents"],
|
|
"summary": "Get incident by ID",
|
|
"description": "Retrieve a specific incident by its ID",
|
|
"parameters": [
|
|
{
|
|
"name": "incidentId",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "The incident ID",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Incident retrieved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "Incident retrieved successfully"
|
|
},
|
|
"data": {
|
|
"$ref": "#/components/schemas/Incident"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"/incidents/{incidentId}/resolve": {
|
|
"put": {
|
|
"tags": ["incidents"],
|
|
"summary": "Resolve incident manually",
|
|
"description": "Manually resolve an ongoing incident. Requires admin or superadmin role.",
|
|
"parameters": [
|
|
{
|
|
"name": "incidentId",
|
|
"in": "path",
|
|
"required": true,
|
|
"description": "The incident ID to resolve",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"comment": {
|
|
"type": "string",
|
|
"description": "Optional comment about the resolution",
|
|
"example": "Issue resolved by restarting the service"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Incident resolved successfully",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "Incident resolved successfully"
|
|
},
|
|
"data": {
|
|
"$ref": "#/components/schemas/Incident"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"401": {
|
|
"$ref": "#/components/responses/Unauthorized"
|
|
},
|
|
"403": {
|
|
"$ref": "#/components/responses/Forbidden"
|
|
},
|
|
"404": {
|
|
"$ref": "#/components/responses/NotFound"
|
|
},
|
|
"500": {
|
|
"$ref": "#/components/responses/InternalServerError"
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"bearerAuth": []
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"securitySchemes": {
|
|
"bearerAuth": {
|
|
"type": "http",
|
|
"scheme": "bearer",
|
|
"bearerFormat": "JWT",
|
|
"description": "JWT token obtained from login endpoint"
|
|
}
|
|
},
|
|
"responses": {
|
|
"Success": {
|
|
"description": "Operation successful",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"NotFound": {
|
|
"description": "Resource not found",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"ValidationError": {
|
|
"description": "Validation failed",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"Unauthorized": {
|
|
"description": "Authentication required or token invalid",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"Forbidden": {
|
|
"description": "Insufficient permissions",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"BadRequest": {
|
|
"description": "Invalid request parameters",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"InternalServerError": {
|
|
"description": "Internal server error",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"schemas": {
|
|
"SuccessResponse": {
|
|
"type": "object",
|
|
"required": ["success", "msg"],
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "Operation completed successfully"
|
|
},
|
|
"data": {
|
|
"type": "object",
|
|
"description": "Response payload (varies by endpoint)"
|
|
}
|
|
}
|
|
},
|
|
"ErrorResponse": {
|
|
"type": "object",
|
|
"required": ["success", "msg"],
|
|
"properties": {
|
|
"success": {
|
|
"type": "boolean",
|
|
"example": false
|
|
},
|
|
"msg": {
|
|
"type": "string",
|
|
"example": "An error occurred"
|
|
},
|
|
"details": {
|
|
"type": "object",
|
|
"description": "Additional error details"
|
|
}
|
|
}
|
|
},
|
|
"RegisterRequest": {
|
|
"type": "object",
|
|
"required": ["firstName", "lastName", "email", "password"],
|
|
"properties": {
|
|
"firstName": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 50,
|
|
"example": "John"
|
|
},
|
|
"lastName": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 50,
|
|
"example": "Doe"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email",
|
|
"example": "john@example.com"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"minLength": 8,
|
|
"format": "password",
|
|
"example": "SecurePass123!"
|
|
},
|
|
"profileImage": {
|
|
"type": "string",
|
|
"format": "binary",
|
|
"description": "Optional profile image file"
|
|
},
|
|
"role": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["user", "admin", "superadmin", "Demo"]
|
|
},
|
|
"default": ["user"]
|
|
}
|
|
}
|
|
},
|
|
"LoginRequest": {
|
|
"type": "object",
|
|
"required": ["email", "password"],
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email",
|
|
"example": "john@example.com"
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"format": "password",
|
|
"example": "SecurePass123!"
|
|
}
|
|
}
|
|
},
|
|
"AuthResponse": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/components/schemas/SuccessResponse"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"data": {
|
|
"type": "object",
|
|
"properties": {
|
|
"token": {
|
|
"type": "string",
|
|
"description": "JWT access token"
|
|
},
|
|
"user": {
|
|
"$ref": "#/components/schemas/User"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"UserUpdateRequest": {
|
|
"type": "object",
|
|
"properties": {
|
|
"firstName": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 50
|
|
},
|
|
"lastName": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 50
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"format": "password",
|
|
"description": "Current password for verification"
|
|
},
|
|
"newPassword": {
|
|
"type": "string",
|
|
"minLength": 8,
|
|
"format": "password",
|
|
"description": "New password (if changing)"
|
|
},
|
|
"profileImage": {
|
|
"type": "string",
|
|
"format": "binary",
|
|
"description": "New profile image file"
|
|
},
|
|
"deleteProfileImage": {
|
|
"type": "boolean",
|
|
"description": "Flag to delete current profile image"
|
|
}
|
|
}
|
|
},
|
|
"User": {
|
|
"type": "object",
|
|
"properties": {
|
|
"_id": {
|
|
"type": "string",
|
|
"example": "64f123a456b789012c345def"
|
|
},
|
|
"firstName": {
|
|
"type": "string",
|
|
"example": "John"
|
|
},
|
|
"lastName": {
|
|
"type": "string",
|
|
"example": "Doe"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"format": "email",
|
|
"example": "john@example.com"
|
|
},
|
|
"role": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["user", "admin", "superadmin", "Demo"]
|
|
}
|
|
},
|
|
"profileImage": {
|
|
"type": "string",
|
|
"description": "URL or path to profile image"
|
|
},
|
|
"isActive": {
|
|
"type": "boolean"
|
|
},
|
|
"teamId": {
|
|
"type": "string"
|
|
},
|
|
"createdAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"updatedAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
}
|
|
},
|
|
"CreateMonitorRequest": {
|
|
"type": "object",
|
|
"required": ["name", "type", "url"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"example": "My Website Monitor"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"example": "Monitors the main website homepage"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["http", "ping", "pagespeed", "hardware", "docker", "port", "game", "grpc", "websocket"],
|
|
"example": "http"
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"example": "https://example.com"
|
|
},
|
|
"interval": {
|
|
"type": "integer",
|
|
"example": 300,
|
|
"description": "Check interval in seconds"
|
|
},
|
|
"statusWindowSize": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 20,
|
|
"default": 5
|
|
},
|
|
"statusWindowThreshold": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 60
|
|
},
|
|
"isActive": {
|
|
"type": "boolean"
|
|
},
|
|
"ignoreTlsErrors": {
|
|
"type": "boolean",
|
|
"default": false
|
|
},
|
|
"useAdvancedMatching": {
|
|
"type": "boolean",
|
|
"default": false
|
|
},
|
|
"port": {
|
|
"type": "integer"
|
|
},
|
|
"notifications": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Array of notification IDs to associate with this monitor"
|
|
},
|
|
"secret": {
|
|
"type": "string"
|
|
},
|
|
"jsonPath": {
|
|
"type": "string"
|
|
},
|
|
"expectedValue": {
|
|
"type": "string"
|
|
},
|
|
"matchMethod": {
|
|
"type": "string",
|
|
"enum": ["equal", "include", "regex", ""]
|
|
},
|
|
"cpuAlertThreshold": {
|
|
"type": "number"
|
|
},
|
|
"memoryAlertThreshold": {
|
|
"type": "number"
|
|
},
|
|
"diskAlertThreshold": {
|
|
"type": "number"
|
|
},
|
|
"tempAlertThreshold": {
|
|
"type": "number"
|
|
},
|
|
"gameId": {
|
|
"type": "string"
|
|
},
|
|
"grpcServiceName": {
|
|
"type": "string",
|
|
"default": ""
|
|
},
|
|
"selectedDisks": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"group": {
|
|
"type": "string",
|
|
"nullable": true,
|
|
"maxLength": 50
|
|
},
|
|
"geoCheckEnabled": {
|
|
"type": "boolean"
|
|
},
|
|
"geoCheckLocations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["northAmerica", "southAmerica", "europe", "asia", "africa", "oceania"]
|
|
}
|
|
},
|
|
"geoCheckInterval": {
|
|
"type": "integer",
|
|
"minimum": 300000
|
|
}
|
|
}
|
|
},
|
|
"UpdateMonitorRequest": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["http", "ping", "pagespeed", "hardware", "docker", "port", "game", "grpc", "websocket", "unknown"]
|
|
},
|
|
"url": {
|
|
"type": "string"
|
|
},
|
|
"statusWindowSize": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 20,
|
|
"default": 5
|
|
},
|
|
"statusWindowThreshold": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 100,
|
|
"default": 60
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"interval": {
|
|
"type": "integer"
|
|
},
|
|
"notifications": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"secret": {
|
|
"type": "string"
|
|
},
|
|
"ignoreTlsErrors": {
|
|
"type": "boolean"
|
|
},
|
|
"useAdvancedMatching": {
|
|
"type": "boolean"
|
|
},
|
|
"jsonPath": {
|
|
"type": "string"
|
|
},
|
|
"expectedValue": {
|
|
"type": "string"
|
|
},
|
|
"matchMethod": {
|
|
"type": "string",
|
|
"enum": ["equal", "include", "regex", ""]
|
|
},
|
|
"port": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 65535
|
|
},
|
|
"cpuAlertThreshold": {
|
|
"type": "number"
|
|
},
|
|
"memoryAlertThreshold": {
|
|
"type": "number"
|
|
},
|
|
"diskAlertThreshold": {
|
|
"type": "number"
|
|
},
|
|
"tempAlertThreshold": {
|
|
"type": "number"
|
|
},
|
|
"gameId": {
|
|
"type": "string"
|
|
},
|
|
"grpcServiceName": {
|
|
"type": "string"
|
|
},
|
|
"selectedDisks": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"group": {
|
|
"type": "string",
|
|
"nullable": true,
|
|
"maxLength": 50
|
|
},
|
|
"geoCheckEnabled": {
|
|
"type": "boolean"
|
|
},
|
|
"geoCheckLocations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["northAmerica", "southAmerica", "europe", "asia", "africa", "oceania"]
|
|
}
|
|
},
|
|
"geoCheckInterval": {
|
|
"type": "integer",
|
|
"minimum": 300000
|
|
}
|
|
}
|
|
},
|
|
"Monitor": {
|
|
"type": "object",
|
|
"properties": {
|
|
"_id": {
|
|
"type": "string",
|
|
"example": "64f123a456b789012c345def"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"teamId": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"example": "My Website Monitor"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"example": "Monitors the main website homepage"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["http", "ping", "pagespeed", "hardware", "docker", "port"]
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"example": "https://example.com"
|
|
},
|
|
"interval": {
|
|
"type": "integer",
|
|
"example": 300
|
|
},
|
|
"isActive": {
|
|
"type": "boolean",
|
|
"example": true
|
|
},
|
|
"status": {
|
|
"type": "boolean",
|
|
"description": "Current monitor status (up/down)"
|
|
},
|
|
"lastChecked": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "Timestamp of last check"
|
|
},
|
|
"notifications": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"httpOptions": {
|
|
"type": "object",
|
|
"properties": {
|
|
"method": {
|
|
"type": "string"
|
|
},
|
|
"headers": {
|
|
"type": "object"
|
|
},
|
|
"body": {
|
|
"type": "string"
|
|
},
|
|
"timeout": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
},
|
|
"assertions": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"createdAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"updatedAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
}
|
|
},
|
|
"CreateNotificationRequest": {
|
|
"type": "object",
|
|
"required": ["type", "name"],
|
|
"properties": {
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["email", "webhook", "slack", "discord", "telegram", "zapier"],
|
|
"example": "email"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"maxLength": 100,
|
|
"example": "Admin Email Notifications"
|
|
},
|
|
"config": {
|
|
"type": "object",
|
|
"description": "Configuration specific to notification type",
|
|
"oneOf": [
|
|
{
|
|
"title": "Email Configuration",
|
|
"properties": {
|
|
"to": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"format": "email"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"title": "Webhook Configuration",
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"headers": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"title": "Slack Configuration",
|
|
"properties": {
|
|
"webhookUrl": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
},
|
|
"channel": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"title": "Discord Configuration",
|
|
"properties": {
|
|
"webhookUrl": {
|
|
"type": "string",
|
|
"format": "uri"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"isActive": {
|
|
"type": "boolean",
|
|
"default": true
|
|
}
|
|
}
|
|
},
|
|
"Notification": {
|
|
"type": "object",
|
|
"properties": {
|
|
"_id": {
|
|
"type": "string"
|
|
},
|
|
"userId": {
|
|
"type": "string"
|
|
},
|
|
"teamId": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["email", "webhook", "slack", "discord", "telegram", "zapier"]
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"config": {
|
|
"type": "object",
|
|
"description": "Type-specific configuration"
|
|
},
|
|
"isActive": {
|
|
"type": "boolean"
|
|
},
|
|
"createdAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"updatedAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
}
|
|
},
|
|
"AppSettings": {
|
|
"type": "object",
|
|
"properties": {
|
|
"appName": {
|
|
"type": "string",
|
|
"example": "Checkmate"
|
|
},
|
|
"appUrl": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"example": "https://checkmate.example.com"
|
|
},
|
|
"logLevel": {
|
|
"type": "string",
|
|
"enum": ["error", "warn", "info", "debug"],
|
|
"default": "info"
|
|
},
|
|
"emailConfig": {
|
|
"type": "object",
|
|
"properties": {
|
|
"host": {
|
|
"type": "string"
|
|
},
|
|
"port": {
|
|
"type": "integer"
|
|
},
|
|
"secure": {
|
|
"type": "boolean"
|
|
},
|
|
"user": {
|
|
"type": "string"
|
|
},
|
|
"pass": {
|
|
"type": "string",
|
|
"format": "password"
|
|
},
|
|
"from": {
|
|
"type": "string",
|
|
"format": "email"
|
|
}
|
|
}
|
|
},
|
|
"webhookRetries": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"maximum": 10,
|
|
"default": 3
|
|
},
|
|
"checksRetention": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 365,
|
|
"default": 90,
|
|
"description": "Days to retain check results"
|
|
}
|
|
}
|
|
},
|
|
"SystemDiagnostics": {
|
|
"type": "object",
|
|
"properties": {
|
|
"uptime": {
|
|
"type": "number",
|
|
"description": "System uptime in seconds"
|
|
},
|
|
"memory": {
|
|
"type": "object",
|
|
"properties": {
|
|
"total": {
|
|
"type": "number",
|
|
"description": "Total memory in bytes"
|
|
},
|
|
"used": {
|
|
"type": "number",
|
|
"description": "Used memory in bytes"
|
|
},
|
|
"free": {
|
|
"type": "number",
|
|
"description": "Free memory in bytes"
|
|
}
|
|
}
|
|
},
|
|
"cpu": {
|
|
"type": "object",
|
|
"properties": {
|
|
"usage": {
|
|
"type": "number",
|
|
"description": "CPU usage percentage"
|
|
},
|
|
"cores": {
|
|
"type": "integer",
|
|
"description": "Number of CPU cores"
|
|
}
|
|
}
|
|
},
|
|
"database": {
|
|
"type": "object",
|
|
"properties": {
|
|
"status": {
|
|
"type": "string",
|
|
"enum": ["connected", "disconnected", "error"]
|
|
},
|
|
"responseTime": {
|
|
"type": "number",
|
|
"description": "Database response time in milliseconds"
|
|
}
|
|
}
|
|
},
|
|
"queue": {
|
|
"type": "object",
|
|
"properties": {
|
|
"active": {
|
|
"type": "integer"
|
|
},
|
|
"waiting": {
|
|
"type": "integer"
|
|
},
|
|
"completed": {
|
|
"type": "integer"
|
|
},
|
|
"failed": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"Incident": {
|
|
"type": "object",
|
|
"properties": {
|
|
"_id": {
|
|
"type": "string",
|
|
"description": "Unique incident identifier"
|
|
},
|
|
"monitorId": {
|
|
"type": "string",
|
|
"description": "ID of the associated monitor"
|
|
},
|
|
"teamId": {
|
|
"type": "string",
|
|
"description": "ID of the team"
|
|
},
|
|
"startTime": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "When the incident started"
|
|
},
|
|
"endTime": {
|
|
"type": ["string", "null"],
|
|
"format": "date-time",
|
|
"description": "When the incident was resolved (null if ongoing)"
|
|
},
|
|
"status": {
|
|
"type": "boolean",
|
|
"description": "Incident status (true = ongoing, false = resolved)"
|
|
},
|
|
"message": {
|
|
"type": ["string", "null"],
|
|
"description": "Error message or description"
|
|
},
|
|
"statusCode": {
|
|
"type": ["integer", "null"],
|
|
"description": "HTTP status code if applicable"
|
|
},
|
|
"resolutionType": {
|
|
"type": ["string", "null"],
|
|
"enum": ["automatic", "manual", null],
|
|
"description": "How the incident was resolved"
|
|
},
|
|
"resolvedBy": {
|
|
"type": ["string", "null"],
|
|
"description": "User ID who resolved the incident (for manual resolution)"
|
|
},
|
|
"comment": {
|
|
"type": ["string", "null"],
|
|
"description": "Resolution comment"
|
|
},
|
|
"checks": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Array of check IDs associated with this incident"
|
|
},
|
|
"createdAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"updatedAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
}
|
|
},
|
|
"IncidentSummary": {
|
|
"type": "object",
|
|
"properties": {
|
|
"totalIncidents": {
|
|
"type": "integer",
|
|
"description": "Total number of incidents"
|
|
},
|
|
"activeIncidents": {
|
|
"type": "integer",
|
|
"description": "Number of ongoing incidents"
|
|
},
|
|
"resolvedIncidents": {
|
|
"type": "integer",
|
|
"description": "Number of resolved incidents"
|
|
},
|
|
"averageResolutionTime": {
|
|
"type": "number",
|
|
"description": "Average time to resolve incidents in milliseconds"
|
|
},
|
|
"incidentsByMonitor": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"monitorId": {
|
|
"type": "string"
|
|
},
|
|
"monitorName": {
|
|
"type": "string"
|
|
},
|
|
"count": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"QueueJob": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"description": "Job ID"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Job name"
|
|
},
|
|
"data": {
|
|
"type": "object",
|
|
"description": "Job payload data"
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"enum": ["waiting", "active", "completed", "failed", "delayed"],
|
|
"description": "Current job status"
|
|
},
|
|
"progress": {
|
|
"type": "number",
|
|
"description": "Job progress percentage"
|
|
},
|
|
"attemptsMade": {
|
|
"type": "integer",
|
|
"description": "Number of attempts made"
|
|
},
|
|
"timestamp": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "When the job was created"
|
|
},
|
|
"processedOn": {
|
|
"type": ["string", "null"],
|
|
"format": "date-time",
|
|
"description": "When the job started processing"
|
|
},
|
|
"finishedOn": {
|
|
"type": ["string", "null"],
|
|
"format": "date-time",
|
|
"description": "When the job finished"
|
|
}
|
|
}
|
|
},
|
|
"QueueMetrics": {
|
|
"type": "object",
|
|
"properties": {
|
|
"waiting": {
|
|
"type": "integer",
|
|
"description": "Number of jobs waiting"
|
|
},
|
|
"active": {
|
|
"type": "integer",
|
|
"description": "Number of jobs currently processing"
|
|
},
|
|
"completed": {
|
|
"type": "integer",
|
|
"description": "Number of completed jobs"
|
|
},
|
|
"failed": {
|
|
"type": "integer",
|
|
"description": "Number of failed jobs"
|
|
},
|
|
"delayed": {
|
|
"type": "integer",
|
|
"description": "Number of delayed jobs"
|
|
}
|
|
}
|
|
},
|
|
"Check": {
|
|
"type": "object",
|
|
"description": "A monitoring check result",
|
|
"properties": {
|
|
"_id": {
|
|
"type": "string",
|
|
"description": "Check ID"
|
|
},
|
|
"metadata": {
|
|
"type": "object",
|
|
"properties": {
|
|
"monitorId": {
|
|
"type": "string",
|
|
"description": "Associated monitor ID"
|
|
},
|
|
"teamId": {
|
|
"type": "string",
|
|
"description": "Associated team ID"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["http", "ping", "pagespeed", "hardware", "docker", "port"],
|
|
"description": "Monitor type"
|
|
}
|
|
},
|
|
"required": ["monitorId", "teamId", "type"]
|
|
},
|
|
"status": {
|
|
"type": "boolean",
|
|
"description": "Check status (true = up, false = down)"
|
|
},
|
|
"responseTime": {
|
|
"type": "number",
|
|
"description": "Response time in milliseconds"
|
|
},
|
|
"statusCode": {
|
|
"type": "integer",
|
|
"description": "HTTP status code (for HTTP monitors)"
|
|
},
|
|
"message": {
|
|
"type": "string",
|
|
"description": "Status message or error description"
|
|
},
|
|
"timings": {
|
|
"$ref": "#/components/schemas/CheckTimings"
|
|
},
|
|
"cpu": {
|
|
"$ref": "#/components/schemas/CheckCpuInfo"
|
|
},
|
|
"memory": {
|
|
"$ref": "#/components/schemas/CheckMemoryInfo"
|
|
},
|
|
"disk": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CheckDiskInfo"
|
|
}
|
|
},
|
|
"host": {
|
|
"$ref": "#/components/schemas/CheckHostInfo"
|
|
},
|
|
"errors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CheckErrorInfo"
|
|
}
|
|
},
|
|
"capture": {
|
|
"$ref": "#/components/schemas/CheckCaptureInfo"
|
|
},
|
|
"net": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CheckNetworkInfo"
|
|
}
|
|
},
|
|
"accessibility": {
|
|
"type": "number",
|
|
"description": "PageSpeed accessibility score (0-100)"
|
|
},
|
|
"bestPractices": {
|
|
"type": "number",
|
|
"description": "PageSpeed best practices score (0-100)"
|
|
},
|
|
"seo": {
|
|
"type": "number",
|
|
"description": "PageSpeed SEO score (0-100)"
|
|
},
|
|
"performance": {
|
|
"type": "number",
|
|
"description": "PageSpeed performance score (0-100)"
|
|
},
|
|
"audits": {
|
|
"$ref": "#/components/schemas/CheckAudits"
|
|
},
|
|
"ack": {
|
|
"type": "boolean",
|
|
"description": "Whether the check has been acknowledged"
|
|
},
|
|
"ackAt": {
|
|
"type": ["string", "null"],
|
|
"format": "date-time",
|
|
"description": "When the check was acknowledged"
|
|
},
|
|
"expiry": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "When the check expires"
|
|
},
|
|
"createdAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"updatedAt": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
}
|
|
},
|
|
"CheckTimings": {
|
|
"type": "object",
|
|
"description": "Detailed timing information for HTTP checks",
|
|
"properties": {
|
|
"start": {
|
|
"type": "number"
|
|
},
|
|
"socket": {
|
|
"type": "number"
|
|
},
|
|
"lookup": {
|
|
"type": "number"
|
|
},
|
|
"connect": {
|
|
"type": "number"
|
|
},
|
|
"secureConnect": {
|
|
"type": "number"
|
|
},
|
|
"upload": {
|
|
"type": "number"
|
|
},
|
|
"response": {
|
|
"type": "number"
|
|
},
|
|
"end": {
|
|
"type": "number"
|
|
},
|
|
"phases": {
|
|
"type": "object",
|
|
"properties": {
|
|
"wait": {
|
|
"type": "number"
|
|
},
|
|
"dns": {
|
|
"type": "number"
|
|
},
|
|
"tcp": {
|
|
"type": "number"
|
|
},
|
|
"tls": {
|
|
"type": "number"
|
|
},
|
|
"request": {
|
|
"type": "number"
|
|
},
|
|
"firstByte": {
|
|
"type": "number"
|
|
},
|
|
"download": {
|
|
"type": "number"
|
|
},
|
|
"total": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"CheckCpuInfo": {
|
|
"type": "object",
|
|
"description": "CPU information for infrastructure checks",
|
|
"properties": {
|
|
"physical_core": {
|
|
"type": "integer"
|
|
},
|
|
"logical_core": {
|
|
"type": "integer"
|
|
},
|
|
"frequency": {
|
|
"type": "number"
|
|
},
|
|
"temperature": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "number"
|
|
}
|
|
},
|
|
"free_percent": {
|
|
"type": "number"
|
|
},
|
|
"usage_percent": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
"CheckMemoryInfo": {
|
|
"type": "object",
|
|
"description": "Memory information for infrastructure checks",
|
|
"properties": {
|
|
"total_bytes": {
|
|
"type": "number"
|
|
},
|
|
"available_bytes": {
|
|
"type": "number"
|
|
},
|
|
"used_bytes": {
|
|
"type": "number"
|
|
},
|
|
"usage_percent": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
"CheckDiskInfo": {
|
|
"type": "object",
|
|
"description": "Disk information for infrastructure checks",
|
|
"properties": {
|
|
"device": {
|
|
"type": "string"
|
|
},
|
|
"mountpoint": {
|
|
"type": "string"
|
|
},
|
|
"read_speed_bytes": {
|
|
"type": "number"
|
|
},
|
|
"write_speed_bytes": {
|
|
"type": "number"
|
|
},
|
|
"total_bytes": {
|
|
"type": "number"
|
|
},
|
|
"free_bytes": {
|
|
"type": "number"
|
|
},
|
|
"usage_percent": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
"CheckHostInfo": {
|
|
"type": "object",
|
|
"description": "Host information for infrastructure checks",
|
|
"properties": {
|
|
"os": {
|
|
"type": "string"
|
|
},
|
|
"platform": {
|
|
"type": "string"
|
|
},
|
|
"kernel_version": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"CheckErrorInfo": {
|
|
"type": "object",
|
|
"description": "Error information from checks",
|
|
"properties": {
|
|
"metric": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"err": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"CheckCaptureInfo": {
|
|
"type": "object",
|
|
"description": "Capture agent information",
|
|
"properties": {
|
|
"version": {
|
|
"type": "string"
|
|
},
|
|
"mode": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"CheckNetworkInfo": {
|
|
"type": "object",
|
|
"description": "Network interface information",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"bytes_sent": {
|
|
"type": "number"
|
|
},
|
|
"bytes_recv": {
|
|
"type": "number"
|
|
},
|
|
"packets_sent": {
|
|
"type": "number"
|
|
},
|
|
"packets_recv": {
|
|
"type": "number"
|
|
},
|
|
"err_in": {
|
|
"type": "number"
|
|
},
|
|
"err_out": {
|
|
"type": "number"
|
|
},
|
|
"drop_in": {
|
|
"type": "number"
|
|
},
|
|
"drop_out": {
|
|
"type": "number"
|
|
},
|
|
"fifo_in": {
|
|
"type": "number"
|
|
},
|
|
"fifo_out": {
|
|
"type": "number"
|
|
}
|
|
}
|
|
},
|
|
"CheckAudits": {
|
|
"type": "object",
|
|
"description": "PageSpeed audit results",
|
|
"properties": {
|
|
"cls": {
|
|
"$ref": "#/components/schemas/LighthouseAudit"
|
|
},
|
|
"si": {
|
|
"$ref": "#/components/schemas/LighthouseAudit"
|
|
},
|
|
"fcp": {
|
|
"$ref": "#/components/schemas/LighthouseAudit"
|
|
},
|
|
"lcp": {
|
|
"$ref": "#/components/schemas/LighthouseAudit"
|
|
},
|
|
"tbt": {
|
|
"$ref": "#/components/schemas/LighthouseAudit"
|
|
}
|
|
}
|
|
},
|
|
"LighthouseAudit": {
|
|
"type": "object",
|
|
"description": "Individual Lighthouse audit result",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string"
|
|
},
|
|
"title": {
|
|
"type": "string"
|
|
},
|
|
"score": {
|
|
"type": "number"
|
|
},
|
|
"displayValue": {
|
|
"type": "string"
|
|
},
|
|
"numericValue": {
|
|
"type": "number"
|
|
},
|
|
"numericUnit": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|