{
  "openapi": "3.0.1",
  "info": {
    "title": "Halo",
    "version": "2.17.0-SNAPSHOT"
  },
  "servers": [
    {
      "url": "http://localhost:8091",
      "description": "Generated server url"
    }
  ],
  "security": [
    {
      "basicAuth": [],
      "bearerAuth": []
    }
  ],
  "paths": {
    "/apis/api.halo.run/v1alpha1/comments": {
      "get": {
        "description": "List comments.",
        "operationId": "ListComments",
        "parameters": [
          {
            "description": "Page number. Default is 0.",
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "Size number. Default is 0.",
            "in": "query",
            "name": "size",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
            "in": "query",
            "name": "sort",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "description": "The comment subject group.",
            "in": "query",
            "name": "group",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The comment subject version.",
            "in": "query",
            "name": "version",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The comment subject kind.",
            "in": "query",
            "name": "kind",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The comment subject name.",
            "in": "query",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Whether to include replies. Default is false.",
            "in": "query",
            "name": "withReplies",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Reply size of the comment, default is 10, only works when withReplies is true.",
            "in": "query",
            "name": "replySize",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/CommentWithReplyVoList"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "CommentV1alpha1Public"
        ]
      },
      "post": {
        "description": "Create a comment.",
        "operationId": "CreateComment",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CommentRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/Comment"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "CommentV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/comments/{name}": {
      "get": {
        "description": "Get a comment.",
        "operationId": "GetComment",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/CommentVoList"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "CommentV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/comments/{name}/reply": {
      "get": {
        "description": "List comment replies.",
        "operationId": "ListCommentReplies",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Page number. Default is 0.",
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "Size number. Default is 0.",
            "in": "query",
            "name": "size",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/ReplyVoList"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "CommentV1alpha1Public"
        ]
      },
      "post": {
        "description": "Create a reply.",
        "operationId": "CreateReply",
        "parameters": [
          {
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReplyRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/Reply"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "CommentV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/indices/-/search": {
      "post": {
        "description": "Search indices.",
        "operationId": "IndicesSearch",
        "requestBody": {
          "content": {
            "*/*": {
              "schema": {
                "$ref": "#/components/schemas/SearchOption"
              }
            }
          },
          "description": "Please note that the \"filterPublished\", \"filterExposed\" and \"filterRecycled\" fields are ignored in this endpoint."
        },
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResult"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "IndexV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/indices/post": {
      "get": {
        "deprecated": true,
        "description": "Search posts with fuzzy query. This method is deprecated, please use POST /indices/-/search instead.",
        "operationId": "SearchPost",
        "parameters": [
          {
            "description": "Keyword to search",
            "in": "query",
            "name": "keyword",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Limit of search results",
            "in": "query",
            "name": "limit",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "Highlight pre tag",
            "in": "query",
            "name": "highlightPreTag",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Highlight post tag",
            "in": "query",
            "name": "highlightPostTag",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResult"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "IndexV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/menus/-": {
      "get": {
        "description": "Gets primary menu.",
        "operationId": "queryPrimaryMenu",
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/MenuVo"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "MenuV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/menus/{name}": {
      "get": {
        "description": "Gets menu by name.",
        "operationId": "queryMenuByName",
        "parameters": [
          {
            "description": "Menu name",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/MenuVo"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "MenuV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/stats/-": {
      "get": {
        "description": "Gets site stats",
        "operationId": "queryStats",
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/SiteStatsVo"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "SystemV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/trackers/counter": {
      "post": {
        "description": "Count an extension resource visits.",
        "operationId": "count",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CounterRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "content": {},
            "description": "default response"
          }
        },
        "tags": [
          "MetricsV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/trackers/downvote": {
      "post": {
        "description": "Downvote an extension resource.",
        "operationId": "downvote",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VoteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "content": {},
            "description": "default response"
          }
        },
        "tags": [
          "MetricsV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/trackers/upvote": {
      "post": {
        "description": "Upvote an extension resource.",
        "operationId": "upvote",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VoteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "content": {},
            "description": "default response"
          }
        },
        "tags": [
          "MetricsV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/users/-/send-password-reset-email": {
      "post": {
        "description": "Send password reset email when forgot password",
        "operationId": "SendPasswordResetEmail",
        "requestBody": {
          "content": {
            "*/*": {
              "schema": {
                "$ref": "#/components/schemas/PasswordResetEmailRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204 NO_CONTENT": {
            "content": {},
            "description": "default response"
          }
        },
        "tags": [
          "UserV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/users/-/send-register-verify-email": {
      "post": {
        "description": "Send registration verification email, which can be called when mustVerifyEmailOnRegistration in user settings is true",
        "operationId": "SendRegisterVerifyEmail",
        "requestBody": {
          "content": {
            "*/*": {
              "schema": {
                "$ref": "#/components/schemas/RegisterVerifyEmailRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204 NO_CONTENT": {
            "content": {},
            "description": "default response"
          }
        },
        "tags": [
          "UserV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/users/-/signup": {
      "post": {
        "description": "Sign up a new user",
        "operationId": "SignUp",
        "requestBody": {
          "content": {
            "*/*": {
              "schema": {
                "$ref": "#/components/schemas/SignUpRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "default": {
            "content": {
              "*/*": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            },
            "description": "default response"
          }
        },
        "tags": [
          "UserV1alpha1Public"
        ]
      }
    },
    "/apis/api.halo.run/v1alpha1/users/{name}/reset-password": {
      "put": {
        "description": "Reset password by token",
        "operationId": "ResetPasswordByToken",
        "parameters": [
          {
            "description": "The name of the user",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "*/*": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204 NO_CONTENT": {
            "content": {},
            "description": "default response"
          }
        },
        "tags": [
          "UserV1alpha1Public"
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "AddOperation": {
        "required": [
          "op",
          "path",
          "value"
        ],
        "type": "object",
        "properties": {
          "op": {
            "type": "string",
            "enum": [
              "add"
            ]
          },
          "path": {
            "pattern": "^(/[^/~]*(~[01][^/~]*)*)*$",
            "type": "string",
            "description": "A JSON Pointer path pointing to the location to move/copy from.",
            "example": "/a/b/c"
          },
          "value": {
            "description": "Value can be any JSON value"
          }
        }
      },
      "Comment": {
        "required": [
          "apiVersion",
          "kind",
          "metadata",
          "spec"
        ],
        "type": "object",
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/components/schemas/Metadata"
          },
          "spec": {
            "$ref": "#/components/schemas/CommentSpec"
          },
          "status": {
            "$ref": "#/components/schemas/CommentStatus"
          }
        }
      },
      "CommentEmailOwner": {
        "type": "object",
        "properties": {
          "avatar": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "website": {
            "type": "string"
          }
        }
      },
      "CommentOwner": {
        "required": [
          "kind",
          "name"
        ],
        "type": "object",
        "properties": {
          "annotations": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "displayName": {
            "type": "string"
          },
          "kind": {
            "minLength": 1,
            "type": "string"
          },
          "name": {
            "maxLength": 64,
            "type": "string"
          }
        }
      },
      "CommentRequest": {
        "required": [
          "content",
          "raw",
          "subjectRef"
        ],
        "type": "object",
        "properties": {
          "allowNotification": {
            "type": "boolean",
            "default": false
          },
          "content": {
            "minLength": 1,
            "type": "string"
          },
          "owner": {
            "$ref": "#/components/schemas/CommentEmailOwner"
          },
          "raw": {
            "minLength": 1,
            "type": "string"
          },
          "subjectRef": {
            "$ref": "#/components/schemas/Ref"
          }
        }
      },
      "CommentSpec": {
        "required": [
          "allowNotification",
          "approved",
          "content",
          "hidden",
          "owner",
          "priority",
          "raw",
          "subjectRef",
          "top"
        ],
        "type": "object",
        "properties": {
          "allowNotification": {
            "type": "boolean",
            "default": true
          },
          "approved": {
            "type": "boolean",
            "default": false
          },
          "approvedTime": {
            "type": "string",
            "format": "date-time"
          },
          "content": {
            "minLength": 1,
            "type": "string"
          },
          "creationTime": {
            "type": "string",
            "format": "date-time"
          },
          "hidden": {
            "type": "boolean",
            "default": false
          },
          "ipAddress": {
            "type": "string"
          },
          "lastReadTime": {
            "type": "string",
            "format": "date-time"
          },
          "owner": {
            "$ref": "#/components/schemas/CommentOwner"
          },
          "priority": {
            "type": "integer",
            "format": "int32",
            "default": 0
          },
          "raw": {
            "minLength": 1,
            "type": "string"
          },
          "subjectRef": {
            "$ref": "#/components/schemas/Ref"
          },
          "top": {
            "type": "boolean",
            "default": false
          },
          "userAgent": {
            "type": "string"
          }
        }
      },
      "CommentStatsVo": {
        "type": "object",
        "properties": {
          "upvote": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "CommentStatus": {
        "type": "object",
        "properties": {
          "hasNewReply": {
            "type": "boolean"
          },
          "lastReplyTime": {
            "type": "string",
            "format": "date-time"
          },
          "observedVersion": {
            "type": "integer",
            "format": "int64"
          },
          "replyCount": {
            "type": "integer",
            "format": "int32"
          },
          "unreadReplyCount": {
            "type": "integer",
            "format": "int32"
          },
          "visibleReplyCount": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "CommentVo": {
        "required": [
          "metadata",
          "owner",
          "spec",
          "stats"
        ],
        "type": "object",
        "properties": {
          "metadata": {
            "$ref": "#/components/schemas/Metadata"
          },
          "owner": {
            "$ref": "#/components/schemas/OwnerInfo"
          },
          "spec": {
            "$ref": "#/components/schemas/CommentSpec"
          },
          "stats": {
            "$ref": "#/components/schemas/CommentStatsVo"
          },
          "status": {
            "$ref": "#/components/schemas/CommentStatus"
          }
        },
        "description": "A chunk of items."
      },
      "CommentVoList": {
        "required": [
          "first",
          "hasNext",
          "hasPrevious",
          "items",
          "last",
          "page",
          "size",
          "total",
          "totalPages"
        ],
        "type": "object",
        "properties": {
          "first": {
            "type": "boolean",
            "description": "Indicates whether current page is the first page."
          },
          "hasNext": {
            "type": "boolean",
            "description": "Indicates whether current page has previous page."
          },
          "hasPrevious": {
            "type": "boolean",
            "description": "Indicates whether current page has previous page."
          },
          "items": {
            "type": "array",
            "description": "A chunk of items.",
            "items": {
              "$ref": "#/components/schemas/CommentVo"
            }
          },
          "last": {
            "type": "boolean",
            "description": "Indicates whether current page is the last page."
          },
          "page": {
            "type": "integer",
            "description": "Page number, starts from 1. If not set or equal to 0, it means no pagination.",
            "format": "int32"
          },
          "size": {
            "type": "integer",
            "description": "Size of each page. If not set or equal to 0, it means no pagination.",
            "format": "int32"
          },
          "total": {
            "type": "integer",
            "description": "Total elements.",
            "format": "int64"
          },
          "totalPages": {
            "type": "integer",
            "description": "Indicates total pages.",
            "format": "int64"
          }
        }
      },
      "CommentWithReplyVo": {
        "required": [
          "metadata",
          "owner",
          "spec",
          "stats"
        ],
        "type": "object",
        "properties": {
          "metadata": {
            "$ref": "#/components/schemas/Metadata"
          },
          "owner": {
            "$ref": "#/components/schemas/OwnerInfo"
          },
          "replies": {
            "$ref": "#/components/schemas/ListResultReplyVo"
          },
          "spec": {
            "$ref": "#/components/schemas/CommentSpec"
          },
          "stats": {
            "$ref": "#/components/schemas/CommentStatsVo"
          },
          "status": {
            "$ref": "#/components/schemas/CommentStatus"
          }
        },
        "description": "A chunk of items."
      },
      "CommentWithReplyVoList": {
        "required": [
          "first",
          "hasNext",
          "hasPrevious",
          "items",
          "last",
          "page",
          "size",
          "total",
          "totalPages"
        ],
        "type": "object",
        "properties": {
          "first": {
            "type": "boolean",
            "description": "Indicates whether current page is the first page."
          },
          "hasNext": {
            "type": "boolean",
            "description": "Indicates whether current page has previous page."
          },
          "hasPrevious": {
            "type": "boolean",
            "description": "Indicates whether current page has previous page."
          },
          "items": {
            "type": "array",
            "description": "A chunk of items.",
            "items": {
              "$ref": "#/components/schemas/CommentWithReplyVo"
            }
          },
          "last": {
            "type": "boolean",
            "description": "Indicates whether current page is the last page."
          },
          "page": {
            "type": "integer",
            "description": "Page number, starts from 1. If not set or equal to 0, it means no pagination.",
            "format": "int32"
          },
          "size": {
            "type": "integer",
            "description": "Size of each page. If not set or equal to 0, it means no pagination.",
            "format": "int32"
          },
          "total": {
            "type": "integer",
            "description": "Total elements.",
            "format": "int64"
          },
          "totalPages": {
            "type": "integer",
            "description": "Indicates total pages.",
            "format": "int64"
          }
        }
      },
      "CopyOperation": {
        "required": [
          "op",
          "from",
          "path"
        ],
        "type": "object",
        "properties": {
          "from": {
            "pattern": "^(/[^/~]*(~[01][^/~]*)*)*$",
            "type": "string",
            "description": "A JSON Pointer path pointing to the location to move/copy from.",
            "example": "/a/b/c"
          },
          "op": {
            "type": "string",
            "enum": [
              "copy"
            ]
          },
          "path": {
            "pattern": "^(/[^/~]*(~[01][^/~]*)*)*$",
            "type": "string",
            "description": "A JSON Pointer path pointing to the location to move/copy from.",
            "example": "/a/b/c"
          }
        }
      },
      "CounterRequest": {
        "type": "object",
        "properties": {
          "group": {
            "type": "string"
          },
          "hostname": {
            "type": "string"
          },
          "language": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "plural": {
            "type": "string"
          },
          "referrer": {
            "type": "string"
          },
          "screen": {
            "type": "string"
          }
        }
      },
      "HaloDocument": {
        "required": [
          "content",
          "id",
          "metadataName",
          "ownerName",
          "permalink",
          "title",
          "type"
        ],
        "type": "object",
        "properties": {
          "annotations": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "content": {
            "type": "string"
          },
          "creationTimestamp": {
            "type": "string",
            "format": "date-time"
          },
          "description": {
            "type": "string"
          },
          "exposed": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "metadataName": {
            "type": "string"
          },
          "ownerName": {
            "type": "string"
          },
          "permalink": {
            "type": "string"
          },
          "published": {
            "type": "boolean"
          },
          "recycled": {
            "type": "boolean"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "title": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "updateTimestamp": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "JsonPatch": {
        "minItems": 1,
        "uniqueItems": true,
        "type": "array",
        "description": "JSON schema for JSONPatch operations",
        "items": {
          "oneOf": [
            {
              "$ref": "#/components/schemas/AddOperation"
            },
            {
              "$ref": "#/components/schemas/ReplaceOperation"
            },
            {
              "$ref": "#/components/schemas/TestOperation"
            },
            {
              "$ref": "#/components/schemas/RemoveOperation"
            },
            {
              "$ref": "#/components/schemas/MoveOperation"
            },
            {
              "$ref": "#/components/schemas/CopyOperation"
            }
          ]
        }
      },
      "ListResultReplyVo": {
        "required": [
          "first",
          "hasNext",
          "hasPrevious",
          "items",
          "last",
          "page",
          "size",
          "total",
          "totalPages"
        ],
        "type": "object",
        "properties": {
          "first": {
            "type": "boolean",
            "description": "Indicates whether current page is the first page."
          },
          "hasNext": {
            "type": "boolean",
            "description": "Indicates whether current page has previous page."
          },
          "hasPrevious": {
            "type": "boolean",
            "description": "Indicates whether current page has previous page."
          },
          "items": {
            "type": "array",
            "description": "A chunk of items.",
            "items": {
              "$ref": "#/components/schemas/ReplyVo"
            }
          },
          "last": {
            "type": "boolean",
            "description": "Indicates whether current page is the last page."
          },
          "page": {
            "type": "integer",
            "description": "Page number, starts from 1. If not set or equal to 0, it means no pagination.",
            "format": "int32"
          },
          "size": {
            "type": "integer",
            "description": "Size of each page. If not set or equal to 0, it means no pagination.",
            "format": "int32"
          },
          "total": {
            "type": "integer",
            "description": "Total elements.",
            "format": "int64"
          },
          "totalPages": {
            "type": "integer",
            "description": "Indicates total pages.",
            "format": "int64"
          }
        }
      },
      "LoginHistory": {
        "required": [
          "loginAt",
          "sourceIp",
          "successful",
          "userAgent"
        ],
        "type": "object",
        "properties": {
          "loginAt": {
            "type": "string",
            "format": "date-time"
          },
          "reason": {
            "type": "string"
          },
          "sourceIp": {
            "type": "string"
          },
          "successful": {
            "type": "boolean"
          },
          "userAgent": {
            "type": "string"
          }
        }
      },
      "MenuItemSpec": {
        "type": "object",
        "properties": {
          "children": {
            "uniqueItems": true,
            "type": "array",
            "description": "Children of this menu item",
            "items": {
              "type": "string",
              "description": "The name of menu item child"
            }
          },
          "displayName": {
            "type": "string",
            "description": "The display name of menu item."
          },
          "href": {
            "type": "string",
            "description": "The href of this menu item."
          },
          "priority": {
            "type": "integer",
            "description": "The priority is for ordering.",
            "format": "int32"
          },
          "target": {
            "type": "string",
            "description": "The \u003ca\u003e target attribute of this menu item.",
            "enum": [
              "_blank",
              "_self",
              "_parent",
              "_top"
            ]
          },
          "targetRef": {
            "$ref": "#/components/schemas/Ref"
          }
        }
      },
      "MenuItemStatus": {
        "type": "object",
        "properties": {
          "displayName": {
            "type": "string",
            "description": "Calculated Display name of menu item."
          },
          "href": {
            "type": "string",
            "description": "Calculated href of manu item."
          }
        }
      },
      "MenuItemVo": {
        "required": [
          "metadata"
        ],
        "type": "object",
        "properties": {
          "displayName": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/components/schemas/Metadata"
          },
          "parentName": {
            "type": "string"
          },
          "spec": {
            "$ref": "#/components/schemas/MenuItemSpec"
          },
          "status": {
            "$ref": "#/components/schemas/MenuItemStatus"
          }
        }
      },
      "MenuSpec": {
        "required": [
          "displayName"
        ],
        "type": "object",
        "properties": {
          "displayName": {
            "type": "string",
            "description": "The display name of the menu."
          },
          "menuItems": {
            "uniqueItems": true,
            "type": "array",
            "description": "Names of menu children below this menu.",
            "items": {
              "type": "string",
              "description": "Names of menu children below this menu."
            }
          }
        }
      },
      "MenuVo": {
        "required": [
          "metadata"
        ],
        "type": "object",
        "properties": {
          "menuItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MenuItemVo"
            }
          },
          "metadata": {
            "$ref": "#/components/schemas/Metadata"
          },
          "spec": {
            "$ref": "#/components/schemas/MenuSpec"
          }
        }
      },
      "Metadata": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "annotations": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "creationTimestamp": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "deletionTimestamp": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "finalizers": {
            "uniqueItems": true,
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string",
              "nullable": true
            }
          },
          "generateName": {
            "type": "string",
            "description": "The name field will be generated automatically according to the given generateName field"
          },
          "labels": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "name": {
            "type": "string",
            "description": "Metadata name"
          },
          "version": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          }
        }
      },
      "MoveOperation": {
        "required": [
          "op",
          "from",
          "path"
        ],
        "type": "object",
        "properties": {
          "from": {
            "pattern": "^(/[^/~]*(~[01][^/~]*)*)*$",
            "type": "string",
            "description": "A JSON Pointer path pointing to the location to move/copy from.",
            "example": "/a/b/c"
          },
          "op": {
            "type": "string",
            "enum": [
              "move"
            ]
          },
          "path": {
            "pattern": "^(/[^/~]*(~[01][^/~]*)*)*$",
            "type": "string",
            "description": "A JSON Pointer path pointing to the location to move/copy from.",
            "example": "/a/b/c"
          }
        }
      },
      "OwnerInfo": {
        "type": "object",
        "properties": {
          "avatar": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "PasswordResetEmailRequest": {
        "required": [
          "email",
          "username"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "username": {
            "type": "string"
          }
        }
      },
      "Ref": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "group": {
            "type": "string",
            "description": "Extension group"
          },
          "kind": {
            "type": "string",
            "description": "Extension kind"
          },
          "name": {
            "type": "string",
            "description": "Extension name. This field is mandatory"
          },
          "version": {
            "type": "string",
            "description": "Extension version"
          }
        },
        "description": "Extension reference object. The name is mandatory"
      },
      "RegisterVerifyEmailRequest": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          }
        }
      },
      "RemoveOperation": {
        "required": [
          "op",
          "path"
        ],
        "type": "object",
        "properties": {
          "op": {
            "type": "string",
            "enum": [
              "remove"
            ]
          },
          "path": {
            "pattern": "^(/[^/~]*(~[01][^/~]*)*)*$",
            "type": "string",
            "description": "A JSON Pointer path pointing to the location to move/copy from.",
            "example": "/a/b/c"
          }
        }
      },
      "ReplaceOperation": {
        "required": [
          "op",
          "path",
          "value"
        ],
        "type": "object",
        "properties": {
          "op": {
            "type": "string",
            "enum": [
              "replace"
            ]
          },
          "path": {
            "pattern": "^(/[^/~]*(~[01][^/~]*)*)*$",
            "type": "string",
            "description": "A JSON Pointer path pointing to the location to move/copy from.",
            "example": "/a/b/c"
          },
          "value": {
            "description": "Value can be any JSON value"
          }
        }
      },
      "Reply": {
        "required": [
          "apiVersion",
          "kind",
          "metadata",
          "spec",
          "status"
        ],
        "type": "object",
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/components/schemas/Metadata"
          },
          "spec": {
            "$ref": "#/components/schemas/ReplySpec"
          },
          "status": {
            "$ref": "#/components/schemas/ReplyStatus"
          }
        }
      },
      "ReplyRequest": {
        "required": [
          "content",
          "raw"
        ],
        "type": "object",
        "properties": {
          "allowNotification": {
            "type": "boolean",
            "default": false
          },
          "content": {
            "minLength": 1,
            "type": "string"
          },
          "owner": {
            "$ref": "#/components/schemas/CommentEmailOwner"
          },
          "quoteReply": {
            "type": "string"
          },
          "raw": {
            "minLength": 1,
            "type": "string"
          }
        }
      },
      "ReplySpec": {
        "required": [
          "allowNotification",
          "approved",
          "commentName",
          "content",
          "hidden",
          "owner",
          "priority",
          "raw",
          "top"
        ],
        "type": "object",
        "properties": {
          "allowNotification": {
            "type": "boolean",
            "default": true
          },
          "approved": {
            "type": "boolean",
            "default": false
          },
          "approvedTime": {
            "type": "string",
            "format": "date-time"
          },
          "commentName": {
            "minLength": 1,
            "type": "string"
          },
          "content": {
            "minLength": 1,
            "type": "string"
          },
          "creationTime": {
            "type": "string",
            "format": "date-time"
          },
          "hidden": {
            "type": "boolean",
            "default": false
          },
          "ipAddress": {
            "type": "string"
          },
          "owner": {
            "$ref": "#/components/schemas/CommentOwner"
          },
          "priority": {
            "type": "integer",
            "format": "int32",
            "default": 0
          },
          "quoteReply": {
            "type": "string"
          },
          "raw": {
            "minLength": 1,
            "type": "string"
          },
          "top": {
            "type": "boolean",
            "default": false
          },
          "userAgent": {
            "type": "string"
          }
        }
      },
      "ReplyStatus": {
        "type": "object",
        "properties": {
          "observedVersion": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "ReplyVo": {
        "required": [
          "metadata",
          "owner",
          "spec",
          "stats"
        ],
        "type": "object",
        "properties": {
          "metadata": {
            "$ref": "#/components/schemas/Metadata"
          },
          "owner": {
            "$ref": "#/components/schemas/OwnerInfo"
          },
          "spec": {
            "$ref": "#/components/schemas/ReplySpec"
          },
          "stats": {
            "$ref": "#/components/schemas/CommentStatsVo"
          }
        },
        "description": "A chunk of items."
      },
      "ReplyVoList": {
        "required": [
          "first",
          "hasNext",
          "hasPrevious",
          "items",
          "last",
          "page",
          "size",
          "total",
          "totalPages"
        ],
        "type": "object",
        "properties": {
          "first": {
            "type": "boolean",
            "description": "Indicates whether current page is the first page."
          },
          "hasNext": {
            "type": "boolean",
            "description": "Indicates whether current page has previous page."
          },
          "hasPrevious": {
            "type": "boolean",
            "description": "Indicates whether current page has previous page."
          },
          "items": {
            "type": "array",
            "description": "A chunk of items.",
            "items": {
              "$ref": "#/components/schemas/ReplyVo"
            }
          },
          "last": {
            "type": "boolean",
            "description": "Indicates whether current page is the last page."
          },
          "page": {
            "type": "integer",
            "description": "Page number, starts from 1. If not set or equal to 0, it means no pagination.",
            "format": "int32"
          },
          "size": {
            "type": "integer",
            "description": "Size of each page. If not set or equal to 0, it means no pagination.",
            "format": "int32"
          },
          "total": {
            "type": "integer",
            "description": "Total elements.",
            "format": "int64"
          },
          "totalPages": {
            "type": "integer",
            "description": "Indicates total pages.",
            "format": "int64"
          }
        }
      },
      "ResetPasswordRequest": {
        "required": [
          "newPassword",
          "token"
        ],
        "type": "object",
        "properties": {
          "newPassword": {
            "minLength": 6,
            "type": "string"
          },
          "token": {
            "type": "string"
          }
        }
      },
      "SearchOption": {
        "required": [
          "keyword"
        ],
        "type": "object",
        "properties": {
          "annotations": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "filterExposed": {
            "type": "boolean"
          },
          "filterPublished": {
            "type": "boolean"
          },
          "filterRecycled": {
            "type": "boolean"
          },
          "highlightPostTag": {
            "type": "string"
          },
          "highlightPreTag": {
            "type": "string"
          },
          "includeCategoryNames": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "includeOwnerNames": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "includeTagNames": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "includeTypes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "keyword": {
            "type": "string"
          },
          "limit": {
            "maximum": 1000,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "SearchResult": {
        "type": "object",
        "properties": {
          "hits": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HaloDocument"
            }
          },
          "keyword": {
            "type": "string"
          },
          "limit": {
            "type": "integer",
            "format": "int32"
          },
          "processingTimeMillis": {
            "type": "integer",
            "format": "int64"
          },
          "total": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "SignUpRequest": {
        "required": [
          "password",
          "user"
        ],
        "type": "object",
        "properties": {
          "password": {
            "minLength": 6,
            "type": "string"
          },
          "user": {
            "$ref": "#/components/schemas/User"
          },
          "verifyCode": {
            "maxLength": 6,
            "minLength": 6,
            "type": "string"
          }
        }
      },
      "SiteStatsVo": {
        "type": "object",
        "properties": {
          "category": {
            "type": "integer",
            "format": "int32"
          },
          "comment": {
            "type": "integer",
            "format": "int32"
          },
          "post": {
            "type": "integer",
            "format": "int32"
          },
          "upvote": {
            "type": "integer",
            "format": "int32"
          },
          "visit": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "TestOperation": {
        "required": [
          "op",
          "path",
          "value"
        ],
        "type": "object",
        "properties": {
          "op": {
            "type": "string",
            "enum": [
              "test"
            ]
          },
          "path": {
            "pattern": "^(/[^/~]*(~[01][^/~]*)*)*$",
            "type": "string",
            "description": "A JSON Pointer path pointing to the location to move/copy from.",
            "example": "/a/b/c"
          },
          "value": {
            "description": "Value can be any JSON value"
          }
        }
      },
      "User": {
        "required": [
          "apiVersion",
          "kind",
          "metadata",
          "spec"
        ],
        "type": "object",
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/components/schemas/Metadata"
          },
          "spec": {
            "$ref": "#/components/schemas/UserSpec"
          },
          "status": {
            "$ref": "#/components/schemas/UserStatus"
          }
        }
      },
      "UserSpec": {
        "required": [
          "displayName",
          "email"
        ],
        "type": "object",
        "properties": {
          "avatar": {
            "type": "string"
          },
          "bio": {
            "type": "string"
          },
          "disabled": {
            "type": "boolean"
          },
          "displayName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "emailVerified": {
            "type": "boolean"
          },
          "loginHistoryLimit": {
            "type": "integer",
            "format": "int32"
          },
          "password": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "registeredAt": {
            "type": "string",
            "format": "date-time"
          },
          "totpEncryptedSecret": {
            "type": "string"
          },
          "twoFactorAuthEnabled": {
            "type": "boolean"
          }
        }
      },
      "UserStatus": {
        "type": "object",
        "properties": {
          "lastLoginAt": {
            "type": "string",
            "format": "date-time"
          },
          "loginHistories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LoginHistory"
            }
          },
          "permalink": {
            "type": "string"
          }
        }
      },
      "VoteRequest": {
        "type": "object",
        "properties": {
          "group": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "plural": {
            "type": "string"
          }
        }
      }
    },
    "securitySchemes": {
      "basicAuth": {
        "scheme": "basic",
        "type": "http"
      },
      "bearerAuth": {
        "bearerFormat": "JWT",
        "scheme": "bearer",
        "type": "http"
      }
    }
  }
}