{
  "openapi": "3.0.1",
  "info": {
    "title": "SoftLanding.ApiService | student",
    "version": "1.0.0"
  },
  "paths": {
    "/student/homework-documents/{id}": {
      "get": {
        "tags": [
          "HomeworkDocument (Student)"
        ],
        "summary": "Download a file of the student's own homework.",
        "description": "Streams the stored file with its original name and content type. A student reads the files of homework on a lesson of a course they are enrolled in — the material is for the person doing the work. Anything else is `404`.",
        "operationId": "DownloadHomeworkDocumentStudent",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/student/dashboard": {
      "get": {
        "tags": [
          "Dashboard (Student)"
        ],
        "summary": "Get the student dashboard aggregate.",
        "description": "Returns a single read-only snapshot object for the signed-in student's home screen, assembled in\none call instead of from the individual student endpoints.\n\nIt is scoped to the signed-in student and contains only their own data:\n- counters (days until the next lesson, number of actively enrolled courses, attendance rate,\n  unread notifications),\n- the next upcoming lesson and the ordered list of upcoming lessons,\n- the courses the student is currently enrolled in,\n- recent notifications.\n\nThe figures are point-in-time and computed on each request.",
        "operationId": "GetStudentDashboard",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentDashboardGet"
                }
              }
            }
          }
        }
      }
    },
    "/student/material-change-requests": {
      "get": {
        "tags": [
          "MaterialChangeRequest (Student)"
        ],
        "summary": "List the material questions put to the signed-in student.",
        "description": "Returns the student's own requests. `canAnswer` says whether THIS reader may answer them: a minor\nsees the question and cannot act on it — their responsible customer decides, exactly as with a\ncourse invitation. It is server-computed, because the page renders its Save button from it.\n\nFilter with `isAnswered`, `courseId` and `searchTerm`.\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50, `-50` = last\n50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name of the returned\nobject, case-insensitive) and `desc` query parameters. The body is a plain JSON array; the total count is\nreturned in the `Content-Range` response header (`items {start}-{end}/{total}`). Status is `206` when a\n`Range` is sent, `416` if the range is invalid.",
        "operationId": "GetMaterialChangeRequestsStudent",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "IsAnswered",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CourseId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MaterialChangeRequestGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MaterialChangeRequestGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/student/material-change-requests/{id}": {
      "get": {
        "tags": [
          "MaterialChangeRequest (Student)"
        ],
        "summary": "Get one of the student's own material change requests.",
        "description": "`404` for anybody else's.",
        "operationId": "GetMaterialChangeRequestStudentById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaterialChangeRequestGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "MaterialChangeRequest (Student)"
        ],
        "summary": "Answer one's own material change request (adults only).",
        "description": "Answers the request, or corrects an answer already given.\n\nSend one entry per article in `answers`; articles left out keep what they had, so a round may legitimately\nbe answered in two sittings. `alreadyInPossession` is REQUIRED on every entry — omitting it would arrive\nas `false`, which reads as \"please order it\", and a book must never be bought by saying nothing.\n\nThe delivery method may be stated per article or once for the whole round (`deliveryMethodId`); the\nper-article value wins. An article that is NOT already owned needs an effective method, and anything going\nby mail needs a `deliveryAddress` — both are `400` with the article named, because neither can be decided\nfrom one article alone.\n\nAnswering the LAST open article closes the round and produces the material order, in the same transaction:\nan answered round can never exist without its order. It is billed on the next monthly invoice, not on a\nmaterial invoice of its own — this is Fall 2 by definition.\nA MINOR gets `403`: the material list belongs to the decision their responsible customer makes for\nthem. An unset birthdate counts as a minor — the cautious reading.",
        "operationId": "UpdateMaterialChangeRequestStudent",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaterialChangeRequestPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaterialChangeRequestGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/student/my-homework": {
      "get": {
        "tags": [
          "Homework (Student)"
        ],
        "summary": "List the signed-in student's homework. Default: due today or later; pass ?due=YYYY-MM-DD to load older entries (due on/after that date).",
        "description": "Returns the homework assigned across the courses the signed-in student is enrolled in\n(\"my homework\"), each as a `HomeworkGet` with the task description, due date and the owning\nlesson/course context. Only your own homework is returned. By default only entries due today\nor later are included; pass `due=YYYY-MM-DD` to also load older entries (returns everything\ndue on or after that date). Filter additionally with `searchTerm` (matches the description).\nResults are ordered by due date.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property\nname of the returned object, case-insensitive) and `desc` query parameters. The body is a\nplain JSON array; the total count is returned in the `Content-Range` response header\n(`items {start}-{end}/{total}`). Status is `206` when a `Range` is sent, `416` if the range\nis invalid.",
        "operationId": "GetMyHomeworkStudent",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Due",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/HomeworkGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/HomeworkGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/student/my-homework/{id}": {
      "get": {
        "tags": [
          "Homework (Student)"
        ],
        "summary": "Get one of the signed-in student's homework by id.",
        "description": "Returns a single homework by its id as a `HomeworkGet`. Returns `404` if no such homework\nexists or if it does not belong to the signed-in student.",
        "operationId": "GetMyHomeworkStudentById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HomeworkGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/student/students": {
      "get": {
        "tags": [
          "Student (Student)"
        ],
        "summary": "List the student records visible to the signed-in student (self-view).",
        "description": "Returns the student records visible to the signed-in student — their own self-view — each as\na `StudentGet` (personal details, languages, contact data, address, responsible customer and\nlearning subjects). Records belonging to other students are never returned. Soft-deleted\nentries are excluded unless you pass `showRemoved=true`. Filter with `searchTerm` (matches\nfirst name, last name and email).\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property\nname of the returned object, case-insensitive) and `desc` query parameters. The body is a\nplain JSON array; the total count is returned in the `Content-Range` response header\n(`items {start}-{end}/{total}`). Status is `206` when a `Range` is sent, `416` if the range\nis invalid.",
        "operationId": "GetStudentsStudent",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Status",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/NullableOfEStudentStatus"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StudentGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StudentGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/student/students/{id}": {
      "get": {
        "tags": [
          "Student (Student)"
        ],
        "summary": "Get a single student record by id (student self-view).",
        "description": "Returns a single student record as a `StudentGet` (student self-view). Returns `404` if no\nsuch student exists or if it does not belong to the signed-in student.",
        "operationId": "GetStudentStudentById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Student (Student)"
        ],
        "summary": "Partially update the signed-in student's own profile (limited self-edit).",
        "description": "Partially updates the signed-in student's own profile (limited self-edit via `StudentPatch`):\ngender, correspondence language, preferred teaching format, phone and address details. The\nname is not editable and an email change is handled by a separate workflow. Only the fields\npresent in the body are changed. Returns the updated `StudentGet`, `400` on validation errors,\nor `404` if the record does not exist or does not belong to the signed-in student.",
        "operationId": "UpdateStudentStudent",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudentPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/student/courses": {
      "get": {
        "tags": [
          "Course (Student)"
        ],
        "summary": "List the signed-in student's courses.",
        "description": "Returns the courses the signed-in student is enrolled in or invited to (\"my courses\"), each\nas a `CourseGet` with name, type, subject, level, status, colour, weekly schedule,\nstart/end dates, room and teacher (display only, no contact details), required materials,\nplus the student's own enrollment status and own attendance rate. Only your own courses are\never returned; courses belonging to other students are not visible. Soft-deleted courses are\nexcluded unless you pass `showRemoved=true`. Filter with `searchTerm` (matches course name\nand description), `courseTypeId`, `subjectId` and `levelId` (resolvable via the `/lookups/*`\nendpoints).\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property\nname of the returned object, case-insensitive) and `desc` query parameters. The body is a\nplain JSON array; the total count is returned in the `Content-Range` response header\n(`items {start}-{end}/{total}`). Status is `206` when a `Range` is sent, `416` if the range\nis invalid.",
        "operationId": "GetCoursesStudent",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CourseTypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "SubjectId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "LevelId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CourseGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CourseGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/student/courses/{id}": {
      "get": {
        "tags": [
          "Course (Student)"
        ],
        "summary": "Get one of the signed-in student's courses by id.",
        "description": "Returns a single course the signed-in student is enrolled in or invited to, as a `CourseGet`.\nReturns `404` if no such course exists or if it does not belong to the signed-in student.",
        "operationId": "GetCourseStudentById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/student/lessons": {
      "get": {
        "tags": [
          "Lesson (Student)"
        ],
        "summary": "List the signed-in student's lessons.",
        "description": "Returns the lessons of the courses the signed-in student is enrolled in (\"my lessons\"), each\nas a `LessonGet` with date, start/end time, subject, level, teacher and room (display only),\ncomputed status, cancellation flag, the lesson's homework and the student's own attendance\nrecord. Only your own lessons are returned. Soft-deleted lessons are excluded unless you pass\n`showRemoved=true`. Filter with `searchTerm` (matches course name and homework text),\n`courseId`, `subjectId`, a `dateFrom`/`dateTo` range and `isCancelled`.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property\nname of the returned object, case-insensitive) and `desc` query parameters. The body is a\nplain JSON array; the total count is returned in the `Content-Range` response header\n(`items {start}-{end}/{total}`). Status is `206` when a `Range` is sent, `416` if the range\nis invalid.",
        "operationId": "GetLessonsStudent",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CourseId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "SubjectId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "DateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "DateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "IsCancelled",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LessonGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LessonGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/student/lessons/{id}": {
      "get": {
        "tags": [
          "Lesson (Student)"
        ],
        "summary": "Get one of the signed-in student's lessons by id.",
        "description": "Returns a single lesson of one of the signed-in student's courses, as a `LessonGet`. Returns\n`404` if no such lesson exists or if it does not belong to the signed-in student.",
        "operationId": "GetLessonStudentById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LessonGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/student/student-invites": {
      "get": {
        "tags": [
          "StudentInvite (Student)"
        ],
        "summary": "List the signed-in student's course invitations.",
        "description": "Returns the course invitations addressed to the signed-in student (\"my invites\"), each as a\n`StudentInviteGet` with the invited course, invitation status, timestamps and the\nmaterial-choice workflow (per-material state, chosen delivery method and delivery address).\nOnly your own invitations are returned. Soft-deleted entries are excluded unless you pass\n`showRemoved=true`. Filter with `searchTerm` (matches the course name), `courseId` and\n`statusId`.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property\nname of the returned object, case-insensitive) and `desc` query parameters. The body is a\nplain JSON array; the total count is returned in the `Content-Range` response header\n(`items {start}-{end}/{total}`). Status is `206` when a `Range` is sent, `416` if the range\nis invalid.",
        "operationId": "GetStudentInvitesStudent",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CourseId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StudentInviteGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StudentInviteGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/student/student-invites/{id}": {
      "get": {
        "tags": [
          "StudentInvite (Student)"
        ],
        "summary": "Get one of the signed-in student's invitations by id.",
        "description": "Returns a single invitation addressed to the signed-in student, as a `StudentInviteGet`.\nReturns `404` if no such invitation exists or if it is not addressed to the signed-in student.",
        "operationId": "GetStudentInviteStudentById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentInviteGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "StudentInvite (Student)"
        ],
        "summary": "Accept or decline the signed-in student's own invitation and submit material choices.",
        "description": "Responds to one of the signed-in student's own invitations: set the status to accepted or\ndeclined and, when accepting, submit the material choices, delivery method and delivery\naddress (`StudentInvitePatch`). Only adult students may respond directly — for a minor the\nresponsible customer must act on their behalf, and such a call is rejected. Returns the\nupdated `StudentInviteGet`, `400` on validation errors, or `404` if the invitation does not\nexist or is not addressed to the signed-in student.\n\nAccepting ENROLS the student, so it answers `409` when the course has meanwhile become **full** —\nplaces are counted as everybody enrolled plus everybody holding an open invitation, and this\ninvitation holds one, so it only fires when the places were taken after it went out.\n\nAccepting requires an answer for **every** article on the material list, and every article the\nstudent does not already own is then ordered. **How that material is delivered may be stated\neither way**: per article in `materialChoices[].deliveryMethodId`, or once for the whole\nconfirmation in the top-level `deliveryMethodId` — the per-article value wins, then the one for\nthe whole confirmation, then whatever the invitation already holds from an earlier round. An\narticle that ends up with no delivery method at all is a `400` naming it. If anything goes by\nmail, a `deliveryAddress` is required unless the invitation already carries one.\n\n`alreadyInPossession` is **required** per article — omitting it is a `400`, never a silent \"please\norder it\". `false` is the only value that creates or changes an order, and what it does depends on\nthe article's state: while its order line is still `confirmed` it REVISES that line (change the\ndelivery method, or `true` withdraws it) — the same article never produces a second order that way.\nOnce the office has marked the line `ordered`/`delivered` the article reads back as\n`alreadyInPossession: true`, so a `false` there is a deliberate RE-ORDER of a lost or damaged book\nand is charged again; sending `true` for it changes nothing.",
        "operationId": "UpdateStudentInviteStudent",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudentInvitePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentInviteGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/student/notifications": {
      "get": {
        "tags": [
          "Notification (Student)"
        ],
        "summary": "List the signed-in student's notifications.",
        "description": "Returns the notifications addressed to the signed-in student (\"my notifications\"), each as a\n`NotificationGet` with the message, issue date, read flag, category and an optional deep-link\nURL. Only your own notifications are returned. Soft-deleted entries are excluded unless you\npass `showRemoved=true`.\n\nThe message and the deep-link URL are COMPOSED per request from the notification's key and the\nrecords it references, not stored — so a renamed customer or course, or a changed portal route, is\nreflected in notifications that already exist.\n\nFilter with `typeId` / `keyId` (resolvable via `/lookups/notification-type` and\n`/lookups/notification-key`) and `isRead`. **`searchTerm` is not supported here** and is ignored:\nsince the message is composed rather than stored, there is no text column to search, and filtering\nafter the fact would break the pagination contract below.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property\nname of the returned object, case-insensitive) and `desc` query parameters. The body is a\nplain JSON array; the total count is returned in the `Content-Range` response header\n(`items {start}-{end}/{total}`). Status is `206` when a `Range` is sent, `416` if the range\nis invalid.",
        "operationId": "GetNotificationsStudent",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "TypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "KeyId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "IsRead",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/NotificationGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/NotificationGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/student/notifications/{id}": {
      "get": {
        "tags": [
          "Notification (Student)"
        ],
        "summary": "Get one of the signed-in student's notifications by id.",
        "description": "Returns a single notification by its id as a `NotificationGet`. Returns `404` if no such\nnotification exists or if it is not addressed to the signed-in student.",
        "operationId": "GetNotificationStudentById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Notification (Student)"
        ],
        "summary": "Mark one of the signed-in student's notifications as read/unread.",
        "description": "Marks one of the signed-in student's own notifications as read or unread; this is the only\neditable field (`isRead`). Returns the updated `NotificationGet`, `400` on validation errors,\nor `404` if the notification does not exist or is not addressed to the signed-in student.",
        "operationId": "UpdateNotificationStudent",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/student/notifications/unread-count": {
      "get": {
        "tags": [
          "Notification (Student)"
        ],
        "summary": "Count the signed-in student's unread notifications.",
        "description": "Returns how many of the signed-in student's notifications are currently unread, as\n`{ \"unread\": n }`. Intended for a badge or bell indicator: it answers the same question as\nlisting with `isRead=false` but transfers only the number instead of the notifications.\nNotifications addressed to anybody else — including the responsible customer, who has their own\ninbox — are never counted.",
        "operationId": "GetNotificationUnreadCountStudent",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationUnreadCountGet"
                }
              }
            }
          }
        }
      }
    },
    "/student/notifications/mark-all-read": {
      "post": {
        "tags": [
          "Notification (Student)"
        ],
        "summary": "Mark all of the signed-in student's notifications as read.",
        "description": "Marks every unread notification of the signed-in student as read and returns\n`{ \"updated\": n }` — the number of notifications that actually changed. Already-read\nnotifications are not counted, so calling this twice reports `0` the second time.",
        "operationId": "MarkAllNotificationsReadStudent",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationMarkReadResultGet"
                }
              }
            }
          }
        }
      }
    },
    "/student/notifications/mark-read": {
      "post": {
        "tags": [
          "Notification (Student)"
        ],
        "summary": "Mark several notifications as read (student).",
        "description": "Marks the notifications named in the `NotificationMarkReadPost` body (`ids`) as read and\nreturns `{ \"updated\": n }` — the number that actually changed. Ids that are unknown, already\nread, or addressed to somebody else match nothing and are ignored rather than reported\nindividually, so the response cannot be used to probe for other people's notifications.\nReturns `400` when `ids` is missing, empty, contains an empty Guid, or exceeds the per-request\nlimit.",
        "operationId": "MarkNotificationsReadStudent",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationMarkReadPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationMarkReadResultGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/student/myprofile": {
      "get": {
        "tags": [
          "Student MyProfile"
        ],
        "summary": "Get the signed-in student's own profile.",
        "description": "Returns the signed-in student's own profile as a `StudentGet` (personal details, native and\ncorrespondence language, gender, preferred teaching format, contact data, address, responsible\ncustomer, learning subjects and their own `loginNumber` — the 10-digit name they sign in with,\nwhich for a student without an email address is the only identifier they have). The record is resolved from the signed-in user,\nso no id is passed. Returns `404` when the signed-in user has no linked student record.",
        "operationId": "GetStudentMyProfile",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Student MyProfile"
        ],
        "summary": "Partially update the signed-in student's own profile (reduced self-edit DTO).",
        "description": "Partially updates the signed-in student's own profile from a reduced self-edit body\n(`MyProfilePatch`): gender, correspondence language, preferred teaching format, phone — and, for an\nADULT student, their own EMAIL address. Name and the remaining fields stay office-managed.\nA minor may not change their address (`403`): it belongs to the responsible customer, who changes\nit through their own route. A duplicate address is refused with `409`; a changed one is carried\nthrough to the login account (whose login NUMBER never changes). Only the fields present in the body are changed. Returns the updated\n`StudentGet`, `400` on validation errors, or `404` when the signed-in user has no linked\nstudent record.",
        "operationId": "UpdateStudentMyProfile",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MyProfilePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/student/myprofile/reset-password": {
      "post": {
        "tags": [
          "Student MyProfile"
        ],
        "summary": "Send the signed-in ADULT student their own password-reset link.",
        "description": "Triggers the identity provider's password-reset mail for the signed-in student's own login. The\nlink goes to the address on their record and is rendered and delivered by Keycloak itself — this\napplication never learns or sets the password.\n\n**Adults only.** A minor's access is managed by the responsible customer, who sets a one-time\npassword through `POST /customer/students/{id}/set-password`; a minor calling this gets `403`.\n\nReturns `204` once the mail was handed over. `400` if the student has no email address (a student\nwithout a mailbox gets a one-time password instead), `409` if there is no login account yet,\n`404` when the signed-in user has no linked student record, and `503` when no identity provider\nis configured.",
        "operationId": "ResetStudentMyPassword",
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AddressInfoDto": {
        "type": "object",
        "properties": {
          "street": {
            "type": "string"
          },
          "houseNumber": {
            "type": "string",
            "nullable": true
          },
          "additionalLine": {
            "type": "string",
            "nullable": true
          },
          "postalCode": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "poBox": {
            "type": "string",
            "nullable": true
          }
        },
        "nullable": true
      },
      "AttendanceRecordGet": {
        "type": "object",
        "properties": {
          "ownerRef": {
            "type": "string",
            "format": "uuid"
          },
          "ownerTypeName": {
            "type": "string"
          },
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEAttendanceStatus"
          },
          "absenceDocumentPath": {
            "type": "string",
            "nullable": true
          },
          "absenceDocumentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "absenceDocumentSizeBytes": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "CourseColorEnumDto": {
        "type": "object",
        "properties": {
          "propertyName": {
            "type": "string"
          },
          "value": {
            "type": "string"
          },
          "enumValue": {
            "$ref": "#/components/schemas/ECourseColor"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "CourseGet": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "courseType": {
            "$ref": "#/components/schemas/EnumDtoOfECourseType"
          },
          "subject": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfECourseStatus"
          },
          "color": {
            "$ref": "#/components/schemas/CourseColorEnumDto"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "weeklySchedule": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyScheduleSlotDto"
            }
          },
          "room": {
            "$ref": "#/components/schemas/RoomRef"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "requiredMaterials": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MaterialRef2"
            },
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "enrollmentStatus": {
            "$ref": "#/components/schemas/EnumDtoOfECourseEnrollmentStatus"
          },
          "ownAttendanceRate": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "CourseRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "courseType": {
            "$ref": "#/components/schemas/EnumDtoOfECourseType"
          },
          "name": {
            "type": "string"
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "subject": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfECourseStatus"
          },
          "color": {
            "$ref": "#/components/schemas/CourseColorEnumDto"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "roomId": {
            "type": "string",
            "format": "uuid"
          },
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "endDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "weeklySchedule": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyScheduleSlotDto"
            }
          }
        },
        "nullable": true
      },
      "CustomerRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "customerType": {
            "$ref": "#/components/schemas/EnumDtoOfECustomerType"
          },
          "isActive": {
            "type": "boolean"
          },
          "address": {
            "$ref": "#/components/schemas/AddressInfoDto"
          }
        },
        "nullable": true
      },
      "DayOfWeek": {
        "type": "integer"
      },
      "EAttendanceStatus": {
        "type": "integer"
      },
      "ECourseColor": {
        "type": "integer"
      },
      "ECourseEnrollmentStatus": {
        "type": "integer"
      },
      "ECourseStatus": {
        "type": "integer"
      },
      "ECourseType": {
        "type": "integer"
      },
      "ECustomerType": {
        "type": "integer"
      },
      "EGender": {
        "type": "integer"
      },
      "EInviteMaterialStatus": {
        "type": "integer"
      },
      "EInviteStatus": {
        "type": "integer"
      },
      "ELanguage": {
        "type": "integer"
      },
      "ELessonStatus": {
        "type": "integer"
      },
      "EMaterialDeliveryMethod": {
        "type": "integer"
      },
      "EMaterialLevel": {
        "type": "integer"
      },
      "EMaterialType": {
        "type": "integer"
      },
      "ENotificationKey": {
        "type": "integer"
      },
      "ENotificationType": {
        "type": "integer"
      },
      "EnrolledCourseItem": {
        "type": "object",
        "properties": {
          "courseName": {
            "type": "string"
          },
          "subject": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "teacherName": {
            "type": "string"
          }
        }
      },
      "EnumDtoOfEAttendanceStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EAttendanceStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfECourseEnrollmentStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECourseEnrollmentStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfECourseStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECourseStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfECourseType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECourseType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfECustomerType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECustomerType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEGender": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EGender"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfEInviteMaterialStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EInviteMaterialStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfEInviteMaterialStatus2": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EInviteMaterialStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEInviteStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EInviteStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfELanguage": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ELanguage"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfELanguage2": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ELanguage"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfELessonStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ELessonStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEMaterialDeliveryMethod": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EMaterialDeliveryMethod"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfEMaterialLevel": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EMaterialLevel"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEMaterialType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EMaterialType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfENotificationKey": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ENotificationKey"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfENotificationType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ENotificationType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEPreferredTeachingFormat": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EPreferredTeachingFormat"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfERoomStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ERoomStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEStudentStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EStudentStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfETeachingLevel": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ETeachingLevel"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EPreferredTeachingFormat": {
        "type": "integer"
      },
      "ERoomStatus": {
        "type": "integer"
      },
      "EStudentStatus": {
        "type": "integer"
      },
      "ETeachingLevel": {
        "type": "integer"
      },
      "HomeworkDocumentRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "fileName": {
            "type": "string"
          },
          "contentType": {
            "type": "string"
          },
          "sizeBytes": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "HomeworkGet": {
        "type": "object",
        "properties": {
          "lessonId": {
            "type": "string",
            "format": "uuid"
          },
          "description": {
            "type": "string"
          },
          "dueDate": {
            "type": "string",
            "format": "date"
          },
          "lessonStartDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "documents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HomeworkDocumentRef"
            }
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "HttpValidationProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "InviteMaterialChoiceGet": {
        "type": "object",
        "properties": {
          "materialId": {
            "type": "string",
            "format": "uuid"
          },
          "material": {
            "$ref": "#/components/schemas/MaterialRef"
          },
          "alreadyInPossession": {
            "type": "boolean"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEInviteMaterialStatus2"
          },
          "deliveryMethod": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialDeliveryMethod"
          },
          "answeredAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "InviteMaterialChoicePost": {
        "type": "object",
        "properties": {
          "materialId": {
            "type": "string",
            "format": "uuid"
          },
          "alreadyInPossession": {
            "type": "boolean",
            "nullable": true
          },
          "deliveryMethodId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "LessonGet": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "subject": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "room": {
            "$ref": "#/components/schemas/RoomRef"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfELessonStatus"
          },
          "isCancelled": {
            "type": "boolean"
          },
          "homeworks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HomeworkGet"
            },
            "nullable": true
          },
          "ownAttendance": {
            "$ref": "#/components/schemas/AttendanceRecordGet"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "MaterialChangeRequestAnswer": {
        "type": "object",
        "properties": {
          "materialId": {
            "type": "string",
            "format": "uuid"
          },
          "alreadyInPossession": {
            "type": "boolean",
            "nullable": true
          },
          "deliveryMethodId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "MaterialChangeRequestGet": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "requestedAt": {
            "type": "string",
            "format": "date-time"
          },
          "answeredAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "isAnswered": {
            "type": "boolean"
          },
          "deliveryMethod": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialDeliveryMethod"
          },
          "deliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "defaultDeliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MaterialChangeRequestItemGet"
            }
          },
          "canAnswer": {
            "type": "boolean"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "MaterialChangeRequestItemGet": {
        "type": "object",
        "properties": {
          "materialId": {
            "type": "string",
            "format": "uuid"
          },
          "material": {
            "$ref": "#/components/schemas/MaterialRef"
          },
          "alreadyInPossession": {
            "type": "boolean"
          },
          "answeredAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "deliveryMethod": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialDeliveryMethod"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEInviteMaterialStatus"
          }
        }
      },
      "MaterialChangeRequestPatch": {
        "type": "object",
        "properties": {
          "answers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MaterialChangeRequestAnswer"
            },
            "nullable": true
          },
          "deliveryMethodId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "deliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          }
        }
      },
      "MaterialRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "isbn": {
            "type": "string"
          },
          "language": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialLevel"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "type": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialType"
          }
        },
        "nullable": true
      },
      "MaterialRef2": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "isbn": {
            "type": "string"
          },
          "language": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialLevel"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "type": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialType"
          }
        }
      },
      "MiniListDataOfEnrolledCourseItem": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnrolledCourseItem"
            }
          },
          "viewAllUrl": {
            "type": "string",
            "nullable": true
          },
          "maxItems": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "MiniListDataOfStudentNotificationItem": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StudentNotificationItem"
            }
          },
          "viewAllUrl": {
            "type": "string",
            "nullable": true
          },
          "maxItems": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "MiniListDataOfStudentUpcomingLessonItem": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StudentUpcomingLessonItem2"
            }
          },
          "viewAllUrl": {
            "type": "string",
            "nullable": true
          },
          "maxItems": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "MyProfilePatch": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "genderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeGender": {
            "type": "boolean"
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "removePhone": {
            "type": "boolean"
          },
          "correspondenceLanguageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeCorrespondenceLanguage": {
            "type": "boolean"
          },
          "preferredTeachingFormatId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removePreferredTeachingFormat": {
            "type": "boolean"
          }
        }
      },
      "NotificationGet": {
        "type": "object",
        "properties": {
          "targetId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "eventDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "date": {
            "type": "string",
            "format": "date-time"
          },
          "message": {
            "type": "string"
          },
          "isRead": {
            "type": "boolean"
          },
          "targetUrl": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/EnumDtoOfENotificationType"
          },
          "key": {
            "$ref": "#/components/schemas/EnumDtoOfENotificationKey"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "NotificationMarkReadPost": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          }
        }
      },
      "NotificationMarkReadResultGet": {
        "type": "object",
        "properties": {
          "updated": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "NotificationPatch": {
        "type": "object",
        "properties": {
          "isRead": {
            "type": "boolean",
            "nullable": true
          }
        }
      },
      "NotificationUnreadCountGet": {
        "type": "object",
        "properties": {
          "unread": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "NullableOfEStudentStatus": {
        "type": "integer"
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "RoomRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "maxStudents": {
            "type": "integer",
            "format": "int32"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfERoomStatus"
          }
        },
        "nullable": true
      },
      "StudentDashboardGet": {
        "type": "object",
        "properties": {
          "nextLesson": {
            "$ref": "#/components/schemas/StudentUpcomingLessonItem"
          },
          "upcomingLessons": {
            "$ref": "#/components/schemas/MiniListDataOfStudentUpcomingLessonItem"
          },
          "enrolledCourses": {
            "$ref": "#/components/schemas/MiniListDataOfEnrolledCourseItem"
          },
          "notifications": {
            "$ref": "#/components/schemas/MiniListDataOfStudentNotificationItem"
          }
        }
      },
      "StudentGet": {
        "type": "object",
        "properties": {
          "lastName": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "birthdate": {
            "type": "string",
            "format": "date-time"
          },
          "nativeLanguage": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage2"
          },
          "gender": {
            "$ref": "#/components/schemas/EnumDtoOfEGender"
          },
          "correspondenceLanguage": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage2"
          },
          "preferredTeachingFormat": {
            "$ref": "#/components/schemas/EnumDtoOfEPreferredTeachingFormat"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEStudentStatus"
          },
          "inactive": {
            "type": "boolean"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "useCustomerAddress": {
            "type": "boolean"
          },
          "address": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "customer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "subjects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SubjectGet"
            }
          },
          "age": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isChild": {
            "type": "boolean",
            "nullable": true
          },
          "loginNumber": {
            "type": "string",
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "StudentInviteGet": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEInviteStatus"
          },
          "invitedAt": {
            "type": "string",
            "format": "date-time"
          },
          "respondedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "materialChoices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InviteMaterialChoiceGet"
            }
          },
          "deliveryMethod": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialDeliveryMethod"
          },
          "deliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "defaultDeliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "acceptedDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "declinedDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "isPending": {
            "type": "boolean"
          },
          "materialListComplete": {
            "type": "boolean"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "StudentInvitePatch": {
        "type": "object",
        "properties": {
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "materialChoices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InviteMaterialChoicePost"
            },
            "nullable": true
          },
          "deliveryMethodId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "deliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          }
        }
      },
      "StudentNotificationItem": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          },
          "date": {
            "type": "string",
            "format": "date-time"
          },
          "type": {
            "$ref": "#/components/schemas/EnumDtoOfENotificationType"
          },
          "isRead": {
            "type": "boolean"
          }
        }
      },
      "StudentPatch": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "genderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeGender": {
            "type": "boolean"
          },
          "correspondenceLanguageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeCorrespondenceLanguage": {
            "type": "boolean"
          },
          "preferredTeachingFormatId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removePreferredTeachingFormat": {
            "type": "boolean"
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "useCustomerAddress": {
            "type": "boolean",
            "nullable": true
          },
          "address": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "removeAddress": {
            "type": "boolean"
          }
        }
      },
      "StudentRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "nativeLanguage": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage2"
          },
          "isChild": {
            "type": "boolean",
            "nullable": true
          },
          "age": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "nullable": true
      },
      "StudentUpcomingLessonItem": {
        "type": "object",
        "properties": {
          "courseName": {
            "type": "string"
          },
          "subject": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "teacherName": {
            "type": "string"
          },
          "roomName": {
            "type": "string"
          },
          "homework": {
            "type": "string",
            "nullable": true
          }
        },
        "nullable": true
      },
      "StudentUpcomingLessonItem2": {
        "type": "object",
        "properties": {
          "courseName": {
            "type": "string"
          },
          "subject": { },
          "level": { },
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "teacherName": {
            "type": "string"
          },
          "roomName": {
            "type": "string"
          },
          "homework": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "SubjectGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "language": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          }
        }
      },
      "TeacherRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "mobilePhone": {
            "type": "string"
          },
          "lessonsToChildren": {
            "type": "boolean"
          },
          "inactive": {
            "type": "boolean"
          },
          "teachingLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnumDtoOfELanguage"
            }
          }
        },
        "nullable": true
      },
      "WeeklyScheduleSlotDto": {
        "type": "object",
        "properties": {
          "day": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          }
        }
      }
    },
    "securitySchemes": {
      "keycloak": {
        "type": "oauth2",
        "description": "Log in via Keycloak (Authorization Code + PKCE). Uses the public 'swagger-ui' client.",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://auth.triskela.com/realms/softlanding/protocol/openid-connect/auth",
            "tokenUrl": "https://auth.triskela.com/realms/softlanding/protocol/openid-connect/token",
            "scopes": {
              "openid": "OpenID Connect",
              "profile": "User profile",
              "email": "User email"
            }
          }
        }
      }
    }
  },
  "security": [
    {
      "keycloak": [
        "openid",
        "profile",
        "email"
      ]
    }
  ],
  "tags": [
    {
      "name": "HomeworkDocument (Student)"
    },
    {
      "name": "Dashboard (Student)"
    },
    {
      "name": "MaterialChangeRequest (Student)"
    },
    {
      "name": "Homework (Student)"
    },
    {
      "name": "Student (Student)"
    },
    {
      "name": "Course (Student)"
    },
    {
      "name": "Lesson (Student)"
    },
    {
      "name": "StudentInvite (Student)"
    },
    {
      "name": "Notification (Student)"
    },
    {
      "name": "Student MyProfile"
    }
  ]
}