{
  "openapi": "3.0.0",
  "info": {
    "title": "set-api",
    "version": "0.0.1",
    "description": "set-api",
    "contact": {}
  },
  "paths": {
    "/evaluation-groups/days": {
      "get": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "listDays",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Fechas con grupos de evaluación en un rango"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "EvaluationGroupsController.listDays"
      }
    },
    "/evaluation-groups/evaluators": {
      "get": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "evaluators",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Evaluadores que pueden atender un grupo"
                }
              }
            }
          }
        },
        "operationId": "EvaluationGroupsController.evaluators"
      }
    },
    "/evaluation-groups/from-calendar": {
      "post": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "fromCalendar",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Crear grupo e importar técnicos del calendario"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "date",
                  "place"
                ],
                "properties": {
                  "date": {
                    "type": "string"
                  },
                  "place": {
                    "type": "string"
                  },
                  "time": {
                    "type": "string"
                  },
                  "hostName": {
                    "type": "string"
                  },
                  "updateExisting": {
                    "type": "boolean"
                  },
                  "rows": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "amtacNumber": {
                          "type": "string"
                        },
                        "birthdate": {
                          "type": "string"
                        },
                        "mail": {
                          "type": "string"
                        },
                        "phone": {
                          "type": "string"
                        },
                        "address": {
                          "type": "string"
                        },
                        "city": {
                          "type": "string"
                        },
                        "state": {
                          "type": "string"
                        },
                        "zipCode": {
                          "type": "string"
                        },
                        "country": {
                          "type": "string"
                        },
                        "level": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "EvaluationGroupsController.fromCalendar"
      }
    },
    "/evaluation-groups/match-rows": {
      "post": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "matchRows",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Técnicos de la plantilla que ya existen"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "rows": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "amtacNumber": {
                          "type": "string"
                        },
                        "birthdate": {
                          "type": "string"
                        },
                        "mail": {
                          "type": "string"
                        },
                        "phone": {
                          "type": "string"
                        },
                        "address": {
                          "type": "string"
                        },
                        "city": {
                          "type": "string"
                        },
                        "state": {
                          "type": "string"
                        },
                        "zipCode": {
                          "type": "string"
                        },
                        "country": {
                          "type": "string"
                        },
                        "level": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "EvaluationGroupsController.matchRows"
      }
    },
    "/evaluation-groups/parse-calendar": {
      "post": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "parseCalendar",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Leer técnicos del calendario de evaluaciones sin importarlos"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string"
                  },
                  "fromRow": {
                    "type": "number"
                  },
                  "toRow": {
                    "type": "number"
                  },
                  "date": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "EvaluationGroupsController.parseCalendar"
      }
    },
    "/evaluation-groups/parse-template": {
      "post": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "parseTemplate",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Leer técnicos de la plantilla sin importarlos"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "EvaluationGroupsController.parseTemplate"
      }
    },
    "/evaluation-groups/template": {
      "get": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "template",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "Plantilla xlsx de técnicos",
            "content": {
              "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "operationId": "EvaluationGroupsController.template"
      }
    },
    "/evaluation-groups/{id}/evaluator": {
      "patch": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "setEvaluator",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Asignar el evaluador de un grupo"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "evaluatorId": {
                    "type": "number",
                    "nullable": true
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "EvaluationGroupsController.setEvaluator"
      }
    },
    "/evaluation-groups/{id}/import": {
      "post": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "importMembers",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Alta de técnicos desde plantilla"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string"
                  },
                  "rows": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "amtacNumber": {
                          "type": "string"
                        },
                        "birthdate": {
                          "type": "string"
                        },
                        "mail": {
                          "type": "string"
                        },
                        "phone": {
                          "type": "string"
                        },
                        "address": {
                          "type": "string"
                        },
                        "city": {
                          "type": "string"
                        },
                        "state": {
                          "type": "string"
                        },
                        "zipCode": {
                          "type": "string"
                        },
                        "country": {
                          "type": "string"
                        },
                        "level": {
                          "type": "string"
                        }
                      }
                    }
                  },
                  "updateExisting": {
                    "type": "boolean"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "EvaluationGroupsController.importMembers"
      }
    },
    "/evaluation-groups/{id}/members": {
      "post": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "addMember",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Agregar un técnico al grupo"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "technicalId"
                ],
                "properties": {
                  "technicalId": {
                    "type": "number"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "EvaluationGroupsController.addMember"
      }
    },
    "/evaluation-groups/{id}": {
      "get": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "findById",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Detalle de un grupo de evaluación"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "EvaluationGroupsController.findById"
      },
      "delete": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "remove",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Eliminar un grupo sin evaluaciones"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "EvaluationGroupsController.remove"
      }
    },
    "/evaluation-groups": {
      "post": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "create",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Crear grupo de evaluación"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "date",
                  "place",
                  "hostName"
                ],
                "properties": {
                  "date": {
                    "type": "string"
                  },
                  "place": {
                    "type": "string"
                  },
                  "time": {
                    "type": "string"
                  },
                  "hostName": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "EvaluationGroupsController.create"
      },
      "get": {
        "x-controller-name": "EvaluationGroupsController",
        "x-operation-name": "list",
        "tags": [
          "EvaluationGroupsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Grupos de evaluación de un día"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "date",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "operationId": "EvaluationGroupsController.list"
      }
    },
    "/evaluations/history": {
      "get": {
        "x-controller-name": "EvaluationsController",
        "x-operation-name": "history",
        "tags": [
          "EvaluationsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Historial de evaluaciones en orden cronológico"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "passed",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "EvaluationsController.history"
      }
    },
    "/evaluations/target": {
      "get": {
        "x-controller-name": "EvaluationsController",
        "x-operation-name": "target",
        "tags": [
          "EvaluationsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Nivel al que aspira el técnico y sus ejercicios"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "technicalId",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "EvaluationsController.target"
      }
    },
    "/evaluations/{id}": {
      "get": {
        "x-controller-name": "EvaluationsController",
        "x-operation-name": "findOne",
        "tags": [
          "EvaluationsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Detalle de una evaluación"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "EvaluationsController.findOne"
      }
    },
    "/evaluations": {
      "post": {
        "x-controller-name": "EvaluationsController",
        "x-operation-name": "create",
        "tags": [
          "EvaluationsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Registrar evaluación del día"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "date",
                  "technicalId",
                  "items"
                ],
                "properties": {
                  "date": {
                    "type": "string"
                  },
                  "technicalId": {
                    "type": "number"
                  },
                  "groupId": {
                    "type": "number"
                  },
                  "place": {
                    "type": "string"
                  },
                  "hostName": {
                    "type": "string"
                  },
                  "writtenScore": {
                    "type": "number"
                  },
                  "writtenTotal": {
                    "type": "number"
                  },
                  "identityCheck": {
                    "type": "boolean"
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "exerciseId": {
                          "type": "number"
                        },
                        "resultId": {
                          "type": "number"
                        },
                        "resultIds": {
                          "type": "array",
                          "items": {
                            "type": "number"
                          }
                        },
                        "notes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "photos": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "EvaluationsController.create"
      },
      "get": {
        "x-controller-name": "EvaluationsController",
        "x-operation-name": "list",
        "tags": [
          "EvaluationsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Evaluaciones de un día o de un técnico"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "date",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "technicalId",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "EvaluationsController.list"
      }
    },
    "/exam-questions/{id}": {
      "patch": {
        "x-controller-name": "ExamsController",
        "x-operation-name": "updateQuestion",
        "tags": [
          "ExamsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Actualizar pregunta (clave correcta, etc.)"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string"
                  },
                  "topicId": {
                    "type": "number"
                  },
                  "type": {
                    "type": "string"
                  },
                  "image": {
                    "type": "string",
                    "nullable": true
                  },
                  "options": {
                    "type": "array"
                  },
                  "rows": {
                    "type": "array"
                  },
                  "columns": {
                    "type": "array"
                  },
                  "correctKey": {
                    "type": "string",
                    "nullable": true
                  },
                  "correctMap": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "nullable": true
                  },
                  "active": {
                    "type": "boolean"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ExamsController.updateQuestion"
      }
    },
    "/exam-sessions/{token}/debug-key": {
      "get": {
        "x-controller-name": "ExamsController",
        "x-operation-name": "sessionDebugKey",
        "tags": [
          "ExamsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Clave de respuestas para herramientas debug"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "operationId": "ExamsController.sessionDebugKey"
      }
    },
    "/exam-sessions/{token}/submit": {
      "post": {
        "x-controller-name": "ExamsController",
        "x-operation-name": "publicSubmit",
        "tags": [
          "ExamsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Enviar respuestas del examen"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "answers": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ExamsController.publicSubmit"
      }
    },
    "/exam-sessions/{token}": {
      "get": {
        "x-controller-name": "ExamsController",
        "x-operation-name": "publicGet",
        "tags": [
          "ExamsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Examen público por token"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "operationId": "ExamsController.publicGet"
      }
    },
    "/exams/{id}/practice": {
      "get": {
        "x-controller-name": "ExamsController",
        "x-operation-name": "practice",
        "tags": [
          "ExamsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Examen de práctica (superuser, con clave debug)"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ExamsController.practice"
      }
    },
    "/exams/{id}/practice-submit": {
      "post": {
        "x-controller-name": "ExamsController",
        "x-operation-name": "practiceSubmit",
        "tags": [
          "ExamsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Calificar práctica sin guardar sesión"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "answers": {
                    "type": "object",
                    "additionalProperties": true
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ExamsController.practiceSubmit"
      }
    },
    "/exams/{id}": {
      "patch": {
        "x-controller-name": "ExamsController",
        "x-operation-name": "updateExam",
        "tags": [
          "ExamsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Actualizar configuración del examen"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "questionsPerTopic": {
                    "type": "number"
                  },
                  "active": {
                    "type": "boolean"
                  },
                  "questions": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "number"
                        },
                        "topicId": {
                          "type": "number"
                        },
                        "type": {
                          "type": "string"
                        },
                        "text": {
                          "type": "string"
                        },
                        "image": {
                          "type": "string",
                          "nullable": true
                        },
                        "options": {
                          "type": "array"
                        },
                        "rows": {
                          "type": "array"
                        },
                        "columns": {
                          "type": "array"
                        },
                        "correctKey": {
                          "type": "string",
                          "nullable": true
                        },
                        "correctMap": {
                          "type": "object",
                          "additionalProperties": {
                            "type": "string"
                          },
                          "nullable": true
                        },
                        "active": {
                          "type": "boolean"
                        }
                      }
                    }
                  },
                  "topics": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "number"
                        },
                        "name": {
                          "type": "string"
                        },
                        "sort": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ExamsController.updateExam"
      },
      "get": {
        "x-controller-name": "ExamsController",
        "x-operation-name": "detail",
        "tags": [
          "ExamsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Detalle de examen con temas y preguntas"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ExamsController.detail"
      }
    },
    "/exams": {
      "get": {
        "x-controller-name": "ExamsController",
        "x-operation-name": "list",
        "tags": [
          "ExamsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Listado de exámenes escritos"
                }
              }
            }
          }
        },
        "operationId": "ExamsController.list"
      }
    },
    "/exercises/{id}": {
      "patch": {
        "x-controller-name": "ExercisesController",
        "x-operation-name": "update",
        "tags": [
          "ExercisesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Actualizar ejercicio"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "levelIds": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ExercisesController.update"
      },
      "delete": {
        "x-controller-name": "ExercisesController",
        "x-operation-name": "remove",
        "tags": [
          "ExercisesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Borrado lógico del ejercicio"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ExercisesController.remove"
      }
    },
    "/exercises": {
      "post": {
        "x-controller-name": "ExercisesController",
        "x-operation-name": "create",
        "tags": [
          "ExercisesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Crear ejercicio"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "levelIds"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "levelIds": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "ExercisesController.create"
      },
      "get": {
        "x-controller-name": "ExercisesController",
        "x-operation-name": "list",
        "tags": [
          "ExercisesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Ejercicios activos con sus niveles"
                }
              }
            }
          }
        },
        "operationId": "ExercisesController.list"
      }
    },
    "/files": {
      "post": {
        "x-controller-name": "FilesController",
        "x-operation-name": "create",
        "tags": [
          "FilesController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Guardar una foto"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "image"
                ],
                "properties": {
                  "image": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "FilesController.create"
      }
    },
    "/levels/{id}/move": {
      "post": {
        "x-controller-name": "LevelsController",
        "x-operation-name": "move",
        "tags": [
          "LevelsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Subir o bajar la jerarquía del nivel"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "direction"
                ],
                "properties": {
                  "direction": {
                    "type": "string",
                    "enum": [
                      "up",
                      "down"
                    ]
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "LevelsController.move"
      }
    },
    "/levels/{id}": {
      "patch": {
        "x-controller-name": "LevelsController",
        "x-operation-name": "updateName",
        "tags": [
          "LevelsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Actualizar nombre del nivel"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "LevelsController.updateName"
      },
      "delete": {
        "x-controller-name": "LevelsController",
        "x-operation-name": "remove",
        "tags": [
          "LevelsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Borrado lógico del nivel"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "LevelsController.remove"
      }
    },
    "/levels": {
      "post": {
        "x-controller-name": "LevelsController",
        "x-operation-name": "create",
        "tags": [
          "LevelsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Crear nivel"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "hierarchy": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "operationId": "LevelsController.create"
      },
      "get": {
        "x-controller-name": "LevelsController",
        "x-operation-name": "list",
        "tags": [
          "LevelsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Niveles activos ordenados por jerarquía"
                }
              }
            }
          }
        },
        "operationId": "LevelsController.list"
      }
    },
    "/ping": {
      "get": {
        "x-controller-name": "PingController",
        "x-operation-name": "ping",
        "tags": [
          "PingController"
        ],
        "responses": {
          "200": {
            "description": "Ping Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PingResponse"
                }
              }
            }
          }
        },
        "operationId": "PingController.ping"
      }
    },
    "/results/{id}/move": {
      "post": {
        "x-controller-name": "ResultsController",
        "x-operation-name": "move",
        "tags": [
          "ResultsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Subir o bajar la jerarquía del resultado"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "direction"
                ],
                "properties": {
                  "direction": {
                    "type": "string",
                    "enum": [
                      "up",
                      "down"
                    ]
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ResultsController.move"
      }
    },
    "/results/{id}": {
      "patch": {
        "x-controller-name": "ResultsController",
        "x-operation-name": "update",
        "tags": [
          "ResultsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Actualizar resultado"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "instakill": {
                    "type": "boolean"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "ResultsController.update"
      },
      "delete": {
        "x-controller-name": "ResultsController",
        "x-operation-name": "remove",
        "tags": [
          "ResultsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Borrado lógico del resultado"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "ResultsController.remove"
      }
    },
    "/results": {
      "post": {
        "x-controller-name": "ResultsController",
        "x-operation-name": "create",
        "tags": [
          "ResultsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Crear resultado"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "instakill": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "operationId": "ResultsController.create"
      },
      "get": {
        "x-controller-name": "ResultsController",
        "x-operation-name": "list",
        "tags": [
          "ResultsController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Resultados activos ordenados por jerarquía"
                }
              }
            }
          }
        },
        "operationId": "ResultsController.list"
      }
    },
    "/roles": {
      "get": {
        "x-controller-name": "UsersManageController",
        "x-operation-name": "listRoles",
        "tags": [
          "UsersManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Roles disponibles para el usuario en sesión"
                }
              }
            }
          }
        },
        "operationId": "UsersManageController.listRoles"
      }
    },
    "/system/calendar-source/test": {
      "post": {
        "x-controller-name": "SystemController",
        "x-operation-name": "calendarSourceTest",
        "tags": [
          "SystemController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Probar la lectura del calendario"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "SystemController.calendarSourceTest"
      }
    },
    "/system/calendar-source": {
      "put": {
        "x-controller-name": "SystemController",
        "x-operation-name": "calendarSourceSave",
        "tags": [
          "SystemController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Registrar el calendario de Google Drive"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "nullable": true
                  }
                }
              }
            }
          }
        },
        "operationId": "SystemController.calendarSourceSave"
      },
      "get": {
        "x-controller-name": "SystemController",
        "x-operation-name": "calendarSourceRead",
        "tags": [
          "SystemController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Calendario de Google Drive configurado"
                }
              }
            }
          }
        },
        "operationId": "SystemController.calendarSourceRead"
      }
    },
    "/system/format": {
      "post": {
        "x-controller-name": "SystemController",
        "x-operation-name": "format",
        "tags": [
          "SystemController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Borrar técnicos y evaluaciones"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "password"
                ],
                "properties": {
                  "password": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "SystemController.format"
      }
    },
    "/system/mail-settings/test": {
      "post": {
        "x-controller-name": "SystemController",
        "x-operation-name": "mailSettingsTest",
        "tags": [
          "SystemController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Probar SMTP con un correo de prueba"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "host": {
                    "type": "string",
                    "nullable": true
                  },
                  "port": {
                    "oneOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "secure": {
                    "type": "boolean",
                    "nullable": true
                  },
                  "user": {
                    "type": "string",
                    "nullable": true
                  },
                  "password": {
                    "type": "string",
                    "nullable": true
                  },
                  "fromEmail": {
                    "type": "string",
                    "nullable": true
                  },
                  "fromName": {
                    "type": "string",
                    "nullable": true
                  },
                  "portalUrl": {
                    "type": "string",
                    "nullable": true
                  },
                  "to": {
                    "type": "string",
                    "nullable": true
                  }
                }
              }
            }
          }
        },
        "operationId": "SystemController.mailSettingsTest"
      }
    },
    "/system/mail-settings": {
      "put": {
        "x-controller-name": "SystemController",
        "x-operation-name": "mailSettingsSave",
        "tags": [
          "SystemController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Guardar SMTP y URL del portal"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "host": {
                    "type": "string",
                    "nullable": true
                  },
                  "port": {
                    "oneOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "secure": {
                    "type": "boolean",
                    "nullable": true
                  },
                  "user": {
                    "type": "string",
                    "nullable": true
                  },
                  "password": {
                    "type": "string",
                    "nullable": true
                  },
                  "fromEmail": {
                    "type": "string",
                    "nullable": true
                  },
                  "fromName": {
                    "type": "string",
                    "nullable": true
                  },
                  "portalUrl": {
                    "type": "string",
                    "nullable": true
                  }
                }
              }
            }
          }
        },
        "operationId": "SystemController.mailSettingsSave"
      },
      "get": {
        "x-controller-name": "SystemController",
        "x-operation-name": "mailSettingsRead",
        "tags": [
          "SystemController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "SMTP y URL del portal"
                }
              }
            }
          }
        },
        "operationId": "SystemController.mailSettingsRead"
      }
    },
    "/technicals/manage": {
      "get": {
        "x-controller-name": "TechnicalsManageController",
        "x-operation-name": "list",
        "tags": [
          "TechnicalsManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Listado paginado de técnicos activos"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "levelId",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "withoutLevel",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "TechnicalsManageController.list"
      }
    },
    "/technicals/match": {
      "post": {
        "x-controller-name": "TechnicalsManageController",
        "x-operation-name": "match",
        "tags": [
          "TechnicalsManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Técnicos activos por No. AMTEAC"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "amtacNumbers": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "TechnicalsManageController.match"
      }
    },
    "/technicals/{id}/changes": {
      "get": {
        "x-controller-name": "TechnicalsManageController",
        "x-operation-name": "listChanges",
        "tags": [
          "TechnicalsManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bitácora de cambios del técnico"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "TechnicalsManageController.listChanges"
      }
    },
    "/technicals/{id}": {
      "patch": {
        "x-controller-name": "TechnicalsManageController",
        "x-operation-name": "update",
        "tags": [
          "TechnicalsManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Actualizar técnico"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "amtacNumber": {
                    "oneOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "birthdate": {
                    "type": "string",
                    "nullable": true
                  },
                  "address": {
                    "type": "string",
                    "nullable": true
                  },
                  "city": {
                    "type": "string",
                    "nullable": true
                  },
                  "state": {
                    "type": "string",
                    "nullable": true
                  },
                  "zipCode": {
                    "type": "string",
                    "nullable": true
                  },
                  "country": {
                    "type": "string",
                    "nullable": true
                  },
                  "mail": {
                    "type": "string",
                    "nullable": true
                  },
                  "phone": {
                    "type": "string",
                    "nullable": true
                  },
                  "photo": {
                    "type": "string",
                    "nullable": true
                  },
                  "levelId": {
                    "oneOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "TechnicalsManageController.update"
      },
      "get": {
        "x-controller-name": "TechnicalsManageController",
        "x-operation-name": "findById",
        "tags": [
          "TechnicalsManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Detalle de un técnico activo"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "TechnicalsManageController.findById"
      },
      "delete": {
        "x-controller-name": "TechnicalsManageController",
        "x-operation-name": "softDelete",
        "tags": [
          "TechnicalsManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Borrado lógico del técnico"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "TechnicalsManageController.softDelete"
      }
    },
    "/technicals": {
      "post": {
        "x-controller-name": "TechnicalsManageController",
        "x-operation-name": "create",
        "tags": [
          "TechnicalsManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Crear técnico"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "amtacNumber": {
                    "oneOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "birthdate": {
                    "type": "string",
                    "nullable": true
                  },
                  "address": {
                    "type": "string",
                    "nullable": true
                  },
                  "city": {
                    "type": "string",
                    "nullable": true
                  },
                  "state": {
                    "type": "string",
                    "nullable": true
                  },
                  "zipCode": {
                    "type": "string",
                    "nullable": true
                  },
                  "country": {
                    "type": "string",
                    "nullable": true
                  },
                  "mail": {
                    "type": "string",
                    "nullable": true
                  },
                  "phone": {
                    "type": "string",
                    "nullable": true
                  },
                  "photo": {
                    "type": "string",
                    "nullable": true
                  },
                  "levelId": {
                    "oneOf": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "name"
                ]
              }
            }
          }
        },
        "operationId": "TechnicalsManageController.create"
      }
    },
    "/users/forgot-password": {
      "post": {
        "x-controller-name": "AuthController",
        "x-operation-name": "forgotPassword",
        "tags": [
          "AuthController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Solicitar restablecimiento de contraseña"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "AuthController.forgotPassword"
      }
    },
    "/users/login": {
      "post": {
        "x-controller-name": "AuthController",
        "x-operation-name": "login",
        "tags": [
          "AuthController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Inicio de sesión"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "username",
                  "password"
                ],
                "properties": {
                  "username": {
                    "type": "string"
                  },
                  "password": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "AuthController.login"
      }
    },
    "/users/manage": {
      "get": {
        "x-controller-name": "UsersManageController",
        "x-operation-name": "list",
        "tags": [
          "UsersManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Listado paginado de usuarios activos"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "roleId",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "operationId": "UsersManageController.list"
      }
    },
    "/users/register": {
      "post": {
        "x-controller-name": "AuthController",
        "x-operation-name": "register",
        "tags": [
          "AuthController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Registro de usuario (solo superuser y admin)"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "username",
                  "password",
                  "name",
                  "lastname",
                  "roleId"
                ],
                "properties": {
                  "username": {
                    "type": "string"
                  },
                  "password": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "evaluatorNumber": {
                    "type": "string"
                  },
                  "roleId": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "operationId": "AuthController.register"
      }
    },
    "/users/reset-password": {
      "post": {
        "x-controller-name": "AuthController",
        "x-operation-name": "resetPassword",
        "tags": [
          "AuthController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Restablecer contraseña con el token del correo"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "token",
                  "password"
                ],
                "properties": {
                  "token": {
                    "type": "string"
                  },
                  "password": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "operationId": "AuthController.resetPassword"
      }
    },
    "/users/{id}/role": {
      "get": {
        "x-controller-name": "UserRoleController",
        "x-operation-name": "getRole",
        "tags": [
          "UserRoleController"
        ],
        "responses": {
          "200": {
            "description": "Role belonging to User",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Role"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "UserRoleController.getRole"
      }
    },
    "/users/{id}/session": {
      "get": {
        "x-controller-name": "AuthController",
        "x-operation-name": "session",
        "tags": [
          "AuthController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Usuario en sesión con su rol"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "AuthController.session"
      }
    },
    "/users/{id}": {
      "patch": {
        "x-controller-name": "UsersManageController",
        "x-operation-name": "updateById",
        "tags": [
          "UsersManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Actualizar usuario"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "username": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "lastname": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "nullable": true
                  },
                  "evaluatorNumber": {
                    "type": "string",
                    "nullable": true
                  },
                  "password": {
                    "type": "string",
                    "nullable": true
                  },
                  "roleId": {
                    "type": "number"
                  }
                }
              }
            }
          },
          "x-parameter-index": 1
        },
        "operationId": "UsersManageController.updateById"
      },
      "delete": {
        "x-controller-name": "UsersManageController",
        "x-operation-name": "softDelete",
        "tags": [
          "UsersManageController"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Borrado lógico del usuario"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "number"
            },
            "required": true
          }
        ],
        "operationId": "UsersManageController.softDelete"
      }
    },
    "/users": {
      "post": {
        "x-controller-name": "UserController",
        "x-operation-name": "create",
        "tags": [
          "UserController"
        ],
        "responses": {
          "200": {
            "description": "User model instance",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            }
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewUser"
              }
            }
          }
        },
        "operationId": "UserController.create"
      }
    }
  },
  "servers": [
    {
      "url": "https://www.amteac-set-api.acceso.sv"
    }
  ],
  "components": {
    "schemas": {
      "User": {
        "title": "User",
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "username": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "evaluatorNumber": {
            "type": "string"
          },
          "lastname": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          },
          "token": {
            "type": "string"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "deleted": {
            "type": "boolean"
          },
          "roleId": {
            "type": "object"
          }
        },
        "additionalProperties": true
      },
      "NewUser": {
        "title": "NewUser",
        "type": "object",
        "description": "(tsType: Omit<User, 'id'>, schemaOptions: { title: 'NewUser', exclude: [ 'id' ] })",
        "properties": {
          "username": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "evaluatorNumber": {
            "type": "string"
          },
          "lastname": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "password": {
            "type": "string"
          },
          "token": {
            "type": "string"
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "deleted": {
            "type": "boolean"
          },
          "roleId": {
            "type": "object"
          }
        },
        "additionalProperties": true,
        "x-typescript-type": "Omit<User, 'id'>"
      },
      "Role": {
        "title": "Role",
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "nickname": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "PingResponse": {
        "type": "object",
        "title": "PingResponse",
        "properties": {
          "greeting": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "headers": {
            "type": "object",
            "properties": {
              "Content-Type": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        }
      }
    }
  }
}