{"info":{"_postman_id":"b82a6d55-b8f8-4a6e-a5f8-7dd02a661026","name":"codeboard","description":"<html><head></head><body><p>This documentation serves as a description for all existing endpoints in the codeboard application.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"18706406","collectionId":"b82a6d55-b8f8-4a6e-a5f8-7dd02a661026","publishedId":"2sA3BkcYVT","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2024-05-03T07:10:18.000Z"},"item":[{"name":"ai","item":[{"name":"getRelevantHint","id":"00eec782-07e3-425f-8d53-86e8c2ec9ffa","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"hints\": [\r\n    {\r\n      \"id\": 0,\r\n      \"name\": \"Reisezeit in Stunden\",\r\n      \"note\": \"Um die Reisezeit in Stunden zu berechnen, braucht es eine Division.\"\r\n    },\r\n    {\r\n      \"id\": 1,\r\n      \"name\": \"Reisezeit in Minuten\",\r\n      \"note\": \"Um von Stunden zu Minuten zu kommen, musst du mit 60 multiplizieren.\"\r\n    }\r\n  ]\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/ai/hints/{{userId}}/{{courseId_ai}}/{{projectId_ai}}","description":"<p>This endpoint returns an index to indicate which hint should be displayed for the student (using gpt).</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth: req.isAuthenticated()</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/ai/hints/{{userId}}/{{courseId_ai}}/{{projectId_ai}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">\"1\"\n\n</code></pre>\n","urlObject":{"path":["api","ai","hints","{{userId}}","{{courseId_ai}}","{{projectId_ai}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"00eec782-07e3-425f-8d53-86e8c2ec9ffa"},{"name":"getCompilerExplanation","id":"e3599e4f-e527-4f49-aefc-d12c69d8079a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"compilationError\": true,\r\n  \"output\": \"./Root/Main.java:12: error: ';' expected\\r\\n        double d = keyScan.nextDouble()\\r\\n,                                       ^\\r\\n,1 error\\r\\n\",\r\n  \"outputArray\": [\r\n    \"./Root/Main.java:12: error: ';' expected\\r\\n        double d = keyScan.nextDouble()\\r\\n\",\r\n    \"                                       ^\\r\\n\",\r\n    \"1 error\\r\\n\"\r\n  ],\r\n  \"stream\": false\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/ai/compiler/{{userId}}/{{courseId_ai}}/{{projectId_ai}}","description":"<p>This endpoint is used generate an compilation error explanation using gpt.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth: req.isAuthenticated()</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/ai/compiler/{{userId}}/{{courseId_ai}}/{{projectId_ai}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"answer\": \"Hallo Samuel, es gibt einen Fehler in deinem Programm in der Klasse Main. Am Ende der Zeile 12 hast du das Semikolon (;) vergessen. Du solltest die Zeile mit `double d = keyScan.nextDouble();` schreiben.\",\n  \"error\": [\n    \"./Root/Main.java:12: error: ';' expected\\r\\n        double d = keyScan.nextDouble()\\r\\n\",\n    \"                                       ^\\r\\n\",\n    \"1 error\\r\\n\"\n  ]\n}\n\n</code></pre>\n","urlObject":{"path":["api","ai","compiler","{{userId}}","{{courseId_ai}}","{{projectId_ai}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e3599e4f-e527-4f49-aefc-d12c69d8079a"},{"name":"getUsageStats","id":"ead207a2-744b-4c2c-8766-4fba1244208b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/ai/stats","description":"<p>This endpoint is used to download a csv containing the usages stats (gpt).</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth: req.isAuthenticated()</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/ai/stats</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">id,promptTokens,completionTokens,totalTokens,tool,userId,courseId,projectId,createdAt\n9,240,77,317,compErrExp,3,5,21,Mon Feb 26 2024 08:25:05 GMT+0100 (Central European Standard Time)\n10,336,80,416,compErrExp,3,5,10,Tue Feb 27 2024 19:31:26 GMT+0100 (Central European Standard Time)\n11,224,66,290,compErrExpTest,3,5,10,Tue Feb 27 2024 19:32:58 GMT+0100 (Central European Standard Time)\n12,742,2,744,hints,3,5,10,Tue Feb 27 2024 19:33:42 GMT+0100 (Central European Standard Time)\n13,1728,1,1729,hints,3,5,20,Tue Feb 27 2024 19:35:31 GMT+0100 (Central European Standard Time)\n14,1678,2,1680,hints,3,5,20,Tue Feb 27 2024 19:36:00 GMT+0100 (Central European Standard Time)\n15,163,99,262,compErrExpTest,2,,2,Thu Mar 28 2024 15:48:12 GMT+0100 (Central European Standard Time)\n16,,,,compErrExp,,,,Thu Mar 28 2024 16:02:47 GMT+0100 (Central European Standard Time)\n17,151,78,229,compErrExp,2,,2,Thu Mar 28 2024 16:10:00 GMT+0100 (Central European Standard Time)\n18,152,89,241,compErrExp,2,,2,Fri Apr 12 2024 17:39:37 GMT+0200 (Central European Summer Time)\n19,151,78,229,compErrExp,2,,2,Tue Apr 16 2024 20:41:58 GMT+0200 (Central European Summer Time)\n20,152,88,240,compErrExp,2,,2,Tue Apr 16 2024 20:48:23 GMT+0200 (Central European Summer Time)\n21,699,2,701,hints,3,,19,Tue Apr 16 2024 20:53:07 GMT+0200 (Central European Summer Time)\n22,669,1,670,hints,3,,19,Tue Apr 16 2024 20:55:09 GMT+0200 (Central European Summer Time)\n23,327,54,381,compErrExp,3,,19,Tue Apr 16 2024 20:56:42 GMT+0200 (Central European Summer Time)\n\n</code></pre>\n","urlObject":{"path":["api","ai","stats"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"ead207a2-744b-4c2c-8766-4fba1244208b"}],"id":"46169fe9-b6b8-4f7c-a1c1-94ab36f93974","description":"<p>Endpoints regarding the integration of gpt to support students in solving coding tasks (hints and compilation error explanations)</p>\n","_postman_id":"46169fe9-b6b8-4f7c-a1c1-94ab36f93974"},{"name":"auth-session","item":[{"name":"login","id":"8b341f96-34a0-4b0d-8242-07f14b777ca1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"username\": \"testuser\",\r\n    \"password\": \"{{user_pw}}\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/session","description":"<p>This endpoint allows you to create a new session by sending a POST request to the specified URL. The request should include a JSON payload with the \"username\" and \"password\" fields.</p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/session</code></p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"username\": \"example\",\n    \"authenticated\": true\n}\n\n</code></pre>\n","urlObject":{"path":["api","session"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"8b341f96-34a0-4b0d-8242-07f14b777ca1"},{"name":"isAuthenticated","id":"0ed92789-7dae-4fbf-ba10-5d36607ea9cb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/session","description":"<p>GET-Request to check wheter a user is authenticated.</p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/session</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"id\": 2,\n    \"username\": \"admin\",\n    \"role\": \"user\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","session"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"0ed92789-7dae-4fbf-ba10-5d36607ea9cb"},{"name":"logout","id":"085fb2e1-9fa6-43e4-afb1-829da5490cf2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"{{url}}/api/session","description":"<p>Logout to end a session</p>\n<h3 id=\"request\">Request</h3>\n<p><code>DELETE /api/session</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><p>Status: 200</p>\n</li>\n<li><p>Content-Type: application/json</p>\n</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">OK\n\n</code></pre>\n","urlObject":{"path":["api","session"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"085fb2e1-9fa6-43e4-afb1-829da5490cf2"}],"id":"2e11f9c4-5cdd-4e43-85e2-9907e576ae37","description":"<p>Endpoints gegarding auth</p>\n","_postman_id":"2e11f9c4-5cdd-4e43-85e2-9907e576ae37"},{"name":"users","item":[{"name":"getUsers","event":[{"listen":"test","script":{"id":"ac914fec-c10e-4de3-b6f5-8e6695aafe75","exec":[""],"type":"text/javascript","packages":{}}}],"id":"f23e80c1-df8e-4e80-ad02-ecdc4bc7e2fb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/users","description":"<p>This endpoint retrieves user information of all users.</p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/users</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"username\": \"admin\",\n        \"emailPublic\": \"test@zhaw.ch\",\n        \"location\": \"Winterthur\",\n        \"createdAt\": \"2023-03-10T13:48:51.000Z\"\n    },\n    {\n        \"username\": \"Roby\",\n        \"emailPublic\": null,\n        \"location\": null,\n        \"createdAt\": \"2023-03-10T13:48:51.000Z\"\n    },\n    {\n        \"username\": \"testuser\",\n        \"emailPublic\": \"test@gmail.com\",\n        \"location\": \"Winterthur\",\n        \"createdAt\": \"2023-03-10T13:48:51.000Z\"\n    }\n]\n\n</code></pre>\n","urlObject":{"path":["api","users"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f23e80c1-df8e-4e80-ad02-ecdc4bc7e2fb"},{"name":"getUser","event":[{"listen":"test","script":{"id":"ac914fec-c10e-4de3-b6f5-8e6695aafe75","exec":[""],"type":"text/javascript","packages":{}}}],"id":"f96a452e-b2d4-4a9c-b679-66f9439a9361","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/users/{{username}}","description":"<p>This endpoint retrieves user information based on the provided username.</p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/users/{{username}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"id\": 2,\n    \"username\": \"admin\",\n    \"email\": \"test@zhaw.ch\",\n    \"emailPublic\": \"test@zhaw.ch\",\n    \"name\": \"Max\",\n    \"url\": \"\",\n    \"location\": \"Winterthur\",\n    \"institution\": \"ZHAW\",\n}\n\n</code></pre>\n","urlObject":{"path":["api","users","{{username}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f96a452e-b2d4-4a9c-b679-66f9439a9361"},{"name":"uploadImages","id":"13460bab-0012-466d-b2d9-fc4364ced62e","protocolProfileBehavior":{"disableBodyPruning":true,"disabledSystemHeaders":{}},"request":{"method":"POST","header":[],"body":{"mode":"file","file":{"src":"postman-cloud:///1eef8b2c-6ec0-4dd0-b0aa-6bd6ae77644f"}},"url":"{{url}}/api/users/{{username}}/projectImages","description":"<p>This endpoint makes an HTTP POST request to add an image which can be used for projects of the requested user (in the task description)</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>isAuth: req.isAuthenticated()</code></p>\n<p><code>isSelf: req.user.username === req.params.username</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/users/{{username}}/projectImages</code></p>\n","urlObject":{"path":["api","users","{{username}}","projectImages"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"13460bab-0012-466d-b2d9-fc4364ced62e"},{"name":"getUploadImages","id":"22b213a9-039d-4004-8fdf-50c1b00e644a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/users/{{username}}/projectImages","description":"<p>This endpoint makes an HTTP GET request to get all images available for projects of the requesting user</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>isAuth: req.isAuthenticated()</code></p>\n<p><code>isSelf: req.user.username === req.params.username</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET/api/users/{{username}}/projectImages</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"username\": \"admin\",\n    \"imgSet\": [\n        {\n            \"id\": 1,\n            \"imgName\": \"abgabe1.png\",\n            \"path\": \"images\\\\projects\\\\abgabe1.png\",\n            \"createdAt\": \"2024-01-26T08:00:00.000Z\"\n        },\n        {\n            \"id\": 242,\n            \"imgName\": \"coding.jpg\",\n            \"path\": \"images\\\\projects\\\\coding.jpg\",\n            \"createdAt\": \"2024-01-25T14:53:16.000Z\"\n        }\n    ]\n}\n\n</code></pre>\n","urlObject":{"path":["api","users","{{username}}","projectImages"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"22b213a9-039d-4004-8fdf-50c1b00e644a"},{"name":"deleteImage","id":"6ec0600b-30e0-4a4d-b8f3-aa9f83f1a988","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"{{url}}/api/users/{{username}}/projectImages/{{imgId}}","description":"<p>This endpoint is used to delete a specific project image for a user. The <code>username</code> parameter in the URL path specifies the user, and the <code>imgId</code> parameter identifies the specific image to be deleted.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>isAuth: req.isAuthenticated()</code></p>\n<p><code>isSelf: req.user.username === req.params.username</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>DELETE /api/users/{{username}}/projectImages/{{imgId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<p>Upon successful deletion, the server returns a status code of 200 with a JSON response containing a <code>message</code> key.</p>\n<p>Example:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"message\": \"Image successfully deleted.\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","users","{{username}}","projectImages","{{imgId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6ec0600b-30e0-4a4d-b8f3-aa9f83f1a988"},{"name":"getUserSettings","event":[{"listen":"test","script":{"id":"ac914fec-c10e-4de3-b6f5-8e6695aafe75","exec":[""],"type":"text/javascript","packages":{}}}],"id":"b6f684b5-aff3-4065-b777-5e997f5d8197","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/users/{{username}}/settings","description":"<p>This endpoint retrieves the settings for a specific user identified by their username.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-javascript\">isAuth: req.isAuthenticated()\nisSelf: req.user.username === req.params.username\n\n</code></pre>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/users/{{username}}/settings</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"id\": 2,\n    \"username\": \"admin\",\n    \"email\": \"test@zhaw.ch\",\n    \"emailPublic\": \"test@zhaw.ch\",\n    \"name\": \"Samuel\",\n    \"url\": \"\",\n    \"location\": \"Winterthur\",\n    \"institution\": \"ZHAW\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","users","{{username}}","settings"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b6f684b5-aff3-4065-b777-5e997f5d8197"},{"name":"putUserSettings","event":[{"listen":"test","script":{"id":"ac914fec-c10e-4de3-b6f5-8e6695aafe75","exec":[""],"type":"text/javascript","packages":{}}}],"id":"d8c1f083-ef7d-4601-90f5-c801569e1605","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n    \"emailPublic\": \"test@zhaw.ch\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/users/{{username}}/settings","description":"<p>This endpoint allows the user to update the settings for a specific user. The HTTP PUT request should be made to /api/users/{{username}}/settings, where {{username}} is the username of the user whose settings need to be updated.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-javascript\">isAuth: req.isAuthenticated()\nisSelf: req.user.username === req.params.username\n\n</code></pre>\n<h3 id=\"request\">Request</h3>\n<p><code>PUT /api/users/{{username}}/settings</code></p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"msg\": \"User {{username}} updated successfully\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","users","{{username}}","settings"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d8c1f083-ef7d-4601-90f5-c801569e1605"},{"name":"putPassword","event":[{"listen":"test","script":{"id":"ac914fec-c10e-4de3-b6f5-8e6695aafe75","exec":[""],"type":"text/javascript","packages":{}}}],"id":"e836f503-5beb-488e-b496-6f1662c34d03","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n    \"currentPassword\": \"kCiqTwE4O19o\",\r\n    \"newPassword\": \"kCiqTwE4O19o\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/users/{{username}}/settings/password","description":"<p>This endpoint allows the user to update their password.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-javascript\">isAuth: req.isAuthenticated()\nisSelf: req.user.username === req.params.username\n\n</code></pre>\n<h3 id=\"request\">Request</h3>\n<p><code>PUT /api/users/{{username}}/settings/password</code></p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"msg\": \"Password updated successfully\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","users","{{username}}","settings","password"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e836f503-5beb-488e-b496-6f1662c34d03"},{"name":"getUserProjects","id":"d9b699b5-e572-47a0-a614-cfab8e56a5fb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/users/{{username}}/projects","description":"<p>This endpoint retrieves the projects associated with a specific user.</p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/users/{{username}}/projects</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"username\": \"admin\",\n    \"emailPublic\": \"test@zhaw.ch\",\n    \"name\": \"Samuel\",\n    \"url\": \"\",\n    \"location\": \"Winterthur\",\n    \"institution\": \"ZHAW\",\n    \"imageUrl\": null,\n    \"ownerSet\": [\n        {\n            \"id\": 2,\n            \"projectname\": \"Test-Insel\",\n            \"language\": \"Java\",\n            \"description\": \"This is another project for testing.\",\n            \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n            \"isPrivate\": false,\n            \"ownerSet\": [\n                {\n                    \"username\": \"admin\",\n                    \"ProjectsOwners\": {\n                        \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n                        \"updatedAt\": \"2023-03-10T14:35:56.000Z\",\n                        \"ProjectId\": 2,\n                        \"UserId\": 2\n                    }\n                }\n            ],\n            \"userSet\": [],\n            \"courseSet\": [\n                {\n                    \"coursename\": \"This is a new course name\",\n                    \"id\": 4,\n                    \"CourseProjects\": {\n                        \"createdAt\": \"2024-04-15T05:48:15.000Z\",\n                        \"updatedAt\": \"2024-04-15T05:48:15.000Z\",\n                        \"CourseId\": 4,\n                        \"ProjectId\": 2\n                    }\n                },\n                {\n                    \"coursename\": \"codeboard Tests\",\n                    \"id\": 5,\n                    \"CourseProjects\": {\n                        \"createdAt\": \"2024-04-12T10:25:35.000Z\",\n                        \"updatedAt\": \"2024-04-12T10:25:35.000Z\",\n                        \"CourseId\": 5,\n                        \"ProjectId\": 2\n                    }\n                }\n            ],\n            \"ProjectsOwners\": {\n                \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n                \"updatedAt\": \"2023-03-10T14:35:56.000Z\",\n                \"ProjectId\": 2,\n                \"UserId\": 2\n            }\n        }\n}\n\n</code></pre>\n","urlObject":{"path":["api","users","{{username}}","projects"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d9b699b5-e572-47a0-a614-cfab8e56a5fb"},{"name":"getUserProject","id":"ac8b8424-54fa-46f2-9a30-ab5065b01d3d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/users/{{username}}/projects/{{projectId}}","description":"<p>This endpoints retrieves the version of a project for displaying it in the IDE as it has been stored by the user</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p>There are 3 types of middlewares. If one of the middlewares (...ElseNextRoute) failes the request gets routed to the next endpoint</p>\n<p>user must have access rights to retrieve her version of the project</p>\n<p><code>mw.isAuth: req.isAuthenticated()</code></p>\n<p><code>mw.isValidProjectId: checks if the projectId in request params belongs to an project</code></p>\n<p><code>mw.isUserElseNextRoute: check if the requested user is a user of a given project (projectId)</code></p>\n<p>(assume: isAuth, isValidProjectId) project may be private but current user is an LTI user</p>\n<p><code>mw.isLtiUserElseNextRoute: checks if the request has LTI information and the project allows for the LTI session</code></p>\n<p>(assume: isAuth, validProjectId) project is public so every user can retrieve her version of the project</p>\n<p><code>mw.isPublicProject: checks if the given projet (projectId) is a public project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/users/{{username}}/projects/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["api","users","{{username}}","projects","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"ac8b8424-54fa-46f2-9a30-ab5065b01d3d"}],"id":"05901acb-1ba1-481e-83ff-0bc883406752","_postman_id":"05901acb-1ba1-481e-83ff-0bc883406752","description":""},{"name":"courses","item":[{"name":"createCourseForUser","id":"b84e48a6-c094-4aea-a9b1-d49c85d9f259","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"coursename\": \"Course_Name\",\r\n    \"description\": \"Course_Description\",\r\n    \"contextId\": 1212,\r\n    \"courseOptions\": {\r\n        \"userDisabledActions\": \"error-chatbox|ai-compiler|tips\"\r\n    }\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/courses","description":"<p>This endpoint creates a new course for the requesting user.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>isAuth: req.isAuthenticated()</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/courses</code></p>\n<h3 id=\"request-1\">Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"message\": \"Course created successfully\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","courses"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b84e48a6-c094-4aea-a9b1-d49c85d9f259"},{"name":"getCourse","event":[{"listen":"test","script":{"id":"c3fdf73e-3cb3-4a4d-8ba2-785a7cabd06b","exec":[""],"type":"text/javascript","packages":{}}}],"id":"35f9922d-2d23-4468-89ff-56adcd33408d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/courses/{{courseId}}","description":"<p>This endpoint retrieves a course by id.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>isValidCourseId: checks if the requesting course exists (courseId)</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET {{url}}/api/courses/{{courseId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"courseId\": 4,\n    \"coursename\": \"This is a new course name\",\n    \"description\": \"This is a new course description\",\n    \"courseOptions\": [\n        {\n            \"id\": 1,\n            \"option\": \"userDisabledActions\",\n            \"value\": \"questions|ai-hints\",\n            \"createdAt\": \"2023-09-08T07:35:31.000Z\",\n            \"updatedAt\": \"2024-04-15T05:48:15.000Z\",\n            \"courseId\": 4\n        }\n    ],\n    \"userRole\": \"owner\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","courses","{{courseId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"35f9922d-2d23-4468-89ff-56adcd33408d"},{"name":"getUserCourses","id":"a9963d04-1672-41e6-88c0-87ee71b91265","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/users/{{username}}/courses/owner","description":"<p>This endpoint retrieves the list of courses owned by a specific user.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>isAuth: req.isAuthenticated()</code></p>\n<p><code>isSelf: req.user.username === req.params.username</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/users/{{username}}/courses/owner</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"id\": 2,\n    \"courseOwnerSet\": [\n        {\n            \"id\": 4,\n            \"coursename\": \"This is a new course name\",\n            \"description\": \"This is a new course description\",\n            \"contextId\": null,\n            \"createdAt\": \"2023-08-23T07:50:30.000Z\",\n            \"updatedAt\": \"2024-04-10T15:27:41.000Z\",\n            \"errAndExcHelpSetId\": null,\n            \"CourseOwners\": {\n                \"createdAt\": \"2023-08-23T07:50:30.000Z\",\n                \"updatedAt\": \"2023-08-23T07:50:30.000Z\",\n                \"CourseId\": 4,\n                \"UserId\": 2\n            }\n        },\n        {\n            \"id\": 5,\n            \"coursename\": \"codeboard Tests\",\n            \"description\": \"\",\n            \"contextId\": \"\",\n            \"createdAt\": \"2023-09-08T07:39:52.000Z\",\n            \"updatedAt\": \"2024-02-16T11:05:39.000Z\",\n            \"errAndExcHelpSetId\": null,\n            \"CourseOwners\": {\n                \"createdAt\": \"2023-09-08T07:39:53.000Z\",\n                \"updatedAt\": \"2023-09-08T07:39:53.000Z\",\n                \"CourseId\": 5,\n                \"UserId\": 2\n            }\n        }\n    ],\n    \"courseUserSet\": []\n}\n\n</code></pre>\n","urlObject":{"path":["api","users","{{username}}","courses","owner"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"a9963d04-1672-41e6-88c0-87ee71b91265"},{"name":"getCourseSettings","id":"5a91ee75-2543-4912-a870-ace82ed19728","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/courses/{{courseId}}/settings","description":"<p>This endpoint retrieves the settings of a course.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>isValidCourseId: db.Course.findByPk(req.params.courseId)</code></p>\n<p><code>isAuth: req.isAuthenticated()</code></p>\n<p><code>isCourseOwner: checks if requested user is owner of the course</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET {{url}}/api/courses/{{courseId}}/settings</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"id\": 4,\n    \"coursename\": \"This is a new course name\",\n    \"description\": \"This is a new course description\",\n    \"contextId\": null,\n    \"courseOptions\": [\n        {\n            \"option\": \"userDisabledActions\",\n            \"value\": \"questions|ai-hints\"\n        }\n    ],\n    \"projectSet\": [\n        {\n            \"id\": 2,\n            \"projectname\": \"Test-Insel\",\n            \"CourseProjects\": {\n                \"createdAt\": \"2024-04-15T05:48:15.000Z\",\n                \"updatedAt\": \"2024-04-15T05:48:15.000Z\",\n                \"CourseId\": 4,\n                \"ProjectId\": 2\n            }\n        }\n    ]\n}\n\n</code></pre>\n","urlObject":{"path":["api","courses","{{courseId}}","settings"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"5a91ee75-2543-4912-a870-ace82ed19728"},{"name":"putCourseSettings","id":"4a209b45-a985-4c05-85b7-b081605b6cf8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n    \"contextId\": null,\r\n    \"courseOptions\": {\r\n        \"userDisabledActions\": \"questions|ai-hints\"\r\n    },\r\n    \"coursename\": \"This is a new course name\",\r\n    \"description\": \"This is a new course description\",\r\n    \"projectIds\": [\"2\"]\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/courses/{{courseId}}/settings","description":"<p>This endpoint allows the user to update the settings for a specific course. The HTTP PUT request should be made to /api/courses/{{courseId}}/settings, where {{courseId}} is the unique identifier of the course being updated.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>isValidCourseId: db.Course.findByPk(req.params.courseId)</code></p>\n<p><code>isAuth: req.isAuthenticated()</code></p>\n<p><code>isCourseOwner: checks if requested user is owner of the course</code></p>\n<h3 id=\"request\">Request</h3>\n<p>PUT /api/courses/{{courseId}}/settings</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{   \n   \"msg\": \"Course settings updated\", \n   \"projectIds\": [        \n           2    \n    ]\n}\n\n</code></pre>\n","urlObject":{"path":["api","courses","{{courseId}}","settings"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"4a209b45-a985-4c05-85b7-b081605b6cf8"},{"name":"deleteCourse","id":"c5b677ab-f32d-4ec5-b37e-3406d55c42d1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/courses/{{courseId_1}}","description":"<p>This endpoint deletes the requested course.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>isValidCourseId: db.Course.findByPk(req.params.courseId)</code></p>\n<p><code>isAuth: req.isAuthenticated()</code></p>\n<p><code>isCourseOwner: checks if requested user is owner of the course</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>DELETE /api/coureses/courseId</code></p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"msg\": \"Project deletion successful.\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","courses","{{courseId_1}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c5b677ab-f32d-4ec5-b37e-3406d55c42d1"}],"id":"37a5aac5-3190-4560-b2c8-4e20eeb14076","_postman_id":"37a5aac5-3190-4560-b2c8-4e20eeb14076","description":""},{"name":"projects","item":[{"name":"getAllProjects","id":"274eece6-7f5b-47c4-9b20-81baaf261a72","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/projects","description":"<p>This endpoint makes an HTTP GET request to retrieve a list of projects from the server.</p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/projects</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"count\": 11,\n    \"projects\": [\n        {\n            \"id\": 2,\n            \"projectname\": \"Test-Insel\",\n            \"language\": \"Java\",\n            \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n            \"description\": \"This is another project for testing.\"\n        },\n        {\n            \"id\": 5,\n            \"projectname\": \"Routenplaner\",\n            \"language\": \"Java\",\n            \"createdAt\": \"2023-05-03T14:28:00.000Z\",\n            \"description\": \"\"\n        },\n        {\n            \"id\": 6,\n            \"projectname\": \"Aufgabe - Fehler finden\",\n            \"language\": \"Java\",\n            \"createdAt\": \"2023-05-08T08:40:07.000Z\",\n            \"description\": \"Diese Aufgabe wurde im Rahmen der Evaluation verwendet.\"\n        }\n    ],\n    \"hasNext\": true,\n    \"next\": \"/api/projects?page=2\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"274eece6-7f5b-47c4-9b20-81baaf261a72"},{"name":"getAllFeaturedProjects","id":"9c4901f1-8574-4487-8cbe-cab7ec8fd153","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/projects/featured","description":"<p>This endpoint updates a project (for project owners) or save a version (for project users).</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isOwnerElseNextRoute: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>PUT /api/projects/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li><p>Status: 200</p>\n</li>\n<li><p>Content-Type: application/json</p>\n</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","featured"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"9c4901f1-8574-4487-8cbe-cab7ec8fd153"},{"name":"createProjectForUser","id":"e3a2f29b-cfc0-4b44-ad8a-f73da7f9a190","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"projectname\": \"Test-Project\",\r\n    \"description\": \"test\",\r\n    \"isPrivate\": true,\r\n    \"language\": \"Java\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects","description":"<p>This endpoint creates a new project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth: req.isAuthenticated()</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/projects</code></p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"message\": \"Success\",\n    \"id\": 12345\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e3a2f29b-cfc0-4b44-ad8a-f73da7f9a190"},{"name":"projectImage","id":"3cee9e98-ceed-4fbc-ac76-9d5a02722b7f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"{{url}}/api/projects/{{projectId}}/projectImage","description":"<p>This endpoint uploads an image to the image store which then can be used in the task description of the user project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isOwnerElseNextRoute: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/projects/{{projectId}}/projectImage</code>  </p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","projectImage"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"3cee9e98-ceed-4fbc-ac76-9d5a02722b7f"},{"name":"isAuthorizedOwner","id":"8b04d081-795d-4c4c-a855-df24bac480b7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/projects/{{projectId}}/authorizedownercheck","description":"<p>This endpoint is used to check if the current user is an owner of the project</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isOwner: checks if the requested user is the owner of the project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET api/projects/{{projectId}}/authorizedownercheck</code></p>\n<h3 id=\"response\">Response</h3>\n<p>If the requested user is an owner of a project the server responds with status code 204 (No Content)</p>\n","urlObject":{"path":["api","projects","{{projectId}}","authorizedownercheck"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"8b04d081-795d-4c4c-a855-df24bac480b7"},{"name":"getProjectSettings","id":"2721f5d8-1b32-4c7d-8d6b-267f448d3fb3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/projects/{{projectId}}/settings","description":"<p>This endpoint retrieves the settings of a specific project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists</code></p>\n<p><code>mw.isAuth: req.isAuthenticated()</code></p>\n<p><code>mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/projects/{{projectId}}/settings</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"id\": 2,\n    \"projectname\": \"Test - Insel\",\n    \"description\": \"This is another project for testing.\",\n    \"language\": \"Java\",\n    \"code\": \"42\",\n    \"isPrivate\": false,\n    \"isSubmissionAllowed\": true,\n    \"isLtiAllowed\": false,\n    \"ltiKey\": \"\",\n    \"ltiSecret\": \"\",\n    \"ownerSet\": [\n        {\n            \"username\": \"admin\",\n            \"ProjectsOwners\": {\n                \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n                \"updatedAt\": \"2023-03-10T14:35:56.000Z\",\n                \"ProjectId\": 2,\n                \"UserId\": 2\n            }\n        }\n    ],\n    \"userSet\": [],\n    \"courseSet\": [\n        {\n            \"id\": 4,\n            \"CourseProjects\": {\n                \"createdAt\": \"2024-01-24T09:52:54.000Z\",\n                \"updatedAt\": \"2024-01-24T09:52:54.000Z\",\n                \"CourseId\": 4,\n                \"ProjectId\": 2\n            }\n        }\n    ]\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","settings"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"2721f5d8-1b32-4c7d-8d6b-267f448d3fb3"},{"name":"putProjectSettings","id":"e52a3d05-ce67-4b43-8b38-97651bce5345","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n  \"projectname\": \"Test-Insel\",\r\n  \"description\": \"This is another project for testing.\",\r\n  \"language\": \"Java\",\r\n  \"isPrivate\": false,\r\n  \"ownerSet\": [\r\n    \"admin\"\r\n  ],\r\n  \"userSet\": [],\r\n  \"isSubmissionAllowed\": true,\r\n  \"isLtiAllowed\": false,\r\n  \"ltiKey\": \"\",\r\n  \"ltiSecret\": \"\",\r\n  \"courseSet\": [\r\n    5\r\n  ]\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/settings","description":"<p>This endpoint allows the requesting user to update the settings of the project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists</code></p>\n<p><code>mw.isAuth: req.isAuthenticated()</code></p>\n<p><code>mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>PUT /api/projects/{{projectId}}/settings</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"id\": 2,\n    \"projectname\": \"Test - Insel\",\n    \"description\": \"This is another project for testing.\",\n    \"language\": \"Java\",\n    \"code\": \"42\",\n    \"isPrivate\": false,\n    \"isSubmissionAllowed\": true,\n    \"isLtiAllowed\": false,\n    \"ltiKey\": \"\",\n    \"ltiSecret\": \"\",\n    \"ownerSet\": [\n        {\n            \"username\": \"admin\",\n            \"ProjectsOwners\": {\n                \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n                \"updatedAt\": \"2023-03-10T14:35:56.000Z\",\n                \"ProjectId\": 2,\n                \"UserId\": 2\n            }\n        }\n    ],\n    \"userSet\": [],\n    \"courseSet\": [\n        {\n            \"id\": 4,\n            \"CourseProjects\": {\n                \"createdAt\": \"2024-01-24T09:52:54.000Z\",\n                \"updatedAt\": \"2024-01-24T09:52:54.000Z\",\n                \"CourseId\": 4,\n                \"ProjectId\": 2\n            }\n        }\n    ]\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","settings"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e52a3d05-ce67-4b43-8b38-97651bce5345"},{"name":"getFullProject","id":"181f1814-fb43-4670-968e-b415e82d7d5d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/projects/{{projectId}}","description":"<p>This endpoint retrieves the informations of a project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p>There are 4 types of middlewares. If one of the middlewares (...ElseNextRoute) failes the request gets routed to the next endpoint</p>\n<ul>\n<li>If the project id is valid, the user is authenticated and the owner, load the full project<br />  <code>mw.isValidProjectId: checks if the requested project exists mw.isAuthElseNextRoute: req.isAuthenticated() mw.isOwnerElseNextRoute: checks if the requesting user is the owner of the requested project</code></li>\n<li>(if the project id is valid) the user is authenticated and a user of the project, load the limited view of the project<br />  <code>mw.isAuthElseNextRoute: req.isAuthenticated() mw.isUserElseNextRoute: check if a given user is a user of a given project</code></li>\n<li>(if the project id is valid) and the request has LTI information<br />  <code>mw.isLtiUserElseNextRoute: checks if the request has LTI information and the project allows for the LTI session</code></li>\n<li>(if the project id is valid) and the project is public, load the limited view of the project<br />  <code>mw.isPublicProject: checks if the project is public</code></li>\n</ul>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/projects/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Example resposne for a requesting user which is also the owner of the project</li>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"id\": 2,\n    \"projectname\": \"Test-Insel\",\n    \"language\": \"Java\",\n    \"description\": \"This is another project for testing.\",\n    \"lastUId\": 31,\n    \"isSubmissionAllowed\": true,\n    \"courseSet\": [\n        {\n            \"coursename\": \"codeboard Tests\",\n            \"contextId\": \"\",\n            \"description\": \"\",\n            \"id\": 5,\n            \"courseOptions\": [\n                {\n                    \"option\": \"userDisabledActions\",\n                    \"value\": \"|tree-view\"\n                }\n            ]\n        }\n    ],\n    \"fileSet\": [\n        {\n            \"id\": 6,\n            \"filename\": \"Root\",\n            \"path\": \"\",\n            \"uniqueId\": 0,\n            \"parentUId\": -1,\n            \"isFolder\": true,\n            \"content\": \"\",\n            \"isHidden\": false,\n            \"isStatic\": false,\n            \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n            \"updatedAt\": \"2023-03-10T14:35:56.000Z\",\n            \"ProjectId\": 2\n        },\n        {\n            \"id\": 7,\n            \"filename\": \"codeboard.json\",\n            \"path\": \"Root\",\n            \"uniqueId\": 1,\n            \"parentUId\": 0,\n            \"isFolder\": false,\n            \"content\": \"{\\r\\n    \\\"_comment\\\": \\\"Specify the main file used for compiling your application. Specify the main class used for running your application.\\\",\\r\\n    \\\"MainFileForCompilation\\\": \\\"Main.java\\\",\\r\\n    \\\"MainClassForRunning\\\": \\\"Main\\\",\\t\\r\\n\\t\\\"userDisabledActions\\\": [],\\r\\n    \\\"userEnabledActions\\\": [\\\"tree-view\\\"],\\r\\n    \\\"Testing\\\": {\\r\\n        \\\"onSuccess\\\": \\\"Sehr gut, das hat geklappt. Du bist nun bereit für den Kurs. Du kannst deine Lösung mit dem blauen Submit-Button abgeben. Mach doch anschliessend gleich mit der nächsten Lektion weiter!\\\",\\r\\n        \\\"useCompileTests\\\": true,\\r\\n        \\\"ioTests\\\": [\\r\\n            {\\r\\n                \\\"name\\\": \\\"Ausgabe Testen\\\",\\r\\n                \\\"input\\\": [\\r\\n                ],\\r\\n                \\\"expectedOutput\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                \\\"tests\\\": [\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                        \\\"pass\\\": true,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe des Programms ist richtig.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\"Java ist eine Insel\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"He, du willst mich wohl reinlegen! Du hast ja gar nichts gemacht. Lies die Aufgabenstellung durch und versuche es dann nochmals.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist eine Kaffee\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Es heisst \\\\\\\"ein Kaffee\\\\\\\" und nicht \\\\\\\"eine Kaffee\\\\\\\". Passe deine Lösung noch entsprechend an.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\".*\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe ist noch nicht richtig. Dein Programm wird vom System nur akzeptiert, wenn es die Ausgabe \\\\\\\"Java ist ein Kaffee\\\\\\\" macht. Versuche es nochmal!\\\",\\r\\n                        \\\"type\\\": \\\"regex\\\"\\r\\n                    }\\r\\n                ]\\r\\n            }\\r\\n        ]\\r\\n    },\\r\\n    \\\"Help\\\": {\\r\\n        \\\"tips\\\": [\\r\\n            \\t{\\r\\n                \\\"name\\\": \\\"Tipp 1\\\",\\r\\n                \\\"note\\\": \\\"Der Text in der Print-Anweisung muss in doppelten Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": true,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\([\\\\\\\\w\\\\\\\\s]+\\\\\\\\)\\\\\\\\s*;\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Tipp 2\\\",\\r\\n                \\\"note\\\": \\\"Du musst lediglich die dritte Zeile anpassen. Ersetze dort einfach den Text &lt;i&gt;Java ist eine Insel&lt;/i&gt; mit &lt;i&gt;Java ist ein Kaffee&lt;/i&gt;. Achte darauf, dass am Anfang und am Ende des Textes doppelte Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\(\\\\\\\"Java ist ein Kaffee\\\\\\\"\\\\\\\\);\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Test-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Verwende die Methode &lt;tt&gt;length()&lt;/tt&gt;. Achte auf die korrekte Schreibweise.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"\\\\\\\\w*\\\\\\\\.length\\\\\\\\(\\\\\\\\)\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Test\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp1\\\",\\r\\n                \\\"note\\\": \\\"Test1\\\"\\r\\n            }\\r\\n\\t\\t\\r\\n        ]\\r\\n    }\\r\\n}\",\n            \"isHidden\": true,\n            \"isStatic\": false,\n            \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n            \"updatedAt\": \"2024-01-24T11:05:43.000Z\",\n            \"ProjectId\": 2\n        },\n        {\n            \"id\": 8,\n            \"filename\": \"Main.java\",\n            \"path\": \"Root\",\n            \"uniqueId\": 2,\n            \"parentUId\": 0,\n            \"isFolder\": false,\n            \"content\": \"public class Main {\\r\\n    public static void main(String[] args) {\\r\\n        System.out.println(\\\"Java ist ein Kaffee\\\")\\r\\n    }\\r\\n}\",\n            \"isHidden\": false,\n            \"isStatic\": false,\n            \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n            \"updatedAt\": \"2024-03-28T14:42:53.000Z\",\n            \"ProjectId\": 2\n        },\n        {\n            \"id\": 9,\n            \"filename\": \"projectDescription.html\",\n            \"path\": \"Root\",\n            \"uniqueId\": 3,\n            \"parentUId\": 0,\n            \"isFolder\": false,\n            \"content\": \"&lt;div class=\\\"projectDescription\\\"&gt;\\r\\n&lt;img src=&amp;#x27;images\\\\projects\\\\2082111.jpg&amp;#x27; alt=&amp;#x27;2082111.jpg&amp;#x27; width=&amp;#x27;90%&amp;#x27;&gt;\\r\\n&lt;h2&gt;Aufgabenstellung&lt;/h2&gt;\\r\\n    &lt;p&gt;Ersetze im Programm &lt;i&gt;Java ist eine Insel&lt;/i&gt; durch &lt;i&gt;Java ist ein Kaffee&lt;/i&gt;. Führe anschliessend \\r\\n\\tdas Programm mit &lt;i&gt;Run&lt;/i&gt; aus. Wenn du zufrieden bist mit dem Programm, führe dem Test aus. &lt;/p&gt;\\r\\n\\t&lt;p&gt;&lt;b&gt;Achtung:&lt;/b&gt; Dein Programm wird vom System nur akzeptiert, wenn es genau die richtige Ausgabe macht. &lt;/p&gt;\\r\\n\\t&lt;p&gt;Wenn der Test \\r\\n\\tfunktioniert hat, kannst du anschliessend die Aufgabe mit dem Submit-Button abgeben. Nach der Abgabe kannst \\r\\n\\tdu auf der Hauptseite des Kurses die nächste Lektion aufrufen.&lt;/p&gt;\\r\\n&lt;/div&gt;\",\n            \"isHidden\": true,\n            \"isStatic\": false,\n            \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n            \"updatedAt\": \"2024-01-25T13:11:03.000Z\",\n            \"ProjectId\": 2\n        },\n        {\n            \"id\": 10,\n            \"filename\": \"sampleSolution.html\",\n            \"path\": \"Root\",\n            \"uniqueId\": 21,\n            \"parentUId\": 0,\n            \"isFolder\": false,\n            \"content\": \"&lt;div class=\\\"sampleSolution\\\"&gt;\\r\\n&lt;pre&gt;&lt;code class=\\\"language-java\\\" prism&gt;public class Main {\\r\\n  public static void main(String[] args) {\\r\\n    System.out.println(\\\"Java ist ein Kaffee\\\");\\r\\n  }\\r\\n}&lt;/code&gt;&lt;/pre&gt;\\r\\n&lt;/div&gt;\",\n            \"isHidden\": true,\n            \"isStatic\": true,\n            \"createdAt\": \"2023-03-10T14:37:04.000Z\",\n            \"updatedAt\": \"2024-01-19T10:43:38.000Z\",\n            \"ProjectId\": 2\n        }\n    ],\n    \"configFile\": {\n        \"id\": 7,\n        \"filename\": \"codeboard.json\",\n        \"path\": \"Root\",\n        \"uniqueId\": 1,\n        \"parentUId\": 0,\n        \"isFolder\": false,\n        \"content\": \"{\\r\\n    \\\"_comment\\\": \\\"Specify the main file used for compiling your application. Specify the main class used for running your application.\\\",\\r\\n    \\\"MainFileForCompilation\\\": \\\"Main.java\\\",\\r\\n    \\\"MainClassForRunning\\\": \\\"Main\\\",\\t\\r\\n\\t\\\"userDisabledActions\\\": [],\\r\\n    \\\"userEnabledActions\\\": [\\\"tree-view\\\"],\\r\\n    \\\"Testing\\\": {\\r\\n        \\\"onSuccess\\\": \\\"Sehr gut, das hat geklappt. Du bist nun bereit für den Kurs. Du kannst deine Lösung mit dem blauen Submit-Button abgeben. Mach doch anschliessend gleich mit der nächsten Lektion weiter!\\\",\\r\\n        \\\"useCompileTests\\\": true,\\r\\n        \\\"ioTests\\\": [\\r\\n            {\\r\\n                \\\"name\\\": \\\"Ausgabe Testen\\\",\\r\\n                \\\"input\\\": [\\r\\n                ],\\r\\n                \\\"expectedOutput\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                \\\"tests\\\": [\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                        \\\"pass\\\": true,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe des Programms ist richtig.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\"Java ist eine Insel\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"He, du willst mich wohl reinlegen! Du hast ja gar nichts gemacht. Lies die Aufgabenstellung durch und versuche es dann nochmals.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist eine Kaffee\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Es heisst \\\\\\\"ein Kaffee\\\\\\\" und nicht \\\\\\\"eine Kaffee\\\\\\\". Passe deine Lösung noch entsprechend an.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\".*\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe ist noch nicht richtig. Dein Programm wird vom System nur akzeptiert, wenn es die Ausgabe \\\\\\\"Java ist ein Kaffee\\\\\\\" macht. Versuche es nochmal!\\\",\\r\\n                        \\\"type\\\": \\\"regex\\\"\\r\\n                    }\\r\\n                ]\\r\\n            }\\r\\n        ]\\r\\n    },\\r\\n    \\\"Help\\\": {\\r\\n        \\\"tips\\\": [\\r\\n            \\t{\\r\\n                \\\"name\\\": \\\"Tipp 1\\\",\\r\\n                \\\"note\\\": \\\"Der Text in der Print-Anweisung muss in doppelten Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": true,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\([\\\\\\\\w\\\\\\\\s]+\\\\\\\\)\\\\\\\\s*;\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Tipp 2\\\",\\r\\n                \\\"note\\\": \\\"Du musst lediglich die dritte Zeile anpassen. Ersetze dort einfach den Text &lt;i&gt;Java ist eine Insel&lt;/i&gt; mit &lt;i&gt;Java ist ein Kaffee&lt;/i&gt;. Achte darauf, dass am Anfang und am Ende des Textes doppelte Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\(\\\\\\\"Java ist ein Kaffee\\\\\\\"\\\\\\\\);\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Test-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Verwende die Methode &lt;tt&gt;length()&lt;/tt&gt;. Achte auf die korrekte Schreibweise.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"\\\\\\\\w*\\\\\\\\.length\\\\\\\\(\\\\\\\\)\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Test\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp1\\\",\\r\\n                \\\"note\\\": \\\"Test1\\\"\\r\\n            }\\r\\n\\t\\t\\r\\n        ]\\r\\n    }\\r\\n}\",\n        \"isHidden\": true,\n        \"isStatic\": false,\n        \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n        \"updatedAt\": \"2024-01-24T11:05:43.000Z\",\n        \"ProjectId\": 2\n    },\n    \"projectDescription\": {\n        \"id\": 9,\n        \"filename\": \"projectDescription.html\",\n        \"path\": \"Root\",\n        \"uniqueId\": 3,\n        \"parentUId\": 0,\n        \"isFolder\": false,\n        \"content\": \"&lt;div class=\\\"projectDescription\\\"&gt;\\r\\n&lt;img src=&amp;#x27;images\\\\projects\\\\2082111.jpg&amp;#x27; alt=&amp;#x27;2082111.jpg&amp;#x27; width=&amp;#x27;90%&amp;#x27;&gt;\\r\\n&lt;h2&gt;Aufgabenstellung&lt;/h2&gt;\\r\\n    &lt;p&gt;Ersetze im Programm &lt;i&gt;Java ist eine Insel&lt;/i&gt; durch &lt;i&gt;Java ist ein Kaffee&lt;/i&gt;. Führe anschliessend \\r\\n\\tdas Programm mit &lt;i&gt;Run&lt;/i&gt; aus. Wenn du zufrieden bist mit dem Programm, führe dem Test aus. &lt;/p&gt;\\r\\n\\t&lt;p&gt;&lt;b&gt;Achtung:&lt;/b&gt; Dein Programm wird vom System nur akzeptiert, wenn es genau die richtige Ausgabe macht. &lt;/p&gt;\\r\\n\\t&lt;p&gt;Wenn der Test \\r\\n\\tfunktioniert hat, kannst du anschliessend die Aufgabe mit dem Submit-Button abgeben. Nach der Abgabe kannst \\r\\n\\tdu auf der Hauptseite des Kurses die nächste Lektion aufrufen.&lt;/p&gt;\\r\\n&lt;/div&gt;\",\n        \"isHidden\": true,\n        \"isStatic\": false,\n        \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n        \"updatedAt\": \"2024-01-25T13:11:03.000Z\",\n        \"ProjectId\": 2\n    },\n    \"sampleSolution\": {\n        \"id\": 10,\n        \"filename\": \"sampleSolution.html\",\n        \"path\": \"Root\",\n        \"uniqueId\": 21,\n        \"parentUId\": 0,\n        \"isFolder\": false,\n        \"content\": \"&lt;div class=\\\"sampleSolution\\\"&gt;\\r\\n&lt;pre&gt;&lt;code class=\\\"language-java\\\" prism&gt;public class Main {\\r\\n  public static void main(String[] args) {\\r\\n    System.out.println(\\\"Java ist ein Kaffee\\\");\\r\\n  }\\r\\n}&lt;/code&gt;&lt;/pre&gt;\\r\\n&lt;/div&gt;\",\n        \"isHidden\": true,\n        \"isStatic\": true,\n        \"createdAt\": \"2023-03-10T14:37:04.000Z\",\n        \"updatedAt\": \"2024-01-19T10:43:38.000Z\",\n        \"ProjectId\": 2\n    },\n    \"userRole\": \"owner\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"181f1814-fb43-4670-968e-b415e82d7d5d"},{"name":"putProject","id":"225ddde3-940e-44e7-b69a-ce95c4ddadd9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n  \"project\": {\r\n    \"lastUId\": 31\r\n  },\r\n  \"files\": [\r\n    {\r\n      \"filename\": \"Main.java\",\r\n      \"path\": \"Root\",\r\n      \"content\": \"public class Main {\\r\\n    public static void main(String[] args) {\\r\\n        System.out.println(\\\"Java ist ein Kaffee\\\")\\r\\n    }\\r\\n}\",\r\n      \"uniqueId\": 2,\r\n      \"parentUId\": 0,\r\n      \"isFolder\": false,\r\n      \"id\": 8,\r\n      \"isHidden\": false,\r\n      \"isStatic\": false\r\n    },\r\n    {\r\n      \"filename\": \"codeboard.json\",\r\n      \"path\": \"Root\",\r\n      \"content\": \"{\\r\\n    \\\"_comment\\\": \\\"Specify the main file used for compiling your application. Specify the main class used for running your application.\\\",\\r\\n    \\\"MainFileForCompilation\\\": \\\"Main.java\\\",\\r\\n    \\\"MainClassForRunning\\\": \\\"Main\\\",\\t\\r\\n\\t\\\"userDisabledActions\\\": [],\\r\\n    \\\"userEnabledActions\\\": [\\\"tree-view\\\"],\\r\\n    \\\"Testing\\\": {\\r\\n        \\\"onSuccess\\\": \\\"Sehr gut, das hat geklappt. Du bist nun bereit für den Kurs. Du kannst deine Lösung mit dem blauen Submit-Button abgeben. Mach doch anschliessend gleich mit der nächsten Lektion weiter!\\\",\\r\\n        \\\"useCompileTests\\\": true,\\r\\n        \\\"ioTests\\\": [\\r\\n            {\\r\\n                \\\"name\\\": \\\"Ausgabe Testen\\\",\\r\\n                \\\"input\\\": [\\r\\n                ],\\r\\n                \\\"expectedOutput\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                \\\"tests\\\": [\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                        \\\"pass\\\": true,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe des Programms ist richtig.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\"Java ist eine Insel\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"He, du willst mich wohl reinlegen! Du hast ja gar nichts gemacht. Lies die Aufgabenstellung durch und versuche es dann nochmals.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist eine Kaffee\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Es heisst \\\\\\\"ein Kaffee\\\\\\\" und nicht \\\\\\\"eine Kaffee\\\\\\\". Passe deine Lösung noch entsprechend an.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\".*\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe ist noch nicht richtig. Dein Programm wird vom System nur akzeptiert, wenn es die Ausgabe \\\\\\\"Java ist ein Kaffee\\\\\\\" macht. Versuche es nochmal!\\\",\\r\\n                        \\\"type\\\": \\\"regex\\\"\\r\\n                    }\\r\\n                ]\\r\\n            }\\r\\n        ]\\r\\n    },\\r\\n    \\\"Help\\\": {\\r\\n        \\\"tips\\\": [\\r\\n            \\t{\\r\\n                \\\"name\\\": \\\"Tipp 1\\\",\\r\\n                \\\"note\\\": \\\"Der Text in der Print-Anweisung muss in doppelten Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": true,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\([\\\\\\\\w\\\\\\\\s]+\\\\\\\\)\\\\\\\\s*;\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Tipp 2\\\",\\r\\n                \\\"note\\\": \\\"Du musst lediglich die dritte Zeile anpassen. Ersetze dort einfach den Text <i>Java ist eine Insel</i> mit <i>Java ist ein Kaffee</i>. Achte darauf, dass am Anfang und am Ende des Textes doppelte Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\(\\\\\\\"Java ist ein Kaffee\\\\\\\"\\\\\\\\);\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Test-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Verwende die Methode <tt>length()</tt>. Achte auf die korrekte Schreibweise.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"\\\\\\\\w*\\\\\\\\.length\\\\\\\\(\\\\\\\\)\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Test\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp1\\\",\\r\\n                \\\"note\\\": \\\"Test1\\\"\\r\\n            }\\r\\n\\t\\t\\r\\n        ]\\r\\n    }\\r\\n}\",\r\n      \"uniqueId\": 1,\r\n      \"parentUId\": 0,\r\n      \"isFolder\": false,\r\n      \"id\": 7,\r\n      \"isHidden\": true,\r\n      \"isStatic\": false\r\n    },\r\n    {\r\n      \"filename\": \"projectDescription.html\",\r\n      \"path\": \"Root\",\r\n      \"content\": \"<div class=\\\"projectDescription\\\">\\r\\n<img src='images\\\\projects\\\\2082111.jpg' alt='2082111.jpg' width='90%'>\\r\\n<h2>Aufgabenstellung</h2>\\r\\n    <p>Ersetze im Programm <i>Java ist eine Insel</i> durch <i>Java ist ein Kaffee</i>. Führe anschliessend \\r\\n\\tdas Programm mit <i>Run</i> aus. Wenn du zufrieden bist mit dem Programm, führe dem Test aus. </p>\\r\\n\\t<p><b>Achtung:</b> Dein Programm wird vom System nur akzeptiert, wenn es genau die richtige Ausgabe macht. </p>\\r\\n\\t<p>Wenn der Test \\r\\n\\tfunktioniert hat, kannst du anschliessend die Aufgabe mit dem Submit-Button abgeben. Nach der Abgabe kannst \\r\\n\\tdu auf der Hauptseite des Kurses die nächste Lektion aufrufen.</p>\\r\\n</div>\",\r\n      \"uniqueId\": 3,\r\n      \"parentUId\": 0,\r\n      \"isFolder\": false,\r\n      \"id\": 9,\r\n      \"isHidden\": true,\r\n      \"isStatic\": false\r\n    },\r\n    {\r\n      \"filename\": \"sampleSolution.html\",\r\n      \"path\": \"Root\",\r\n      \"content\": \"<div class=\\\"sampleSolution\\\">\\r\\n<pre><code class=\\\"language-java\\\" prism>public class Main {\\r\\n  public static void main(String[] args) {\\r\\n    System.out.println(\\\"Java ist ein Kaffee\\\");\\r\\n  }\\r\\n}</code></pre>\\r\\n</div>\",\r\n      \"uniqueId\": 21,\r\n      \"parentUId\": 0,\r\n      \"isFolder\": false,\r\n      \"id\": 10,\r\n      \"isHidden\": true,\r\n      \"isStatic\": true\r\n    },\r\n    {\r\n      \"filename\": \"Root\",\r\n      \"path\": \"\",\r\n      \"content\": \"\",\r\n      \"uniqueId\": 0,\r\n      \"parentUId\": -1,\r\n      \"isFolder\": true,\r\n      \"id\": 6,\r\n      \"isHidden\": false,\r\n      \"isStatic\": false\r\n    }\r\n  ],\r\n  \"courseId\": null\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}","description":"<p>This endpoint updates a project (for project owners) or save a version (for project users).</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p>There are 4 types of middlewares. If one of the middlewares (...ElseNextRoute) failes the request gets routed to the next endpoint</p>\n<ul>\n<li>If the project id is valid, the user is authenticated and the owner, modify the actual project<br />  <code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isOwnerElseNextRoute: checks if the requesting user is the owner of the requested project</code></li>\n<li>(if the projectId is valid, the user is authenticated) and the current user has access rights (is a user of a project) the version of a user project gets saved<br />  <code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isUserElseNextRoute: check if a given user is a user of a given project</code></li>\n<li>(if the projectId is valid) and the current user has no access rights but connects via LTI which overrides the access rights<br />  <code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isLtiUserElseNextRoute: checks if the request has LTI information and the project allows for the LTI session</code></li>\n<li>(if the projectId is valid and the user is authenticated) andthe project is public, the version for the authenticated user gets stored<br />  <code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated()</code><br />  <code>mw.isPublicProject: checks if the project is public</code></li>\n</ul>\n<h3 id=\"request\">Request</h3>\n<p><code>PUT /api/projects/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Example response when a user of a project save his current version</li>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n\"msg\": User project successfully saved.\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"225ddde3-940e-44e7-b69a-ce95c4ddadd9"},{"name":"deleteProject","id":"e769027e-8088-4a5c-9574-7f395bb57fab","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}","description":"<p>This endpoint deletes a project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p>If the project id is valid, the user is authenticated and the owner, delete the actual project<br /><code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>DELETE /api/projects/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n\"msg\": \"Project deletion successful.\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e769027e-8088-4a5c-9574-7f395bb57fab"},{"name":"runActionOnProject","id":"3d8677f7-6240-424e-bba8-868ad135aca2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"files\": [\r\n    {\r\n      \"filename\": \"Root/Main.java\",\r\n      \"content\": \"import java.util.Scanner;\\n\\npublic class Main {\\n\\tpublic static void main(String[] args) {\\n\\t\\t\\n\\t\\t// Hier werden Geschwindigkeit und Distanz eingelesen.\\n\\t\\t// Diesen Teil nicht ändern.\\n\\t\\tScanner keyScan = new Scanner(System.in);\\n\\t\\tSystem.out.print(\\\"Geschwindigkeit (km/h): \\\");\\n\\t\\tdouble v = keyScan.nextDouble();\\n\\t\\tSystem.out.print(\\\"Distanz (km): \\\");\\n\\t\\tdouble d = keyScan.nextDouble();\\n\\t\\t\\n\\t\\t\\n\\t\\t// Hier soll die Reisezeit (in Minuten) berechnet und anschliessend ausgegeben werden.\\n\\t\\t// Die Geschwindigkeit befindet sich in der Variablen v, die Distanz in der Variablen d.\\n\\t\\tdouble reisezeit = 60 / (v / d);\\n\\t\\tSystem.out.println(\\\"Reisezeit (min): \\\" + reisezeit);\\n\\t\\t\\n\\t}\\n}\\n\\n\\n\\n\"\r\n    }\r\n  ],\r\n  \"language\": \"Java\",\r\n  \"action\": \"compileandrun\",\r\n  \"hasLtiData\": false,\r\n  \"ltiData\": {},\r\n  \"courseId\": 5\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}","description":"<p>This endpoint runs operations on a project (e.g. compile, run, test)</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p>There are a few types of middlewares. If one of the middlewares (...ElseNextRoute) failes the request gets routed to the next endpoint. In the limited run operation endpoints additional data have to be collected because requested user has limited access rights.</p>\n<ul>\n<li>If the project id is valid, the user is authenticated and the owner, run operations on a project<br />  <code>mw.isValidProjectId: checks if the requested project exists mw.isAuthElseNextRoute: req.isAuthenticated() mw.isOwnerElseNextRoute: checks if the requesting user is the owner of the requested project</code></li>\n<li>(if the projectId is valid, the user is authenticated) and the current user has access rights (is a user of a project) run limited operations on a project<br />  <code>mw.isAuthElseNextRoute: req.isAuthenticated() mw.isUserElseNextRoute: check if a given user is a user of a given project</code></li>\n<li>(if the projectId is valid) and the current user has no access rights but connects via LTI which overrides the access rights<br />  <code>mw.isLtiUserElseNextRoute: checks if the request has LTI information and the project allows for the LTI session</code></li>\n<li>(if the projectId is valid) and the project is public<br />  <code>mw.isPublicProject: checks if the project is public</code></li>\n</ul>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/projects/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"\",\n  \"streamUrl\": \"\",\n  \"startUrl\": \"\",\n  \"stopUrl\": \"\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"3d8677f7-6240-424e-bba8-868ad135aca2"},{"name":"getProjectSummary","id":"d6df2765-962b-48f9-8f13-df0df09aa3de","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/summary","description":"<p>This endpoint returns a summary of the project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p>There are a few types of middlewares. If one of the middlewares (...ElseNextRoute) returns false the request gets routed to the next endpoint.</p>\n<ul>\n<li><p>If the project id is valid, the user is authenticated and the owner, return the project summary<br />  <code>mw.isValidProjectId: checks if the requested project exists   mw.isAuthElseNextRoute: req.isAuthenticated()   mw.isOwnerOrUserElseNextRoute: checks if the requesting user is the owner of the requested project</code></p>\n</li>\n<li><p>(if the projectId is valid) and the project is public return the project summary<br />  <code>mw.isPublicProject: checks if the project is public</code></p>\n</li>\n</ul>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/projects/{{projectId}}/summary</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"id\": 2,\n    \"projectname\": \"Test-Insel\",\n    \"description\": \"This is another project for testing.\",\n    \"language\": \"Java\",\n    \"isPrivate\": false,\n    \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n    \"ownerSet\": [\n        {\n            \"username\": \"admin\",\n            \"ProjectsOwners\": {\n                \"createdAt\": \"2023-03-10T14:35:56.000Z\",\n                \"updatedAt\": \"2023-03-10T14:35:56.000Z\",\n                \"ProjectId\": 2,\n                \"UserId\": 2\n            }\n        }\n    ]\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","summary"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d6df2765-962b-48f9-8f13-df0df09aa3de"},{"name":"initLtiSession","id":"8bd1ace6-8ca4-4ab9-9528-2dd30fc8ec2c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/lti/projects/{{projectId}}","description":"<p>This endpoint initializes a new LTI session</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p>There are a few types of middlewares. If one of the middlewares (...ElseNextRoute) failes the request gets routed to the next endpoint. In the limited run operation endpoints additional data have to be collected because requested user has limited access rights.</p>\n<ul>\n<li><p>If the project id is valid, the lti request authorized, the user is authenticated and the lti user is equals the requested user, init lti session<br />  <code>mw.isValidProjectId: checks if the requested project exists mw.isLtiRequestAuthorized: checks if lti request is authorized mw.isAuthElseNextRoute: req.isAuthenticated() mw.isLtiUserIdEqualsUserName: checks if the requesting user is equals the user in the request body</code></p>\n</li>\n<li><p>(if project id is valid, the lti request authorized), the requested lti user already exists and is authenticated, init lti session<br />  <code>mw.isReturningLtiUserElseNextRoute: checks if lti user already exists mw.authenticateLtiUserElseNextRoute: tries to authenticate a lti user</code></p>\n</li>\n<li><p>(if project id is valid, the lti request authorized) and the current user has no access rights but connects via LTI which overrides the access rights<br />  <code>mw.isReturningLtiUserElseNextRoute: checks if lti user already exists mw.updateLtiUserPassword: is called, when lti user was found by its user_id but the lis_person_sourdid changed due to moodle changes</code></p>\n</li>\n<li><p>(if project id is valid, the lti request authorized), the lti user can be created and the lti user can be authenticated<br />  <code>mw.isLtiUserCreatableElseNextRoute: tries to create a user with the lti data mw.authenticateLtiUserElseNextRoute: tries to authenticate a lti user</code></p>\n</li>\n</ul>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /lti/projects/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["lti","projects","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"8bd1ace6-8ca4-4ab9-9528-2dd30fc8ec2c"},{"name":"getAllUserProjectsForProject","id":"c617a484-07a2-43f7-acfc-a66ab6a63b10","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/userprojects","description":"<p>This endpoint returns a list of all versions of projects stored by users</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists mw.isAuth(): req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/projects/{{projectId}}/userprojects</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"id\": 44,\n        \"updatedAt\": \"2024-02-07T13:55:12.000Z\",\n        \"isLastStoredByOwner\": false,\n        \"projectId\": 2,\n        \"user\": {\n            \"userId\": 3,\n            \"username\": \"testuser\"\n        },\n        \"project\": {\n            \"projectId\": 2,\n            \"projectname\": \"Test-Insel\"\n        }\n    },\n    {\n        \"id\": 19,\n        \"updatedAt\": \"2024-02-07T13:55:25.000Z\",\n        \"isLastStoredByOwner\": false,\n        \"projectId\": 2,\n        \"user\": {\n            \"userId\": 3,\n            \"username\": \"testuser\"\n        },\n        \"project\": {\n            \"projectId\": 2,\n            \"projectname\": \"Test-Insel\"\n        }\n    }\n]\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","userprojects"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c617a484-07a2-43f7-acfc-a66ab6a63b10"},{"name":"getUserProjectForProject","id":"39e073cf-4e5e-4b7a-aed4-2cf056ca91e3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/userprojects/{{userprojectId}}","description":"<p>This endpoint returns the user version of a project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectIdAndUserprojectIdCombo: checks the requested userproject (projectId, userprojectId) exists mw.isAuth(): req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/projects/{{projectId}}/userprojects</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">%7B\n%20%20%20%20%22userprojectId%22%3A%2044%2C\n%20%20%20%20%22projectId%22%3A%202%2C\n%20%20%20%20%22projectname%22%3A%20%22Test-Insel%22%2C\n%20%20%20%20%22language%22%3A%20%22Java%22%2C\n%20%20%20%20%22description%22%3A%20%22This%20is%20another%20project%20for%20testing.%22%2C\n%20%20%20%20%22lastUId%22%3A%205%2C\n%20%20%20%20%22isSubmissionAllowed%22%3A%20false%2C\n%20%20%20%20%22fileSet%22%3A%20%5B\n%20%20%20%20%20%20%20%20%7B\n%20%20%20%20%20%20%20%20%20%20%20%20%22filename%22%3A%20%22Main.java%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22path%22%3A%20%22Root%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22content%22%3A%20%22public%20class%20Main%20%7B%5Cr%5Cn%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%5Cr%5Cn%20%20%20%20%20%20%20%20System.out.println(%5C%22Java%20ist%20ein%20Kaffee%5C%22)%3B%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%7D%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22uniqueId%22%3A%201%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22parentUId%22%3A%200%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isFolder%22%3A%20false%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%208%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isHidden%22%3A%20false%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isStatic%22%3A%20false\n%20%20%20%20%20%20%20%20%7D%2C\n%20%20%20%20%20%20%20%20%7B\n%20%20%20%20%20%20%20%20%20%20%20%20%22filename%22%3A%20%22Root%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22path%22%3A%20%22%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22content%22%3A%20%22%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22uniqueId%22%3A%200%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22parentUId%22%3A%20-1%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isFolder%22%3A%20true%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%206%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isHidden%22%3A%20false%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isStatic%22%3A%20false\n%20%20%20%20%20%20%20%20%7D%2C\n%20%20%20%20%20%20%20%20%7B\n%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%207%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22filename%22%3A%20%22codeboard.json%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22path%22%3A%20%22Root%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22uniqueId%22%3A%202%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22parentUId%22%3A%200%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isFolder%22%3A%20false%2C\n            \"content\": \"{\\r\\n    \\\"_comment\\\": \\\"Specify the main file used for compiling your application. Specify the main class used for running your application.\\\",\\r\\n    \\\"MainFileForCompilation\\\": \\\"Main.java\\\",\\r\\n    \\\"MainClassForRunning\\\": \\\"Main\\\",\\t\\r\\n\\t\\\"userDisabledActions\\\": [],\\r\\n    \\\"userEnabledActions\\\": [\\\"tree-view\\\"],\\r\\n    \\\"Testing\\\": {\\r\\n        \\\"onSuccess\\\": \\\"Sehr gut, das hat geklappt. Du bist nun bereit für den Kurs. Du kannst deine Lösung mit dem blauen Submit-Button abgeben. Mach doch anschliessend gleich mit der nächsten Lektion weiter!\\\",\\r\\n        \\\"useCompileTests\\\": true,\\r\\n        \\\"ioTests\\\": [\\r\\n            {\\r\\n                \\\"name\\\": \\\"Ausgabe Testen\\\",\\r\\n                \\\"input\\\": [\\r\\n                ],\\r\\n                \\\"expectedOutput\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                \\\"tests\\\": [\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                        \\\"pass\\\": true,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe des Programms ist richtig.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\"Java ist eine Insel\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"He, du willst mich wohl reinlegen! Du hast ja gar nichts gemacht. Lies die Aufgabenstellung durch und versuche es dann nochmals.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist eine Kaffee\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Es heisst \\\\\\\"ein Kaffee\\\\\\\" und nicht \\\\\\\"eine Kaffee\\\\\\\". Passe deine Lösung noch entsprechend an.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\".*\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe ist noch nicht richtig. Dein Programm wird vom System nur akzeptiert, wenn es die Ausgabe \\\\\\\"Java ist ein Kaffee\\\\\\\" macht. Versuche es nochmal!\\\",\\r\\n                        \\\"type\\\": \\\"regex\\\"\\r\\n                    }\\r\\n                ]\\r\\n            }\\r\\n        ]\\r\\n    },\\r\\n    \\\"Help\\\": {\\r\\n        \\\"tips\\\": [\\r\\n            \\t{\\r\\n                \\\"name\\\": \\\"Tipp 1\\\",\\r\\n                \\\"note\\\": \\\"Der Text in der Print-Anweisung muss in doppelten Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": true,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\([\\\\\\\\w\\\\\\\\s]+\\\\\\\\)\\\\\\\\s*;\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Tipp 2\\\",\\r\\n                \\\"note\\\": \\\"Du musst lediglich die dritte Zeile anpassen. Ersetze dort einfach den Text &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist eine Insel&lt;/i&gt; mit &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist ein Kaffee&lt;/i&gt;. Achte darauf, dass am Anfang und am Ende des Textes doppelte Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\(\\\\\\\"Java ist ein Kaffee\\\\\\\"\\\\\\\\);\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Test-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Verwende die Methode &lt;tt&gt;length()&lt;/tt&gt;. Achte auf die korrekte Schreibweise.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"\\\\\\\\w*\\\\\\\\.length\\\\\\\\(\\\\\\\\)\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Test\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp1\\\",\\r\\n                \\\"note\\\": \\\"Test1\\\"\\r\\n            }\\r\\n\\t\\t\\r\\n        ]\\r\\n    }\\r\\n}\",\n%20%20%20%20%20%20%20%20%20%20%20%20%22isHidden%22%3A%20true%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isStatic%22%3A%20false\n%20%20%20%20%20%20%20%20%7D%2C\n%20%20%20%20%20%20%20%20%7B\n%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%209%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22filename%22%3A%20%22projectDescription.html%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22path%22%3A%20%22Root%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22uniqueId%22%3A%203%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22parentUId%22%3A%200%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isFolder%22%3A%20false%2C\n            \"content\": \"&lt;div class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=\\\"projectDescription\\\"&gt;\\r\\n&lt;img class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; src=&amp;#x27;images\\\\projects\\\\2082111.jpg&amp;#x27; alt=&amp;#x27;2082111.jpg&amp;#x27; width=&amp;#x27;90%&amp;#x27;&gt;\\r\\n&lt;h2 class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Aufgabenstellung&lt;/h2&gt;\\r\\n    &lt;p class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Ersetze im Programm &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist eine Insel&lt;/i&gt; durch &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist ein Kaffee&lt;/i&gt;. Führe anschliessend \\r\\n\\tdas Programm mit &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Run&lt;/i&gt; aus. Wenn du zufrieden bist mit dem Programm, führe dem Test aus. &lt;/p&gt;\\r\\n\\t&lt;p class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;&lt;strong class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Achtung:&lt;/b&gt; Dein Programm wird vom System nur akzeptiert, wenn es genau die richtige Ausgabe macht. &lt;/p&gt;\\r\\n\\t&lt;p class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Wenn der Test \\r\\n\\tfunktioniert hat, kannst du anschliessend die Aufgabe mit dem Submit-Button abgeben. Nach der Abgabe kannst \\r\\n\\tdu auf der Hauptseite des Kurses die nächste Lektion aufrufen.&lt;/p&gt;\\r\\n&lt;/div&gt;\",\n%20%20%20%20%20%20%20%20%20%20%20%20%22isHidden%22%3A%20true%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isStatic%22%3A%20false\n%20%20%20%20%20%20%20%20%7D%2C\n%20%20%20%20%20%20%20%20%7B\n%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%2010%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22filename%22%3A%20%22sampleSolution.html%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22path%22%3A%20%22Root%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22uniqueId%22%3A%204%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22parentUId%22%3A%200%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isFolder%22%3A%20false%2C\n            \"content\": \"&lt;div class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=\\\"sampleSolution\\\"&gt;\\r\\n&lt;pre class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;&lt;code class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=\\\"language-java\\\" prism&gt;public class Main {\\r\\n  public static void main(String[] args) {\\r\\n    System.out.println(\\\"Java ist ein Kaffee\\\");\\r\\n  }\\r\\n}&lt;/code&gt;&lt;/pre&gt;\\r\\n&lt;/div&gt;\",\n%20%20%20%20%20%20%20%20%20%20%20%20%22isHidden%22%3A%20true%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isStatic%22%3A%20true\n%20%20%20%20%20%20%20%20%7D\n%20%20%20%20%5D%2C\n%20%20%20%20%22course%22%3A%20%7B\n%20%20%20%20%20%20%20%20%22id%22%3A%205%2C\n%20%20%20%20%20%20%20%20%22coursename%22%3A%20%22codeboard%20Tests%22\n%20%20%20%20%7D%2C\n%20%20%20%20%22userRole%22%3A%20%22userproject%22%2C\n%20%20%20%20%22username%22%3A%20%22testuser%22%2C\n%20%20%20%20%22updatedAt%22%3A%20%222024-02-07T13%3A55%3A12.000Z%22\n%7D\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","userprojects","{{userprojectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"39e073cf-4e5e-4b7a-aed4-2cf056ca91e3"},{"name":"getCourseUserProjects","id":"0175d5de-b733-4b4b-b2e9-73e9861849bc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/courses/{{courseId}}/userProjects","description":"<p>This endpoint returns a list of all projects by a given course Id.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth(): req.isAuthenticated() mw.isValidCourseId: checks the requested course (courseId) exists   mw.isCourseOwner: checks if the requesting user is the owner of the requested course</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/courses/{{courseId}}/userProjects</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"id\": 12,\n        \"updatedAt\": \"2023-08-23T07:52:07.000Z\",\n        \"isLastStoredByOwner\": false,\n        \"projectId\": 8,\n        \"user\": {\n            \"userId\": 3,\n            \"username\": \"testuser\"\n        },\n        \"project\": {\n            \"projectId\": 8,\n            \"projectname\": \"Aufgabe - Helpersysteme entdecken\"\n        }\n    },\n    {\n        \"id\": 19,\n        \"updatedAt\": \"2024-02-07T13:55:25.000Z\",\n        \"isLastStoredByOwner\": false,\n        \"projectId\": 2,\n        \"user\": {\n            \"userId\": 3,\n            \"username\": \"testuser\"\n        },\n        \"project\": {\n            \"projectId\": 2,\n            \"projectname\": \"Test-Insel\"\n        }\n    }\n]\n\n</code></pre>\n","urlObject":{"path":["api","courses","{{courseId}}","userProjects"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"0175d5de-b733-4b4b-b2e9-73e9861849bc"},{"name":"getCourseProjectUserProjects","id":"081a22d1-7dcc-4773-ad1a-6cef3d70238c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/courses/{{courseId}}/projects/{{projectId}}/userprojects","description":"<p>This endpoint returns a specific project from a specific course.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth(): req.isAuthenticated() mw.isValidCourseId: checks the requested course (courseId) exists mw.isCourseOwner: checks if the requesting user is the owner of the requested course mw.isProjectInCourse: checks if the requested project is in the requested course</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/courses/{{courseId}}/projects/{{projectId}}/userprojects</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"id\": 19,\n        \"updatedAt\": \"2024-02-07T13:55:25.000Z\",\n        \"isLastStoredByOwner\": false,\n        \"projectId\": 2,\n        \"user\": {\n            \"userId\": 3,\n            \"username\": \"testuser\"\n        },\n        \"project\": {\n            \"projectId\": 2,\n            \"projectname\": \"Test-Insel\"\n        }\n    }\n]\n\n</code></pre>\n","urlObject":{"path":["api","courses","{{courseId}}","projects","{{projectId}}","userprojects"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"081a22d1-7dcc-4773-ad1a-6cef3d70238c"}],"id":"2733d6eb-c7e5-4e33-a2dd-27f5adec9b48","_postman_id":"2733d6eb-c7e5-4e33-a2dd-27f5adec9b48","description":""},{"name":"submissions","item":[{"name":"getAllSubmissions","id":"dcb09bee-c296-48ea-bf2f-e772f8fd0382","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/submissions","description":"<p>This endpoint returns all submissions for a given projectId.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project (projectId) exists   mw.isAuth(): req.isAuthenticated()   mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/projects/{{projectId}}/submissions</code>  </p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"submissionId\": 55,\n        \"id\": 55,\n        \"ltiSessionId\": -1,\n        \"hasResult\": true,\n        \"testResult\": \"0.0000\",\n        \"numTestsPassed\": 0,\n        \"numTestsFailed\": 1,\n        \"createdAt\": \"2024-01-24T09:52:22.000Z\",\n        \"updatedAt\": \"2024-01-24T09:52:22.000Z\",\n        \"projectId\": 2,\n        \"user\": {\n            \"userId\": 3,\n            \"username\": \"testuser\"\n        },\n        \"project\": {\n            \"projectId\": 2,\n            \"projectname\": \"Test-Insel\"\n        }\n    },\n    {\n        \"submissionId\": 54,\n        \"id\": 54,\n        \"ltiSessionId\": -1,\n        \"hasResult\": true,\n        \"testResult\": \"0.0000\",\n        \"numTestsPassed\": 0,\n        \"numTestsFailed\": 1,\n        \"createdAt\": \"2024-01-24T09:51:07.000Z\",\n        \"updatedAt\": \"2024-01-24T09:51:07.000Z\",\n        \"projectId\": 2,\n        \"user\": {\n            \"userId\": 3,\n            \"username\": \"testuser\"\n        },\n        \"project\": {\n            \"projectId\": 2,\n            \"projectname\": \"Test-Insel\"\n        }\n    }\n]\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","submissions"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"dcb09bee-c296-48ea-bf2f-e772f8fd0382"},{"name":"createSubmission","id":"6d892869-32f5-4fcd-8ec6-ff2a220331af","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"files\": [\r\n    {\r\n      \"filename\": \"Root/Main.java\",\r\n      \"content\": \"public class Main {\\r\\n    public static void main(String[] args) {\\r\\n        System.out.println(\\\"Java ist ein Kaffee\\\")\\r\\n    }\\r\\n}\"\r\n    },\r\n    {\r\n      \"filename\": \"Root/codeboard.json\",\r\n      \"content\": \"{\\r\\n    \\\"_comment\\\": \\\"Specify the main file used for compiling your application. Specify the main class used for running your application.\\\",\\r\\n    \\\"MainFileForCompilation\\\": \\\"Main.java\\\",\\r\\n    \\\"MainClassForRunning\\\": \\\"Main\\\",\\t\\r\\n\\t\\\"userDisabledActions\\\": [],\\r\\n    \\\"userEnabledActions\\\": [\\\"tree-view\\\"],\\r\\n    \\\"Testing\\\": {\\r\\n        \\\"onSuccess\\\": \\\"Sehr gut, das hat geklappt. Du bist nun bereit für den Kurs. Du kannst deine Lösung mit dem blauen Submit-Button abgeben. Mach doch anschliessend gleich mit der nächsten Lektion weiter!\\\",\\r\\n        \\\"useCompileTests\\\": true,\\r\\n        \\\"ioTests\\\": [\\r\\n            {\\r\\n                \\\"name\\\": \\\"Ausgabe Testen\\\",\\r\\n                \\\"input\\\": [\\r\\n                ],\\r\\n                \\\"expectedOutput\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                \\\"tests\\\": [\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                        \\\"pass\\\": true,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe des Programms ist richtig.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\"Java ist eine Insel\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"He, du willst mich wohl reinlegen! Du hast ja gar nichts gemacht. Lies die Aufgabenstellung durch und versuche es dann nochmals.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist eine Kaffee\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Es heisst \\\\\\\"ein Kaffee\\\\\\\" und nicht \\\\\\\"eine Kaffee\\\\\\\". Passe deine Lösung noch entsprechend an.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\".*\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe ist noch nicht richtig. Dein Programm wird vom System nur akzeptiert, wenn es die Ausgabe \\\\\\\"Java ist ein Kaffee\\\\\\\" macht. Versuche es nochmal!\\\",\\r\\n                        \\\"type\\\": \\\"regex\\\"\\r\\n                    }\\r\\n                ]\\r\\n            }\\r\\n        ]\\r\\n    },\\r\\n    \\\"Help\\\": {\\r\\n        \\\"tips\\\": [\\r\\n            \\t{\\r\\n                \\\"name\\\": \\\"Tipp 1\\\",\\r\\n                \\\"note\\\": \\\"Der Text in der Print-Anweisung muss in doppelten Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": true,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\([\\\\\\\\w\\\\\\\\s]+\\\\\\\\)\\\\\\\\s*;\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Tipp 2\\\",\\r\\n                \\\"note\\\": \\\"Du musst lediglich die dritte Zeile anpassen. Ersetze dort einfach den Text <i>Java ist eine Insel</i> mit <i>Java ist ein Kaffee</i>. Achte darauf, dass am Anfang und am Ende des Textes doppelte Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\(\\\\\\\"Java ist ein Kaffee\\\\\\\"\\\\\\\\);\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Test-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Verwende die Methode <tt>length()</tt>. Achte auf die korrekte Schreibweise.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"\\\\\\\\w*\\\\\\\\.length\\\\\\\\(\\\\\\\\)\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Test\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp1\\\",\\r\\n                \\\"note\\\": \\\"Test1\\\"\\r\\n            }\\r\\n\\t\\t\\r\\n        ]\\r\\n    }\\r\\n}\"\r\n    },\r\n    {\r\n      \"filename\": \"Root/projectDescription.html\",\r\n      \"content\": \"<div class=\\\"projectDescription\\\">\\r\\n<img src='images\\\\projects\\\\2082111.jpg' alt='2082111.jpg' width='90%'>\\r\\n<h2>Aufgabenstellung</h2>\\r\\n    <p>Ersetze im Programm <i>Java ist eine Insel</i> durch <i>Java ist ein Kaffee</i>. Führe anschliessend \\r\\n\\tdas Programm mit <i>Run</i> aus. Wenn du zufrieden bist mit dem Programm, führe dem Test aus. </p>\\r\\n\\t<p><b>Achtung:</b> Dein Programm wird vom System nur akzeptiert, wenn es genau die richtige Ausgabe macht. </p>\\r\\n\\t<p>Wenn der Test \\r\\n\\tfunktioniert hat, kannst du anschliessend die Aufgabe mit dem Submit-Button abgeben. Nach der Abgabe kannst \\r\\n\\tdu auf der Hauptseite des Kurses die nächste Lektion aufrufen.</p>\\r\\n</div>\"\r\n    },\r\n    {\r\n      \"filename\": \"Root/sampleSolution.html\",\r\n      \"content\": \"<div class=\\\"sampleSolution\\\">\\r\\n<pre><code class=\\\"language-java\\\" prism>public class Main {\\r\\n  public static void main(String[] args) {\\r\\n    System.out.println(\\\"Java ist ein Kaffee\\\");\\r\\n  }\\r\\n}</code></pre>\\r\\n</div>\"\r\n    }\r\n  ],\r\n  \"language\": \"Java\",\r\n  \"action\": \"compile\",\r\n  \"hasLtiData\": false,\r\n  \"ltiData\": {},\r\n  \"filesInDefaultFormat\": [\r\n    {\r\n      \"filename\": \"Main.java\",\r\n      \"path\": \"Root\",\r\n      \"content\": \"public class Main {\\r\\n    public static void main(String[] args) {\\r\\n        System.out.println(\\\"Java ist ein Kaffee\\\")\\r\\n    }\\r\\n}\",\r\n      \"uniqueId\": 2,\r\n      \"parentUId\": 0,\r\n      \"isFolder\": false,\r\n      \"id\": 8,\r\n      \"isHidden\": false,\r\n      \"isStatic\": false\r\n    },\r\n    {\r\n      \"filename\": \"codeboard.json\",\r\n      \"path\": \"Root\",\r\n      \"content\": \"{\\r\\n    \\\"_comment\\\": \\\"Specify the main file used for compiling your application. Specify the main class used for running your application.\\\",\\r\\n    \\\"MainFileForCompilation\\\": \\\"Main.java\\\",\\r\\n    \\\"MainClassForRunning\\\": \\\"Main\\\",\\t\\r\\n\\t\\\"userDisabledActions\\\": [],\\r\\n    \\\"userEnabledActions\\\": [\\\"tree-view\\\"],\\r\\n    \\\"Testing\\\": {\\r\\n        \\\"onSuccess\\\": \\\"Sehr gut, das hat geklappt. Du bist nun bereit für den Kurs. Du kannst deine Lösung mit dem blauen Submit-Button abgeben. Mach doch anschliessend gleich mit der nächsten Lektion weiter!\\\",\\r\\n        \\\"useCompileTests\\\": true,\\r\\n        \\\"ioTests\\\": [\\r\\n            {\\r\\n                \\\"name\\\": \\\"Ausgabe Testen\\\",\\r\\n                \\\"input\\\": [\\r\\n                ],\\r\\n                \\\"expectedOutput\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                \\\"tests\\\": [\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                        \\\"pass\\\": true,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe des Programms ist richtig.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\"Java ist eine Insel\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"He, du willst mich wohl reinlegen! Du hast ja gar nichts gemacht. Lies die Aufgabenstellung durch und versuche es dann nochmals.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist eine Kaffee\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Es heisst \\\\\\\"ein Kaffee\\\\\\\" und nicht \\\\\\\"eine Kaffee\\\\\\\". Passe deine Lösung noch entsprechend an.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\".*\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe ist noch nicht richtig. Dein Programm wird vom System nur akzeptiert, wenn es die Ausgabe \\\\\\\"Java ist ein Kaffee\\\\\\\" macht. Versuche es nochmal!\\\",\\r\\n                        \\\"type\\\": \\\"regex\\\"\\r\\n                    }\\r\\n                ]\\r\\n            }\\r\\n        ]\\r\\n    },\\r\\n    \\\"Help\\\": {\\r\\n        \\\"tips\\\": [\\r\\n            \\t{\\r\\n                \\\"name\\\": \\\"Tipp 1\\\",\\r\\n                \\\"note\\\": \\\"Der Text in der Print-Anweisung muss in doppelten Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": true,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\([\\\\\\\\w\\\\\\\\s]+\\\\\\\\)\\\\\\\\s*;\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Tipp 2\\\",\\r\\n                \\\"note\\\": \\\"Du musst lediglich die dritte Zeile anpassen. Ersetze dort einfach den Text <i>Java ist eine Insel</i> mit <i>Java ist ein Kaffee</i>. Achte darauf, dass am Anfang und am Ende des Textes doppelte Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\(\\\\\\\"Java ist ein Kaffee\\\\\\\"\\\\\\\\);\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Test-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Verwende die Methode <tt>length()</tt>. Achte auf die korrekte Schreibweise.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"\\\\\\\\w*\\\\\\\\.length\\\\\\\\(\\\\\\\\)\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Test\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp1\\\",\\r\\n                \\\"note\\\": \\\"Test1\\\"\\r\\n            }\\r\\n\\t\\t\\r\\n        ]\\r\\n    }\\r\\n}\",\r\n      \"uniqueId\": 1,\r\n      \"parentUId\": 0,\r\n      \"isFolder\": false,\r\n      \"id\": 7,\r\n      \"isHidden\": true,\r\n      \"isStatic\": false\r\n    },\r\n    {\r\n      \"filename\": \"projectDescription.html\",\r\n      \"path\": \"Root\",\r\n      \"content\": \"<div class=\\\"projectDescription\\\">\\r\\n<img src='images\\\\projects\\\\2082111.jpg' alt='2082111.jpg' width='90%'>\\r\\n<h2>Aufgabenstellung</h2>\\r\\n    <p>Ersetze im Programm <i>Java ist eine Insel</i> durch <i>Java ist ein Kaffee</i>. Führe anschliessend \\r\\n\\tdas Programm mit <i>Run</i> aus. Wenn du zufrieden bist mit dem Programm, führe dem Test aus. </p>\\r\\n\\t<p><b>Achtung:</b> Dein Programm wird vom System nur akzeptiert, wenn es genau die richtige Ausgabe macht. </p>\\r\\n\\t<p>Wenn der Test \\r\\n\\tfunktioniert hat, kannst du anschliessend die Aufgabe mit dem Submit-Button abgeben. Nach der Abgabe kannst \\r\\n\\tdu auf der Hauptseite des Kurses die nächste Lektion aufrufen.</p>\\r\\n</div>\",\r\n      \"uniqueId\": 3,\r\n      \"parentUId\": 0,\r\n      \"isFolder\": false,\r\n      \"id\": 9,\r\n      \"isHidden\": true,\r\n      \"isStatic\": false\r\n    },\r\n    {\r\n      \"filename\": \"sampleSolution.html\",\r\n      \"path\": \"Root\",\r\n      \"content\": \"<div class=\\\"sampleSolution\\\">\\r\\n<pre><code class=\\\"language-java\\\" prism>public class Main {\\r\\n  public static void main(String[] args) {\\r\\n    System.out.println(\\\"Java ist ein Kaffee\\\");\\r\\n  }\\r\\n}</code></pre>\\r\\n</div>\",\r\n      \"uniqueId\": 21,\r\n      \"parentUId\": 0,\r\n      \"isFolder\": false,\r\n      \"id\": 10,\r\n      \"isHidden\": true,\r\n      \"isStatic\": true\r\n    },\r\n    {\r\n      \"filename\": \"Root\",\r\n      \"path\": \"\",\r\n      \"content\": \"\",\r\n      \"uniqueId\": 0,\r\n      \"parentUId\": -1,\r\n      \"isFolder\": true,\r\n      \"id\": 6,\r\n      \"isHidden\": false,\r\n      \"isStatic\": false\r\n    }\r\n  ],\r\n  \"userRole\": \"owner\",\r\n  \"course\": {}\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/submissions","description":"<p>This endpoint creates a new submission for a given project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project (projectId) exists</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/projects/{{projectId}}/submissions</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","submissions"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6d892869-32f5-4fcd-8ec6-ff2a220331af"},{"name":"getSubmission","id":"d48da567-4ad2-4452-8d04-16ce451b63af","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/submissions/{{submissionId}}","description":"<p>This endpoint returns a specific submission for a given project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectIdAAndSubmissionIdCombo: checks if the requested project (projectId) exists   mw.isAuth: req.isAuthenticated()   mw.isOwner: checks if the requested user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/projects/{{projectId}}/submissions/{{submissionId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"submissionId\": 1,\n    \"hasResult\": true,\n    \"testResult\": \"1.0000\",\n    \"numTestsPassed\": 1,\n    \"numTestsFailed\": 0,\n    \"isLtiSubmission\": false,\n    \"createdAt\": \"2023-03-10T14:40:34.000Z\",\n    \"updatedAt\": \"2023-03-10T14:40:34.000Z\",\n    \"userFilesDump\": [\n        {\n            \"filename\": \"Main.java\",\n            \"path\": \"Root\",\n            \"content\": \"public class Main {\\r\\n  public static void main(String[] args) {\\r\\n    System.out.println(\\\"Java ist ein Kaffee\\\");\\r\\n  }\\r\\n}\",\n            \"uniqueId\": 2,\n            \"parentUId\": 0,\n            \"isFolder\": false,\n            \"id\": 8,\n            \"isHidden\": false,\n            \"isStatic\": false\n        },\n        {\n            \"filename\": \"codeboard.json\",\n            \"path\": \"Root\",\n            \"content\": \"{\\r\\n    \\\"_comment\\\": \\\"Specify the main file used for compiling your application. Specify the main class used for running your application.\\\",\\r\\n    \\\"MainFileForCompilation\\\": \\\"Main.java\\\",\\r\\n    \\\"MainClassForRunning\\\": \\\"Main\\\",\\t\\r\\n\\t\\\"userDisabledActions\\\": [\\\"tree-view\\\"],\\r\\n    \\\"Testing\\\": {\\r\\n        \\\"onSuccess\\\": \\\"Sehr gut, das hat geklappt. Du bist nun bereit für den Kurs. Du kannst deine Lösung mit dem blauen Submit-Button abgeben. Mach doch anschliessend gleich mit der nächsten Lektion weiter!\\\",\\r\\n        \\\"useCompileTests\\\": true,\\r\\n        \\\"ioTests\\\": [\\r\\n            {\\r\\n                \\\"name\\\": \\\"Ausgabe Testen\\\",\\r\\n                \\\"input\\\": [\\r\\n                ],\\r\\n                \\\"expectedOutput\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                \\\"tests\\\": [\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                        \\\"pass\\\": true,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe des Programms ist richtig.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\"Java ist eine Insel\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"He, du willst mich wohl reinlegen! Du hast ja gar nichts gemacht. Lies die Aufgabenstellung durch und versuche es dann nochmals.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist eine Kaffee\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Es heisst \\\\\\\"ein Kaffee\\\\\\\" und nicht \\\\\\\"eine Kaffee\\\\\\\". Passe deine Lösung noch entsprechend an.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\".*\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe ist noch nicht richtig. Dein Programm wird vom System nur akzeptiert, wenn es die Ausgabe \\\\\\\"Java ist ein Kaffee\\\\\\\" macht. Versuche es nochmal!\\\",\\r\\n                        \\\"type\\\": \\\"regex\\\"\\r\\n                    }\\r\\n                ]\\r\\n            }\\r\\n        ]\\r\\n    },\\r\\n    \\\"Help\\\": {\\r\\n        \\\"tips\\\": [\\r\\n\\t\\t\\t{\\r\\n                \\\"name\\\": \\\"Tipp 1\\\",\\r\\n                \\\"note\\\": \\\"Du musst lediglich die dritte Zeile anpassen. Ersetze dort einfach den Text &lt;i&gt;Java ist eine Insel&lt;/i&gt; mit &lt;i&gt;Java ist ein Kaffee&lt;/i&gt;. Achte darauf, dass am Anfang und am Ende des Textes doppelte Anführungszeichen stehen.\\\"\\r\\n            }\\r\\n        ]\\r\\n    }\\r\\n}\",\n            \"uniqueId\": 1,\n            \"parentUId\": 0,\n            \"isFolder\": false,\n            \"id\": 7,\n            \"isHidden\": true,\n            \"isStatic\": false\n        },\n        {\n            \"filename\": \"projectDescription.html\",\n            \"path\": \"Root\",\n            \"content\": \"&lt;div class=\\\"projectDescription\\\"&gt;\\r\\n&lt;h2&gt;Aufgabenstellung&lt;/h2&gt;\\r\\n    &lt;p&gt;Ersetze im Programm &lt;i&gt;Java ist eine Insel&lt;/i&gt; durch &lt;i&gt;Java ist ein Kaffee&lt;/i&gt;. Führe anschliessend \\r\\n\\tdas Programm mit &lt;i&gt;Run&lt;/i&gt; aus. Wenn du zufrieden bist mit dem Programm, führe dem Test aus. &lt;/p&gt;\\r\\n\\t&lt;p&gt;&lt;b&gt;Achtung:&lt;/b&gt; Dein Programm wird vom System nur akzeptiert, wenn es genau die richtige Ausgabe macht. &lt;/p&gt;\\r\\n\\t&lt;p&gt;Wenn der Test \\r\\n\\tfunktioniert hat, kannst du anschliessend die Aufgabe mit dem Submit-Button abgeben. Nach der Abgabe kannst \\r\\n\\tdu auf der Hauptseite des Kurses die nächste Lektion aufrufen.&lt;/p&gt;\\r\\n&lt;/div&gt;\",\n            \"uniqueId\": 3,\n            \"parentUId\": 0,\n            \"isFolder\": false,\n            \"id\": 9,\n            \"isHidden\": true,\n            \"isStatic\": false\n        },\n        {\n            \"filename\": \"sampleSolution.html\",\n            \"path\": \"Root\",\n            \"content\": \"&lt;div class=\\\"sampleSolution\\\"&gt;\\r\\n&lt;pre&gt;&lt;code class=\\\"language-java\\\" prism&gt;public class Main {\\r\\n  public static void main(String[] args) {\\r\\n    System.out.println(\\\"Java ist ein Kaffee\\\");\\r\\n  }\\r\\n}&lt;/code&gt;&lt;/pre&gt;\\r\\n&lt;/div&gt;\",\n            \"uniqueId\": 21,\n            \"parentUId\": 0,\n            \"isFolder\": false,\n            \"id\": 10,\n            \"isHidden\": false,\n            \"isStatic\": false\n        },\n        {\n            \"filename\": \"Root\",\n            \"path\": \"\",\n            \"content\": \"\",\n            \"uniqueId\": 0,\n            \"parentUId\": -1,\n            \"isFolder\": true,\n            \"id\": 6,\n            \"isHidden\": false,\n            \"isStatic\": false\n        }\n    ],\n    \"hiddenFilesDump\": [],\n    \"project\": {\n        \"projectId\": 2,\n        \"projectname\": \"Test-Insel\",\n        \"language\": \"Java\"\n    },\n    \"user\": {\n        \"userId\": 2,\n        \"username\": \"admin\"\n    },\n    \"userRole\": \"submission\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","submissions","{{submissionId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d48da567-4ad2-4452-8d04-16ce451b63af"},{"name":"getCourseSubmissions","id":"40e5c641-f599-4d7b-954c-4944b06a25fe","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/courses/{{courseId}}/submissions","description":"<p>This endpoint returns a list of all submissions of a given course.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth: req.isAuthenticated()   mw.isValidCourseId: checks if the requested course (courseId) exists   mw.isCourseOwner: checks if the requested user is the owner of the requested course</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/courses/{{courseId}}/submissions</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"submissionId\": 54,\n        \"id\": 54,\n        \"ltiSessionId\": -1,\n        \"hasResult\": true,\n        \"testResult\": \"0.0000\",\n        \"numTestsPassed\": 0,\n        \"numTestsFailed\": 1,\n        \"createdAt\": \"2024-01-24T09:51:07.000Z\",\n        \"updatedAt\": \"2024-01-24T09:51:07.000Z\",\n        \"projectId\": 2,\n        \"user\": {\n            \"userId\": 3,\n            \"username\": \"testuser\"\n        },\n        \"project\": {\n            \"projectId\": 2,\n            \"projectname\": \"Test-Insel\"\n        }\n    }\n]\n\n</code></pre>\n","urlObject":{"path":["api","courses","{{courseId}}","submissions"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"40e5c641-f599-4d7b-954c-4944b06a25fe"},{"name":"getCourseProjectSubmissions","id":"d7373e85-187a-4f76-bb2c-e2813791e52f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/courses/{{courseId}}/projects/{{projectId}}/submissions","description":"<p>This endpoint returns all submissions for a given course and project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth: req.isAuthenticated() mw.isValidCourseId: checks if the requested course (courseId) exists mw.isCourseOwner: checks if the requested user is the owner of the requested course   mw.isProjectInCourse: checks if the requested project is in the given course.</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/courses/{{courseId}}/projects/{{projectId}}/submissions</code>  </p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"submissionId\": 54,\n        \"id\": 54,\n        \"ltiSessionId\": -1,\n        \"hasResult\": true,\n        \"testResult\": \"0.0000\",\n        \"numTestsPassed\": 0,\n        \"numTestsFailed\": 1,\n        \"createdAt\": \"2024-01-24T09:51:07.000Z\",\n        \"updatedAt\": \"2024-01-24T09:51:07.000Z\",\n        \"projectId\": 2,\n        \"user\": {\n            \"userId\": 3,\n            \"username\": \"testuser\"\n        },\n        \"project\": {\n            \"projectId\": 2,\n            \"projectname\": \"Test-Insel\"\n        }\n    }\n]\n\n</code></pre>\n","urlObject":{"path":["api","courses","{{courseId}}","projects","{{projectId}}","submissions"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d7373e85-187a-4f76-bb2c-e2813791e52f"}],"id":"458d62b4-6640-47b9-9fe9-47573a9de96d","_postman_id":"458d62b4-6640-47b9-9fe9-47573a9de96d","description":""},{"name":"help-requests","item":[{"name":"createHelpRequest","id":"2ded2502-2850-4f63-8b07-31247636c6c1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"hasLtiData\": false,\r\n  \"ltiData\": {},\r\n  \"filesInDefaultFormat\": [\r\n    {\r\n      \"filename\": \"Main.java\",\r\n      \"path\": \"Root\",\r\n      \"content\": \"import java.util.Scanner;\\n\\npublic class Main {\\n    public static void main(String[] args) {\\n\\n        // Hier werden Geschwindigkeit und Distanz eingelesen.\\n        // Diesen Teil nicht ändern.\\n        Scanner keyScan = new Scanner(System.in);\\n        System.out.print(\\\"Geschwindigkeit (km/h): \\\");\\n        double v = keyScan.nextDouble();\\n        System.out.print(\\\"Distanz (km): \\\");\\n        double d = keyScan.nextDouble()\\n\\n        // Hier soll die Reisezeit (in Minuten) berechnet und anschliessend ausgegeben werden.\\n        // Die Geschwindigkeit befindet sich in der Variablen v, die Distanz in der Variablen d.\\n        double reisezeit = d / v * 60;\\n        System.out.println(\\\"Reisezeit (min): \\\" + reisezeit);\\n    }\\n}\",\r\n      \"uniqueId\": 2,\r\n      \"parentUId\": 0,\r\n      \"isFolder\": false,\r\n      \"id\": 107,\r\n      \"isHidden\": false,\r\n      \"isStatic\": false\r\n    },\r\n    {\r\n      \"filename\": \"Root\",\r\n      \"path\": \"\",\r\n      \"content\": \"\",\r\n      \"uniqueId\": 0,\r\n      \"parentUId\": -1,\r\n      \"isFolder\": true,\r\n      \"id\": 105,\r\n      \"isHidden\": false,\r\n      \"isStatic\": false\r\n    }\r\n  ],\r\n  \"userRole\": \"user\",\r\n  \"courseId\": 5\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/helpRequests","description":"<p>This endpoint creates a new help request (question from student) in a specific project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p>There are 2 routes for this endpoint. The 2nd one is used when the project is public.<br /><code>mw.isValidProjectId: checks if the requested project (projectId) exists mw.isAuthElseNextRoute: req.isAuthenticated() mw.isLtiUserElseNextRoute: checks if the request has LTI information and the project allows for the LTI session</code>------------<code>mw.isPublicProject: checks if the requested project is public.</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/projects/{{projectId}}/helpRequests</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">%7B\n%20%20%20%20%22id%22%3A%2036%2C\n%20%20%20%20%22status%22%3A%20%22unanswered%22%2C\n%20%20%20%20%22userFilesDump%22%3A%20%22%5B%7B%5C%22filename%5C%22%3A%5C%22Main.java%5C%22%2C%5C%22path%5C%22%3A%5C%22Root%5C%22%2C%5C%22content%5C%22%3A%5C%22import%20java.util.Scanner%3B%5C%5Cn%5C%5Cnpublic%20class%20Main%20%7B%5C%5Cn%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%5C%5Cn%5C%5Cn%20%20%20%20%20%20%20%20%2F%2F%20Hier%20werden%20Geschwindigkeit%20und%20Distanz%20eingelesen.%5C%5Cn%20%20%20%20%20%20%20%20%2F%2F%20Diesen%20Teil%20nicht%20%C3%A4ndern.%5C%5Cn%20%20%20%20%20%20%20%20Scanner%20keyScan%20%3D%20new%20Scanner(System.in)%3B%5C%5Cn%20%20%20%20%20%20%20%20System.out.print(%5C%5C%5C%22Geschwindigkeit%20(km%2Fh)%3A%20%5C%5C%5C%22)%3B%5C%5Cn%20%20%20%20%20%20%20%20double%20v%20%3D%20keyScan.nextDouble()%3B%5C%5Cn%20%20%20%20%20%20%20%20System.out.print(%5C%5C%5C%22Distanz%20(km)%3A%20%5C%5C%5C%22)%3B%5C%5Cn%20%20%20%20%20%20%20%20double%20d%20%3D%20keyScan.nextDouble()%5C%5Cn%5C%5Cn%20%20%20%20%20%20%20%20%2F%2F%20Hier%20soll%20die%20Reisezeit%20(in%20Minuten)%20berechnet%20und%20anschliessend%20ausgegeben%20werden.%5C%5Cn%20%20%20%20%20%20%20%20%2F%2F%20Die%20Geschwindigkeit%20befindet%20sich%20in%20der%20Variablen%20v%2C%20die%20Distanz%20in%20der%20Variablen%20d.%5C%5Cn%20%20%20%20%20%20%20%20double%20reisezeit%20%3D%20d%20%2F%20v%20*%2060%3B%5C%5Cn%20%20%20%20%20%20%20%20System.out.println(%5C%5C%5C%22Reisezeit%20(min)%3A%20%5C%5C%5C%22%20%2B%20reisezeit)%3B%5C%5Cn%20%20%20%20%7D%5C%5Cn%7D%5C%22%2C%5C%22uniqueId%5C%22%3A2%2C%5C%22parentUId%5C%22%3A0%2C%5C%22isFolder%5C%22%3Afalse%2C%5C%22id%5C%22%3A107%2C%5C%22isHidden%5C%22%3Afalse%2C%5C%22isStatic%5C%22%3Afalse%7D%2C%7B%5C%22filename%5C%22%3A%5C%22Root%5C%22%2C%5C%22path%5C%22%3A%5C%22%5C%22%2C%5C%22content%5C%22%3A%5C%22%5C%22%2C%5C%22uniqueId%5C%22%3A0%2C%5C%22parentUId%5C%22%3A-1%2C%5C%22isFolder%5C%22%3Atrue%2C%5C%22id%5C%22%3A105%2C%5C%22isHidden%5C%22%3Afalse%2C%5C%22isStatic%5C%22%3Afalse%7D%5D%22%2C\n    \"hiddenFilesDump\": \"[{\\\"id\\\":7,\\\"filename\\\":\\\"codeboard.json\\\",\\\"path\\\":\\\"Root\\\",\\\"uniqueId\\\":1,\\\"parentUId\\\":0,\\\"isFolder\\\":false,\\\"content\\\":\\\"{\\\\r\\\\n    \\\\\\\"_comment\\\\\\\": \\\\\\\"Specify the main file used for compiling your application. Specify the main class used for running your application.\\\\\\\",\\\\r\\\\n    \\\\\\\"MainFileForCompilation\\\\\\\": \\\\\\\"Main.java\\\\\\\",\\\\r\\\\n    \\\\\\\"MainClassForRunning\\\\\\\": \\\\\\\"Main\\\\\\\",\\\\t\\\\r\\\\n\\\\t\\\\\\\"userDisabledActions\\\\\\\": [],\\\\r\\\\n    \\\\\\\"userEnabledActions\\\\\\\": [\\\\\\\"tree-view\\\\\\\"],\\\\r\\\\n    \\\\\\\"Testing\\\\\\\": {\\\\r\\\\n        \\\\\\\"onSuccess\\\\\\\": \\\\\\\"Sehr gut, das hat geklappt. Du bist nun bereit für den Kurs. Du kannst deine Lösung mit dem blauen Submit-Button abgeben. Mach doch anschliessend gleich mit der nächsten Lektion weiter!\\\\\\\",\\\\r\\\\n        \\\\\\\"useCompileTests\\\\\\\": true,\\\\r\\\\n        \\\\\\\"ioTests\\\\\\\": [\\\\r\\\\n            {\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Ausgabe Testen\\\\\\\",\\\\r\\\\n                \\\\\\\"input\\\\\\\": [\\\\r\\\\n                ],\\\\r\\\\n                \\\\\\\"expectedOutput\\\\\\\": \\\\\\\"Java ist ein Kaffee\\\\\\\",\\\\r\\\\n                \\\\\\\"tests\\\\\\\": [\\\\r\\\\n                    {\\\\r\\\\n                        \\\\\\\"matching\\\\\\\": \\\\\\\"Java ist ein Kaffee\\\\\\\",\\\\r\\\\n                        \\\\\\\"pass\\\\\\\": true,\\\\r\\\\n                        \\\\\\\"note\\\\\\\": \\\\\\\"Die Ausgabe des Programms ist richtig.\\\\\\\",\\\\r\\\\n                        \\\\\\\"type\\\\\\\": \\\\\\\"strict\\\\\\\"\\\\r\\\\n                    },\\\\r\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t{\\\\r\\\\n                        \\\\\\\"matching\\\\\\\": \\\\\\\"Java ist eine Insel\\\\\\\",\\\\r\\\\n                        \\\\\\\"pass\\\\\\\": false,\\\\r\\\\n                        \\\\\\\"note\\\\\\\": \\\\\\\"He, du willst mich wohl reinlegen! Du hast ja gar nichts gemacht. Lies die Aufgabenstellung durch und versuche es dann nochmals.\\\\\\\",\\\\r\\\\n                        \\\\\\\"type\\\\\\\": \\\\\\\"strict\\\\\\\"\\\\r\\\\n                    },\\\\r\\\\n                    {\\\\r\\\\n                        \\\\\\\"matching\\\\\\\": \\\\\\\"Java ist eine Kaffee\\\\\\\",\\\\r\\\\n                        \\\\\\\"pass\\\\\\\": false,\\\\r\\\\n                        \\\\\\\"note\\\\\\\": \\\\\\\"Es heisst \\\\\\\\\\\\\\\"ein Kaffee\\\\\\\\\\\\\\\" und nicht \\\\\\\\\\\\\\\"eine Kaffee\\\\\\\\\\\\\\\". Passe deine Lösung noch entsprechend an.\\\\\\\",\\\\r\\\\n                        \\\\\\\"type\\\\\\\": \\\\\\\"strict\\\\\\\"\\\\r\\\\n                    },\\\\r\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t{\\\\r\\\\n                        \\\\\\\"matching\\\\\\\": \\\\\\\".*\\\\\\\",\\\\r\\\\n                        \\\\\\\"pass\\\\\\\": false,\\\\r\\\\n                        \\\\\\\"note\\\\\\\": \\\\\\\"Die Ausgabe ist noch nicht richtig. Dein Programm wird vom System nur akzeptiert, wenn es die Ausgabe \\\\\\\\\\\\\\\"Java ist ein Kaffee\\\\\\\\\\\\\\\" macht. Versuche es nochmal!\\\\\\\",\\\\r\\\\n                        \\\\\\\"type\\\\\\\": \\\\\\\"regex\\\\\\\"\\\\r\\\\n                    }\\\\r\\\\n                ]\\\\r\\\\n            }\\\\r\\\\n        ]\\\\r\\\\n    },\\\\r\\\\n    \\\\\\\"Help\\\\\\\": {\\\\r\\\\n        \\\\\\\"tips\\\\\\\": [\\\\r\\\\n            \\\\t{\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Tipp 1\\\\\\\",\\\\r\\\\n                \\\\\\\"note\\\\\\\": \\\\\\\"Der Text in der Print-Anweisung muss in doppelten Anführungszeichen stehen.\\\\\\\",\\\\r\\\\n                \\\\\\\"mustMatch\\\\\\\": true,\\\\r\\\\n                \\\\\\\"matching\\\\\\\": \\\\\\\"System\\\\\\\\\\\\\\\\.out\\\\\\\\\\\\\\\\.println\\\\\\\\\\\\\\\\([\\\\\\\\\\\\\\\\w\\\\\\\\\\\\\\\\s]+\\\\\\\\\\\\\\\\)\\\\\\\\\\\\\\\\s*;\\\\\\\"\\\\r\\\\n            },\\\\r\\\\n            {\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Tipp 2\\\\\\\",\\\\r\\\\n                \\\\\\\"note\\\\\\\": \\\\\\\"Du musst lediglich die dritte Zeile anpassen. Ersetze dort einfach den Text &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist eine Insel&lt;/i&gt; mit &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist ein Kaffee&lt;/i&gt;. Achte darauf, dass am Anfang und am Ende des Textes doppelte Anführungszeichen stehen.\\\\\\\",\\\\r\\\\n                \\\\\\\"mustMatch\\\\\\\": false,\\\\r\\\\n                \\\\\\\"matching\\\\\\\": \\\\\\\"System\\\\\\\\\\\\\\\\.out\\\\\\\\\\\\\\\\.println\\\\\\\\\\\\\\\\(\\\\\\\\\\\\\\\"Java ist ein Kaffee\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\);\\\\\\\"\\\\r\\\\n            },\\\\r\\\\n            {\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Test-Tipp\\\\\\\",\\\\r\\\\n                \\\\\\\"note\\\\\\\": \\\\\\\"Verwende die Methode &lt;tt&gt;length()&lt;/tt&gt;. Achte auf die korrekte Schreibweise.\\\\\\\",\\\\r\\\\n                \\\\\\\"mustMatch\\\\\\\": false,\\\\r\\\\n                \\\\\\\"matching\\\\\\\": \\\\\\\"\\\\\\\\\\\\\\\\w*\\\\\\\\\\\\\\\\.length\\\\\\\\\\\\\\\\(\\\\\\\\\\\\\\\\)\\\\\\\"\\\\r\\\\n            },\\\\r\\\\n            {\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Standard-Tipp\\\\\\\",\\\\r\\\\n                \\\\\\\"note\\\\\\\": \\\\\\\"Test\\\\\\\"\\\\r\\\\n            },\\\\r\\\\n            {\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Standard-Tipp1\\\\\\\",\\\\r\\\\n                \\\\\\\"note\\\\\\\": \\\\\\\"Test1\\\\\\\"\\\\r\\\\n            }\\\\r\\\\n\\\\t\\\\t\\\\r\\\\n        ]\\\\r\\\\n    }\\\\r\\\\n}\\\",\\\"isHidden\\\":true,\\\"isStatic\\\":false,\\\"createdAt\\\":\\\"2023-03-10T14:35:56.000Z\\\",\\\"updatedAt\\\":\\\"2024-01-24T11:05:43.000Z\\\",\\\"ProjectId\\\":2},{\\\"id\\\":9,\\\"filename\\\":\\\"projectDescription.html\\\",\\\"path\\\":\\\"Root\\\",\\\"uniqueId\\\":3,\\\"parentUId\\\":0,\\\"isFolder\\\":false,\\\"content\\\":\\\"&lt;div class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=\\\\\\\"projectDescription\\\\\\\"&gt;\\\\r\\\\n&lt;img class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; src=&amp;#x27;images\\\\\\\\projects\\\\\\\\2082111.jpg&amp;#x27; alt=&amp;#x27;2082111.jpg&amp;#x27; width=&amp;#x27;90%&amp;#x27;&gt;\\\\r\\\\n&lt;h2 class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Aufgabenstellung&lt;/h2&gt;\\\\r\\\\n    &lt;p class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Ersetze im Programm &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist eine Insel&lt;/i&gt; durch &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist ein Kaffee&lt;/i&gt;. Führe anschliessend \\\\r\\\\n\\\\tdas Programm mit &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Run&lt;/i&gt; aus. Wenn du zufrieden bist mit dem Programm, führe dem Test aus. &lt;/p&gt;\\\\r\\\\n\\\\t&lt;p class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;&lt;strong class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Achtung:&lt;/b&gt; Dein Programm wird vom System nur akzeptiert, wenn es genau die richtige Ausgabe macht. &lt;/p&gt;\\\\r\\\\n\\\\t&lt;p class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Wenn der Test \\\\r\\\\n\\\\tfunktioniert hat, kannst du anschliessend die Aufgabe mit dem Submit-Button abgeben. Nach der Abgabe kannst \\\\r\\\\n\\\\tdu auf der Hauptseite des Kurses die nächste Lektion aufrufen.&lt;/p&gt;\\\\r\\\\n&lt;/div&gt;\\\",\\\"isHidden\\\":true,\\\"isStatic\\\":false,\\\"createdAt\\\":\\\"2023-03-10T14:35:56.000Z\\\",\\\"updatedAt\\\":\\\"2024-01-25T13:11:03.000Z\\\",\\\"ProjectId\\\":2},{\\\"id\\\":10,\\\"filename\\\":\\\"sampleSolution.html\\\",\\\"path\\\":\\\"Root\\\",\\\"uniqueId\\\":21,\\\"parentUId\\\":0,\\\"isFolder\\\":false,\\\"content\\\":\\\"&lt;div class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=\\\\\\\"sampleSolution\\\\\\\"&gt;\\\\r\\\\n&lt;pre class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;&lt;code class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27; class=\\\\\\\"language-java\\\\\\\" prism&gt;public class Main {\\\\r\\\\n  public static void main(String[] args) {\\\\r\\\\n    System.out.println(\\\\\\\"Java ist ein Kaffee\\\\\\\");\\\\r\\\\n  }\\\\r\\\\n}&lt;/code&gt;&lt;/pre&gt;\\\\r\\\\n&lt;/div&gt;\\\",\\\"isHidden\\\":true,\\\"isStatic\\\":true,\\\"createdAt\\\":\\\"2023-03-10T14:37:04.000Z\\\",\\\"updatedAt\\\":\\\"2024-01-19T10:43:38.000Z\\\",\\\"ProjectId\\\":2}]\",\n%20%20%20%20%22projectId%22%3A%20%222%22%2C\n%20%20%20%20%22userId%22%3A%202%2C\n%20%20%20%20%22ltiSessionId%22%3A%20-1%2C\n%20%20%20%20%22courseId%22%3A%205%2C\n%20%20%20%20%22updatedAt%22%3A%20%222024-04-15T06%3A08%3A21.005Z%22%2C\n%20%20%20%20%22createdAt%22%3A%20%222024-04-15T06%3A08%3A21.005Z%22\n%7D\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","helpRequests"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"2ded2502-2850-4f63-8b07-31247636c6c1"},{"name":"updateHelpRequest","id":"fb7a7c33-fce5-4f07-8882-50c90abed7df","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n  \"status\": \"answered\",\r\n  \"helpRequestId\": 36,\r\n  \"courseId\": null\r\n}   ","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/helpRequests","description":"<p>This endpoint modifies an existing help request (e.g. the status unanswered --&gt; answered)</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested course (courseId) exists mw.isAuth: req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>PUT /api/projects/{{projectId}}/helpRequests</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 36,\n  \"status\": \"answered\",\n  \"userFilesDump\": \"[{\\\"filename\\\":\\\"Main.java\\\",\\\"path\\\":\\\"Root\\\",\\\"content\\\":\\\"import java.util.Scanner;\\\\n\\\\npublic class Main {\\\\n    public static void main(String[] args) {\\\\n\\\\n        // Hier werden Geschwindigkeit und Distanz eingelesen.\\\\n        // Diesen Teil nicht ändern.\\\\n        Scanner keyScan = new Scanner(System.in);\\\\n        System.out.print(\\\\\\\"Geschwindigkeit (km/h): \\\\\\\");\\\\n        double v = keyScan.nextDouble();\\\\n        System.out.print(\\\\\\\"Distanz (km): \\\\\\\");\\\\n        double d = keyScan.nextDouble()\\\\n\\\\n        // Hier soll die Reisezeit (in Minuten) berechnet und anschliessend ausgegeben werden.\\\\n        // Die Geschwindigkeit befindet sich in der Variablen v, die Distanz in der Variablen d.\\\\n        double reisezeit = d / v * 60;\\\\n        System.out.println(\\\\\\\"Reisezeit (min): \\\\\\\" + reisezeit);\\\\n    }\\\\n}\\\",\\\"uniqueId\\\":2,\\\"parentUId\\\":0,\\\"isFolder\\\":false,\\\"id\\\":107,\\\"isHidden\\\":false,\\\"isStatic\\\":false},{\\\"filename\\\":\\\"Root\\\",\\\"path\\\":\\\"\\\",\\\"content\\\":\\\"\\\",\\\"uniqueId\\\":0,\\\"parentUId\\\":-1,\\\"isFolder\\\":true,\\\"id\\\":105,\\\"isHidden\\\":false,\\\"isStatic\\\":false}]\",\n  \"hiddenFilesDump\": \"[{\\\"id\\\":7,\\\"filename\\\":\\\"codeboard.json\\\",\\\"path\\\":\\\"Root\\\",\\\"uniqueId\\\":1,\\\"parentUId\\\":0,\\\"isFolder\\\":false,\\\"content\\\":\\\"{\\\\r\\\\n    \\\\\\\"_comment\\\\\\\": \\\\\\\"Specify the main file used for compiling your application. Specify the main class used for running your application.\\\\\\\",\\\\r\\\\n    \\\\\\\"MainFileForCompilation\\\\\\\": \\\\\\\"Main.java\\\\\\\",\\\\r\\\\n    \\\\\\\"MainClassForRunning\\\\\\\": \\\\\\\"Main\\\\\\\",\\\\t\\\\r\\\\n\\\\t\\\\\\\"userDisabledActions\\\\\\\": [],\\\\r\\\\n    \\\\\\\"userEnabledActions\\\\\\\": [\\\\\\\"tree-view\\\\\\\"],\\\\r\\\\n    \\\\\\\"Testing\\\\\\\": {\\\\r\\\\n        \\\\\\\"onSuccess\\\\\\\": \\\\\\\"Sehr gut, das hat geklappt. Du bist nun bereit für den Kurs. Du kannst deine Lösung mit dem blauen Submit-Button abgeben. Mach doch anschliessend gleich mit der nächsten Lektion weiter!\\\\\\\",\\\\r\\\\n        \\\\\\\"useCompileTests\\\\\\\": true,\\\\r\\\\n        \\\\\\\"ioTests\\\\\\\": [\\\\r\\\\n            {\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Ausgabe Testen\\\\\\\",\\\\r\\\\n                \\\\\\\"input\\\\\\\": [\\\\r\\\\n                ],\\\\r\\\\n                \\\\\\\"expectedOutput\\\\\\\": \\\\\\\"Java ist ein Kaffee\\\\\\\",\\\\r\\\\n                \\\\\\\"tests\\\\\\\": [\\\\r\\\\n                    {\\\\r\\\\n                        \\\\\\\"matching\\\\\\\": \\\\\\\"Java ist ein Kaffee\\\\\\\",\\\\r\\\\n                        \\\\\\\"pass\\\\\\\": true,\\\\r\\\\n                        \\\\\\\"note\\\\\\\": \\\\\\\"Die Ausgabe des Programms ist richtig.\\\\\\\",\\\\r\\\\n                        \\\\\\\"type\\\\\\\": \\\\\\\"strict\\\\\\\"\\\\r\\\\n                    },\\\\r\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t{\\\\r\\\\n                        \\\\\\\"matching\\\\\\\": \\\\\\\"Java ist eine Insel\\\\\\\",\\\\r\\\\n                        \\\\\\\"pass\\\\\\\": false,\\\\r\\\\n                        \\\\\\\"note\\\\\\\": \\\\\\\"He, du willst mich wohl reinlegen! Du hast ja gar nichts gemacht. Lies die Aufgabenstellung durch und versuche es dann nochmals.\\\\\\\",\\\\r\\\\n                        \\\\\\\"type\\\\\\\": \\\\\\\"strict\\\\\\\"\\\\r\\\\n                    },\\\\r\\\\n                    {\\\\r\\\\n                        \\\\\\\"matching\\\\\\\": \\\\\\\"Java ist eine Kaffee\\\\\\\",\\\\r\\\\n                        \\\\\\\"pass\\\\\\\": false,\\\\r\\\\n                        \\\\\\\"note\\\\\\\": \\\\\\\"Es heisst \\\\\\\\\\\\\\\"ein Kaffee\\\\\\\\\\\\\\\" und nicht \\\\\\\\\\\\\\\"eine Kaffee\\\\\\\\\\\\\\\". Passe deine Lösung noch entsprechend an.\\\\\\\",\\\\r\\\\n                        \\\\\\\"type\\\\\\\": \\\\\\\"strict\\\\\\\"\\\\r\\\\n                    },\\\\r\\\\n\\\\t\\\\t\\\\t\\\\t\\\\t{\\\\r\\\\n                        \\\\\\\"matching\\\\\\\": \\\\\\\".*\\\\\\\",\\\\r\\\\n                        \\\\\\\"pass\\\\\\\": false,\\\\r\\\\n                        \\\\\\\"note\\\\\\\": \\\\\\\"Die Ausgabe ist noch nicht richtig. Dein Programm wird vom System nur akzeptiert, wenn es die Ausgabe \\\\\\\\\\\\\\\"Java ist ein Kaffee\\\\\\\\\\\\\\\" macht. Versuche es nochmal!\\\\\\\",\\\\r\\\\n                        \\\\\\\"type\\\\\\\": \\\\\\\"regex\\\\\\\"\\\\r\\\\n                    }\\\\r\\\\n                ]\\\\r\\\\n            }\\\\r\\\\n        ]\\\\r\\\\n    },\\\\r\\\\n    \\\\\\\"Help\\\\\\\": {\\\\r\\\\n        \\\\\\\"tips\\\\\\\": [\\\\r\\\\n            \\\\t{\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Tipp 1\\\\\\\",\\\\r\\\\n                \\\\\\\"note\\\\\\\": \\\\\\\"Der Text in der Print-Anweisung muss in doppelten Anführungszeichen stehen.\\\\\\\",\\\\r\\\\n                \\\\\\\"mustMatch\\\\\\\": true,\\\\r\\\\n                \\\\\\\"matching\\\\\\\": \\\\\\\"System\\\\\\\\\\\\\\\\.out\\\\\\\\\\\\\\\\.println\\\\\\\\\\\\\\\\([\\\\\\\\\\\\\\\\w\\\\\\\\\\\\\\\\s]+\\\\\\\\\\\\\\\\)\\\\\\\\\\\\\\\\s*;\\\\\\\"\\\\r\\\\n            },\\\\r\\\\n            {\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Tipp 2\\\\\\\",\\\\r\\\\n                \\\\\\\"note\\\\\\\": \\\\\\\"Du musst lediglich die dritte Zeile anpassen. Ersetze dort einfach den Text &lt;i&gt;Java ist eine Insel&lt;/i&gt; mit &lt;i&gt;Java ist ein Kaffee&lt;/i&gt;. Achte darauf, dass am Anfang und am Ende des Textes doppelte Anführungszeichen stehen.\\\\\\\",\\\\r\\\\n                \\\\\\\"mustMatch\\\\\\\": false,\\\\r\\\\n                \\\\\\\"matching\\\\\\\": \\\\\\\"System\\\\\\\\\\\\\\\\.out\\\\\\\\\\\\\\\\.println\\\\\\\\\\\\\\\\(\\\\\\\\\\\\\\\"Java ist ein Kaffee\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\);\\\\\\\"\\\\r\\\\n            },\\\\r\\\\n            {\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Test-Tipp\\\\\\\",\\\\r\\\\n                \\\\\\\"note\\\\\\\": \\\\\\\"Verwende die Methode &lt;tt&gt;length()&lt;/tt&gt;. Achte auf die korrekte Schreibweise.\\\\\\\",\\\\r\\\\n                \\\\\\\"mustMatch\\\\\\\": false,\\\\r\\\\n                \\\\\\\"matching\\\\\\\": \\\\\\\"\\\\\\\\\\\\\\\\w*\\\\\\\\\\\\\\\\.length\\\\\\\\\\\\\\\\(\\\\\\\\\\\\\\\\)\\\\\\\"\\\\r\\\\n            },\\\\r\\\\n            {\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Standard-Tipp\\\\\\\",\\\\r\\\\n                \\\\\\\"note\\\\\\\": \\\\\\\"Test\\\\\\\"\\\\r\\\\n            },\\\\r\\\\n            {\\\\r\\\\n                \\\\\\\"name\\\\\\\": \\\\\\\"Standard-Tipp1\\\\\\\",\\\\r\\\\n                \\\\\\\"note\\\\\\\": \\\\\\\"Test1\\\\\\\"\\\\r\\\\n            }\\\\r\\\\n\\\\t\\\\t\\\\r\\\\n        ]\\\\r\\\\n    }\\\\r\\\\n}\\\",\\\"isHidden\\\":true,\\\"isStatic\\\":false,\\\"createdAt\\\":\\\"2023-03-10T14:35:56.000Z\\\",\\\"updatedAt\\\":\\\"2024-01-24T11:05:43.000Z\\\",\\\"ProjectId\\\":2},{\\\"id\\\":9,\\\"filename\\\":\\\"projectDescription.html\\\",\\\"path\\\":\\\"Root\\\",\\\"uniqueId\\\":3,\\\"parentUId\\\":0,\\\"isFolder\\\":false,\\\"content\\\":\\\"&lt;div class=\\\\\\\"projectDescription\\\\\\\"&gt;\\\\r\\\\n&lt;img src=&amp;#x27;images\\\\\\\\projects\\\\\\\\2082111.jpg&amp;#x27; alt=&amp;#x27;2082111.jpg&amp;#x27; width=&amp;#x27;90%&amp;#x27;&gt;\\\\r\\\\n&lt;h2&gt;Aufgabenstellung&lt;/h2&gt;\\\\r\\\\n    &lt;p&gt;Ersetze im Programm &lt;i&gt;Java ist eine Insel&lt;/i&gt; durch &lt;i&gt;Java ist ein Kaffee&lt;/i&gt;. Führe anschliessend \\\\r\\\\n\\\\tdas Programm mit &lt;i&gt;Run&lt;/i&gt; aus. Wenn du zufrieden bist mit dem Programm, führe dem Test aus. &lt;/p&gt;\\\\r\\\\n\\\\t&lt;p&gt;&lt;b&gt;Achtung:&lt;/b&gt; Dein Programm wird vom System nur akzeptiert, wenn es genau die richtige Ausgabe macht. &lt;/p&gt;\\\\r\\\\n\\\\t&lt;p&gt;Wenn der Test \\\\r\\\\n\\\\tfunktioniert hat, kannst du anschliessend die Aufgabe mit dem Submit-Button abgeben. Nach der Abgabe kannst \\\\r\\\\n\\\\tdu auf der Hauptseite des Kurses die nächste Lektion aufrufen.&lt;/p&gt;\\\\r\\\\n&lt;/div&gt;\\\",\\\"isHidden\\\":true,\\\"isStatic\\\":false,\\\"createdAt\\\":\\\"2023-03-10T14:35:56.000Z\\\",\\\"updatedAt\\\":\\\"2024-01-25T13:11:03.000Z\\\",\\\"ProjectId\\\":2},{\\\"id\\\":10,\\\"filename\\\":\\\"sampleSolution.html\\\",\\\"path\\\":\\\"Root\\\",\\\"uniqueId\\\":21,\\\"parentUId\\\":0,\\\"isFolder\\\":false,\\\"content\\\":\\\"&lt;div class=\\\\\\\"sampleSolution\\\\\\\"&gt;\\\\r\\\\n&lt;pre&gt;&lt;code class=\\\\\\\"language-java\\\\\\\" prism&gt;public class Main {\\\\r\\\\n  public static void main(String[] args) {\\\\r\\\\n    System.out.println(\\\\\\\"Java ist ein Kaffee\\\\\\\");\\\\r\\\\n  }\\\\r\\\\n}&lt;/code&gt;&lt;/pre&gt;\\\\r\\\\n&lt;/div&gt;\\\",\\\"isHidden\\\":true,\\\"isStatic\\\":true,\\\"createdAt\\\":\\\"2023-03-10T14:37:04.000Z\\\",\\\"updatedAt\\\":\\\"2024-01-19T10:43:38.000Z\\\",\\\"ProjectId\\\":2}]\",\n  \"createdAt\": \"2024-04-15T06:08:21.000Z\",\n  \"updatedAt\": \"2024-04-15T06:15:52.825Z\",\n  \"courseId\": 5,\n  \"projectId\": 2,\n  \"userId\": 2,\n  \"ltiSessionId\": -1\n}\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","helpRequests"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"fb7a7c33-fce5-4f07-8882-50c90abed7df"},{"name":"getHelpRequest","id":"f5abdbb3-9e56-4425-892e-1bf666922856","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/helpRequests/{{helpRequestId}}","description":"<p>This endpoint returns a specific help request in a given project</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectIdAndHelpRequestIdCombo: checks a specific help request exists in a given project mw.isAuth: req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/projects/{{projectId}}/helpRequests/{{helpRequestId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">%7B\n%20%20%20%20%22helpRequestId%22%3A%2036%2C\n%20%20%20%20%22isLtiHelp%22%3A%20false%2C\n%20%20%20%20%22createdAt%22%3A%20%222024-04-15T06%3A08%3A21.000Z%22%2C\n%20%20%20%20%22updatedAt%22%3A%20%222024-04-15T06%3A15%3A52.000Z%22%2C\n%20%20%20%20%22projectName%22%3A%20%22Test-Insel%22%2C\n%20%20%20%20%22status%22%3A%20%22answered%22%2C\n%20%20%20%20%22userFilesDump%22%3A%20%5B\n%20%20%20%20%20%20%20%20%7B\n%20%20%20%20%20%20%20%20%20%20%20%20%22filename%22%3A%20%22Main.java%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22path%22%3A%20%22Root%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22content%22%3A%20%22import%20java.util.Scanner%3B%5Cn%5Cnpublic%20class%20Main%20%7B%5Cn%20%20%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%5Cn%5Cn%20%20%20%20%20%20%20%20%2F%2F%20Hier%20werden%20Geschwindigkeit%20und%20Distanz%20eingelesen.%5Cn%20%20%20%20%20%20%20%20%2F%2F%20Diesen%20Teil%20nicht%20%C3%A4ndern.%5Cn%20%20%20%20%20%20%20%20Scanner%20keyScan%20%3D%20new%20Scanner(System.in)%3B%5Cn%20%20%20%20%20%20%20%20System.out.print(%5C%22Geschwindigkeit%20(km%2Fh)%3A%20%5C%22)%3B%5Cn%20%20%20%20%20%20%20%20double%20v%20%3D%20keyScan.nextDouble()%3B%5Cn%20%20%20%20%20%20%20%20System.out.print(%5C%22Distanz%20(km)%3A%20%5C%22)%3B%5Cn%20%20%20%20%20%20%20%20double%20d%20%3D%20keyScan.nextDouble()%5Cn%5Cn%20%20%20%20%20%20%20%20%2F%2F%20Hier%20soll%20die%20Reisezeit%20(in%20Minuten)%20berechnet%20und%20anschliessend%20ausgegeben%20werden.%5Cn%20%20%20%20%20%20%20%20%2F%2F%20Die%20Geschwindigkeit%20befindet%20sich%20in%20der%20Variablen%20v%2C%20die%20Distanz%20in%20der%20Variablen%20d.%5Cn%20%20%20%20%20%20%20%20double%20reisezeit%20%3D%20d%20%2F%20v%20*%2060%3B%5Cn%20%20%20%20%20%20%20%20System.out.println(%5C%22Reisezeit%20(min)%3A%20%5C%22%20%2B%20reisezeit)%3B%5Cn%20%20%20%20%7D%5Cn%7D%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22uniqueId%22%3A%202%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22parentUId%22%3A%200%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isFolder%22%3A%20false%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%20107%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isHidden%22%3A%20false%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isStatic%22%3A%20false\n%20%20%20%20%20%20%20%20%7D%2C\n%20%20%20%20%20%20%20%20%7B\n%20%20%20%20%20%20%20%20%20%20%20%20%22filename%22%3A%20%22Root%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22path%22%3A%20%22%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22content%22%3A%20%22%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22uniqueId%22%3A%200%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22parentUId%22%3A%20-1%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isFolder%22%3A%20true%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%20105%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isHidden%22%3A%20false%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isStatic%22%3A%20false\n%20%20%20%20%20%20%20%20%7D\n%20%20%20%20%5D%2C\n%20%20%20%20%22hiddenFilesDump%22%3A%20%5B\n%20%20%20%20%20%20%20%20%7B\n%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%207%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22filename%22%3A%20%22codeboard.json%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22path%22%3A%20%22Root%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22uniqueId%22%3A%201%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22parentUId%22%3A%200%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isFolder%22%3A%20false%2C\n            \"content\": \"{\\r\\n    \\\"_comment\\\": \\\"Specify the main file used for compiling your application. Specify the main class used for running your application.\\\",\\r\\n    \\\"MainFileForCompilation\\\": \\\"Main.java\\\",\\r\\n    \\\"MainClassForRunning\\\": \\\"Main\\\",\\t\\r\\n\\t\\\"userDisabledActions\\\": [],\\r\\n    \\\"userEnabledActions\\\": [\\\"tree-view\\\"],\\r\\n    \\\"Testing\\\": {\\r\\n        \\\"onSuccess\\\": \\\"Sehr gut, das hat geklappt. Du bist nun bereit für den Kurs. Du kannst deine Lösung mit dem blauen Submit-Button abgeben. Mach doch anschliessend gleich mit der nächsten Lektion weiter!\\\",\\r\\n        \\\"useCompileTests\\\": true,\\r\\n        \\\"ioTests\\\": [\\r\\n            {\\r\\n                \\\"name\\\": \\\"Ausgabe Testen\\\",\\r\\n                \\\"input\\\": [\\r\\n                ],\\r\\n                \\\"expectedOutput\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                \\\"tests\\\": [\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist ein Kaffee\\\",\\r\\n                        \\\"pass\\\": true,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe des Programms ist richtig.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\"Java ist eine Insel\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"He, du willst mich wohl reinlegen! Du hast ja gar nichts gemacht. Lies die Aufgabenstellung durch und versuche es dann nochmals.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n                    {\\r\\n                        \\\"matching\\\": \\\"Java ist eine Kaffee\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Es heisst \\\\\\\"ein Kaffee\\\\\\\" und nicht \\\\\\\"eine Kaffee\\\\\\\". Passe deine Lösung noch entsprechend an.\\\",\\r\\n                        \\\"type\\\": \\\"strict\\\"\\r\\n                    },\\r\\n\\t\\t\\t\\t\\t{\\r\\n                        \\\"matching\\\": \\\".*\\\",\\r\\n                        \\\"pass\\\": false,\\r\\n                        \\\"note\\\": \\\"Die Ausgabe ist noch nicht richtig. Dein Programm wird vom System nur akzeptiert, wenn es die Ausgabe \\\\\\\"Java ist ein Kaffee\\\\\\\" macht. Versuche es nochmal!\\\",\\r\\n                        \\\"type\\\": \\\"regex\\\"\\r\\n                    }\\r\\n                ]\\r\\n            }\\r\\n        ]\\r\\n    },\\r\\n    \\\"Help\\\": {\\r\\n        \\\"tips\\\": [\\r\\n            \\t{\\r\\n                \\\"name\\\": \\\"Tipp 1\\\",\\r\\n                \\\"note\\\": \\\"Der Text in der Print-Anweisung muss in doppelten Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": true,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\([\\\\\\\\w\\\\\\\\s]+\\\\\\\\)\\\\\\\\s*;\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Tipp 2\\\",\\r\\n                \\\"note\\\": \\\"Du musst lediglich die dritte Zeile anpassen. Ersetze dort einfach den Text &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist eine Insel&lt;/i&gt; mit &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist ein Kaffee&lt;/i&gt;. Achte darauf, dass am Anfang und am Ende des Textes doppelte Anführungszeichen stehen.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"System\\\\\\\\.out\\\\\\\\.println\\\\\\\\(\\\\\\\"Java ist ein Kaffee\\\\\\\"\\\\\\\\);\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Test-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Verwende die Methode &lt;tt&gt;length()&lt;/tt&gt;. Achte auf die korrekte Schreibweise.\\\",\\r\\n                \\\"mustMatch\\\": false,\\r\\n                \\\"matching\\\": \\\"\\\\\\\\w*\\\\\\\\.length\\\\\\\\(\\\\\\\\)\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp\\\",\\r\\n                \\\"note\\\": \\\"Test\\\"\\r\\n            },\\r\\n            {\\r\\n                \\\"name\\\": \\\"Standard-Tipp1\\\",\\r\\n                \\\"note\\\": \\\"Test1\\\"\\r\\n            }\\r\\n\\t\\t\\r\\n        ]\\r\\n    }\\r\\n}\",\n%20%20%20%20%20%20%20%20%20%20%20%20%22isHidden%22%3A%20true%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isStatic%22%3A%20false%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22createdAt%22%3A%20%222023-03-10T14%3A35%3A56.000Z%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22updatedAt%22%3A%20%222024-01-24T11%3A05%3A43.000Z%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22ProjectId%22%3A%202\n%20%20%20%20%20%20%20%20%7D%2C\n%20%20%20%20%20%20%20%20%7B\n%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%209%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22filename%22%3A%20%22projectDescription.html%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22path%22%3A%20%22Root%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22uniqueId%22%3A%203%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22parentUId%22%3A%200%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isFolder%22%3A%20false%2C\n            \"content\": \"&lt;div class=&amp;#x27;preserveHtml&amp;#x27; class=\\\"projectDescription\\\"&gt;\\r\\n&lt;img class=&amp;#x27;preserveHtml&amp;#x27; src=&amp;#x27;images\\\\projects\\\\2082111.jpg&amp;#x27; alt=&amp;#x27;2082111.jpg&amp;#x27; width=&amp;#x27;90%&amp;#x27;&gt;\\r\\n&lt;h2 class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Aufgabenstellung&lt;/h2&gt;\\r\\n    &lt;p class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Ersetze im Programm &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist eine Insel&lt;/i&gt; durch &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Java ist ein Kaffee&lt;/i&gt;. Führe anschliessend \\r\\n\\tdas Programm mit &lt;i class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Run&lt;/i&gt; aus. Wenn du zufrieden bist mit dem Programm, führe dem Test aus. &lt;/p&gt;\\r\\n\\t&lt;p class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;&lt;strong class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Achtung:&lt;/b&gt; Dein Programm wird vom System nur akzeptiert, wenn es genau die richtige Ausgabe macht. &lt;/p&gt;\\r\\n\\t&lt;p class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;Wenn der Test \\r\\n\\tfunktioniert hat, kannst du anschliessend die Aufgabe mit dem Submit-Button abgeben. Nach der Abgabe kannst \\r\\n\\tdu auf der Hauptseite des Kurses die nächste Lektion aufrufen.&lt;/p&gt;\\r\\n&lt;/div&gt;\",\n%20%20%20%20%20%20%20%20%20%20%20%20%22isHidden%22%3A%20true%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isStatic%22%3A%20false%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22createdAt%22%3A%20%222023-03-10T14%3A35%3A56.000Z%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22updatedAt%22%3A%20%222024-01-25T13%3A11%3A03.000Z%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22ProjectId%22%3A%202\n%20%20%20%20%20%20%20%20%7D%2C\n%20%20%20%20%20%20%20%20%7B\n%20%20%20%20%20%20%20%20%20%20%20%20%22id%22%3A%2010%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22filename%22%3A%20%22sampleSolution.html%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22path%22%3A%20%22Root%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22uniqueId%22%3A%2021%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22parentUId%22%3A%200%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isFolder%22%3A%20false%2C\n            \"content\": \"&lt;div class=&amp;#x27;preserveHtml&amp;#x27; class=\\\"sampleSolution\\\"&gt;\\r\\n&lt;pre class=&amp;#x27;preserveHtml&amp;#x27; class=&amp;#x27;preserveHtml&amp;#x27;&gt;&lt;code class=&amp;#x27;preserveHtml&amp;#x27; class=\\\"language-java\\\" prism&gt;public class Main {\\r\\n  public static void main(String[] args) {\\r\\n    System.out.println(\\\"Java ist ein Kaffee\\\");\\r\\n  }\\r\\n}&lt;/code&gt;&lt;/pre&gt;\\r\\n&lt;/div&gt;\",\n%20%20%20%20%20%20%20%20%20%20%20%20%22isHidden%22%3A%20true%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22isStatic%22%3A%20true%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22createdAt%22%3A%20%222023-03-10T14%3A37%3A04.000Z%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22updatedAt%22%3A%20%222024-01-19T10%3A43%3A38.000Z%22%2C\n%20%20%20%20%20%20%20%20%20%20%20%20%22ProjectId%22%3A%202\n%20%20%20%20%20%20%20%20%7D\n%20%20%20%20%5D%2C\n%20%20%20%20%22project%22%3A%20%7B\n%20%20%20%20%20%20%20%20%22projectId%22%3A%202%2C\n%20%20%20%20%20%20%20%20%22projectname%22%3A%20%22Test-Insel%22%2C\n%20%20%20%20%20%20%20%20%22language%22%3A%20%22Java%22\n%20%20%20%20%7D%2C\n%20%20%20%20%22user%22%3A%20%7B\n%20%20%20%20%20%20%20%20%22userId%22%3A%202%2C\n%20%20%20%20%20%20%20%20%22username%22%3A%20%22admin%22\n%20%20%20%20%7D%2C\n%20%20%20%20%22userRole%22%3A%20%22help%22\n%7D\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","helpRequests","{{helpRequestId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f5abdbb3-9e56-4425-892e-1bf666922856"},{"name":"getAllHelpRequests","id":"06dd2fe9-8580-4ae6-83ec-092badcf9a1f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/projects/{{projectId}}/helpRequests","description":"<p>This endpoint returns a list of all help requests of a given project.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks a specific project exists mw.isAuth: req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/projects/{{projectId}}/helpRequests</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">\n    {\n        \"helpRequestId\": 25,\n        \"userId\": 2,\n        \"id\": 25,\n        \"ltiSessionId\": -1,\n        \"status\": \"answered\",\n        \"createdAt\": \"2023-05-05T11:59:20.000Z\",\n        \"updatedAt\": \"2023-05-05T12:00:23.000Z\",\n        \"projectId\": 2,\n        \"user\": {\n            \"userId\": 2,\n            \"username\": \"admin\"\n        },\n        \"project\": {\n            \"projectId\": 2,\n            \"projectname\": \"Test-Insel\"\n        },\n        \"bestSubmission\": {\n            \"submissionId\": 25,\n            \"id\": 25,\n            \"ltiSessionId\": -1,\n            \"hasResult\": true,\n            \"testResult\": \"1.0000\",\n            \"numTestsPassed\": 1,\n            \"numTestsFailed\": 0,\n            \"createdAt\": \"2023-05-10T10:58:31.000Z\",\n            \"updatedAt\": \"2023-05-10T10:58:31.000Z\",\n            \"projectId\": 2,\n            \"user\": {\n                \"userId\": 2,\n                \"username\": \"admin\"\n            },\n            \"project\": {\n                \"projectId\": 2,\n                \"projectname\": \"Test-Insel\"\n            }\n        }\n    }\n]\n\n</code></pre>\n","urlObject":{"path":["api","projects","{{projectId}}","helpRequests"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"06dd2fe9-8580-4ae6-83ec-092badcf9a1f"},{"name":"getCourseHelpRequests","id":"f0c03e4a-1c1c-4b6b-bd0b-0694afb5de88","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/courses/{{courseId_hr}}/helpRequests","description":"<p>This endpoint returns a list of all help requests of a given course.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth: req.isAuthenticated() mw.isValidCourseId: checks a specific course exists mw.isCourseOwner: checks if the requesting user is the owner of the course</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/courses/{{courseId_hr}}/helpRequests</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"helpRequestId\": 31,\n        \"userId\": 3,\n        \"id\": 31,\n        \"ltiSessionId\": -1,\n        \"status\": \"answered\",\n        \"createdAt\": \"2023-09-25T05:58:30.000Z\",\n        \"updatedAt\": \"2023-09-25T05:59:37.000Z\",\n        \"projectId\": 10,\n        \"user\": {\n            \"userId\": 3,\n            \"username\": \"testuser\"\n        },\n        \"project\": {\n            \"projectId\": 10,\n            \"projectname\": \"Codeboard-Test\"\n        },\n        \"bestSubmission\": {\n            \"submissionId\": 42,\n            \"id\": 42,\n            \"ltiSessionId\": -1,\n            \"hasResult\": true,\n            \"testResult\": \"1.0000\",\n            \"numTestsPassed\": 1,\n            \"numTestsFailed\": 0,\n            \"createdAt\": \"2023-09-21T09:13:03.000Z\",\n            \"updatedAt\": \"2023-09-21T09:13:03.000Z\",\n            \"projectId\": 10,\n            \"user\": {\n                \"userId\": 3,\n                \"username\": \"testuser\"\n            },\n            \"project\": {\n                \"projectId\": 10,\n                \"projectname\": \"Codeboard-Test\"\n            }\n        }\n    }\n]\n\n</code></pre>\n","urlObject":{"path":["api","courses","{{courseId_hr}}","helpRequests"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f0c03e4a-1c1c-4b6b-bd0b-0694afb5de88"},{"name":"getCourseProjectHelpRequests","id":"9c52197d-7616-469d-8822-9c360b633111","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/courses/{{courseId_hr}}/projects/{{projectId}}/helpRequests","description":"<p>This endpoint returns a list of all help requests of a specific project in a given course.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth: req.isAuthenticated() mw.isValidCourseId: checks a specific course exists mw.isCourseOwner: checks if the requesting user is the owner of the course mw.isProjectInCourse: checks if the requested project is part of a given course</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/courses/{{courseId}}/projects/{{projectId}}/helpRequests</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n    {\n        \"helpRequestId\": 36,\n        \"userId\": 2,\n        \"id\": 36,\n        \"ltiSessionId\": -1,\n        \"status\": \"answered\",\n        \"createdAt\": \"2024-04-15T06:08:21.000Z\",\n        \"updatedAt\": \"2024-04-15T06:15:52.000Z\",\n        \"projectId\": 2,\n        \"user\": {\n            \"userId\": 2,\n            \"username\": \"admin\"\n        },\n        \"project\": {\n            \"projectId\": 2,\n            \"projectname\": \"Test-Insel\"\n        }\n    }\n]\n\n</code></pre>\n","urlObject":{"path":["api","courses","{{courseId_hr}}","projects","{{projectId}}","helpRequests"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"9c52197d-7616-469d-8822-9c360b633111"}],"id":"e5680ae4-18e5-4071-ad58-7ce9b08d3c96","_postman_id":"e5680ae4-18e5-4071-ad58-7ce9b08d3c96","description":""},{"name":"logs","item":[{"name":"getProjectAccessPerProjectLogs","id":"bb0951b4-dee5-46ac-961a-d933f5fff6b8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/log/user/summaryProjectAccess/{{projectId}}","description":"<p>This endpoint returns the project access log summary per project</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/log/user/summaryProjectAccess/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["api","log","user","summaryProjectAccess","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"bb0951b4-dee5-46ac-961a-d933f5fff6b8"},{"name":"getCompilerActivityPerProjectLogs","id":"edfc39ea-0519-494e-a626-d55286353b1a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/log/user/summaryCompiler/{{projectId}}","description":"<p>This endpoint returns the compilation summary per project</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET/api/log/user/summaryCompiler/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["api","log","user","summaryCompiler","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"edfc39ea-0519-494e-a626-d55286353b1a"},{"name":"getSubmitPerProjectLogs","id":"8bcee47f-40cd-44c8-8a44-6b0951ccbd62","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/log/user/summarySubmitAccess/{{projectId}}","description":"<p>This endpoint returns the submit summary per project</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/log/user/summarySubmitAccess/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["api","log","user","summarySubmitAccess","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"8bcee47f-40cd-44c8-8a44-6b0951ccbd62"},{"name":"getCompilationPerDayLogs","id":"eebf3ef0-bcca-438c-aeae-e442c8d3bcc2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/log/user/summaryProjectCompilationRunDay/{{projectId}}","description":"<p>This endpoint returns the compilation log summary per day. If the requests has a projectId defined, then * returns the summary for that projectID, otherwise it returns it for all projects</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/log/user/summaryProjectCompilationRunDay/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["api","log","user","summaryProjectCompilationRunDay","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"eebf3ef0-bcca-438c-aeae-e442c8d3bcc2"},{"name":"getProjectAccessPerDayLogs","id":"f2473848-cb65-4913-b239-e7f470b5e143","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/log/user/summaryProjectAccessDay/{{projectId}}","description":"<p>This endpoint returns theproject access per day (for all projects)</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated() mw.isOwner: checks if the requesting user is the owner of the requested project</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/log/user/summaryProjectAccessDay/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["api","log","user","summaryProjectAccessDay","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f2473848-cb65-4913-b239-e7f470b5e143"}],"id":"aed0c379-7102-45b2-b6dd-4bc4fcc2a02e","_postman_id":"aed0c379-7102-45b2-b6dd-4bc4fcc2a02e","description":""},{"name":"chat","item":[{"name":"addChatLine","id":"b46c6724-8afd-4cc5-921c-bff1f59d76db","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"aMessage\": \"Test-Antwort\",\r\n  \"author\": \"admin\",\r\n  \"type\": \"helpRequestAnswer\",\r\n  \"helpRequestId\": 35\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/chat/{{username}}/{{projectId}}","description":"<p>This endpoint creates a new chatbox (e.g. when an project owner answers an help request)</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists   mw.isAuth: req.isAuthenticated()</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/chat/{{username}}/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": 588,\n  \"type\": \"helpRequestAnswer\",\n  \"message\": \"Test-Antwort\",\n  \"createdAt\": \"2024-04-16T18:25:35.000Z\",\n  \"updatedAt\": \"2024-04-16T18:25:35.000Z\",\n  \"ProjectId\": 19,\n  \"userId\": 3,\n  \"authorId\": 2,\n  \"subjectId\": 35,\n  \"user\": {\n    \"username\": \"testuser\",\n    \"name\": \"Samuel\",\n    \"email\": \"mict@zhaw.ch\",\n    \"emailPublic\": \"test@gmail.com\"\n  },\n  \"author\": {\n    \"username\": \"admin\"\n  },\n  \"subject\": {\n    \"status\": \"answered\",\n    \"course\": {\n      \"id\": 5,\n      \"coursename\": \"codeboard Tests\"\n    }\n  },\n  \"project\": {\n    \"projectname\": \"AI hints test - Reisezeit\"\n  }\n}\n\n</code></pre>\n","urlObject":{"path":["api","chat","{{username}}","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b46c6724-8afd-4cc5-921c-bff1f59d76db"},{"name":"getChatHistory","id":"e42d5a45-d09b-4057-a7da-0a6a01986768","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/chat/{{username}}/{{projectId}}","description":"<p>This endpoint returns the chat history.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isValidProjectId: checks if the requested project exists mw.isAuth: req.isAuthenticated()</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/chat/{{username}}/{{projectId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">\"data\": [\n        {\n            \"id\": 232,\n            \"type\": \"card\",\n            \"message\": \"{\\\"cardHeader\\\":\\\"Hilfe angefragt\\\",\\\"cardBody\\\":\\\"Das ist ein Test-Anliegen.\\\",\\\"cardType\\\":\\\"help\\\",\\\"cardReference\\\":\\\"/projects/2/helprequests/27\\\"}\",\n            \"createdAt\": \"2023-05-17T07:57:35.000Z\",\n            \"updatedAt\": \"2023-05-17T07:57:35.000Z\",\n            \"ProjectId\": 2,\n            \"userId\": 2,\n            \"authorId\": 2,\n            \"subjectId\": 27,\n            \"user\": {\n                \"username\": \"admin\",\n                \"name\": \"Samuel\"\n            },\n            \"author\": {\n                \"username\": \"admin\",\n                \"name\": \"Samuel\"\n            },\n            \"subject\": {\n                \"status\": \"answered\"\n            }\n        },\n        {\n            \"id\": 233,\n            \"type\": \"html\",\n            \"message\": \"Das ist eine Antwort auf das Test-Anliegen.\",\n            \"createdAt\": \"2023-05-17T08:01:27.000Z\",\n            \"updatedAt\": \"2023-05-17T08:01:27.000Z\",\n            \"ProjectId\": 2,\n            \"userId\": 2,\n            \"authorId\": 2,\n            \"subjectId\": 27,\n            \"user\": {\n                \"username\": \"admin\",\n                \"name\": \"Samuel\"\n            },\n            \"author\": {\n                \"username\": \"admin\",\n                \"name\": \"Samuel\"\n            },\n            \"subject\": {\n                \"status\": \"answered\"\n            }\n        }\n]\n\n</code></pre>\n","urlObject":{"path":["api","chat","{{username}}","{{projectId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e42d5a45-d09b-4057-a7da-0a6a01986768"},{"name":"rateErrorCompilationMessage","id":"f79fa364-ac0a-4c20-8871-cddeb8915da7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/chat/chatLines/{{chatLineId}}","description":"<p>This endpoint updates the rating of a chatbox.</p>\n<h3 id=\"middleware\">Middleware</h3>\n<p><code>mw.isAuth: req.isAuthenticated()</code></p>\n<h3 id=\"request\">Request</h3>\n<p><code>PUT /api/chat/chatLines/{{chatLineId}}</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{}\n\n</code></pre>\n","urlObject":{"path":["api","chat","chatLines","{{chatLineId}}"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f79fa364-ac0a-4c20-8871-cddeb8915da7"}],"id":"c4d9bf1e-135f-4733-82c7-dedb8463220f","_postman_id":"c4d9bf1e-135f-4733-82c7-dedb8463220f","description":""},{"name":"support","item":[{"name":"initLtiSession","id":"64afa9a0-3c9b-41f4-bd66-f8e96e015835","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"{{url}}/support/lti/debug","urlObject":{"path":["support","lti","debug"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"64afa9a0-3c9b-41f4-bd66-f8e96e015835"},{"name":"sendOutcome","id":"9427b159-1dfc-4f59-a03a-e9e5a59767d4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"url":"{{url}}/support/lti/debug/outcome","urlObject":{"path":["support","lti","debug","outcome"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"9427b159-1dfc-4f59-a03a-e9e5a59767d4"}],"id":"a21fb4a5-441c-4a61-a6d9-d21a5c53abb8","_postman_id":"a21fb4a5-441c-4a61-a6d9-d21a5c53abb8","description":""},{"name":"container","item":[{"name":"startContainer","id":"d4c8522e-9532-49fc-a39c-74a3893b9373","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/startContainer/{{mantraId}}/{{containerId}}/start","description":"<p>This endpoint starts a container (Mantra)</p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/startContainer/{{mantraId}}/{{containerId}}/start</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["api","startContainer","{{mantraId}}","{{containerId}}","start"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d4c8522e-9532-49fc-a39c-74a3893b9373"},{"name":"stopContainer","id":"eb4d78b4-6597-4ff7-b8fa-46a978669646","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{url}}/api/stopContainer/{{mantraId}}/{{containerId}}/stop","description":"<p>This endpoint stops the container (mantra)</p>\n<h3 id=\"request\">Request</h3>\n<p><code>GET /api/startContainer/{{mantraId}}/{{containerId}}/stop</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n}\n\n</code></pre>\n","urlObject":{"path":["api","stopContainer","{{mantraId}}","{{containerId}}","stop"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"eb4d78b4-6597-4ff7-b8fa-46a978669646"}],"id":"bf509072-5186-4fa3-8720-d1cc1ac5d0a9","_postman_id":"bf509072-5186-4fa3-8720-d1cc1ac5d0a9","description":""},{"name":"help","item":[{"name":"getHelpForCompilation","id":"cbac7700-9b2c-47b8-b68c-5c687d411bff","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"files\": [\r\n    {\r\n      \"filename\": \"Root/Main.java\",\r\n      \"content\": \"import java.util.Scanner;\\n\\npublic class Main {\\n    public static void main(String[] args) {\\n\\n        // Hier werden Geschwindigkeit und Distanz eingelesen.\\n        // Diesen Teil nicht ändern.\\n        Scanner keyScan = new Scanner(System.in);\\n        System.out.print(\\\"Geschwindigkeit (km/h): \\\");\\n        double v = keyScan.nextDouble();\\n        System.out.print(\\\"Distanz (km): \\\");\\n        double d = keyScan.nextDouble()\\n\\n        // Hier soll die Reisezeit (in Minuten) berechnet und anschliessend ausgegeben werden.\\n        // Die Geschwindigkeit befindet sich in der Variablen v, die Distanz in der Variablen d.\\n        double reisezeit = d / v * 60;\\n        System.out.println(\\\"Reisezeit (min): \\\" + reisezeit);\\n    }\\n}\"\r\n    }\r\n  ],\r\n  \"language\": \"Java\",\r\n  \"action\": \"compile\",\r\n  \"id\": \"m02ld3g3ng3rh0eaxzbvzov4wfwnzk5jmsfydmufef\",\r\n  \"hasLtiData\": false,\r\n  \"ltiData\": {},\r\n  \"courseId\": 5,\r\n  \"compilation\": {\r\n    \"compilationError\": true,\r\n    \"output\": \"./Root/Main.java:12: error: ';' expected\\r\\n        double d = keyScan.nextDouble()\\r\\n                                       ^\\r\\n,1 error\\r\\n\",\r\n    \"outputArray\": [\r\n      \"./Root/Main.java:12: error: ';' expected\\r\\n        double d = keyScan.nextDouble()\\r\\n                                       ^\\r\\n\",\r\n      \"1 error\\r\\n\"\r\n    ],\r\n    \"stream\": false\r\n  }\r\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}/api/{{projectId}}/help/compilation","description":"<p>This endpoint is used to explain a compilation error.</p>\n<h3 id=\"request\">Request</h3>\n<p><code>POST /api/{{projectId}}/help/compilation</code></p>\n<h3 id=\"response\">Response</h3>\n<ul>\n<li>Status: 200</li>\n<li>Content-Type: application/json</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">Hoppla. Da ist in der Klasse Main auf Zeile 12 etwas schief gelaufen. Du hast, wie es scheint, das Zeichen ; vergessen. Füge das fehlende Zeichen ; an der richtigen Stelle hinzu.\n\n</code></pre>\n","urlObject":{"path":["api","{{projectId}}","help","compilation"],"host":["{{url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"cbac7700-9b2c-47b8-b68c-5c687d411bff"}],"id":"fff18578-b50a-4c6e-8e5a-e0b6ebdea36c","_postman_id":"fff18578-b50a-4c6e-8e5a-e0b6ebdea36c","description":""}],"event":[{"listen":"prerequest","script":{"id":"e4fa8b31-acb7-48b4-90c1-61ae566fc2e2","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"28430412-6a32-4ab4-a7b7-8dd8958d0824","type":"text/javascript","packages":{},"exec":[""]}}]}