diff --git a/Dockerfile b/Dockerfile index c9f507c..261ad83 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM adoptopenjdk/openjdk11:alpine-jre WORKDIR /eedu -COPY /target/gateway-0.1-SNAPSHOT.jar gateway.jar +COPY gateway-core/target/gateway-core-0.1-SNAPSHOT.jar gateway.jar EXPOSE 80 diff --git a/backend-api/pom.xml b/backend-api/pom.xml new file mode 100644 index 0000000..d43a08f --- /dev/null +++ b/backend-api/pom.xml @@ -0,0 +1,94 @@ + + + + gateway + de.the-morpheus.e-du + 0.1-SNAPSHOT + + 4.0.0 + + backend-api + + + + io.swagger.core.v3 + swagger-annotations + 2.1.2 + compile + + + com.squareup.okhttp + okhttp + 2.7.5 + compile + + + com.squareup.okhttp + logging-interceptor + 2.7.5 + compile + + + org.threeten + threetenbp + 1.4.0 + + + io.gsonfire + gson-fire + 1.8.4 + + + org.realityforge.javax.annotation + javax.annotation + 1.0.1 + + + junit + junit + 4.13 + compile + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.9 + 1.9 + + + + io.swagger.codegen.v3 + swagger-codegen-maven-plugin + 3.0.19 + + + + generate + + + ${project.basedir}/src/main/resources/task.yaml + java + de.themorpheus.edu.backend.api + de.themorpheus.edu.backend.model + de.themorpheus.edu.backend.invoker + + ${project.basedir}/src/main/java + + + + + + + + + + \ No newline at end of file diff --git a/backend-api/src/main/resources/task.yaml b/backend-api/src/main/resources/task.yaml new file mode 100644 index 0000000..58a5407 --- /dev/null +++ b/backend-api/src/main/resources/task.yaml @@ -0,0 +1,4714 @@ +openapi: 3.0.1 +info: + title: Task Microservice WIP + version: v1 +servers: + - url: http://localhost:80 +tags: + - name: task + description: Task + - name: task_group + description: Task Group + - name: subject + description: Subject + - name: module + description: Module + - name: lecture + description: Lecture + - name: difficulty + description: Difficulty + - name: task_type + description: Task Types + - name: solution + description: Solution +paths: + /task: + post: + tags: + - task + summary: Creates a new task + operationId: createTask + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + requestBody: + content: + application/json: + schema: + type: object + properties: + task: + type: string + example: "Calculate Term" + description: + type: string + example: "Calculate the following Term: 3(6*7-9)/3" + language: + type: string + example: "de-DE" + necessary_points: + type: integer + example: 100 + task_type_id: + type: integer + example: 1 + description: "Also possible to use [task_type_name_key: string], but one has to be present. If both are present the id will be used." + lecture_id: + type: integer + example: 1 + description: "Also possible to use [lecture_name_key: string], but one has to be present. If both are present the id will be used." + difficulty_id: + type: integer + example: 1 + description: "Also possible to use [difficulty_name_key: string], but one has to be present. If both are present the id will be used." + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Task' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task/{task_id}: + get: + tags: + - task + summary: Gets a task + operationId: getTask + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + example: 1 + format: int32 + minimum: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Task' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: CORS + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + put: + tags: + - task + summary: Edits a Task + operationId: editTask + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + example: 1 + format: int32 + minimum: 1 + requestBody: + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + example: 1 + task: + type: string + example: "Calculate Term" + description: + type: string + example: "Calculate the following Term: 3(6*7-9)/3" + language: + type: string + example: "de-DE" + necessary_points: + type: integer + example: 100 + task_type_id: + type: integer + example: 1 + description: "Also possible to use [task_type_name_key: string]" + lecture_id: + type: integer + example: 1 + description: "Also possible to use [lecture_name_key: string]" + difficulty_id: + type: integer + example: 1 + description: "Also possible to use [difficulty_name_key: string]" + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Task' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - task + summary: Deletes a Task + operationId: deleteTask + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + example: 1 + format: int32 + minimum: 1 + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task/next: + post: + tags: + - task + summary: Gets next random task + description: Gets next random task in current lecture based on last task and + takes an integer array of the already absolved tasks ids. + operationId: getNext + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + requestBody: + content: + application/json: + schema: + type: object + properties: + last_task_ids: + type: array + description: List of tasks that have already been absolved + items: + type: integer + example: + - 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Task' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task/own: + get: + tags: + - task + summary: Gets all tasks created by the user + operationId: getOwnTasks + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + tasks: + type: array + items: + $ref: '#/components/schemas/Task' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task/user/{user_id}: + get: + tags: + - task + summary: Get all tasks created by specified user + operationId: getUserTasks + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + - name: user_id + in: path + required: true + description: The UUID of the user + schema: + type: string + example: "52bd088c-d6ad-4cee-9f93-cabfc8c07234" + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + tasks: + type: array + items: + $ref: '#/components/schemas/Task' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task/vote/{task_id}: + put: + tags: + - task + summary: Votes for a task + description: Vote for a specific task. The vote argument can **only** be *1* or + *-1* + operationId: voteTask + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + example: 1 + format: int32 + minimum: 1 + requestBody: + content: + application/json: + schema: + type: object + properties: + vote: + type: integer + example: 1 + description: Can only be 1 or -1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/TaskVote' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task/verify/{task_id}: + patch: + tags: + - task + summary: Verifys a task + operationId: verifyTask + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + example: 1 + format: int32 + minimum: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Task' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task/solution_type/{task_id}: + get: + tags: + - task + summary: Get the solution_type of a task + operationId: getTaskSolutionType + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + example: 1 + format: int32 + minimum: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + solution_type: + type: string + example: "multiple_choice_solution" + + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task/done/{task_id}: + get: + tags: + - task + summary: Marks a task as done + operationId: markTaskAsDone + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + example: 1 + format: int32 + minimum: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + task_done_id: + type: integer + example: 1 + date: + type: integer + example: 1589528838573 + format: int64 + description: "(Timestamp)" + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task_group: + post: + tags: + - task_group + summary: Create a Task Group + operationId: createTaskGroup + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + lecture_id: + type: integer + example: 1 + name_key: + type: string + example: Tolles-Aufgaben-Pack + task_ids: + type: array + items: + type: integer + example: 1 + difficulty_id: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + task_group_id: + type: integer + example: 1 + lecture_id: + type: integer + example: 1 + name_key: + type: string + example: Tolles-Aufgaben-Pack + task_ids: + type: array + items: + type: integer + example: 1 + difficulty_id: + type: integer + example: 1 + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + put: + tags: + - task_group + summary: Edit a Task Group + operationId: editTaskGroup + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_group_id: + type: integer + example: 1 + description: The task group id to modify + lecture_id: + type: integer + example: 1 + name_key: + type: string + example: Tolles-Aufgaben-Pack + task_ids: + type: array + items: + type: integer + example: 1 + difficulty_id: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + lecture_id: + type: integer + example: 1 + name_key: + type: string + example: Tolles-Aufgaben-Pack + task_ids: + type: array + items: + type: integer + example: 1 + difficulty_id: + type: integer + example: 1 + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task_group/own: + get: + tags: + - task_group + summary: Get all task groups created by the user + operationId: getOwnTaskGroups + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + task_groups: + type: array + items: + $ref: '#/components/schemas/TaskGroup' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task_group/user/{user_id}: + get: + tags: + - task_group + summary: Get all task groups from specified user + operationId: getTaskGroupsFromUser + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: user_id + in: path + required: true + schema: + type: string + example: 0b870676-1a01-47aa-8402-859fb9806238 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + task_groups: + type: array + items: + $ref: '#/components/schemas/TaskGroup' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task_group/{task_group_id}: + get: + tags: + - task_group + summary: Get a task group + operationId: getTaskGroup + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_group_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/TaskGroup' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - task_group + summary: Delete a Task Group + operationId: deleteTaskGroup + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_group_id + in: path + required: true + schema: + type: string + example: 1 + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task_group/task: + post: + tags: + - task_group + summary: Add single task to Task Group + operationId: addTaskToTaskGroups + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_group_id: + type: integer + example: 1 + description: The task group id to add the task to + task_id: + type: integer + description: The id of the task to add to the Task Group + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + task_group_id: + type: integer + example: 1 + description: The task group id to add the task to + task_id: + type: integer + description: The id of the task to add to the Task Group + example: 1 + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task_group/{task_group_id}/task/{task_id}: + delete: + tags: + - task_group + summary: Remove single task from Task Group + operationId: removeTaskFromTaskGroups + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_group_id + in: path + required: true + description: The id of the task group + schema: + type: integer + example: 1 + - name: task_id + in: path + required: true + description: The id of the task to remove from the task group + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /lecture/{lecture_name_key}/task_group: + get: + tags: + - task_group + summary: Get Task Groups from lecture + operationId: getTaskGroupsFromLecture + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: lecture_name_key + in: path + required: true + schema: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + task_Groups: + type: array + items: + $ref: '#/components/schemas/TaskGroup' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/multiple_choice/: + post: + tags: + - solution + summary: Creates a new multiple choice Solution + operationId: createmultipleChoiceSolution + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + applicaton/json: + schema: + type: object + properties: + task_id: + type: integer + example: 1 + solution: + type: string + example: "L\xF6sung 1" + is_correct: + type: boolean + example: 1 + responses: + 200: + description: Ok + content: + application/json: + schema: + type: object + properties: + multiple_choice_solution_id: + type: integer + minimum: 1 + example: 1 + correct: + type: boolean + example: true + solution: + type: string + example: "L\xF6sung 1 lol" + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/multiple_choice/{task_id}: + get: + tags: + - solution + summary: Get all multiple choice solutions from task id + operationId: getMultipleChoiceSolutions + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + solutions: + type: array + items: + type: object + properties: + multiple_choice_solution_id: + type: integer + example: 1 + solution: + type: string + example: "L\xF6sung 1 lol" + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/multiple_choice/{task_id}/all: + get: + tags: + - solution + summary: Same as solution/multiple_choice/{task_id}, but returns more data. + This route can only be used by teachers. + operationId: getAllMultipleChoiceSolutionsExpanded + security: + - JWT: + - read + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + solutions: + type: array + items: + type: object + properties: + multiple_choice_solution_id: + type: integer + example: 1 + solution: + type: string + example: "L\xF6sung 1 lol" + correct: + type: boolean + example: true + /solution/multiple_choice/check: + post: + tags: + - solution + summary: Check multiple choice solutions + operationId: checkMultipleChoiceSolutions + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + solution: + type: array + items: + type: object + properties: + multiple_choice_solution_id: + type: integer + example: 1 + correct: + type: boolean + example: true + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + solutions: + type: array + items: + type: boolean + description: Array if solution is true or not + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/multiple_choice/{multiple_choice_solution_id}: + delete: + tags: + - solution + summary: Deletes a multiple choice Solution + operationId: deleteMultipleChoiceSolutions + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: multiple_choice_solution_id + description: Id of the muliple choice solution + in: path + required: true + schema: + type: integer + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/freestyle: + post: + tags: + - solution + summary: Create a freestyle sample solution + operationId: createFreestyleSolution + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SampleSolution' + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/freestyle/check: + post: + tags: + - solution + summary: Check freestyle solution + operationId: checkFreestyleSolution + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + solution: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/SampleSolution' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/freestyle/{task_id}: + delete: + tags: + - solution + summary: Delte freestyle solution + operationId: deleteFreestyleSolution + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_id + in: path + required: true + schema: + type: string + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/wordsalad/: + post: + tags: + - solution + summary: Creates a new wordsalad Solution + operationId: createWordsaladSolution + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + applicaton/json: + schema: + type: object + properties: + task_id: + type: integer + solution: + type: string + responses: + 200: + description: Ok + content: + application/json: + schema: + type: object + properties: + wordsalad_solution_id: + type: integer + solution: + type: string + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + put: + tags: + - solution + summary: Edits a wordsalad Solution + operationId: editWordsaladSolution + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + solution: + type: string + responses: + 200: + description: Ok + content: + application/json: + schema: + type: object + properties: + wordsalad_solution_id: + type: integer + solution: + type: string + 400: + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/wordsalad/{task_id}: + get: + tags: + - solution + summary: Get all wordsalad solution from task id + operationId: getWordsaladSolution + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + format: int32 + minimum: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + solution: + type: string + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - solution + summary: Deletes a Wordsalad solution + operationId: deleteWordsaladSolutions + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/wordsalad/check: + post: + tags: + - solution + summary: Check wordsalad solution + operationId: checkWordsaladSolution + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + solution: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + correct: + type: boolean + solution: + type: string + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/image/: + post: + tags: + - solution + summary: Create a image solution + operationId: createImageSolution + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + solution: + type: string + example: LINK_TO_IMAGE + format: URL + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + solution: + type: string + example: LINK_TO_IMAGE + format: URL + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/image/{task_id}: + get: + tags: + - solution + summary: Get all image solution from task id + operationId: getImageSolution + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + format: int32 + minimum: 1 + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - solution + summary: Deletes a Image Solution + operationId: deleteImmageSolution + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + format: int32 + minimum: 1 + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/image/check: + post: + tags: + - solution + summary: Check image solution + operationId: solutionImageCheck + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + url: + type: string + example: LINK_TO_IMAGE + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/topic_connection: + post: + tags: + - solution + summary: Creates a new topic connection solution + operationId: createTopicConnectionSolution + security: + - JWT: + - read + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + point_a: + type: string + description: Name of connection point a. Can not be empty + point_b: + type: string + description: Name of connection point b. Can not be empty + responses: + 200: + description: Ok + content: + application/json: + schema: + type: object + properties: + topic_connection_solution_id: + type: integer + point_a: + type: string + point_b: + type: string + 400: + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/topic_connection/{task_id}: + get: + tags: + - solution + summary: Get all topic connection solution from task id + operationId: getTopicConnectionSolution + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + format: int32 + minimum: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + points: + type: array + items: + type: string + description: String of a connection point in random order + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/topic_connection/{task_id}/all: + get: + tags: + - solution + summary: Same as /solution/multiple_choice/{task_id}, but returns more data. + This route can only be used by teachers. + operationId: getAllTopicConnectionSolutionsExpanded + security: + - JWT: + - read + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_id + in: path + required: true + description: The unique task id + schema: + type: integer + format: int32 + minimum: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + solutions: + type: array + items: + type: object + properties: + topic_connection_solution_id: + type: integer + point_a: + type: string + point_b: + type: string + /solution/topic_connection/check: + post: + tags: + - solution + summary: check topic connection solution + operationId: checkTopicConnectionSolution + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + connected_points: + type: array + items: + type: object + properties: + point_a: + type: string + point_b: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + correct: + type: array + items: + type: object + properties: + topic_connection_solution_id: + type: integer + point_a: + type: string + point_b: + type: string + wrong: + type: array + items: + type: object + properties: + topic_connection_solution_id: + type: integer + point_a: + type: string + point_b: + type: string + missing: + type: array + items: + type: object + properties: + topic_connection_solution_id: + type: integer + point_a: + type: string + point_b: + type: string + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/topic_connection/{topic_connection_solution_id}: + delete: + tags: + - solution + summary: deletes a topic connection solution + operationId: deleteTopicConnectionSolution + security: + - JWT: + - read + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: topic_connection_solution_id + in: path + required: true + schema: + type: integer + format: int32 + minimum: 1 + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /solution/simple_equation: + post: + tags: + - solution + summary: Creates a simple equation solution + operationId: createSimpleEquationSolution + security: + - JWT: + - read + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + taks_id: + type: integer + result: + type: string + steps: + type: array + items: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + result: + type: string + steps: + type: array + items: + type: object + properties: + simple_equation_solution_id: + type: integer + step: + type: string + put: + tags: + - solution + summary: Updates a simple equation + operationId: updateSimpleEquationSolution + security: + - JWT: + - read + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + result: + type: string + steps: + type: array + items: + type: object + properties: + simple_equation_solution_id: + type: integer + description: If you want to create a new step at the end just + increment the last step id by one. If you want to change + the order of the steps you can change the simple equation + solution ids of all the steps to do so. + step: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + result: + type: string + steps: + type: array + items: + type: object + properties: + simple_equation_solution_id: + type: integer + step: + type: string + /solution/simple_equation/check: + post: + tags: + - solution + summary: check a simple equation solution + operationId: checkSimpleEquationSolution + security: + - JWT: + - read + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + task_id: + type: integer + result: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + correct: + type: boolean + result: + type: string + steps: + type: array + items: + type: object + properties: + simple_equation_solution_id: + type: integer + step: + type: string + /solution/simple_equation/{task_id}: + delete: + tags: + - solution + summary: deletes a simple_equation solution + operationId: deleteSimpleEquationSolution + security: + - JWT: + - read + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: task_id + in: path + required: true + schema: + type: integer + format: int32 + minimum: 1 + responses: + '200': + description: Ok + /subject: + post: + tags: + - subject + summary: Create a subject + operationId: createSubject + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + name_key: + type: string + example: maths + description_key: + type: string + example: calculating numbers + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Subject' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + get: + tags: + - subject + summary: Get all subjects + operationId: getSubjects + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + subjects: + type: array + items: + $ref: '#/components/schemas/Subject' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /subject/{name_key}: + get: + tags: + - subject + summary: Get subject by name_key + operationId: getSubjectbyname_key + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: name_key + in: path + required: true + schema: + type: string + example: maths + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Subject' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - subject + summary: Delete subject by name_key + operationId: deleteSubjectbyname_key + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: name_key + in: path + required: true + schema: + type: string + example: maths + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /subject/{subject_id}: + get: + tags: + - subject + summary: Get subject by subject_id + operationId: getSubjectbysubject_id + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: subject_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Subject' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - subject + summary: Delete subject by subject_id + operationId: deleteSubjectbysubject_id + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: subject_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /module: + post: + tags: + - module + summary: Create module + operationId: createModule + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + name_key: + type: string + example: geometry + subject_name_key: + type: string + example: maths + subject_id: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/Module" + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + get: + tags: + - module + summary: Get all modules + operationId: getModules + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + modules: + type: array + items: + $ref: '#/components/schemas/Module' + /module/{name_key}: + get: + tags: + - module + summary: Get module by name_key + operationId: getModulebyname_key + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: name_key + in: path + required: true + example: geometry + schema: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Module' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - module + summary: Delete Module by name_key + operationId: deleteModulebyname_key + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: name_key + in: path + required: true + example: geometry + schema: + type: string + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /module/{module_id}: + get: + tags: + - module + summary: Get module by module_id + operationId: getModulebymodule_id + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: module_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Module' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - module + summary: Delete Module by module_id + operationId: deleteModulebymodule_id + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: module_id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /subject/{subject_name_key}/module: + get: + tags: + - subject + summary: Get modules from subject + operationId: getModulesFromSubjectbyname_key + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: subject_name_key + in: path + required: true + schema: + type: string + example: maths + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + modules: + type: array + items: + $ref: '#/components/schemas/Module' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /subject/{subject_id}/module: + get: + tags: + - subject + summary: Get modules from subject + operationId: getModulesFromSubjectbysubject_id + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: subject_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + modules: + type: array + items: + $ref: '#/components/schemas/Module' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /lecture: + post: + tags: + - lecture + summary: Create lecture + operationId: createLecture + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + name_key: + type: string + example: squares + module_name_key: + type: string + example: geometry + module_id: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + lecture_id: + type: integer + example: 1 + name_key: + type: string + example: squares + module_name_key: + type: string + example: geometry + module_id: + type: integer + example: 1 + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + get: + tags: + - lecture + summary: Get all lectures + operationId: getLectures + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + lectures: + type: array + items: + $ref: '#/components/schemas/Lecture' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /lecture/{lecture_id}: + get: + tags: + - lecture + summary: Get lecture by id + operationId: getLecturebyid + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: lecture_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Lecture' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - lecture + summary: Delete Lecture by id + operationId: deleteLecturebyid + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: lecture_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /lecture/{name_key}: + get: + tags: + - lecture + summary: Get lecture by name_key + operationId: getLecturebyname_key + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: name_key + in: path + required: true + schema: + type: string + example: squares + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Lecture' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - lecture + summary: Delete Lecture by name_key + operationId: deleteLecturebyname_key + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: name_key + in: path + required: true + schema: + type: string + example: squares + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /lecture/{lecture_id}/task: + get: + tags: + - lecture + summary: Get all Tasks by lecture_id + operationId: getTaskByLectureId + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + - name: lecture_id + in: path + required: true + description: The unique lecture id + schema: + type: integer + format: int32 + minimum: 1 + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + tasks: + type: array + items: + $ref: '#/components/schemas/Task' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /lecture/{name_key}/task: + get: + tags: + - lecture + summary: Get all Tasks by lecture_name_key + operationId: getTaskByLectureNameKey + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/JWT' + - name: X-ServiceToken + in: header + required: true + description: View schema + schema: + $ref: '#/components/schemas/X-ServiceToken' + - name: name_key + in: path + required: true + description: The unique lecture name key + schema: + type: string + example: geometry + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + tasks: + type: array + items: + $ref: '#/components/schemas/Task' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /module/{module_name_key}/lecture: + get: + tags: + - module + summary: Get lectures from module_name_key + operationId: getLecturesFromModule_name_key + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: module_name_key + in: path + required: true + schema: + type: string + example: geometry + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + lectures: + type: array + items: + $ref: '#/components/schemas/Lecture' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /module/{module_id}/lecture: + get: + tags: + - module + summary: Get lectures from module_id + operationId: getLecturesFromModule_id + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: module_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + lectures: + type: array + items: + $ref: '#/components/schemas/Lecture' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /difficulty: + post: + tags: + - difficulty + summary: Create difficulty + operationId: createDifficulty + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + name_key: + type: string + example: easy + + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + difficulty_id: + type: integer + example: 1 + name_key: + type: string + example: easy + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + get: + tags: + - difficulty + summary: Get all difficultys + operationId: getDifficultys + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + difficulties: + type: array + items: + $ref: '#/components/schemas/Difficulty' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /difficulty/{name_key}: + get: + tags: + - difficulty + summary: Get difficulty by name_key + operationId: getDifficultybyname_key + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: false + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: name_key + in: path + required: true + schema: + type: string + example: easy + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Difficulty' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - difficulty + summary: Delete difficulty by name_key + operationId: deleteDifficultybyname_key + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: false + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: name_key + in: path + required: true + schema: + type: string + example: easy + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /difficulty/{difficulty_id}: + get: + tags: + - difficulty + summary: Get difficulty by difficulty_id + operationId: getDifficultybydifficulty_id + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: false + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: difficulty_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Difficulty' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - difficulty + summary: Delete difficulty by difficulty_id + operationId: deleteDifficultybydifficulty_id + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: false + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + - name: difficulty_id + in: path + required: true + schema: + type: integer + responses: + '200': + description: Ok + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task_type: + post: + tags: + - task_type + summary: Create task type + operationId: createTaskType + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + name_key: + type: string + example: exercise + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/TaskType' + + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + get: + tags: + - task_type + summary: Get all task types + operationId: getAllTaskTypes + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + schema: + type: string + - name: X-ServiceToken + in: header + required: true + schema: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + type: object + properties: + task_types: + type: array + items: + $ref: '#/components/schemas/TaskType' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task_type/{name_key}: + get: + tags: + - task_type + summary: Get task type by name_key + operationId: getTaskTypebyname_key + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + schema: + type: string + - name: name_key + in: path + required: true + schema: + type: string + example: exercise + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/TaskType' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - task_type + summary: Delete task type by name_key + operationId: deleteTaskTypebyname_key + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + schema: + type: string + - name: name_key + in: path + required: true + schema: + type: string + example: exercise + responses: + '200': + description: Ok + '400': + description: Internal Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /task_type/{task_type_id}: + get: + tags: + - task_type + summary: Get task type by task_type_id + operationId: getTaskTypebyid + security: + - JWT: + - read + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + schema: + type: string + - name: task_type_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/TaskType' + '400': + description: User Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: + - task_type + summary: Delete task type by task_type_id + operationId: deleteTaskTypebytask_type_id + security: + - JWT: + - write + - ServiceToken: + - read + - write + parameters: + - name: Authorization + in: header + required: true + schema: + type: string + - name: task_type_id + in: path + required: true + schema: + type: integer + example: 1 + responses: + '200': + description: Ok + '400': + description: Internal Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +components: + securitySchemes: + JWT: + type: http + scheme: bearer + bearerFormat: JWT + ServiceToken: + type: http + scheme: bearer + bearerFormat: randomstring + responses: + BadRequest: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Forbidden: + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + MethodNotAllowed: + description: Method not allowed + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NotAcceptable: + description: Not acceptable + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + RequestTimeout: + description: Request timeout + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Conflict: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Gone: + description: Gone + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + LengthRequiered: + description: Length requiered + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + PreconditionFailed: + description: Precondition failed + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + PayloadTooLarge: + description: Payload too large + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + RequestURITooLong: + description: Request-URI too long + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + RequestRangeNotSatisfiable: + description: Request range not satisfiable + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + ExpectationFailed: + description: Expectation failed + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + UnprocessableEntity: + description: Unprocessable entity + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Locked: + description: Locked + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + TooManyRequests: + description: Too many requests + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NoResponse: + description: No response + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + InternalServerError: + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + BadGateway: + description: BadGateway + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + ServiceUnavailable: + description: Service unavailable + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Insufficient Storage: + description: Insufficient Storage + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + LoopDetected: + description: Loop detected + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + BandwidthLimitExceeded: + description: Bandwidth limit exceeded + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NotExtended: + description: Not extended + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NetworkAuthenticationRequired: + description: Network authentication required + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NetworkConnectTimeoutError: + description: Network connect timeout error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + schemas: + JWT: + type: string + example: "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1ODk0ODE3NDEsImV4cCI6MTYwOTQ1NTYwMCwibm9uY2UiOiJuaWNlbGl0dGxlcmFuZG9tc3RyaW5nIiwiYXVkIjpbImdld2lhLmNvbSJdLCJzY29wZXMiOlsidGFzay50YXNrLnJlYWQuYWxsIiwidGFzay50YXNrLndyaXRlLmFsbCIsInRhc2sudGFzay5kZWxldGUuYWxsIiwidGFzay50YXNrZ3JvdXAucmVhZC5hbGwiLCJ0YXNrLnRhc2tncm91cC53cml0ZS5hbGwiLCJ0YXNrLnRhc2tncm91cC5kZWxldGUuYWxsIiwidGFzay5zdWJqZWN0LnJlYWQuYWxsIiwidGFzay5zdWJqZWN0LndyaXRlLmFsbCIsInRhc2suc3ViamVjdC5kZWxldGUuYWxsIiwidGFzay5tb2R1bGUucmVhZC5hbGwiLCJ0YXNrLm1vZHVsZS53cml0ZS5hbGwiLCJ0YXNrLm1vZHVsZS5kZWxldGUuYWxsIiwidGFzay5sZWN0dXJlLnJlYWQuYWxsIiwidGFzay5sZWN0dXJlLndyaXRlLmFsbCIsInRhc2subGVjdHVyZS5kZWxldGUuYWxsIiwidGFzay5kaWZmaWN1bHR5LnJlYWQuYWxsIiwidGFzay5kaWZmaWN1bHR5LndyaXRlLmFsbCIsInRhc2suZGlmZmljdWx0eS5kZWxldGUuYWxsIiwidGFzay50YXNrdHlwZS5yZWFkLmFsbCIsInRhc2sudGFza3R5cGUud3JpdGUuYWxsIiwidGFzay50YXNrdHlwZS5kZWxldGUuYWxsIiwidGFzay51c2VyLnJlYWQuYWxsIiwidGFzay51c2VyLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5tdWx0aXBsZWNob2ljZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ucmVhZC5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ud3JpdGUuYWxsIiwidGFzay5zb2x1dGlvbi5hbmFncmFtLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmZyZWVzdHlsZS5yZWFkLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5pbWFnZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnRvcGljY29ubmVjdGlvbi5yZWFkLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5zaW1wbGVlcXVhdGlvbi53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLmRlbGV0ZS5hbGwiXX0.m3MuV-N7lkYn3SSamesEZ1o6FMrrMNQBXMv8JneSuoXu-5KgN2p7VMZJlvXN0_toKQQ1wixlGh-DxSO6pEfU_w" + description: "Json Web Token (Example has all scopes, expires 2021, HS512 encoding, secret: 'SECRET')" + X-ServiceToken: + type: string + example: "SECRET" + description: "ServiceToken to force just using gateway" + Task: + type: object + properties: + task_id: + type: integer + example: 1 + task: + type: string + example: "Calculate Term" + description: + type: string + example: "Calculate the following Term: 3(6*7-9)/3" + language: + type: string + example: "de-DE" + author_id: + type: string + example: "52bd088c-d6ad-4cee-9f93-cabfc8c07234" + necessary_points: + type: integer + example: 100 + verified: + type: boolean + example: false + lecture: + type: object + properties: + lecture_id: + type: integer + example: 1 + name_key: + type: string + example: "geometry" + module_id: + type: integer + example: 1 + task_type_id: + type: object + properties: + task_type_id: + type: integer + example: 1 + name_key: + type: string + example: "exercise" + difficulty_id: + type: object + properties: + difficulty_id: + type: integer + example: 1 + name_key: + type: string + example: "easy" + TaskVote: + type: object + properties: + task_vote_id: + type: integer + example: 1 + user_id: + type: string + example: "52bd088c-d6ad-4cee-9f93-cabfc8c07234" + value: + type: integer + example: 1 + TaskGroup: + type: object + properties: + task_group_id: + type: integer + example: 1 + lecture_id: + type: integer + example: 1 + name_key: + type: string + example: Tolles-Aufgaben-Pack + task_ids: + type: array + items: + type: integer + example: 1 + author_id: + type: string + example: 0b870676-1a01-47aa-8402-859fb9806238 + difficulty_id: + type: integer + example: 1 + Lecture: + type: object + properties: + lecture_id: + type: integer + example: 1 + name_key: + type: string + example: squares + module_id: + type: integer + example: 1 + Module: + type: object + properties: + module_id: + type: integer + example: 1 + name_key: + type: string + example: geometry + subject_id: + type: integer + example: 1 + Subject: + type: object + properties: + subject_id: + type: integer + example: 1 + name_key: + type: string + example: maths + description_key: + type: string + example: calculating numbers + Difficulty: + type: object + properties: + difficulty_id: + type: integer + example: 1 + name_key: + type: string + example: easy + TaskType: + type: object + properties: + task_type_id: + type: integer + example: 1 + name_key: + type: string + example: exercise + SampleSolution: + type: object + properties: + task_id: + type: integer + solution: + type: string + description: Sample solution + Error: + oneOf: + - $ref: '#/components/schemas/InternalError' + - $ref: '#/components/schemas/ValidationError' + - $ref: '#/components/schemas/ControllerError' + InternalError: + type: object + properties: + timestamp: + type: string + example: 2020-03-22T20:26:47.367+0000 + status: + type: string + example: 404 + error: + type: string + example: Not Found + message: + type: string + path: + type: string + ValidationError: + type: object + properties: + timestamp: + type: string + example: 2020-03-22T14:52:51.714+0000 + status: + type: string + example: 400 + error: + type: string + example: Bad Request + message: + type: string + path: + type: string + errors: + type: array + items: + type: object + properties: + codes: + type: array + items: + type: string + arguments: + type: array + items: + additionalProperties: + type: string + default_message: + type: string + object_name: + type: string + field: + type: string + rejected_value: + type: string + binding_failure: + type: boolean + code: + type: string + ControllerError: + type: object + properties: + status: + type: integer + example: 404 + message_key: + type: string + example: NOT_FOUND + extra: + type: string + example: task + required: + - message_key + - status \ No newline at end of file diff --git a/gateway-core/pom.xml b/gateway-core/pom.xml new file mode 100644 index 0000000..f52d168 --- /dev/null +++ b/gateway-core/pom.xml @@ -0,0 +1,347 @@ + + + + gateway + de.the-morpheus.e-du + 0.1-SNAPSHOT + + 4.0.0 + + gateway-core + + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.6.RELEASE + pom + import + + + + + + + org.springframework.boot + spring-boot + 2.2.6.RELEASE + + + + org.springframework.boot + spring-boot-autoconfigure + 2.2.6.RELEASE + + + + org.springframework.boot + spring-boot-configuration-processor + 2.2.6.RELEASE + true + + + + org.springframework.boot + spring-boot-starter-test + 2.2.6.RELEASE + test + + + + org.apache.logging.log4j + log4j-core + 2.13.2 + compile + + + org.apache.logging.log4j + log4j-api + + + + + org.apache.logging.log4j + log4j-api + 2.13.2 + compile + + + org.slf4j + slf4j-api + 1.7.25 + compile + + + org.apache.logging.log4j + log4j-slf4j-impl + 2.13.2 + compile + + + io.sentry + sentry-log4j2 + 1.7.30 + compile + + + org.apache.logging.log4j + log4j-api + + + org.apache.logging.log4j + log4j-core + + + org.apache.logging.log4j + log4j-to-slf4j + + + + + + org.projectlombok + lombok + 1.18.12 + compile + + + javax.validation + validation-api + 2.0.1.Final + compile + + + com.auth0 + java-jwt + 3.10.1 + compile + + + com.squareup.okhttp3 + okhttp + 4.5.0 + compile + + + com.google.code.gson + gson + 2.8.6 + compile + + + javax.servlet + javax.servlet-api + 4.0.1 + compile + + + com.google.code.findbugs + jsr305 + 1.3.9 + compile + + + + + org.springframework.boot + spring-boot-starter-actuator + 2.3.0.M4 + compile + + + commons-logging + commons-logging + + + org.springframework.boot + spring-boot-starter-logging + + + + + org.springframework.boot + spring-boot-starter + 2.3.0.M4 + + + commons-logging + commons-logging + + + org.springframework.boot + spring-boot-starter-logging + + + + + org.springframework.boot + spring-boot-devtools + 2.2.6.RELEASE + + + commons-logging + commons-logging + + + org.springframework.boot + spring-boot-starter-logging + + + + + org.springframework + spring-webmvc + 5.2.6.RELEASE + + + commons-logging + commons-logging + + + org.springframework.boot + spring-boot-starter-logging + + + + + + + io.micrometer + micrometer-core + 1.4.1 + compile + + + io.micrometer + micrometer-registry-influx + 1.4.1 + compile + + + + + com.graphql-java-kickstart + graphql-spring-boot-starter + 7.0.0 + compile + + + com.graphql-java-kickstart + playground-spring-boot-starter + 7.0.0 + compile + + + com.graphql-java-kickstart + graphql-java-tools + 6.0.2 + compile + + + com.careykevin + graphql-actuator + 0.0.3 + compile + + + de.the-morpheus.e-du + backend-api + 0.1-SNAPSHOT + compile + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.9 + 1.9 + + + + pl.project13.maven + git-commit-id-plugin + 4.0.0 + + + get-the-git-infos + + revision + + + + + ${project.basedir}/.git + git + false + true + ${project.build.outputDirectory}/git.properties + json + + false + false + -dirty + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.2.6.RELEASE + + + + repackage + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.1.1 + + checkstyle.xml + UTF-8 + true + true + false + + + + validate + validate + + check + + + + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + + + + \ No newline at end of file diff --git a/src/main/java/de/themorpheus/edu/gateway/GatewayApplication.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/GatewayApplication.java similarity index 97% rename from src/main/java/de/themorpheus/edu/gateway/GatewayApplication.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/GatewayApplication.java index 5d79556..dd11f60 100644 --- a/src/main/java/de/themorpheus/edu/gateway/GatewayApplication.java +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/GatewayApplication.java @@ -11,12 +11,14 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.io.IOException; @EnableGraphQLActuator @SpringBootApplication +@Import(TaskApiConfiguration.class) public class GatewayApplication { public static final boolean PRODUCTIVE = Boolean.parseBoolean(System.getenv("PRODUCTIVE")); diff --git a/gateway-core/src/main/java/de/themorpheus/edu/gateway/TaskApiConfiguration.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/TaskApiConfiguration.java new file mode 100644 index 0000000..e807d8b --- /dev/null +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/TaskApiConfiguration.java @@ -0,0 +1,51 @@ +package de.themorpheus.edu.gateway; + +import de.themorpheus.edu.backend.api.DifficultyApi; +import de.themorpheus.edu.backend.api.LectureApi; +import de.themorpheus.edu.backend.api.ModuleApi; +import de.themorpheus.edu.backend.api.SubjectApi; +import de.themorpheus.edu.backend.api.TaskApi; +import de.themorpheus.edu.backend.api.TaskTypeApi; +import de.themorpheus.edu.backend.invoker.ApiClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class TaskApiConfiguration { + + @Bean + public TaskApi taskApi() { + return new TaskApi(apiClient()); + } + + @Bean + public TaskTypeApi taskTypeApi() { + return new TaskTypeApi(apiClient()); + } + + @Bean + public LectureApi lectureApi() { + return new LectureApi(apiClient()); + } + + @Bean + public ModuleApi moduleApi() { + return new ModuleApi(apiClient()); + } + + @Bean + public SubjectApi subjectApi() { + return new SubjectApi(apiClient()); + } + + @Bean + public DifficultyApi difficultyApi() { + return new DifficultyApi(apiClient()); + } + + @Bean + public ApiClient apiClient() { + return new ApiClient(); + } + +} diff --git a/src/main/java/de/themorpheus/edu/gateway/backend/BackendAPI.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/BackendAPI.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/backend/BackendAPI.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/BackendAPI.java diff --git a/src/main/java/de/themorpheus/edu/gateway/backend/Service.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/Service.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/backend/Service.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/Service.java diff --git a/src/main/java/de/themorpheus/edu/gateway/backend/UserService.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/UserService.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/backend/UserService.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/UserService.java diff --git a/src/main/java/de/themorpheus/edu/gateway/backend/user/UserCreateDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/user/UserCreateDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/backend/user/UserCreateDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/user/UserCreateDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/backend/user/UserErrorResponseDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/user/UserErrorResponseDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/backend/user/UserErrorResponseDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/user/UserErrorResponseDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/backend/user/UserLoginRequestDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/user/UserLoginRequestDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/backend/user/UserLoginRequestDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/user/UserLoginRequestDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/backend/user/UserLoginResponseDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/user/UserLoginResponseDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/backend/user/UserLoginResponseDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/backend/user/UserLoginResponseDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/generic/ServiceInfoDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/generic/ServiceInfoDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/generic/ServiceInfoDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/generic/ServiceInfoDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/report/TicketDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/report/TicketDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/report/TicketDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/report/TicketDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/DifficultyDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/DifficultyDTO.java similarity index 94% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/DifficultyDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/DifficultyDTO.java index ddc67c7..92cbb12 100644 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/DifficultyDTO.java +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/DifficultyDTO.java @@ -16,6 +16,6 @@ public class DifficultyDTO { @Min(0) private int difficultyId; @NotNull @NotEmpty @NotBlank - private String displayName; + private String nameKey; } diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/LectureDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/LectureDTO.java similarity index 94% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/LectureDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/LectureDTO.java index 11e2204..3ff3bff 100644 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/LectureDTO.java +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/LectureDTO.java @@ -16,6 +16,6 @@ public class LectureDTO { @Min(0) private int lectureId; @NotNull @NotEmpty @NotBlank - private String displayName; + private String nameKey; private ModuleDTO module; } diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/ModuleDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/ModuleDTO.java similarity index 94% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/ModuleDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/ModuleDTO.java index 65cb9e0..dce0040 100644 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/ModuleDTO.java +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/ModuleDTO.java @@ -16,6 +16,6 @@ public class ModuleDTO { @Min(0) private int moduleId; @NotNull @NotEmpty @NotBlank - private String displayName; + private String nameKey; private SubjectDTO subject; } diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/SubjectDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/SubjectDTO.java similarity index 94% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/SubjectDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/SubjectDTO.java index 8207e15..3bd7a27 100644 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/SubjectDTO.java +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/SubjectDTO.java @@ -16,6 +16,6 @@ public class SubjectDTO { @Min(0) private int subjectId; @NotNull @NotEmpty @NotBlank - private String displayName; + private String nameKey; } diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/TaskDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/TaskDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/TaskDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/TaskDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/TaskTypeDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/TaskTypeDTO.java similarity index 94% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/TaskTypeDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/TaskTypeDTO.java index 1b7ba92..e25528a 100644 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/TaskTypeDTO.java +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/task/TaskTypeDTO.java @@ -16,6 +16,6 @@ public class TaskTypeDTO { @Min(0) private int taskTypeId; @NotNull @NotEmpty @NotBlank - private String displayName; + private String nameKey; } diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/JwtResultDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/JwtResultDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/JwtResultDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/JwtResultDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserAuthDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserAuthDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserAuthDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserAuthDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserAuthResultDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserAuthResultDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserAuthResultDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserAuthResultDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserRegisterDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserRegisterDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserRegisterDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserRegisterDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserRegisterResultDTO.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserRegisterResultDTO.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserRegisterResultDTO.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/dto/user/UserRegisterResultDTO.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/mutation/user/AuthenticationResolver.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/mutation/user/AuthenticationResolver.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/resolver/mutation/user/AuthenticationResolver.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/mutation/user/AuthenticationResolver.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/ServiceInfoResolver.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/ServiceInfoResolver.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/ServiceInfoResolver.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/ServiceInfoResolver.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/report/TicketResolver.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/report/TicketResolver.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/report/TicketResolver.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/report/TicketResolver.java diff --git a/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/DifficultyResolver.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/DifficultyResolver.java new file mode 100644 index 0000000..9c9b226 --- /dev/null +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/DifficultyResolver.java @@ -0,0 +1,26 @@ +package de.themorpheus.edu.gateway.graphql.resolver.query.task; + +import de.themorpheus.edu.backend.api.DifficultyApi; +import de.themorpheus.edu.backend.invoker.ApiException; +import de.themorpheus.edu.backend.model.Difficulty; +import de.themorpheus.edu.gateway.graphql.dto.task.DifficultyDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.validation.constraints.Min; +import graphql.kickstart.tools.GraphQLQueryResolver; +import graphql.schema.DataFetchingEnvironment; + +@Component +public class DifficultyResolver implements GraphQLQueryResolver { + + @Autowired private DifficultyApi difficultyApi; + + public DifficultyDTO difficultyById(@Min(0) int difficultyId, DataFetchingEnvironment environment) throws ApiException { + Difficulty difficulty = difficultyApi.getDifficultybydifficultyId("SECRET", difficultyId, "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1ODk0ODE3NDEsImV4cCI6MTYwOTQ1NTYwMCwibm9uY2UiOiJuaWNlbGl0dGxlcmFuZG9tc3RyaW5nIiwiYXVkIjpbImdld2lhLmNvbSJdLCJzY29wZXMiOlsidGFzay50YXNrLnJlYWQuYWxsIiwidGFzay50YXNrLndyaXRlLmFsbCIsInRhc2sudGFzay5kZWxldGUuYWxsIiwidGFzay50YXNrZ3JvdXAucmVhZC5hbGwiLCJ0YXNrLnRhc2tncm91cC53cml0ZS5hbGwiLCJ0YXNrLnRhc2tncm91cC5kZWxldGUuYWxsIiwidGFzay5zdWJqZWN0LnJlYWQuYWxsIiwidGFzay5zdWJqZWN0LndyaXRlLmFsbCIsInRhc2suc3ViamVjdC5kZWxldGUuYWxsIiwidGFzay5tb2R1bGUucmVhZC5hbGwiLCJ0YXNrLm1vZHVsZS53cml0ZS5hbGwiLCJ0YXNrLm1vZHVsZS5kZWxldGUuYWxsIiwidGFzay5sZWN0dXJlLnJlYWQuYWxsIiwidGFzay5sZWN0dXJlLndyaXRlLmFsbCIsInRhc2subGVjdHVyZS5kZWxldGUuYWxsIiwidGFzay5kaWZmaWN1bHR5LnJlYWQuYWxsIiwidGFzay5kaWZmaWN1bHR5LndyaXRlLmFsbCIsInRhc2suZGlmZmljdWx0eS5kZWxldGUuYWxsIiwidGFzay50YXNrdHlwZS5yZWFkLmFsbCIsInRhc2sudGFza3R5cGUud3JpdGUuYWxsIiwidGFzay50YXNrdHlwZS5kZWxldGUuYWxsIiwidGFzay51c2VyLnJlYWQuYWxsIiwidGFzay51c2VyLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5tdWx0aXBsZWNob2ljZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ucmVhZC5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ud3JpdGUuYWxsIiwidGFzay5zb2x1dGlvbi5hbmFncmFtLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmZyZWVzdHlsZS5yZWFkLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5pbWFnZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnRvcGljY29ubmVjdGlvbi5yZWFkLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5zaW1wbGVlcXVhdGlvbi53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLmRlbGV0ZS5hbGwiXX0.m3MuV-N7lkYn3SSamesEZ1o6FMrrMNQBXMv8JneSuoXu-5KgN2p7VMZJlvXN0_toKQQ1wixlGh-DxSO6pEfU_w"); + return new DifficultyDTO( + difficulty.getDifficultyId(), + difficulty.getNameKey() + ); + } + +} diff --git a/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/LectureResolver.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/LectureResolver.java new file mode 100644 index 0000000..0f5d5fa --- /dev/null +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/LectureResolver.java @@ -0,0 +1,28 @@ +package de.themorpheus.edu.gateway.graphql.resolver.query.task; + +import de.themorpheus.edu.backend.api.LectureApi; +import de.themorpheus.edu.backend.invoker.ApiException; +import de.themorpheus.edu.backend.model.Lecture; +import de.themorpheus.edu.gateway.graphql.dto.task.LectureDTO; +import graphql.schema.DataFetchingEnvironment; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.validation.constraints.Min; +import graphql.kickstart.tools.GraphQLQueryResolver; + +@Component +public class LectureResolver implements GraphQLQueryResolver { + + @Autowired private LectureApi lectureApi; + @Autowired private ModuleResolver moduleResolver; + + public LectureDTO lectureById(@Min(0) int lectureId, DataFetchingEnvironment environment) throws ApiException { + Lecture lecture = lectureApi.getLecturebyid("SECRET", lectureId, "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1ODk0ODE3NDEsImV4cCI6MTYwOTQ1NTYwMCwibm9uY2UiOiJuaWNlbGl0dGxlcmFuZG9tc3RyaW5nIiwiYXVkIjpbImdld2lhLmNvbSJdLCJzY29wZXMiOlsidGFzay50YXNrLnJlYWQuYWxsIiwidGFzay50YXNrLndyaXRlLmFsbCIsInRhc2sudGFzay5kZWxldGUuYWxsIiwidGFzay50YXNrZ3JvdXAucmVhZC5hbGwiLCJ0YXNrLnRhc2tncm91cC53cml0ZS5hbGwiLCJ0YXNrLnRhc2tncm91cC5kZWxldGUuYWxsIiwidGFzay5zdWJqZWN0LnJlYWQuYWxsIiwidGFzay5zdWJqZWN0LndyaXRlLmFsbCIsInRhc2suc3ViamVjdC5kZWxldGUuYWxsIiwidGFzay5tb2R1bGUucmVhZC5hbGwiLCJ0YXNrLm1vZHVsZS53cml0ZS5hbGwiLCJ0YXNrLm1vZHVsZS5kZWxldGUuYWxsIiwidGFzay5sZWN0dXJlLnJlYWQuYWxsIiwidGFzay5sZWN0dXJlLndyaXRlLmFsbCIsInRhc2subGVjdHVyZS5kZWxldGUuYWxsIiwidGFzay5kaWZmaWN1bHR5LnJlYWQuYWxsIiwidGFzay5kaWZmaWN1bHR5LndyaXRlLmFsbCIsInRhc2suZGlmZmljdWx0eS5kZWxldGUuYWxsIiwidGFzay50YXNrdHlwZS5yZWFkLmFsbCIsInRhc2sudGFza3R5cGUud3JpdGUuYWxsIiwidGFzay50YXNrdHlwZS5kZWxldGUuYWxsIiwidGFzay51c2VyLnJlYWQuYWxsIiwidGFzay51c2VyLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5tdWx0aXBsZWNob2ljZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ucmVhZC5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ud3JpdGUuYWxsIiwidGFzay5zb2x1dGlvbi5hbmFncmFtLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmZyZWVzdHlsZS5yZWFkLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5pbWFnZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnRvcGljY29ubmVjdGlvbi5yZWFkLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5zaW1wbGVlcXVhdGlvbi53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLmRlbGV0ZS5hbGwiXX0.m3MuV-N7lkYn3SSamesEZ1o6FMrrMNQBXMv8JneSuoXu-5KgN2p7VMZJlvXN0_toKQQ1wixlGh-DxSO6pEfU_w"); + return new LectureDTO( + lecture.getLectureId(), + lecture.getNameKey(), + moduleResolver.moduleById(lecture.getModuleId(), environment) + ); + } + +} diff --git a/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/ModuleResolver.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/ModuleResolver.java new file mode 100644 index 0000000..f81f2a2 --- /dev/null +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/ModuleResolver.java @@ -0,0 +1,28 @@ +package de.themorpheus.edu.gateway.graphql.resolver.query.task; + +import de.themorpheus.edu.backend.api.ModuleApi; +import de.themorpheus.edu.backend.invoker.ApiException; +import de.themorpheus.edu.backend.model.Module; +import de.themorpheus.edu.gateway.graphql.dto.task.ModuleDTO; +import graphql.schema.DataFetchingEnvironment; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.validation.constraints.Min; +import graphql.kickstart.tools.GraphQLQueryResolver; + +@Component +public class ModuleResolver implements GraphQLQueryResolver { + + @Autowired private ModuleApi moduleApi; + @Autowired private SubjectResolver subjectResolver; + + public ModuleDTO moduleById(@Min(0) int moduleId, DataFetchingEnvironment environment) throws ApiException { + Module module = moduleApi.getModulebymoduleId("SECRET", moduleId, "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1ODk0ODE3NDEsImV4cCI6MTYwOTQ1NTYwMCwibm9uY2UiOiJuaWNlbGl0dGxlcmFuZG9tc3RyaW5nIiwiYXVkIjpbImdld2lhLmNvbSJdLCJzY29wZXMiOlsidGFzay50YXNrLnJlYWQuYWxsIiwidGFzay50YXNrLndyaXRlLmFsbCIsInRhc2sudGFzay5kZWxldGUuYWxsIiwidGFzay50YXNrZ3JvdXAucmVhZC5hbGwiLCJ0YXNrLnRhc2tncm91cC53cml0ZS5hbGwiLCJ0YXNrLnRhc2tncm91cC5kZWxldGUuYWxsIiwidGFzay5zdWJqZWN0LnJlYWQuYWxsIiwidGFzay5zdWJqZWN0LndyaXRlLmFsbCIsInRhc2suc3ViamVjdC5kZWxldGUuYWxsIiwidGFzay5tb2R1bGUucmVhZC5hbGwiLCJ0YXNrLm1vZHVsZS53cml0ZS5hbGwiLCJ0YXNrLm1vZHVsZS5kZWxldGUuYWxsIiwidGFzay5sZWN0dXJlLnJlYWQuYWxsIiwidGFzay5sZWN0dXJlLndyaXRlLmFsbCIsInRhc2subGVjdHVyZS5kZWxldGUuYWxsIiwidGFzay5kaWZmaWN1bHR5LnJlYWQuYWxsIiwidGFzay5kaWZmaWN1bHR5LndyaXRlLmFsbCIsInRhc2suZGlmZmljdWx0eS5kZWxldGUuYWxsIiwidGFzay50YXNrdHlwZS5yZWFkLmFsbCIsInRhc2sudGFza3R5cGUud3JpdGUuYWxsIiwidGFzay50YXNrdHlwZS5kZWxldGUuYWxsIiwidGFzay51c2VyLnJlYWQuYWxsIiwidGFzay51c2VyLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5tdWx0aXBsZWNob2ljZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ucmVhZC5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ud3JpdGUuYWxsIiwidGFzay5zb2x1dGlvbi5hbmFncmFtLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmZyZWVzdHlsZS5yZWFkLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5pbWFnZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnRvcGljY29ubmVjdGlvbi5yZWFkLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5zaW1wbGVlcXVhdGlvbi53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLmRlbGV0ZS5hbGwiXX0.m3MuV-N7lkYn3SSamesEZ1o6FMrrMNQBXMv8JneSuoXu-5KgN2p7VMZJlvXN0_toKQQ1wixlGh-DxSO6pEfU_w"); + return new ModuleDTO( + module.getModuleId(), + module.getNameKey(), + subjectResolver.subjectById(module.getSubjectId(), environment) + ); + } + +} diff --git a/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/SubjectResolver.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/SubjectResolver.java new file mode 100644 index 0000000..b59d460 --- /dev/null +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/SubjectResolver.java @@ -0,0 +1,26 @@ +package de.themorpheus.edu.gateway.graphql.resolver.query.task; + +import de.themorpheus.edu.backend.api.SubjectApi; +import de.themorpheus.edu.backend.invoker.ApiException; +import de.themorpheus.edu.backend.model.Subject; +import de.themorpheus.edu.gateway.graphql.dto.task.SubjectDTO; +import graphql.schema.DataFetchingEnvironment; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.validation.constraints.Min; +import graphql.kickstart.tools.GraphQLQueryResolver; + +@Component +public class SubjectResolver implements GraphQLQueryResolver { + + @Autowired private SubjectApi subjectApi; + + public SubjectDTO subjectById(@Min(0) int subjectId, DataFetchingEnvironment environment) throws ApiException { + Subject subject = subjectApi.getSubjectbysubjectId("SECRET", subjectId, "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1ODk0ODE3NDEsImV4cCI6MTYwOTQ1NTYwMCwibm9uY2UiOiJuaWNlbGl0dGxlcmFuZG9tc3RyaW5nIiwiYXVkIjpbImdld2lhLmNvbSJdLCJzY29wZXMiOlsidGFzay50YXNrLnJlYWQuYWxsIiwidGFzay50YXNrLndyaXRlLmFsbCIsInRhc2sudGFzay5kZWxldGUuYWxsIiwidGFzay50YXNrZ3JvdXAucmVhZC5hbGwiLCJ0YXNrLnRhc2tncm91cC53cml0ZS5hbGwiLCJ0YXNrLnRhc2tncm91cC5kZWxldGUuYWxsIiwidGFzay5zdWJqZWN0LnJlYWQuYWxsIiwidGFzay5zdWJqZWN0LndyaXRlLmFsbCIsInRhc2suc3ViamVjdC5kZWxldGUuYWxsIiwidGFzay5tb2R1bGUucmVhZC5hbGwiLCJ0YXNrLm1vZHVsZS53cml0ZS5hbGwiLCJ0YXNrLm1vZHVsZS5kZWxldGUuYWxsIiwidGFzay5sZWN0dXJlLnJlYWQuYWxsIiwidGFzay5sZWN0dXJlLndyaXRlLmFsbCIsInRhc2subGVjdHVyZS5kZWxldGUuYWxsIiwidGFzay5kaWZmaWN1bHR5LnJlYWQuYWxsIiwidGFzay5kaWZmaWN1bHR5LndyaXRlLmFsbCIsInRhc2suZGlmZmljdWx0eS5kZWxldGUuYWxsIiwidGFzay50YXNrdHlwZS5yZWFkLmFsbCIsInRhc2sudGFza3R5cGUud3JpdGUuYWxsIiwidGFzay50YXNrdHlwZS5kZWxldGUuYWxsIiwidGFzay51c2VyLnJlYWQuYWxsIiwidGFzay51c2VyLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5tdWx0aXBsZWNob2ljZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ucmVhZC5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ud3JpdGUuYWxsIiwidGFzay5zb2x1dGlvbi5hbmFncmFtLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmZyZWVzdHlsZS5yZWFkLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5pbWFnZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnRvcGljY29ubmVjdGlvbi5yZWFkLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5zaW1wbGVlcXVhdGlvbi53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLmRlbGV0ZS5hbGwiXX0.m3MuV-N7lkYn3SSamesEZ1o6FMrrMNQBXMv8JneSuoXu-5KgN2p7VMZJlvXN0_toKQQ1wixlGh-DxSO6pEfU_w"); + return new SubjectDTO( + subject.getSubjectId(), + subject.getNameKey() + ); + } + +} diff --git a/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskResolver.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskResolver.java new file mode 100644 index 0000000..9f4a4d2 --- /dev/null +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskResolver.java @@ -0,0 +1,68 @@ +package de.themorpheus.edu.gateway.graphql.resolver.query.task; + +import de.themorpheus.edu.backend.api.TaskApi; +import de.themorpheus.edu.backend.invoker.ApiException; +import de.themorpheus.edu.backend.model.Task; +import de.themorpheus.edu.gateway.graphql.dto.task.DifficultyDTO; +import de.themorpheus.edu.gateway.graphql.dto.task.LectureDTO; +import de.themorpheus.edu.gateway.graphql.dto.task.ModuleDTO; +import de.themorpheus.edu.gateway.graphql.dto.task.SubjectDTO; +import de.themorpheus.edu.gateway.graphql.dto.task.TaskDTO; +import de.themorpheus.edu.gateway.graphql.dto.task.TaskTypeDTO; +import de.themorpheus.edu.gateway.graphql.resolver.query.user.UserResolver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.validation.constraints.Min; +import graphql.kickstart.tools.GraphQLQueryResolver; +import graphql.schema.DataFetchingEnvironment; + +@Component +public class TaskResolver implements GraphQLQueryResolver { + + public static final TaskDTO EXAMPLE = new TaskDTO( + 0, + "Create something", + UserResolver.EXAMPLE, + 10, + new TaskTypeDTO( + 0, + "Exercise" + ), + new LectureDTO( + 0, + "Integralrechnung", + new ModuleDTO( + 0, + "Analysis", + new SubjectDTO( + 0, + "Math" + ) + ) + ), + new DifficultyDTO( + 0, + "Hard" + ) + ); + + @Autowired private TaskApi taskApi; + @Autowired private TaskTypeResolver taskTypeResolver; + @Autowired private LectureResolver lectureResolver; + @Autowired private DifficultyResolver difficultyResolver; + + + public TaskDTO taskById(@Min(0) int taskId, DataFetchingEnvironment environment) throws ApiException { + Task task = taskApi.getTask("eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1ODk0ODE3NDEsImV4cCI6MTYwOTQ1NTYwMCwibm9uY2UiOiJuaWNlbGl0dGxlcmFuZG9tc3RyaW5nIiwiYXVkIjpbImdld2lhLmNvbSJdLCJzY29wZXMiOlsidGFzay50YXNrLnJlYWQuYWxsIiwidGFzay50YXNrLndyaXRlLmFsbCIsInRhc2sudGFzay5kZWxldGUuYWxsIiwidGFzay50YXNrZ3JvdXAucmVhZC5hbGwiLCJ0YXNrLnRhc2tncm91cC53cml0ZS5hbGwiLCJ0YXNrLnRhc2tncm91cC5kZWxldGUuYWxsIiwidGFzay5zdWJqZWN0LnJlYWQuYWxsIiwidGFzay5zdWJqZWN0LndyaXRlLmFsbCIsInRhc2suc3ViamVjdC5kZWxldGUuYWxsIiwidGFzay5tb2R1bGUucmVhZC5hbGwiLCJ0YXNrLm1vZHVsZS53cml0ZS5hbGwiLCJ0YXNrLm1vZHVsZS5kZWxldGUuYWxsIiwidGFzay5sZWN0dXJlLnJlYWQuYWxsIiwidGFzay5sZWN0dXJlLndyaXRlLmFsbCIsInRhc2subGVjdHVyZS5kZWxldGUuYWxsIiwidGFzay5kaWZmaWN1bHR5LnJlYWQuYWxsIiwidGFzay5kaWZmaWN1bHR5LndyaXRlLmFsbCIsInRhc2suZGlmZmljdWx0eS5kZWxldGUuYWxsIiwidGFzay50YXNrdHlwZS5yZWFkLmFsbCIsInRhc2sudGFza3R5cGUud3JpdGUuYWxsIiwidGFzay50YXNrdHlwZS5kZWxldGUuYWxsIiwidGFzay51c2VyLnJlYWQuYWxsIiwidGFzay51c2VyLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5tdWx0aXBsZWNob2ljZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ucmVhZC5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ud3JpdGUuYWxsIiwidGFzay5zb2x1dGlvbi5hbmFncmFtLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmZyZWVzdHlsZS5yZWFkLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5pbWFnZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnRvcGljY29ubmVjdGlvbi5yZWFkLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5zaW1wbGVlcXVhdGlvbi53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLmRlbGV0ZS5hbGwiXX0.m3MuV-N7lkYn3SSamesEZ1o6FMrrMNQBXMv8JneSuoXu-5KgN2p7VMZJlvXN0_toKQQ1wixlGh-DxSO6pEfU_w", "SECRET", taskId); + return new TaskDTO( + task.getTaskId(), + task.getTask(), + UserResolver.EXAMPLE, + task.getNecessaryPoints(), + taskTypeResolver.taskTypeById(task.getTaskTypeId().getTaskTypeId(), environment), + lectureResolver.lectureById(task.getLecture().getLectureId(), environment), + difficultyResolver.difficultyById(task.getDifficultyId().getDifficultyId(), environment) + ); + } + +} diff --git a/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskTypeResolver.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskTypeResolver.java new file mode 100644 index 0000000..800b9ec --- /dev/null +++ b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskTypeResolver.java @@ -0,0 +1,26 @@ +package de.themorpheus.edu.gateway.graphql.resolver.query.task; + +import de.themorpheus.edu.backend.api.TaskTypeApi; +import de.themorpheus.edu.backend.invoker.ApiException; +import de.themorpheus.edu.backend.model.TaskType; +import de.themorpheus.edu.gateway.graphql.dto.task.TaskTypeDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.validation.constraints.Min; +import graphql.kickstart.tools.GraphQLQueryResolver; +import graphql.schema.DataFetchingEnvironment; + +@Component +public class TaskTypeResolver implements GraphQLQueryResolver { + + @Autowired private TaskTypeApi taskTypeApi; + + public TaskTypeDTO taskTypeById(@Min(0) int taskTypeId, DataFetchingEnvironment environment) throws ApiException { + TaskType taskType = taskTypeApi.getTaskTypebyid("eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1ODk0ODE3NDEsImV4cCI6MTYwOTQ1NTYwMCwibm9uY2UiOiJuaWNlbGl0dGxlcmFuZG9tc3RyaW5nIiwiYXVkIjpbImdld2lhLmNvbSJdLCJzY29wZXMiOlsidGFzay50YXNrLnJlYWQuYWxsIiwidGFzay50YXNrLndyaXRlLmFsbCIsInRhc2sudGFzay5kZWxldGUuYWxsIiwidGFzay50YXNrZ3JvdXAucmVhZC5hbGwiLCJ0YXNrLnRhc2tncm91cC53cml0ZS5hbGwiLCJ0YXNrLnRhc2tncm91cC5kZWxldGUuYWxsIiwidGFzay5zdWJqZWN0LnJlYWQuYWxsIiwidGFzay5zdWJqZWN0LndyaXRlLmFsbCIsInRhc2suc3ViamVjdC5kZWxldGUuYWxsIiwidGFzay5tb2R1bGUucmVhZC5hbGwiLCJ0YXNrLm1vZHVsZS53cml0ZS5hbGwiLCJ0YXNrLm1vZHVsZS5kZWxldGUuYWxsIiwidGFzay5sZWN0dXJlLnJlYWQuYWxsIiwidGFzay5sZWN0dXJlLndyaXRlLmFsbCIsInRhc2subGVjdHVyZS5kZWxldGUuYWxsIiwidGFzay5kaWZmaWN1bHR5LnJlYWQuYWxsIiwidGFzay5kaWZmaWN1bHR5LndyaXRlLmFsbCIsInRhc2suZGlmZmljdWx0eS5kZWxldGUuYWxsIiwidGFzay50YXNrdHlwZS5yZWFkLmFsbCIsInRhc2sudGFza3R5cGUud3JpdGUuYWxsIiwidGFzay50YXNrdHlwZS5kZWxldGUuYWxsIiwidGFzay51c2VyLnJlYWQuYWxsIiwidGFzay51c2VyLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5tdWx0aXBsZWNob2ljZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLm11bHRpcGxlY2hvaWNlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ucmVhZC5hbGwiLCJ0YXNrLnNvbHV0aW9uLmFuYWdyYW0ud3JpdGUuYWxsIiwidGFzay5zb2x1dGlvbi5hbmFncmFtLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmZyZWVzdHlsZS5yZWFkLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24uZnJlZXN0eWxlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5pbWFnZS53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLmltYWdlLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnRvcGljY29ubmVjdGlvbi5yZWFkLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLndyaXRlLmFsbCIsInRhc2suc29sdXRpb24udG9waWNjb25uZWN0aW9uLmRlbGV0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLnJlYWQuYWxsIiwidGFzay5zb2x1dGlvbi5zaW1wbGVlcXVhdGlvbi53cml0ZS5hbGwiLCJ0YXNrLnNvbHV0aW9uLnNpbXBsZWVxdWF0aW9uLmRlbGV0ZS5hbGwiXX0.m3MuV-N7lkYn3SSamesEZ1o6FMrrMNQBXMv8JneSuoXu-5KgN2p7VMZJlvXN0_toKQQ1wixlGh-DxSO6pEfU_w", taskTypeId); + return new TaskTypeDTO( + taskType.getTaskTypeId(), + taskType.getNameKey() + ); + } + +} diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/user/UserResolver.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/user/UserResolver.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/user/UserResolver.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/user/UserResolver.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/DeviceId.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/DeviceId.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/DeviceId.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/DeviceId.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/HeaderUtil.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/HeaderUtil.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/HeaderUtil.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/HeaderUtil.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/JsonWebToken.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/JsonWebToken.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/JsonWebToken.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/JsonWebToken.java diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/RefreshToken.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/RefreshToken.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/RefreshToken.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/util/RefreshToken.java diff --git a/src/main/java/de/themorpheus/edu/gateway/util/GitInfo.java b/gateway-core/src/main/java/de/themorpheus/edu/gateway/util/GitInfo.java similarity index 100% rename from src/main/java/de/themorpheus/edu/gateway/util/GitInfo.java rename to gateway-core/src/main/java/de/themorpheus/edu/gateway/util/GitInfo.java diff --git a/src/main/resources/application.properties b/gateway-core/src/main/resources/application.properties similarity index 87% rename from src/main/resources/application.properties rename to gateway-core/src/main/resources/application.properties index 57a08c0..658b806 100644 --- a/src/main/resources/application.properties +++ b/gateway-core/src/main/resources/application.properties @@ -1,10 +1,10 @@ security.basic.enable=false -server.port=80 +server.port=8080 graphql.playground.settings.request.credentials=Same-Origin management.metrics.export.influx.db=${INFLUX_DB} management.metrics.export.influx.username=${INFLUX_USERNAME} management.metrics.export.influx.password=${INFLUX_PASSWORD} -management.metrics.export.influx.step=${INFLUX_STEP} +management.metrics.export.influx.step=1m management.metrics.export.influx.uri=${INFLUX_URI} management.metrics.web.server.auto-time-request=true management.metrics.export.influx.auto-create-db=false diff --git a/src/main/resources/log4j2.xml b/gateway-core/src/main/resources/log4j2.xml similarity index 100% rename from src/main/resources/log4j2.xml rename to gateway-core/src/main/resources/log4j2.xml diff --git a/src/main/resources/schema.graphqls b/gateway-core/src/main/resources/schema.graphqls similarity index 96% rename from src/main/resources/schema.graphqls rename to gateway-core/src/main/resources/schema.graphqls index 8d8ac87..09337d1 100644 --- a/src/main/resources/schema.graphqls +++ b/gateway-core/src/main/resources/schema.graphqls @@ -68,29 +68,29 @@ type Task { type TaskType { taskTypeId: Int - displayName: String + nameKey: String } type Subject { subjectId: Int - displayName: String + nameKey: String } type Module { moduleId: Int - displayName: String + nameKey: String subject: Subject } type Lecture { lectureId: Int - displayName: String + nameKey: String module: Module } type Difficulty { difficultyId: Int - displayName: String + nameKey: String } # ================ User MicroService ================ diff --git a/src/main/resources/security.ignored b/gateway-core/src/main/resources/security.ignored similarity index 100% rename from src/main/resources/security.ignored rename to gateway-core/src/main/resources/security.ignored diff --git a/src/main/resources/sentry.properties b/gateway-core/src/main/resources/sentry.properties similarity index 100% rename from src/main/resources/sentry.properties rename to gateway-core/src/main/resources/sentry.properties diff --git a/pom.xml b/pom.xml index 529c5b5..74ecc91 100644 --- a/pom.xml +++ b/pom.xml @@ -2,12 +2,14 @@ 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.2.6.RELEASE - - + pom + + gateway-core + backend-api + + + UTF-8 + de.the-morpheus.e-du gateway @@ -15,252 +17,8 @@ gateway it collects and filters information requested by the frontend using GraphQL - - - - org.apache.logging.log4j - log4j-core - 2.13.2 - compile - - - org.apache.logging.log4j - log4j-api - - - - - org.apache.logging.log4j - log4j-api - 2.13.2 - compile - - - org.slf4j - slf4j-api - 1.7.25 - compile - - - org.apache.logging.log4j - log4j-slf4j-impl - 2.13.2 - compile - - - io.sentry - sentry-log4j2 - 1.7.30 - compile - - - org.apache.logging.log4j - log4j-api - - - org.apache.logging.log4j - log4j-core - - - org.apache.logging.log4j - log4j-to-slf4j - - - - - - org.projectlombok - lombok - 1.18.12 - compile - - - javax.validation - validation-api - 2.0.1.Final - compile - - - com.auth0 - java-jwt - 3.10.1 - compile - - - com.squareup.okhttp3 - okhttp - 4.5.0 - compile - - - com.google.code.gson - gson - 2.8.6 - compile - - - javax.servlet - javax.servlet-api - 4.0.1 - compile - - - com.google.code.findbugs - jsr305 - 1.3.9 - compile - - - - - org.springframework.boot - spring-boot-starter-actuator - 2.3.0.M4 - compile - - - commons-logging - commons-logging - - - org.springframework.boot - spring-boot-starter-logging - - - - - org.springframework.boot - spring-boot-starter - 2.3.0.M4 - - - commons-logging - commons-logging - - - org.springframework.boot - spring-boot-starter-logging - - - - - org.springframework.boot - spring-boot-devtools - 2.2.6.RELEASE - - - commons-logging - commons-logging - - - org.springframework.boot - spring-boot-starter-logging - - - - - org.springframework - spring-webmvc - 5.2.6.RELEASE - - - commons-logging - commons-logging - - - org.springframework.boot - spring-boot-starter-logging - - - - - - - io.micrometer - micrometer-core - 1.4.1 - compile - - - io.micrometer - micrometer-registry-influx - 1.4.1 - compile - - - - - com.graphql-java-kickstart - graphql-spring-boot-starter - 7.0.0 - compile - - - com.graphql-java-kickstart - playground-spring-boot-starter - 7.0.0 - compile - - - com.graphql-java-kickstart - graphql-java-tools - 6.0.2 - compile - - - com.careykevin - graphql-actuator - 0.0.3 - compile - - - - - - - pl.project13.maven - git-commit-id-plugin - 4.0.0 - - - get-the-git-infos - - revision - - - - - ${project.basedir}/.git - git - false - true - ${project.build.outputDirectory}/git.properties - json - - false - false - -dirty - - - - - org.springframework.boot - spring-boot-maven-plugin - org.apache.maven.plugins maven-checkstyle-plugin @@ -285,19 +43,4 @@ - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - - diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/DifficultyResolver.java b/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/DifficultyResolver.java deleted file mode 100644 index db3ba22..0000000 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/DifficultyResolver.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.themorpheus.edu.gateway.graphql.resolver.query.task; - -import de.themorpheus.edu.gateway.graphql.dto.task.DifficultyDTO; -import org.springframework.stereotype.Component; -import javax.validation.constraints.Min; -import graphql.kickstart.tools.GraphQLQueryResolver; -import graphql.schema.DataFetchingEnvironment; - -@Component -public class DifficultyResolver implements GraphQLQueryResolver { - - public DifficultyDTO difficultyById(@Min(0) int difficultyId, DataFetchingEnvironment environment) { - return TaskResolver.EXAMPLE.getDifficulty(); - } - -} diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/LectureResolver.java b/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/LectureResolver.java deleted file mode 100644 index 10935f4..0000000 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/LectureResolver.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.themorpheus.edu.gateway.graphql.resolver.query.task; - -import de.themorpheus.edu.gateway.graphql.dto.task.LectureDTO; -import org.springframework.stereotype.Component; -import javax.validation.constraints.Min; -import graphql.kickstart.tools.GraphQLQueryResolver; -import graphql.schema.DataFetchingEnvironment; - -@Component -public class LectureResolver implements GraphQLQueryResolver { - - public LectureDTO lectureById(@Min(0) int lectureId, DataFetchingEnvironment environment) { - return TaskResolver.EXAMPLE.getLecture(); - } - -} diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/ModuleResolver.java b/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/ModuleResolver.java deleted file mode 100644 index a5877be..0000000 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/ModuleResolver.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.themorpheus.edu.gateway.graphql.resolver.query.task; - -import de.themorpheus.edu.gateway.graphql.dto.task.ModuleDTO; -import org.springframework.stereotype.Component; -import javax.validation.constraints.Min; -import graphql.kickstart.tools.GraphQLQueryResolver; -import graphql.schema.DataFetchingEnvironment; - -@Component -public class ModuleResolver implements GraphQLQueryResolver { - - public ModuleDTO moduleById(@Min(0) int moduleId, DataFetchingEnvironment environment) { - return TaskResolver.EXAMPLE.getLecture().getModule(); - } - -} diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/SubjectResolver.java b/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/SubjectResolver.java deleted file mode 100644 index 3658140..0000000 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/SubjectResolver.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.themorpheus.edu.gateway.graphql.resolver.query.task; - -import de.themorpheus.edu.gateway.graphql.dto.task.SubjectDTO; -import org.springframework.stereotype.Component; -import javax.validation.constraints.Min; -import graphql.kickstart.tools.GraphQLQueryResolver; -import graphql.schema.DataFetchingEnvironment; - -@Component -public class SubjectResolver implements GraphQLQueryResolver { - - public SubjectDTO subjectById(@Min(0) int subjectId, DataFetchingEnvironment environment) { - return TaskResolver.EXAMPLE.getLecture().getModule().getSubject(); - } - -} diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskResolver.java b/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskResolver.java deleted file mode 100644 index e3493ef..0000000 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskResolver.java +++ /dev/null @@ -1,49 +0,0 @@ -package de.themorpheus.edu.gateway.graphql.resolver.query.task; - -import de.themorpheus.edu.gateway.graphql.dto.task.DifficultyDTO; -import de.themorpheus.edu.gateway.graphql.dto.task.LectureDTO; -import de.themorpheus.edu.gateway.graphql.dto.task.ModuleDTO; -import de.themorpheus.edu.gateway.graphql.dto.task.SubjectDTO; -import de.themorpheus.edu.gateway.graphql.dto.task.TaskDTO; -import de.themorpheus.edu.gateway.graphql.dto.task.TaskTypeDTO; -import de.themorpheus.edu.gateway.graphql.resolver.query.user.UserResolver; -import org.springframework.stereotype.Component; -import javax.validation.constraints.Min; -import graphql.kickstart.tools.GraphQLQueryResolver; -import graphql.schema.DataFetchingEnvironment; - -@Component -public class TaskResolver implements GraphQLQueryResolver { - - public static final TaskDTO EXAMPLE = new TaskDTO( - 0, - "Create something", - UserResolver.EXAMPLE, - 10, - new TaskTypeDTO( - 0, - "Exercise" - ), - new LectureDTO( - 0, - "Integralrechnung", - new ModuleDTO( - 0, - "Analysis", - new SubjectDTO( - 0, - "Math" - ) - ) - ), - new DifficultyDTO( - 0, - "Hard" - ) - ); - - public TaskDTO taskById(@Min(0) int taskId, DataFetchingEnvironment environment) { - return TaskResolver.EXAMPLE; - } - -} diff --git a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskTypeResolver.java b/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskTypeResolver.java deleted file mode 100644 index 10bae83..0000000 --- a/src/main/java/de/themorpheus/edu/gateway/graphql/resolver/query/task/TaskTypeResolver.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.themorpheus.edu.gateway.graphql.resolver.query.task; - -import de.themorpheus.edu.gateway.graphql.dto.task.TaskTypeDTO; -import org.springframework.stereotype.Component; -import javax.validation.constraints.Min; -import graphql.kickstart.tools.GraphQLQueryResolver; -import graphql.schema.DataFetchingEnvironment; - -@Component -public class TaskTypeResolver implements GraphQLQueryResolver { - - public TaskTypeDTO taskTypeById(@Min(0) int taskTypeId, DataFetchingEnvironment environment) { - return TaskResolver.EXAMPLE.getTaskType(); - } - -}