docusaurus-openapi-docs icon indicating copy to clipboard operation
docusaurus-openapi-docs copied to clipboard

Describe group by options

Open thomasheartman opened this issue 3 years ago β€’ 9 comments

Documentation link

The main readme and in the generated docs, under the "Config" section: https://github.com/PaloAltoNetworks/docusaurus-openapi-docs#config

Describe the problem

I'm trying to understand what the various group by options do. You can only choose "tag" or null for now, but does it make a difference? And how is it supposed to group them?

It's not clear to me what it means to "group" in this case. Even groupPathsBy set to "tag", I get all docs in a single, flat structure. There doesn't seem to be any grouping going on:

image

We definitely have tags. They appear to be correctly applied on a generated swagger UI page and do appear in the generated openapi.json document.

I also don't understand what the categoryLinkSource is supposed to do, but maybe because I'm not seeing any groupings?

So I might be doing something wrong or I might just be misunderstanding what the options are supposed to do.

Suggested fix

Elaborate on these options in the documentation, and preferably also add screenshots clearly showing the difference between the various options. I'd also love some help with understanding the behavior right here πŸ˜…

Bonus: typo in "sidebars doc"

The Sidebars doc says:

Using the generated-index feature to create an index of all paths/endpoints availabke under a tag.

It should probably be:

Using the generated-index feature to create an index of all paths/endpoints available under a tag.

thomasheartman avatar Aug 08 '22 11:08 thomasheartman

:tada: Thanks for opening your first issue here! Welcome to the community!

Hi @thomasheartman, thanks for your feedback. I agree that groupPathsBy can be documented better.

Grouping by "tag" is intended to group operations (path + method) by the first tag value (although there is a bug that ends up grouping by all tags if more than one is present). It also requires that the tag(s) be defined at the root level of the OpenAPI spec in addition to being listed under each operation (method). I would check to make sure your tags are defined under each operation and at the root level.

In theory, we will eventually support grouping in other ways, such as by specification/file (when dealing with multi-spec) but the tech specs are still being fleshed out. Another idea is to add support for vendor extensions like ReDoc's x-tagGroups: https://redocly.com/docs/api-reference-docs/specification-extensions/x-tag-groups/ but it gets complicated when handling multi-spec.

The categoryLinkSource option is for determining which source to use as the category link description, whether linking to a doc or a generated-index. See this for more details. Unless you're handling multi-spec, you'll probably always choose "tag" as the categoryLinkSource. What this means is that the description defined under the root level OpenAPI tags will be used as the category link description for the generated-index. Sorry if that's confusing, but the intent was to carry over the tag description to use as the generated-index description. The idea is if you're grouping by tag, a tag's description should best describe the operations under that tag grouping.

sserrata avatar Aug 08 '22 14:08 sserrata

Hey, @sserrata! Thanks for the response and the explanation πŸ˜„ I thought we already did list our tags at the root level, but apparently not. However, now that we do, I'm still not seeing them. Would you have any idea why?

I don't have time to do a full deep dive now (it's late in the day here), but just thought I'd mention it in case you have other ideas. I'll probably get back to you tomorrow with a more thorough investigation.

If it helps, here's the current spec we're using (heads up: it's about 6000 lines 😱 ):

OpenAPI schema in json format
{
  "openapi": "3.0.3",
  "servers": [
    {
      "url": "http://localhost:4242"
    }
  ],
  "info": {
    "title": "Unleash API",
    "version": "4.14.0"
  },
  "security": [
    {
      "apiKey": []
    }
  ],
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "Authorization"
      }
    },
    "schemas": {
      "addonParameterSchema": {
        "type": "object",
        "required": [
          "name",
          "displayName",
          "type",
          "required",
          "sensitive"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "placeholder": {
            "type": "string"
          },
          "required": {
            "type": "boolean"
          },
          "sensitive": {
            "type": "boolean"
          }
        }
      },
      "addonSchema": {
        "type": "object",
        "required": [
          "provider",
          "enabled",
          "parameters",
          "events"
        ],
        "properties": {
          "id": {
            "type": "number"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "provider": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "parameters": {
            "type": "object",
            "additionalProperties": true
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "projects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "environments": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "addonsSchema": {
        "type": "object",
        "required": [
          "addons",
          "providers"
        ],
        "properties": {
          "addons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/addonSchema"
            }
          },
          "providers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/addonTypeSchema"
            }
          }
        }
      },
      "addonTypeSchema": {
        "type": "object",
        "required": [
          "name",
          "displayName",
          "documentationUrl",
          "description"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "documentationUrl": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "tagTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/tagTypeSchema"
            }
          },
          "parameters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/addonParameterSchema"
            }
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "apiTokenSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "username",
          "type"
        ],
        "properties": {
          "secret": {
            "type": "string"
          },
          "username": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "client, admin."
          },
          "environment": {
            "type": "string"
          },
          "project": {
            "type": "string"
          },
          "projects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "seenAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "apiTokensSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "tokens"
        ],
        "properties": {
          "tokens": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/apiTokenSchema"
            }
          }
        }
      },
      "applicationSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "appName"
        ],
        "properties": {
          "appName": {
            "type": "string"
          },
          "sdkVersion": {
            "type": "string"
          },
          "strategies": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "description": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "color": {
            "type": "string"
          },
          "icon": {
            "type": "string"
          },
          "announced": {
            "type": "boolean"
          }
        }
      },
      "applicationsSchema": {
        "type": "object",
        "properties": {
          "applications": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/applicationSchema"
            }
          }
        }
      },
      "bootstrapUiSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "uiConfig",
          "user",
          "email",
          "context",
          "featureTypes",
          "tagTypes",
          "strategies",
          "projects"
        ],
        "properties": {
          "uiConfig": {
            "$ref": "#/components/schemas/uiConfigSchema"
          },
          "user": {
            "type": "object",
            "required": [
              "id"
            ],
            "properties": {
              "id": {
                "type": "number"
              },
              "isAPI": {
                "type": "boolean"
              },
              "name": {
                "type": "string"
              },
              "email": {
                "type": "string"
              },
              "username": {
                "type": "string"
              },
              "imageUrl": {
                "type": "string"
              },
              "inviteLink": {
                "type": "string"
              },
              "loginAttempts": {
                "type": "number"
              },
              "emailSent": {
                "type": "boolean"
              },
              "rootRole": {
                "type": "number"
              },
              "seenAt": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "createdAt": {
                "type": "string",
                "format": "date-time"
              },
              "permissions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/permissionSchema"
                }
              }
            }
          },
          "email": {
            "type": "boolean"
          },
          "context": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/contextFieldSchema"
            }
          },
          "featureTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureTypeSchema"
            }
          },
          "tagTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/tagTypeSchema"
            }
          },
          "strategies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/strategySchema"
            }
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/projectSchema"
            }
          }
        }
      },
      "changePasswordSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "token",
          "password"
        ],
        "properties": {
          "token": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        }
      },
      "clientApplicationSchema": {
        "type": "object",
        "required": [
          "appName",
          "interval",
          "started",
          "strategies"
        ],
        "properties": {
          "appName": {
            "type": "string"
          },
          "instanceId": {
            "type": "string"
          },
          "sdkVersion": {
            "type": "string"
          },
          "environment": {
            "type": "string"
          },
          "interval": {
            "type": "number"
          },
          "started": {
            "oneOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "number"
              }
            ]
          },
          "strategies": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "clientFeatureSchema": {
        "type": "object",
        "required": [
          "name",
          "enabled"
        ],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastSeenAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "enabled": {
            "type": "boolean"
          },
          "stale": {
            "type": "boolean"
          },
          "impressionData": {
            "type": "boolean",
            "nullable": true
          },
          "project": {
            "type": "string"
          },
          "strategies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureStrategySchema"
            }
          },
          "variants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/clientVariantSchema"
            },
            "nullable": true
          }
        }
      },
      "clientFeaturesQuerySchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "tag": {
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "project": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "namePrefix": {
            "type": "string"
          },
          "environment": {
            "type": "string"
          },
          "inlineSegmentConstraints": {
            "type": "boolean"
          }
        }
      },
      "clientFeaturesSchema": {
        "type": "object",
        "required": [
          "version",
          "features"
        ],
        "properties": {
          "version": {
            "type": "number"
          },
          "features": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/clientFeatureSchema"
            }
          },
          "segments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/segmentSchema"
            }
          },
          "query": {
            "$ref": "#/components/schemas/clientFeaturesQuerySchema"
          }
        }
      },
      "clientMetricsSchema": {
        "type": "object",
        "required": [
          "appName",
          "bucket"
        ],
        "properties": {
          "appName": {
            "type": "string"
          },
          "instanceId": {
            "type": "string"
          },
          "environment": {
            "type": "string"
          },
          "bucket": {
            "type": "object",
            "required": [
              "start",
              "stop",
              "toggles"
            ],
            "properties": {
              "start": {
                "$ref": "#/components/schemas/dateSchema"
              },
              "stop": {
                "$ref": "#/components/schemas/dateSchema"
              },
              "toggles": {
                "type": "object",
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "yes": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "no": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "variants": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "integer",
                        "minimum": 0
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "clientVariantSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "weight"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "weight": {
            "type": "number"
          },
          "weightType": {
            "type": "string"
          },
          "stickiness": {
            "type": "string"
          },
          "payload": {
            "type": "object",
            "required": [
              "type",
              "value"
            ],
            "properties": {
              "type": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            }
          }
        }
      },
      "cloneFeatureSchema": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "replaceGroupId": {
            "type": "boolean"
          }
        }
      },
      "constraintSchema": {
        "additionalProperties": false,
        "type": "object",
        "required": [
          "contextName",
          "operator"
        ],
        "description": "A strategy constraint. For more information, refer to [the strategy constraint reference documentation](https://docs.getunleash.io/advanced/strategy_constraints)",
        "properties": {
          "contextName": {
            "description": "The name of the context field that this constraint should apply to.",
            "example": "appName",
            "type": "string"
          },
          "operator": {
            "description": "The operator to use when evaluating this constraint. For more information about the various operators, refer to [the strategy constraint operator documentation](https://docs.getunleash.io/advanced/strategy_constraints#strategy-constraint-operators).",
            "type": "string",
            "enum": [
              "NOT_IN",
              "IN",
              "STR_ENDS_WITH",
              "STR_STARTS_WITH",
              "STR_CONTAINS",
              "NUM_EQ",
              "NUM_GT",
              "NUM_GTE",
              "NUM_LT",
              "NUM_LTE",
              "DATE_AFTER",
              "DATE_BEFORE",
              "SEMVER_EQ",
              "SEMVER_GT",
              "SEMVER_LT"
            ]
          },
          "caseInsensitive": {
            "description": "Whether the operator should be case sensitive or not. Defaults to `false` (being case sensitive).",
            "type": "boolean",
            "default": false
          },
          "inverted": {
            "description": "Whether the result should be negated or not. If `true`, will turn a `true` result into a `false` result and vice versa.",
            "type": "boolean",
            "default": false
          },
          "values": {
            "type": "array",
            "description": "The context values that should be used for constraint evaluation. Use this property instead of `value` for properties that accept multiple values.",
            "items": {
              "type": "string"
            }
          },
          "value": {
            "description": "The context value that should be used for constraint evaluation. Use this property instead of `values` for properties that only accept single values.",
            "type": "string"
          }
        }
      },
      "contextFieldSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "stickiness": {
            "type": "boolean"
          },
          "sortOrder": {
            "type": "number"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "legalValues": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/legalValueSchema"
            }
          }
        }
      },
      "contextFieldsSchema": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/contextFieldSchema"
        }
      },
      "createApiTokenSchema": {
        "type": "object",
        "required": [
          "username",
          "type"
        ],
        "properties": {
          "secret": {
            "type": "string"
          },
          "username": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "client, admin."
          },
          "environment": {
            "type": "string"
          },
          "project": {
            "type": "string"
          },
          "projects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "createFeatureSchema": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "impressionData": {
            "type": "boolean"
          }
        }
      },
      "createFeatureStrategySchema": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "sortOrder": {
            "type": "number"
          },
          "constraints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/constraintSchema"
            }
          },
          "parameters": {
            "$ref": "#/components/schemas/parametersSchema"
          }
        }
      },
      "createUserSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "rootRole"
        ],
        "properties": {
          "username": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "password": {
            "type": "string"
          },
          "rootRole": {
            "type": "number"
          },
          "sendEmail": {
            "type": "boolean"
          }
        }
      },
      "dateSchema": {
        "oneOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "number"
          }
        ]
      },
      "emailSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string"
          }
        }
      },
      "environmentSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "type",
          "enabled"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "protected": {
            "type": "boolean"
          },
          "sortOrder": {
            "type": "number"
          }
        }
      },
      "environmentsSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "environments"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "environments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/environmentSchema"
            }
          }
        }
      },
      "eventSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "createdAt",
          "type",
          "createdBy"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "type": {
            "type": "string"
          },
          "createdBy": {
            "type": "string"
          },
          "environment": {
            "type": "string",
            "nullable": true
          },
          "project": {
            "type": "string",
            "nullable": true
          },
          "featureName": {
            "type": "string",
            "nullable": true
          },
          "data": {
            "type": "object",
            "nullable": true
          },
          "preData": {
            "type": "object",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/tagSchema"
            },
            "nullable": true
          }
        }
      },
      "eventsSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "events"
        ],
        "properties": {
          "version": {
            "type": "integer",
            "minimum": 1
          },
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eventSchema"
            }
          }
        }
      },
      "featureEnvironmentMetricsSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "environment",
          "timestamp",
          "yes",
          "no"
        ],
        "properties": {
          "featureName": {
            "type": "string"
          },
          "appName": {
            "type": "string"
          },
          "environment": {
            "type": "string"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time"
          },
          "yes": {
            "type": "number"
          },
          "no": {
            "type": "number"
          }
        }
      },
      "featureEnvironmentSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "enabled"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "environment": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "strategies": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "id",
                "featureName",
                "projectId",
                "environment",
                "strategyName",
                "constraints",
                "parameters"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "featureName": {
                  "type": "string"
                },
                "projectId": {
                  "type": "string"
                },
                "environment": {
                  "type": "string"
                },
                "strategyName": {
                  "type": "string"
                },
                "sortOrder": {
                  "type": "number"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time"
                },
                "constraints": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/constraintSchema"
                  }
                },
                "parameters": {
                  "$ref": "#/components/schemas/parametersSchema"
                }
              }
            }
          }
        }
      },
      "featureEventsSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "toggleName",
          "events"
        ],
        "properties": {
          "version": {
            "type": "number"
          },
          "toggleName": {
            "type": "string"
          },
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/eventSchema"
            }
          }
        }
      },
      "featureMetricsSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "maturity",
          "data"
        ],
        "properties": {
          "version": {
            "type": "number"
          },
          "maturity": {
            "type": "string"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureEnvironmentMetricsSchema"
            }
          }
        }
      },
      "featureSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "archived": {
            "type": "boolean"
          },
          "project": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "stale": {
            "type": "boolean"
          },
          "impressionData": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "archivedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastSeenAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "environments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/environmentSchema"
            }
          },
          "strategies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureStrategySchema"
            }
          },
          "variants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/variantSchema"
            }
          }
        }
      },
      "featuresSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "features"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "features": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureSchema"
            }
          }
        }
      },
      "featureStrategySchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "sortOrder": {
            "type": "number"
          },
          "segments": {
            "type": "array",
            "items": {
              "type": "number"
            }
          },
          "constraints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/constraintSchema"
            }
          },
          "parameters": {
            "$ref": "#/components/schemas/parametersSchema"
          }
        }
      },
      "featureStrategySegmentSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "segmentId",
          "featureStrategyId"
        ],
        "properties": {
          "segmentId": {
            "type": "integer"
          },
          "featureStrategyId": {
            "type": "string"
          }
        }
      },
      "featureTagSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "featureName",
          "tagValue"
        ],
        "properties": {
          "featureName": {
            "type": "string"
          },
          "tagType": {
            "type": "string"
          },
          "tagValue": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        }
      },
      "featureTypeSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "name",
          "description",
          "lifetimeDays"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "lifetimeDays": {
            "type": "number",
            "nullable": true
          }
        }
      },
      "featureTypesSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "types"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "types": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureTypeSchema"
            }
          }
        }
      },
      "featureUsageSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "maturity",
          "featureName",
          "lastHourUsage",
          "seenApplications"
        ],
        "properties": {
          "version": {
            "type": "number"
          },
          "maturity": {
            "type": "string"
          },
          "featureName": {
            "type": "string"
          },
          "lastHourUsage": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureEnvironmentMetricsSchema"
            }
          },
          "seenApplications": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "featureVariantsSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "variants"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "variants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/variantSchema"
            }
          }
        }
      },
      "feedbackSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "userId": {
            "type": "number"
          },
          "feedbackId": {
            "type": "string"
          },
          "neverShow": {
            "type": "boolean"
          },
          "given": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "groupSchema": {
        "type": "object",
        "additionalProperties": true,
        "required": [
          "name"
        ],
        "properties": {
          "id": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "createdBy": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "users": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/groupUserModelSchema"
            }
          },
          "projects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "groupsSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "groups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/groupSchema"
            }
          }
        }
      },
      "groupUserModelSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "role",
          "user"
        ],
        "properties": {
          "joinedAt": {
            "type": "string",
            "format": "date-time"
          },
          "role": {
            "type": "string"
          },
          "user": {
            "$ref": "#/components/schemas/userSchema"
          }
        }
      },
      "healthCheckSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "health"
        ],
        "properties": {
          "health": {
            "type": "string",
            "enum": [
              "GOOD",
              "BAD"
            ]
          }
        }
      },
      "healthOverviewSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "name"
        ],
        "properties": {
          "version": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "members": {
            "type": "number"
          },
          "health": {
            "type": "number"
          },
          "environments": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "features": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureSchema"
            }
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "healthReportSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "name",
          "potentiallyStaleCount",
          "activeCount",
          "staleCount"
        ],
        "properties": {
          "version": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "members": {
            "type": "number"
          },
          "health": {
            "type": "number"
          },
          "environments": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "features": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureSchema"
            }
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "potentiallyStaleCount": {
            "type": "number"
          },
          "activeCount": {
            "type": "number"
          },
          "staleCount": {
            "type": "number"
          }
        }
      },
      "idSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string"
          }
        }
      },
      "legalValueSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "value"
        ],
        "properties": {
          "value": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "loginSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "username",
          "password"
        ],
        "properties": {
          "username": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        }
      },
      "meSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "user",
          "permissions",
          "feedback",
          "splash"
        ],
        "properties": {
          "user": {
            "$ref": "#/components/schemas/userSchema"
          },
          "permissions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/permissionSchema"
            }
          },
          "feedback": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/feedbackSchema"
            }
          },
          "splash": {
            "type": "object",
            "additionalProperties": {
              "type": "boolean"
            }
          }
        }
      },
      "nameSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          }
        }
      },
      "overrideSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "contextName",
          "values"
        ],
        "properties": {
          "contextName": {
            "type": "string"
          },
          "values": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "parametersSchema": {
        "type": "object",
        "additionalProperties": {
          "type": "string"
        }
      },
      "passwordSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "password"
        ],
        "properties": {
          "password": {
            "type": "string"
          },
          "confirmPassword": {
            "type": "string"
          }
        }
      },
      "patchesSchema": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/patchSchema"
        }
      },
      "patchSchema": {
        "type": "object",
        "required": [
          "path",
          "op"
        ],
        "properties": {
          "path": {
            "type": "string"
          },
          "op": {
            "type": "string",
            "enum": [
              "add",
              "remove",
              "replace",
              "copy",
              "move"
            ]
          },
          "from": {
            "type": "string"
          },
          "value": {}
        }
      },
      "permissionSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "permission"
        ],
        "properties": {
          "permission": {
            "type": "string"
          },
          "project": {
            "type": "string"
          },
          "environment": {
            "type": "string"
          }
        }
      },
      "playgroundFeatureSchema": {
        "description": "A simplified feature toggle model intended for the Unleash playground.",
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "projectId",
          "isEnabled",
          "isEnabledInCurrentEnvironment",
          "variant",
          "variants",
          "strategies"
        ],
        "properties": {
          "name": {
            "type": "string",
            "example": "my-feature",
            "description": "The feature's name."
          },
          "projectId": {
            "type": "string",
            "example": "my-project",
            "description": "The ID of the project that contains this feature."
          },
          "strategies": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "result",
              "data"
            ],
            "properties": {
              "result": {
                "description": "The cumulative results of all the feature's strategies. Can be `true`,\n                                  `false`, or `unknown`.\n                                  This property will only be `unknown`\n                                  if one or more of the strategies can't be fully evaluated and the rest of the strategies\n                                  all resolve to `false`.",
                "anyOf": [
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "string",
                    "enum": [
                      "unknown"
                    ]
                  }
                ]
              },
              "data": {
                "description": "The strategies that apply to this feature.",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/playgroundStrategySchema"
                }
              }
            }
          },
          "isEnabledInCurrentEnvironment": {
            "type": "boolean",
            "description": "Whether the feature is active and would be evaluated in the provided environment in a normal SDK context."
          },
          "isEnabled": {
            "description": "Whether this feature is enabled or not in the current environment.\n                          If a feature can't be fully evaluated (that is, `strategies.result` is `unknown`),\n                          this will be `false` to align with how client SDKs treat unresolved feature states.",
            "type": "boolean",
            "example": true
          },
          "variant": {
            "description": "The feature variant you receive based on the provided context or the _disabled\n                          variant_. If a feature is disabled or doesn't have any\n                          variants, you would get the _disabled variant_.\n                          Otherwise, you'll get one of thefeature's defined variants.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "name",
              "enabled"
            ],
            "properties": {
              "name": {
                "type": "string",
                "description": "The variant's name. If there is no variant or if the toggle is disabled, this will be `disabled`",
                "example": "red-variant"
              },
              "enabled": {
                "type": "boolean",
                "description": "Whether the variant is enabled or not. If the feature is disabled or if it doesn't have variants, this property will be `false`"
              },
              "payload": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "type",
                  "value"
                ],
                "description": "An optional payload attached to the variant.",
                "properties": {
                  "type": {
                    "description": "The format of the payload.",
                    "type": "string",
                    "enum": [
                      "json",
                      "csv",
                      "string"
                    ]
                  },
                  "value": {
                    "type": "string",
                    "description": "The payload value stringified.",
                    "example": "{\"property\": \"value\"}"
                  }
                }
              }
            },
            "nullable": true,
            "example": {
              "name": "green",
              "enabled": true
            }
          },
          "variants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/variantSchema"
            }
          }
        }
      },
      "playgroundStrategySchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "name",
          "result",
          "segments",
          "constraints",
          "parameters"
        ],
        "properties": {
          "name": {
            "description": "The strategy's name.",
            "type": "string"
          },
          "id": {
            "description": "The strategy's id.",
            "type": "string"
          },
          "result": {
            "description": "The strategy's evaluation result. If the strategy is a custom strategy that Unleash can't evaluate, `evaluationStatus` will be `unknown`. Otherwise, it will be `true` or `false`",
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "evaluationStatus",
                  "enabled"
                ],
                "properties": {
                  "evaluationStatus": {
                    "type": "string",
                    "description": "Signals that this strategy could not be evaluated. This is most likely because you're using a custom strategy that Unleash doesn't know about.",
                    "enum": [
                      "incomplete"
                    ]
                  },
                  "enabled": {
                    "description": "Whether this strategy resolves to `false` or if it might resolve to `true`. Because Unleash can't evaluate the strategy, it can't say for certain whether it will be `true`, but if you have failing constraints or segments, it _can_ determine that your strategy would be `false`.",
                    "anyOf": [
                      {
                        "type": "boolean",
                        "enum": [
                          false
                        ]
                      },
                      {
                        "type": "string",
                        "enum": [
                          "unknown"
                        ]
                      }
                    ]
                  }
                }
              },
              {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "evaluationStatus",
                  "enabled"
                ],
                "properties": {
                  "evaluationStatus": {
                    "description": "Signals that this strategy was evaluated successfully.",
                    "type": "string",
                    "enum": [
                      "complete"
                    ]
                  },
                  "enabled": {
                    "type": "boolean",
                    "description": "Whether this strategy evaluates to true or not."
                  }
                }
              }
            ]
          },
          "segments": {
            "type": "array",
            "description": "The strategy's segments and their evaluation results.",
            "items": {
              "$ref": "#/components/schemas/playgroundSegmentSchema"
            }
          },
          "constraints": {
            "type": "array",
            "description": "The strategy's constraints and their evaluation results.",
            "items": {
              "$ref": "#/components/schemas/playgroundConstraintSchema"
            }
          },
          "parameters": {
            "description": "The strategy's constraints and their evaluation results.",
            "example": {
              "myParam1": "param value"
            },
            "$ref": "#/components/schemas/parametersSchema"
          }
        }
      },
      "playgroundConstraintSchema": {
        "additionalProperties": false,
        "type": "object",
        "required": [
          "contextName",
          "operator",
          "result"
        ],
        "description": "A strategy constraint. For more information, refer to [the strategy constraint reference documentation](https://docs.getunleash.io/advanced/strategy_constraints)",
        "properties": {
          "contextName": {
            "description": "The name of the context field that this constraint should apply to.",
            "example": "appName",
            "type": "string"
          },
          "operator": {
            "description": "The operator to use when evaluating this constraint. For more information about the various operators, refer to [the strategy constraint operator documentation](https://docs.getunleash.io/advanced/strategy_constraints#strategy-constraint-operators).",
            "type": "string",
            "enum": [
              "NOT_IN",
              "IN",
              "STR_ENDS_WITH",
              "STR_STARTS_WITH",
              "STR_CONTAINS",
              "NUM_EQ",
              "NUM_GT",
              "NUM_GTE",
              "NUM_LT",
              "NUM_LTE",
              "DATE_AFTER",
              "DATE_BEFORE",
              "SEMVER_EQ",
              "SEMVER_GT",
              "SEMVER_LT"
            ]
          },
          "caseInsensitive": {
            "description": "Whether the operator should be case sensitive or not. Defaults to `false` (being case sensitive).",
            "type": "boolean",
            "default": false
          },
          "inverted": {
            "description": "Whether the result should be negated or not. If `true`, will turn a `true` result into a `false` result and vice versa.",
            "type": "boolean",
            "default": false
          },
          "values": {
            "type": "array",
            "description": "The context values that should be used for constraint evaluation. Use this property instead of `value` for properties that accept multiple values.",
            "items": {
              "type": "string"
            }
          },
          "value": {
            "description": "The context value that should be used for constraint evaluation. Use this property instead of `values` for properties that only accept single values.",
            "type": "string"
          },
          "result": {
            "description": "Whether this was evaluated as true or false.",
            "type": "boolean"
          }
        }
      },
      "playgroundSegmentSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "id",
          "constraints",
          "result"
        ],
        "properties": {
          "id": {
            "description": "The segment's id.",
            "type": "integer"
          },
          "name": {
            "description": "The name of the segment.",
            "example": "segment A",
            "type": "string"
          },
          "result": {
            "description": "Whether this was evaluated as true or false.",
            "type": "boolean"
          },
          "constraints": {
            "type": "array",
            "description": "The list of constraints in this segment.",
            "items": {
              "$ref": "#/components/schemas/playgroundConstraintSchema"
            }
          }
        }
      },
      "playgroundRequestSchema": {
        "description": "Data for the playground API to evaluate toggles",
        "type": "object",
        "required": [
          "environment",
          "context"
        ],
        "properties": {
          "environment": {
            "type": "string",
            "example": "development",
            "description": "The environment to evaluate toggles in."
          },
          "projects": {
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "example": [
                  "my-project"
                ],
                "description": "A list of projects to check for toggles in."
              },
              {
                "type": "string",
                "enum": [
                  "*"
                ],
                "description": "Check toggles in all projects."
              }
            ]
          },
          "context": {
            "description": "The context to use when evaluating toggles",
            "$ref": "#/components/schemas/sdkContextSchema"
          }
        }
      },
      "playgroundResponseSchema": {
        "description": "The state of all features given the provided input.",
        "type": "object",
        "additionalProperties": false,
        "required": [
          "features",
          "input"
        ],
        "properties": {
          "input": {
            "description": "The given input used to evaluate the features.",
            "$ref": "#/components/schemas/playgroundRequestSchema"
          },
          "features": {
            "type": "array",
            "description": "The list of features that have been evaluated.",
            "items": {
              "$ref": "#/components/schemas/playgroundFeatureSchema"
            }
          }
        }
      },
      "projectEnvironmentSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "environment"
        ],
        "properties": {
          "environment": {
            "type": "string"
          }
        }
      },
      "projectSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "name"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "health": {
            "type": "number"
          },
          "featureCount": {
            "type": "number"
          },
          "memberCount": {
            "type": "number"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "projectsSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "projects"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/projectSchema"
            }
          }
        }
      },
      "resetPasswordSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "resetPasswordUrl"
        ],
        "properties": {
          "resetPasswordUrl": {
            "type": "string"
          }
        }
      },
      "roleSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "type",
          "name"
        ],
        "properties": {
          "id": {
            "type": "number"
          },
          "type": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "sdkContextSchema": {
        "description": "The Unleash context as modeled in client SDKs",
        "type": "object",
        "additionalProperties": {
          "type": "string",
          "example": "top-level custom context value"
        },
        "required": [
          "appName"
        ],
        "properties": {
          "appName": {
            "type": "string",
            "minLength": 1,
            "example": "My cool application."
          },
          "currentTime": {
            "type": "string",
            "format": "date-time",
            "example": "2022-07-05T12:56:41+02:00"
          },
          "environment": {
            "type": "string",
            "deprecated": true
          },
          "properties": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "example": {
              "customContextField": "this is one!",
              "otherCustomField": "3"
            }
          },
          "remoteAddress": {
            "type": "string",
            "example": "192.168.1.1"
          },
          "sessionId": {
            "type": "string",
            "example": "b65e7b23-fec0-4814-a129-0e9861ef18fc"
          },
          "userId": {
            "type": "string",
            "example": "[email protected]"
          }
        }
      },
      "segmentSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "constraints"
        ],
        "properties": {
          "id": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "constraints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/constraintSchema"
            }
          }
        }
      },
      "setStrategySortOrderSchema": {
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "sortOrder"
          ],
          "properties": {
            "id": {
              "type": "string"
            },
            "sortOrder": {
              "type": "number"
            }
          }
        }
      },
      "sortOrderSchema": {
        "type": "object",
        "additionalProperties": {
          "type": "number"
        }
      },
      "splashSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "userId",
          "splashId",
          "seen"
        ],
        "properties": {
          "userId": {
            "type": "number"
          },
          "splashId": {
            "type": "string"
          },
          "seen": {
            "type": "boolean"
          }
        }
      },
      "stateSchema": {
        "type": "object",
        "additionalProperties": true,
        "required": [
          "version"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "features": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureSchema"
            }
          },
          "strategies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/strategySchema"
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/tagSchema"
            }
          },
          "tagTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/tagTypeSchema"
            }
          },
          "featureTags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureTagSchema"
            }
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/projectSchema"
            }
          },
          "featureStrategies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureStrategySchema"
            }
          },
          "featureEnvironments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureEnvironmentSchema"
            }
          },
          "environments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/environmentSchema"
            }
          },
          "segments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/segmentSchema"
            }
          },
          "featureStrategySegments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/featureStrategySegmentSchema"
            }
          }
        }
      },
      "strategiesSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "strategies"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "strategies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/strategySchema"
            }
          }
        }
      },
      "strategySchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "displayName",
          "description",
          "editable",
          "deprecated",
          "parameters"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string"
          },
          "editable": {
            "type": "boolean"
          },
          "deprecated": {
            "type": "boolean"
          },
          "parameters": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "required": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      },
      "tagSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "value",
          "type"
        ],
        "properties": {
          "value": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        }
      },
      "tagsSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "tags"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/tagSchema"
            }
          }
        }
      },
      "tagTypeSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "icon": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "tagTypesSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "tagTypes"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "tagTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/tagTypeSchema"
            }
          }
        }
      },
      "tagWithVersionSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "tag"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "tag": {
            "$ref": "#/components/schemas/tagSchema"
          }
        }
      },
      "tokenUserSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "name",
          "email",
          "token",
          "createdBy",
          "role"
        ],
        "properties": {
          "id": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "token": {
            "type": "string"
          },
          "createdBy": {
            "type": "string",
            "nullable": true
          },
          "role": {
            "$ref": "#/components/schemas/roleSchema"
          }
        }
      },
      "uiConfigSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "unleashUrl",
          "baseUriPath",
          "versionInfo"
        ],
        "properties": {
          "slogan": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "environment": {
            "type": "string"
          },
          "unleashUrl": {
            "type": "string"
          },
          "baseUriPath": {
            "type": "string"
          },
          "disablePasswordAuth": {
            "type": "boolean"
          },
          "segmentValuesLimit": {
            "type": "number"
          },
          "strategySegmentsLimit": {
            "type": "number"
          },
          "flags": {
            "type": "object",
            "additionalProperties": {
              "type": "boolean"
            }
          },
          "links": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "authenticationType": {
            "type": "string",
            "enum": [
              "open-source",
              "demo",
              "enterprise",
              "hosted",
              "custom",
              "none"
            ]
          },
          "versionInfo": {
            "$ref": "#/components/schemas/versionSchema"
          }
        }
      },
      "updateApiTokenSchema": {
        "type": "object",
        "required": [
          "expiresAt"
        ],
        "properties": {
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "updateFeatureSchema": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "stale": {
            "type": "boolean"
          },
          "archived": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "impressionData": {
            "type": "boolean"
          },
          "constraints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/constraintSchema"
            }
          }
        }
      },
      "updateFeatureStrategySchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "sortOrder": {
            "type": "number"
          },
          "constraints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/constraintSchema"
            }
          },
          "parameters": {
            "$ref": "#/components/schemas/parametersSchema"
          }
        }
      },
      "updateTagTypeSchema": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string"
          },
          "icon": {
            "type": "string"
          }
        }
      },
      "updateUserSchema": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "email": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "rootRole": {
            "type": "number"
          }
        }
      },
      "upsertContextFieldSchema": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "stickiness": {
            "type": "boolean"
          },
          "sortOrder": {
            "type": "number"
          },
          "legalValues": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/legalValueSchema"
            }
          }
        }
      },
      "upsertStrategySchema": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "editable": {
            "type": "boolean"
          },
          "parameters": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "required": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      },
      "usersGroupsBaseSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "groups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/groupSchema"
            }
          },
          "users": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/userSchema"
            }
          }
        }
      },
      "userSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "number"
          },
          "isAPI": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "username": {
            "type": "string"
          },
          "imageUrl": {
            "type": "string"
          },
          "inviteLink": {
            "type": "string"
          },
          "loginAttempts": {
            "type": "number"
          },
          "emailSent": {
            "type": "boolean"
          },
          "rootRole": {
            "type": "number"
          },
          "seenAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "usersSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "users"
        ],
        "properties": {
          "users": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/userSchema"
            }
          },
          "rootRoles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/roleSchema"
            }
          }
        }
      },
      "usersSearchSchema": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/userSchema"
        }
      },
      "validatePasswordSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "password"
        ],
        "properties": {
          "password": {
            "type": "string"
          }
        }
      },
      "validateTagTypeSchema": {
        "type": "object",
        "required": [
          "valid",
          "tagType"
        ],
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "tagType": {
            "$ref": "#/components/schemas/tagTypeSchema"
          }
        }
      },
      "variantSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "weight",
          "weightType",
          "stickiness"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "weight": {
            "type": "number"
          },
          "weightType": {
            "type": "string"
          },
          "stickiness": {
            "type": "string"
          },
          "payload": {
            "type": "object",
            "required": [
              "type",
              "value"
            ],
            "properties": {
              "type": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            }
          },
          "overrides": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/overrideSchema"
            }
          }
        }
      },
      "variantsSchema": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/variantSchema"
        }
      },
      "versionSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "current",
          "latest",
          "isLatest",
          "instanceId"
        ],
        "properties": {
          "current": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "oss": {
                "type": "string"
              },
              "enterprise": {
                "type": "string"
              }
            }
          },
          "latest": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "oss": {
                "type": "string"
              },
              "enterprise": {
                "type": "string"
              }
            }
          },
          "isLatest": {
            "type": "boolean"
          },
          "instanceId": {
            "type": "string"
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "admin"
    },
    {
      "name": "client"
    },
    {
      "name": "auth"
    },
    {
      "name": "other"
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "tags": [
          "other"
        ],
        "operationId": "getHealth",
        "responses": {
          "200": {
            "description": "healthCheckSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/healthCheckSchema"
                }
              }
            }
          },
          "500": {
            "description": "healthCheckSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/healthCheckSchema"
                }
              }
            }
          }
        }
      }
    },
    "/auth/simple/login": {
      "post": {
        "tags": [
          "auth"
        ],
        "operationId": "login",
        "requestBody": {
          "description": "loginSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/loginSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "userSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/userSchema"
                }
              }
            }
          }
        }
      }
    },
    "/auth/reset/validate": {
      "get": {
        "tags": [
          "auth"
        ],
        "operationId": "validateToken",
        "responses": {
          "200": {
            "description": "tokenUserSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/tokenUserSchema"
                }
              }
            }
          }
        }
      }
    },
    "/auth/reset/password": {
      "post": {
        "tags": [
          "other"
        ],
        "operationId": "changePassword",
        "requestBody": {
          "description": "changePasswordSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/changePasswordSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        }
      }
    },
    "/auth/reset/validate-password": {
      "post": {
        "tags": [
          "other"
        ],
        "operationId": "validatePassword",
        "requestBody": {
          "description": "validatePasswordSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/validatePasswordSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        }
      }
    },
    "/auth/reset/password-email": {
      "post": {
        "tags": [
          "other"
        ],
        "operationId": "sendResetPasswordEmail",
        "requestBody": {
          "description": "emailSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/emailSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        }
      }
    },
    "/api/admin/features": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getAllToggles",
        "responses": {
          "200": {
            "description": "featuresSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featuresSchema"
                }
              }
            }
          }
        },
        "deprecated": true
      }
    },
    "/api/admin/features/validate": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "validateFeature",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        }
      }
    },
    "/api/admin/features/{featureName}/tags": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "listTags",
        "responses": {
          "200": {
            "description": "tagsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/tagsSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "addTag",
        "requestBody": {
          "description": "tagSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/tagSchema"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "tagSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/tagSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/features/{featureName}/tags/{type}/{value}": {
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "removeTag",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "value",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/feature-types": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getAllFeatureTypes",
        "responses": {
          "200": {
            "description": "featureTypesSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureTypesSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/archive/features": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getArchivedFeatures",
        "responses": {
          "200": {
            "description": "featuresSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featuresSchema"
                }
              }
            }
          }
        },
        "deprecated": true
      }
    },
    "/api/admin/archive/features/{projectId}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getArchivedFeaturesByProjectId",
        "responses": {
          "200": {
            "description": "featuresSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featuresSchema"
                }
              }
            }
          }
        },
        "deprecated": true,
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/archive/{featureName}": {
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "deleteFeature",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/archive/revive/{featureName}": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "reviveFeature",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/strategies": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getAllStrategies",
        "responses": {
          "200": {
            "description": "strategiesSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/strategiesSchema"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "createStrategy",
        "requestBody": {
          "description": "upsertStrategySchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/upsertStrategySchema"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "This response has no body."
          }
        }
      }
    },
    "/api/admin/strategies/{name}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getStrategy",
        "responses": {
          "200": {
            "description": "strategySchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/strategySchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "removeStrategy",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/strategies/{strategyName}": {
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "updateStrategy",
        "requestBody": {
          "description": "upsertStrategySchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/upsertStrategySchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "strategyName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/strategies/{strategyName}/deprecate": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "deprecateStrategy",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "strategyName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/strategies/{strategyName}/reactivate": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "reactivateStrategy",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "strategyName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/events": {
      "get": {
        "operationId": "getEvents",
        "tags": [
          "admin"
        ],
        "responses": {
          "200": {
            "description": "eventsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eventsSchema"
                }
              }
            }
          },
          "401": {
            "description": "Authorization information is missing or invalid. Provide a valid API token as the `authorization` header, e.g. `authorization:*.*.my-admin-token`."
          }
        },
        "parameters": [
          {
            "name": "project",
            "description": "The name of the project whose events you want to retrieve",
            "schema": {
              "type": "string"
            },
            "in": "query"
          }
        ],
        "description": "Returns **the last 100** from the Unleash instance when called without a query parameter. When called with a `project` parameter, returns **all events** for the specified project.\n\nIf the provided project does not exist, the list of events will be empty.",
        "summary": "Get the most recent events from the Unleash instance or all events related to a project."
      }
    },
    "/api/admin/events/{featureName}": {
      "get": {
        "operationId": "getEventsForToggle",
        "tags": [
          "admin"
        ],
        "responses": {
          "200": {
            "description": "featureEventsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureEventsSchema"
                }
              }
            }
          },
          "401": {
            "description": "Authorization information is missing or invalid. Provide a valid API token as the `authorization` header, e.g. `authorization:*.*.my-admin-token`."
          }
        },
        "description": "Returns all events related to the specified feature toggle. If the feature toggle does not exist, the list of events will be empty.",
        "summary": "Get all events related to a specific feature toggle.",
        "parameters": [
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/playground": {
      "post": {
        "operationId": "getPlayground",
        "tags": [
          "admin"
        ],
        "responses": {
          "200": {
            "description": "playgroundResponseSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/playgroundResponseSchema"
                }
              }
            }
          },
          "400": {
            "description": "The request data does not match what we expect."
          },
          "401": {
            "description": "Authorization information is missing or invalid. Provide a valid API token as the `authorization` header, e.g. `authorization:*.*.my-admin-token`."
          }
        },
        "requestBody": {
          "description": "playgroundRequestSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/playgroundRequestSchema"
              }
            }
          }
        },
        "description": "Use the provided `context`, `environment`, and `projects` to evaluate toggles on this Unleash instance. Returns a list of all toggles that match the parameters and what they evaluate to. The response also contains the input parameters that were provided.",
        "summary": "Evaluate an Unleash context against a set of environments and projects."
      }
    },
    "/api/admin/metrics/applications/{appName}": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "createApplication",
        "responses": {
          "202": {
            "description": "This response has no body."
          }
        },
        "requestBody": {
          "description": "applicationSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/applicationSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "appName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "deleteApplication",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "appName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getApplication",
        "responses": {
          "200": {
            "description": "applicationSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/applicationSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "appName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/metrics/applications": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getApplications",
        "responses": {
          "200": {
            "description": "applicationsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/applicationsSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/client-metrics/features/{name}/raw": {
      "get": {
        "operationId": "getRawFeatureMetrics",
        "tags": [
          "admin"
        ],
        "responses": {
          "200": {
            "description": "featureMetricsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureMetricsSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/client-metrics/features/{name}": {
      "get": {
        "operationId": "getFeatureUsageSummary",
        "tags": [
          "admin"
        ],
        "responses": {
          "200": {
            "description": "featureUsageSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureUsageSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/user": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getMe",
        "responses": {
          "200": {
            "description": "meSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/meSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/user/change-password": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "changeMyPassword",
        "requestBody": {
          "description": "passwordSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/passwordSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          },
          "400": {
            "description": "passwordMismatch"
          }
        }
      }
    },
    "/api/admin/ui-config": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getUIConfig",
        "responses": {
          "200": {
            "description": "uiConfigSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/uiConfigSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/ui-bootstrap": {
      "get": {
        "tags": [
          "other"
        ],
        "operationId": "getBootstrapUiData",
        "responses": {
          "202": {
            "description": "bootstrapUiSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/bootstrapUiSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/context": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getContextFields",
        "responses": {
          "200": {
            "description": "contextFieldsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/contextFieldsSchema"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "createContextField",
        "requestBody": {
          "description": "upsertContextFieldSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/upsertContextFieldSchema"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "This response has no body."
          }
        }
      }
    },
    "/api/admin/context/{contextField}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getContextField",
        "responses": {
          "200": {
            "description": "contextFieldSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/contextFieldSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "contextField",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "updateContextField",
        "requestBody": {
          "description": "upsertContextFieldSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/upsertContextFieldSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "contextField",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "deleteContextField",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "contextField",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/context/validate": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "validate",
        "requestBody": {
          "description": "nameSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/nameSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        }
      }
    },
    "/api/admin/state/import": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "import",
        "responses": {
          "202": {
            "description": "This response has no body."
          }
        },
        "requestBody": {
          "description": "stateSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/stateSchema"
              }
            }
          }
        }
      }
    },
    "/api/admin/state/export": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "export",
        "responses": {
          "200": {
            "description": "stateSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/stateSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "format",
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "yaml"
              ],
              "default": "json"
            },
            "description": "Desired export format. Must be either `json` or `yaml`.",
            "in": "query"
          },
          {
            "name": "download",
            "schema": {
              "default": false,
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "number"
                }
              ]
            },
            "description": "Whether exported data should be downloaded as a file.",
            "in": "query"
          },
          {
            "name": "strategies",
            "schema": {
              "default": true,
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "number"
                }
              ]
            },
            "description": "Whether strategies should be included in the exported data.",
            "in": "query"
          },
          {
            "name": "featureToggles",
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "number"
                }
              ],
              "default": true
            },
            "description": "Whether feature toggles should be included in the exported data.",
            "in": "query"
          },
          {
            "name": "projects",
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "number"
                }
              ],
              "default": true
            },
            "description": "Whether projects should be included in the exported data.",
            "in": "query"
          },
          {
            "name": "tags",
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "number"
                }
              ],
              "default": true
            },
            "description": "Whether tag types, tags, and feature_tags should be included in the exported data.",
            "in": "query"
          },
          {
            "name": "environments",
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "string",
                  "minLength": 1
                },
                {
                  "type": "number"
                }
              ],
              "default": true
            },
            "description": "Whether environments should be included in the exported data.",
            "in": "query"
          }
        ]
      }
    },
    "/api/admin/tags": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getTags",
        "responses": {
          "200": {
            "description": "tagsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/tagsSchema"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "createTag",
        "responses": {
          "201": {
            "description": "This response has no body."
          }
        },
        "requestBody": {
          "description": "tagSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/tagSchema"
              }
            }
          }
        }
      }
    },
    "/api/admin/tags/{type}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getTagsByType",
        "responses": {
          "200": {
            "description": "tagsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/tagsSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/tags/{type}/{value}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getTag",
        "responses": {
          "200": {
            "description": "tagWithVersionSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/tagWithVersionSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "value",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "deleteTag",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "value",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/tag-types": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getTagTypes",
        "responses": {
          "200": {
            "description": "tagTypesSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/tagTypesSchema"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "createTagType",
        "responses": {
          "201": {
            "description": "tagTypeSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/tagTypeSchema"
                }
              }
            }
          }
        },
        "requestBody": {
          "description": "tagTypeSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/tagTypeSchema"
              }
            }
          }
        }
      }
    },
    "/api/admin/tag-types/validate": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "validateTagType",
        "responses": {
          "200": {
            "description": "validateTagTypeSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/validateTagTypeSchema"
                }
              }
            }
          }
        },
        "requestBody": {
          "description": "tagTypeSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/tagTypeSchema"
              }
            }
          }
        }
      }
    },
    "/api/admin/tag-types/{name}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getTagType",
        "responses": {
          "200": {
            "description": "tagTypeSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/tagTypeSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "updateTagType",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "requestBody": {
          "description": "updateTagTypeSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/updateTagTypeSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "deleteTagType",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/addons": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getAddons",
        "responses": {
          "200": {
            "description": "addonsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/addonsSchema"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "createAddon",
        "requestBody": {
          "description": "addonSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/addonSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "addonSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/addonSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/addons/{id}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getAddon",
        "responses": {
          "200": {
            "description": "addonSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/addonSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "updateAddon",
        "requestBody": {
          "description": "addonSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/addonSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "addonSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/addonSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "deleteAddon",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/api-tokens": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getAllApiTokens",
        "responses": {
          "200": {
            "description": "apiTokensSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/apiTokensSchema"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "createApiToken",
        "requestBody": {
          "description": "createApiTokenSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/createApiTokenSchema"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "apiTokenSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/apiTokenSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/api-tokens/{token}": {
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "updateApiToken",
        "requestBody": {
          "description": "updateApiTokenSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/updateApiTokenSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "deleteApiToken",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/user-admin/validate-password": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "validateUserPassword",
        "requestBody": {
          "description": "passwordSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/passwordSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        }
      }
    },
    "/api/admin/user-admin/{id}/change-password": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "changeUserPassword",
        "requestBody": {
          "description": "passwordSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/passwordSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/user-admin/reset-password": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "resetUserPassword",
        "requestBody": {
          "description": "idSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/idSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "resetPasswordSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/resetPasswordSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/user-admin": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getUsers",
        "responses": {
          "200": {
            "description": "usersSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/usersSchema"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "createUser",
        "requestBody": {
          "description": "createUserSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/createUserSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "userSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/userSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/user-admin/search": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "searchUsers",
        "responses": {
          "200": {
            "description": "usersSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/usersSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/user-admin/access": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getBaseUsersAndGroups",
        "responses": {
          "200": {
            "description": "usersGroupsBaseSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/usersGroupsBaseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/user-admin/{id}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getUser",
        "responses": {
          "200": {
            "description": "userSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/userSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "updateUser",
        "requestBody": {
          "description": "updateUserSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/updateUserSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "userSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/userSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "deleteUser",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/feedback": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "createFeedback",
        "requestBody": {
          "description": "feedbackSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/feedbackSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "feedbackSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/feedbackSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/feedback/{id}": {
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "updateFeedback",
        "requestBody": {
          "description": "feedbackSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/feedbackSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "feedbackSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/feedbackSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getProjects",
        "responses": {
          "200": {
            "description": "projectsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/projectsSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/admin/projects/{projectId}/features/{featureName}/environments/{environment}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getFeatureEnvironment",
        "responses": {
          "200": {
            "description": "featureEnvironmentSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureEnvironmentSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/features/{featureName}/environments/{environment}/off": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "toggleFeatureEnvironmentOff",
        "responses": {
          "200": {
            "description": "featureSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/features/{featureName}/environments/{environment}/on": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "toggleFeatureEnvironmentOn",
        "responses": {
          "200": {
            "description": "featureSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/features/{featureName}/environments/{environment}/strategies": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getFeatureStrategies",
        "responses": {
          "200": {
            "description": "featureStrategySchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureStrategySchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "addFeatureStrategy",
        "requestBody": {
          "description": "createFeatureStrategySchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/createFeatureStrategySchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "featureStrategySchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureStrategySchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/features/{featureName}/environments/{environment}/strategies/{strategyId}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getFeatureStrategy",
        "responses": {
          "200": {
            "description": "featureStrategySchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureStrategySchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "strategyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "updateFeatureStrategy",
        "requestBody": {
          "description": "updateFeatureStrategySchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/updateFeatureStrategySchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "featureStrategySchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureStrategySchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "strategyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "admin"
        ],
        "operationId": "patchFeatureStrategy",
        "requestBody": {
          "description": "patchesSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/patchesSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "featureStrategySchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureStrategySchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "strategyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "operationId": "deleteFeatureStrategy",
        "tags": [
          "admin"
        ],
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "strategyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/features/{featureName}/environments/{environment}/strategies/set-sort-order": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "setStrategySortOrder",
        "requestBody": {
          "description": "setStrategySortOrderSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/setStrategySortOrderSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/features": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getFeatures",
        "responses": {
          "200": {
            "description": "featuresSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featuresSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "createFeature",
        "requestBody": {
          "description": "createFeatureSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/createFeatureSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "featureSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/features/{featureName}/clone": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "cloneFeature",
        "requestBody": {
          "description": "cloneFeatureSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/cloneFeatureSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "featureSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/features/{featureName}": {
      "get": {
        "operationId": "getFeature",
        "tags": [
          "admin"
        ],
        "responses": {
          "200": {
            "description": "featureSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "updateFeature",
        "requestBody": {
          "description": "updateFeatureSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/updateFeatureSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "featureSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "admin"
        ],
        "operationId": "patchFeature",
        "requestBody": {
          "description": "patchesSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/patchesSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "featureSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "archiveFeature",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/environments": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "addEnvironmentToProject",
        "requestBody": {
          "description": "projectEnvironmentSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/projectEnvironmentSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/environments/{environment}": {
      "delete": {
        "tags": [
          "admin"
        ],
        "operationId": "removeEnvironmentFromProject",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "environment",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getProjectHealthOverview",
        "responses": {
          "200": {
            "description": "healthOverviewSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/healthOverviewSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/health-report": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getProjectHealthReport",
        "responses": {
          "200": {
            "description": "healthReportSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/healthReportSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/projects/{projectId}/features/{featureName}/variants": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getFeatureVariants",
        "responses": {
          "200": {
            "description": "featureVariantsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureVariantsSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "admin"
        ],
        "operationId": "patchFeatureVariants",
        "requestBody": {
          "description": "patchesSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/patchesSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "featureVariantsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureVariantsSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "overwriteFeatureVariants",
        "requestBody": {
          "description": "variantsSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/variantsSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "featureVariantsSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/featureVariantsSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/environments": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getAllEnvironments",
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        }
      }
    },
    "/api/admin/environments/{name}": {
      "get": {
        "tags": [
          "admin"
        ],
        "operationId": "getEnvironment",
        "responses": {
          "200": {
            "description": "environmentSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/environmentSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/environments/sort-order": {
      "put": {
        "tags": [
          "admin"
        ],
        "operationId": "updateSortOrder",
        "requestBody": {
          "description": "sortOrderSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/sortOrderSchema"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "This response has no body."
          }
        }
      }
    },
    "/api/admin/environments/{name}/on": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "toggleEnvironmentOn",
        "responses": {
          "204": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/environments/{name}/off": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "toggleEnvironmentOff",
        "responses": {
          "204": {
            "description": "This response has no body."
          }
        },
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/splash/{id}": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "updateSplashSettings",
        "responses": {
          "200": {
            "description": "splashSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/splashSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/admin/constraints/validate": {
      "post": {
        "tags": [
          "admin"
        ],
        "operationId": "validateConstraint",
        "requestBody": {
          "description": "constraintSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/constraintSchema"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "validConstraint"
          },
          "400": {
            "description": "invalidConstraint"
          }
        }
      }
    },
    "/api/client/features/{featureName}": {
      "get": {
        "operationId": "getClientFeature",
        "tags": [
          "client"
        ],
        "responses": {
          "200": {
            "description": "clientFeaturesSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/clientFeaturesSchema"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "featureName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/api/client/features": {
      "get": {
        "operationId": "getAllClientFeatures",
        "tags": [
          "client"
        ],
        "responses": {
          "200": {
            "description": "clientFeaturesSchema",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/clientFeaturesSchema"
                }
              }
            }
          }
        }
      }
    },
    "/api/client/metrics": {
      "post": {
        "tags": [
          "client"
        ],
        "operationId": "registerClientMetrics",
        "requestBody": {
          "description": "clientMetricsSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/clientMetricsSchema"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "This response has no body."
          },
          "400": {
            "description": "The request data does not match what we expect."
          }
        }
      }
    },
    "/api/client/register": {
      "post": {
        "tags": [
          "client"
        ],
        "operationId": "registerClientApplication",
        "requestBody": {
          "description": "clientApplicationSchema",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/clientApplicationSchema"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "This response has no body."
          }
        }
      }
    }
  }
}

thomasheartman avatar Aug 08 '22 17:08 thomasheartman

Hmm, it's possible you may need to clean and re-gen the sidebar at least. I did a quick test and this is what I ended up with:

https://user-images.githubusercontent.com/9343811/183501675-caf02d85-8a2a-4333-8d3e-2eaf1448ceb8.mov

If you added descriptions to your root level tags and set categoryLinkSource to "tag" you would see that description rendered on the category index pages. Markdown is also support for the descriptions.

sserrata avatar Aug 08 '22 19:08 sserrata

Huh, interesting. Cleaning and regenerating doesn't seem to do the trick for me, so there's probably a configuration setting somewhere. It still renders just as a single flat layer πŸ€” I've regenerated docs (into a new folder) and restarted the docusaurus process, so that should be taken care of.

The docusaurus.config.js file has the following plugin section for this:

[
            'docusaurus-plugin-openapi-docs',
            {
                id: 'api-operations',
                docsPluginId: 'classic',
                config: {
                    server: {
                        specPath: 'http://localhost:4242/docs/openapi.json',
                        outputDir: 'docs/generated/openapi/server',
                        sidebarOptions: {
                            groupPathsBy: 'tag',
                            categoryLinkSource: 'tag' // or null/undefined
                        },
                    },
                },
            },
        ]

and I'm using this sidebar entry:

        {
            label: 'OpenAPI',
            collapsed: true,
            type: 'category',
            link: {
                type: 'generated-index',
                title: 'API docs',
                description: 'Generated API docs for the OpenAPI spec',
            },
            items: [
                {
                    type: 'autogenerated',
                    dirName: 'generated/openapi/server',
                },
            ],
        }

Is there some configuration option I have missed? I'll keep digging in the meantime πŸ‘·πŸΌ

thomasheartman avatar Aug 09 '22 06:08 thomasheartman

Ah, it looks to be an issue with your sidebar entry. With sidebarOptions, the plugin will generate a file named sidebar.js which is a module that exports a sidebar slice object for your API docs.

You'll want to change your sidebar entry to something like this:

        {
            label: 'OpenAPI',
            collapsed: true,
            type: 'category',
            link: {
                type: 'generated-index',
                title: 'API docs',
                description: 'Generated API docs for the OpenAPI spec',
            },
            items: require("./docs/generated/openapi/server/sidebar.js"),
        }

sserrata avatar Aug 09 '22 11:08 sserrata

Ah, is that it! Thanks! πŸ™ŒπŸΌ I definitely wouldn't have found that myself πŸ™ˆ That may be a common way to include generated stuff in docusaurus, but I hadn't done that before, so it might be worth mentioning in the docs? You've got great examples showing the docusaurus.config.js file, but it doesn't show you how you include it in the sidebar (or even that you have to).

thomasheartman avatar Aug 09 '22 12:08 thomasheartman

You've got great examples showing the docusaurus.config.js file, but it doesn't show you how you include it in the sidebar (or even that you have to).

I agree that the sidebars can be documented better - or, at least we should add a hint to check the demo sidebars.js for practical examples. Thanks again for the feedback!

sserrata avatar Aug 09 '22 13:08 sserrata

No worries and thanks for the work on creating and maintaining this package πŸ™πŸΌ I've found the answers I'm looking for now, so you can close the issue if you want to. If you'd rather keep it open as a work item for later, that's fine too. I'll leave it up to you ☺️

thomasheartman avatar Aug 09 '22 13:08 thomasheartman

#257

sserrata avatar Sep 21 '22 13:09 sserrata