{
  "openapi": "3.0.0",
  "info": {
    "title": "LoopBack Application",
    "version": "1.0.0"
  },
  "paths": {
    "/auth/login": {
      "post": {
        "x-controller-name": "AuthController",
        "x-operation-name": "login",
        "tags": [
          "AuthController"
        ],
        "responses": {
          "200": {
            "description": "Return value of AuthController.login"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Credentials"
              }
            }
          }
        },
        "operationId": "AuthController.login"
      }
    },
    "/histories/{id}/file": {
      "get": {
        "x-controller-name": "HistoryController",
        "x-operation-name": "downloadHistory",
        "tags": [
          "HistoryController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Download a history file"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "HistoryController.downloadHistory"
      }
    },
    "/histories": {
      "post": {
        "x-controller-name": "HistoryController",
        "x-operation-name": "uploadHistory",
        "tags": [
          "HistoryController"
        ],
        "responses": {
          "200": {
            "description": "Upload a history file and save metadata",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/History"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "x-parser": "stream",
              "schema": {
                "type": "object"
              }
            }
          },
          "description": "Upload zip + metadata",
          "required": true
        },
        "operationId": "HistoryController.uploadHistory"
      },
      "get": {
        "x-controller-name": "HistoryController",
        "x-operation-name": "find",
        "tags": [
          "HistoryController"
        ],
        "responses": {
          "200": {
            "description": "List histories",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/History"
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/History.Filter"
                }
              }
            }
          }
        ],
        "operationId": "HistoryController.find"
      }
    },
    "/seat-plans/{id}/file": {
      "get": {
        "x-controller-name": "SeatPlanController",
        "x-operation-name": "downloadSeatPlanFile",
        "tags": [
          "SeatPlanController"
        ],
        "responses": {
          "200": {
            "description": "Return value of SeatPlanController.downloadSeatPlanFile"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "SeatPlanController.downloadSeatPlanFile"
      }
    },
    "/seat-plans/{id}": {
      "patch": {
        "x-controller-name": "SeatPlanController",
        "x-operation-name": "updateSeatPlan",
        "tags": [
          "SeatPlanController"
        ],
        "responses": {
          "200": {
            "description": "Return value of SeatPlanController.updateSeatPlan"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "x-parser": "stream",
              "schema": {
                "type": "object"
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "SeatPlanController.updateSeatPlan"
      }
    },
    "/seat-plans": {
      "get": {
        "x-controller-name": "SeatPlanController",
        "x-operation-name": "find",
        "tags": [
          "SeatPlanController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "List seat plans with latest history and user"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SeatPlan.Filter"
                }
              }
            }
          }
        ],
        "operationId": "SeatPlanController.find"
      }
    },
    "/users/changePassword/{id}": {
      "post": {
        "x-controller-name": "UserController",
        "x-operation-name": "changePassword",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "Return value of UserController.changePassword"
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "oldPassword",
                  "newPassword"
                ],
                "properties": {
                  "oldPassword": {
                    "type": "string"
                  },
                  "newPassword": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "UserController.changePassword"
      }
    }
  },
  "servers": [
    {
      "url": "https://seatmap-tool-api-vntix.dev.nexpando.vn"
    }
  ],
  "components": {
    "schemas": {
      "History": {
        "title": "History",
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "seatName": {
            "type": "string"
          },
          "filePath": {
            "type": "string"
          },
          "userId": {
            "type": "number"
          },
          "createAt": {
            "type": "string",
            "format": "date-time"
          },
          "seatPlanId": {
            "type": "number"
          }
        },
        "required": [
          "filePath",
          "createAt"
        ],
        "additionalProperties": false
      },
      "Credentials": {
        "title": "Credentials",
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          }
        },
        "required": [
          "email",
          "password"
        ],
        "additionalProperties": false
      },
      "History.ScopeFilter": {
        "type": "object",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "uniqueItems": true
              }
            ]
          },
          "include": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": false,
        "title": "History.ScopeFilter"
      },
      "History.IncludeFilter.Items": {
        "title": "History.IncludeFilter.Items",
        "type": "object",
        "properties": {
          "relation": {
            "type": "string",
            "enum": [
              "user",
              "seatPlan"
            ]
          },
          "scope": {
            "$ref": "#/components/schemas/History.ScopeFilter"
          }
        }
      },
      "History.Filter": {
        "type": "object",
        "title": "History.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "title": "History.WhereFilter",
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "seatName": {
                    "type": "boolean"
                  },
                  "filePath": {
                    "type": "boolean"
                  },
                  "userId": {
                    "type": "boolean"
                  },
                  "createAt": {
                    "type": "boolean"
                  },
                  "seatPlanId": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "id",
                    "seatName",
                    "filePath",
                    "userId",
                    "createAt",
                    "seatPlanId"
                  ],
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "History.Fields"
          },
          "include": {
            "title": "History.IncludeFilter",
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/History.IncludeFilter.Items"
                },
                {
                  "type": "string"
                }
              ]
            }
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<History>"
      },
      "SeatPlan.ScopeFilter": {
        "type": "object",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "uniqueItems": true
              }
            ]
          },
          "include": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": false,
        "title": "SeatPlan.ScopeFilter"
      },
      "SeatPlan.IncludeFilter.Items": {
        "title": "SeatPlan.IncludeFilter.Items",
        "type": "object",
        "properties": {
          "relation": {
            "type": "string",
            "enum": [
              "histories"
            ]
          },
          "scope": {
            "$ref": "#/components/schemas/SeatPlan.ScopeFilter"
          }
        }
      },
      "SeatPlan.Filter": {
        "type": "object",
        "title": "SeatPlan.Filter",
        "properties": {
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "example": 100
          },
          "skip": {
            "type": "integer",
            "minimum": 0
          },
          "order": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          },
          "where": {
            "title": "SeatPlan.WhereFilter",
            "type": "object",
            "additionalProperties": true
          },
          "fields": {
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "boolean"
                  },
                  "name": {
                    "type": "boolean"
                  },
                  "createAt": {
                    "type": "boolean"
                  },
                  "previewUrl": {
                    "type": "boolean"
                  },
                  "updateAt": {
                    "type": "boolean"
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "id",
                    "name",
                    "createAt",
                    "previewUrl",
                    "updateAt"
                  ],
                  "example": "id"
                },
                "uniqueItems": true
              }
            ],
            "title": "SeatPlan.Fields"
          },
          "include": {
            "title": "SeatPlan.IncludeFilter",
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/SeatPlan.IncludeFilter.Items"
                },
                {
                  "type": "string"
                }
              ]
            }
          }
        },
        "additionalProperties": false,
        "x-typescript-type": "@loopback/repository#Filter<SeatPlan>"
      }
    },
    "securitySchemes": {
      "jwt": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "security": [
    {
      "jwt": []
    }
  ]
}