Merge pull request #25 from SELab-2/feat/api-outline
feature: skeletcode van de API
This commit is contained in:
		
						commit
						aa2f1203cb
					
				
					 10 changed files with 357 additions and 0 deletions
				
			
		|  | @ -18,6 +18,8 @@ | ||||||
|         "@mikro-orm/postgresql": "^6.4.6", |         "@mikro-orm/postgresql": "^6.4.6", | ||||||
|         "@mikro-orm/reflection": "^6.4.6", |         "@mikro-orm/reflection": "^6.4.6", | ||||||
|         "@types/js-yaml": "^4.0.9", |         "@types/js-yaml": "^4.0.9", | ||||||
|  |         "@mikro-orm/sqlite": "^6.4.6", | ||||||
|  |         "@mikro-orm/reflection": "^6.4.6", | ||||||
|         "dotenv": "^16.4.7", |         "dotenv": "^16.4.7", | ||||||
|         "express": "^5.0.1", |         "express": "^5.0.1", | ||||||
|         "js-yaml": "^4.1.0" |         "js-yaml": "^4.1.0" | ||||||
|  |  | ||||||
|  | @ -2,9 +2,18 @@ import express, { Express, Response } from 'express'; | ||||||
| import initORM from './orm.js'; | import initORM from './orm.js'; | ||||||
| import themeRoutes from './routes/themes.js'; | import themeRoutes from './routes/themes.js'; | ||||||
| 
 | 
 | ||||||
|  | import studentRouter from './routes/student'; | ||||||
|  | import groupRouter from './routes/group'; | ||||||
|  | import assignmentRouter from './routes/assignment'; | ||||||
|  | import submissionRouter from './routes/submission'; | ||||||
|  | import classRouter from './routes/class'; | ||||||
|  | import questionRouter from './routes/question'; | ||||||
|  | import loginRouter from './routes/login'; | ||||||
|  | 
 | ||||||
| const app: Express = express(); | const app: Express = express(); | ||||||
| const port: string | number = process.env.PORT || 3000; | const port: string | number = process.env.PORT || 3000; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| // TODO Replace with Express routes
 | // TODO Replace with Express routes
 | ||||||
| app.get('/', (_, res: Response) => { | app.get('/', (_, res: Response) => { | ||||||
|     res.json({ |     res.json({ | ||||||
|  | @ -12,6 +21,14 @@ app.get('/', (_, res: Response) => { | ||||||
|     }); |     }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  | app.use('/student', studentRouter); | ||||||
|  | app.use('/group', groupRouter); | ||||||
|  | app.use('/assignment', assignmentRouter); | ||||||
|  | app.use('/submission', submissionRouter); | ||||||
|  | app.use('/class', classRouter); | ||||||
|  | app.use('/question', questionRouter); | ||||||
|  | app.use('/login', loginRouter); | ||||||
|  | 
 | ||||||
| app.use('/theme', themeRoutes); | app.use('/theme', themeRoutes); | ||||||
| 
 | 
 | ||||||
| async function startServer() { | async function startServer() { | ||||||
|  |  | ||||||
							
								
								
									
										54
									
								
								backend/src/routes/assignment.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								backend/src/routes/assignment.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | ||||||
|  | import express from 'express' | ||||||
|  | const router = express.Router(); | ||||||
|  | 
 | ||||||
|  | // root endpoint used to search objects
 | ||||||
|  | router.get('/', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         assignments: [ | ||||||
|  |             '0', | ||||||
|  |             '1', | ||||||
|  |         ] | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // information about an assignment with id 'id'
 | ||||||
|  | router.get('/:id', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         id: req.params.id, | ||||||
|  |         title: 'Dit is een test assignment', | ||||||
|  |         description: 'Een korte beschrijving', | ||||||
|  |         groups: [ '0' ], | ||||||
|  |         learningPath: '0', | ||||||
|  |         class: '0', | ||||||
|  |         links: { | ||||||
|  |             self: `${req.baseUrl}/${req.params.id}`, | ||||||
|  |             submissions: `${req.baseUrl}/${req.params.id}`, | ||||||
|  |         }, | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | router.get('/:id/submissions', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         submissions: [ | ||||||
|  |             '0' | ||||||
|  |         ], | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | router.get('/:id/groups', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         groups: [ | ||||||
|  |             '0' | ||||||
|  |         ], | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | router.get('/:id/questions', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         questions: [ | ||||||
|  |             '0' | ||||||
|  |         ], | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | export default router | ||||||
							
								
								
									
										55
									
								
								backend/src/routes/class.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								backend/src/routes/class.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | ||||||
|  | import express from 'express' | ||||||
|  | const router = express.Router(); | ||||||
|  | 
 | ||||||
|  | // root endpoint used to search objects
 | ||||||
|  | router.get('/', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         classes: [ | ||||||
|  |             '0', | ||||||
|  |             '1', | ||||||
|  |         ] | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // information about an class with id 'id'
 | ||||||
|  | router.get('/:id', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         id: req.params.id, | ||||||
|  |         displayName: 'Klas 4B', | ||||||
|  |         teachers: [ '0' ], | ||||||
|  |         students: [ '0' ], | ||||||
|  |         joinRequests: [ '0' ], | ||||||
|  |         links: { | ||||||
|  |             self: `${req.baseUrl}/${req.params.id}`, | ||||||
|  |             classes: `${req.baseUrl}/${req.params.id}/invitations`, | ||||||
|  |             questions: `${req.baseUrl}/${req.params.id}/assignments`, | ||||||
|  |             students: `${req.baseUrl}/${req.params.id}/students`, | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | router.get('/:id/invitations', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         invitations: [  | ||||||
|  |             '0' | ||||||
|  |         ], | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | router.get('/:id/assignments', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         assignments: [  | ||||||
|  |             '0' | ||||||
|  |         ], | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | router.get('/:id/students', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         students: [  | ||||||
|  |             '0' | ||||||
|  |         ], | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | export default router | ||||||
							
								
								
									
										34
									
								
								backend/src/routes/group.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								backend/src/routes/group.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | ||||||
|  | import express from 'express' | ||||||
|  | const router = express.Router(); | ||||||
|  | 
 | ||||||
|  | // root endpoint used to search objects
 | ||||||
|  | router.get('/', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         groups: [ | ||||||
|  |             '0', | ||||||
|  |             '1', | ||||||
|  |         ] | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // information about a group (members, ... [TODO DOC])
 | ||||||
|  | router.get('/:id', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         id: req.params.id, | ||||||
|  |         assignment: '0', | ||||||
|  |         students: [ '0' ], | ||||||
|  |         submissions: [ '0' ], | ||||||
|  |         // reference to other endpoint
 | ||||||
|  |         // should be less hardcoded
 | ||||||
|  |         questions: `/group/${req.params.id}/question`,  | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | // the list of questions a group has made
 | ||||||
|  | router.get('/:id/question', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         questions: [ '0' ], | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | export default router | ||||||
							
								
								
									
										14
									
								
								backend/src/routes/login.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								backend/src/routes/login.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | ||||||
|  | import express from 'express' | ||||||
|  | const router = express.Router(); | ||||||
|  | 
 | ||||||
|  | // returns login paths for IDP
 | ||||||
|  | router.get('/', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         // dummy variables, needs to be changed
 | ||||||
|  |         // with IDP endpoints
 | ||||||
|  |         leerkracht: '/login-leerkracht', | ||||||
|  |         leerling: '/login-leerling', | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | export default router | ||||||
							
								
								
									
										38
									
								
								backend/src/routes/question.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								backend/src/routes/question.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | ||||||
|  | import express from 'express' | ||||||
|  | const router = express.Router(); | ||||||
|  | 
 | ||||||
|  | // root endpoint used to search objects
 | ||||||
|  | router.get('/', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         questions: [ | ||||||
|  |             '0', | ||||||
|  |             '1', | ||||||
|  |         ] | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // information about an question with id 'id'
 | ||||||
|  | router.get('/:id', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         id: req.params.id, | ||||||
|  |         student: '0', | ||||||
|  |         group: '0', | ||||||
|  |         time: new Date(2025, 1, 1), | ||||||
|  |         content: 'Zijn alle gehele getallen groter dan 2 gelijk aan de som van 2 priemgetallen????', | ||||||
|  |         learningObject: '0', | ||||||
|  |         links: { | ||||||
|  |             self: `${req.baseUrl}/${req.params.id}`, | ||||||
|  |             answers: `${req.baseUrl}/${req.params.id}/answers`, | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | router.get('/:id/answers', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         answers: [ | ||||||
|  |             '0' | ||||||
|  |         ], | ||||||
|  |     }) | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | export default router | ||||||
							
								
								
									
										59
									
								
								backend/src/routes/student.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								backend/src/routes/student.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,59 @@ | ||||||
|  | import express from 'express' | ||||||
|  | const router = express.Router(); | ||||||
|  | 
 | ||||||
|  | // root endpoint used to search objects
 | ||||||
|  | router.get('/', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         students: [ | ||||||
|  |             '0', | ||||||
|  |             '1', | ||||||
|  |         ] | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // information about a student's profile
 | ||||||
|  | router.get('/:id', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         id: req.params.id, | ||||||
|  |         firstName: 'Jimmy', | ||||||
|  |         lastName: 'Faster', | ||||||
|  |         username: 'JimmyFaster2', | ||||||
|  |         endpoints: { | ||||||
|  |             classes: `/student/${req.params.id}/classes`, | ||||||
|  |             questions: `/student/${req.params.id}/submissions`, | ||||||
|  |             invitations: `/student/${req.params.id}/assignments`, | ||||||
|  |             groups: `/student/${req.params.id}/groups`, | ||||||
|  |         }, | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // the list of classes a student is in
 | ||||||
|  | router.get('/:id/classes', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         classes: [ '0' ], | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | // the list of submissions a student has made
 | ||||||
|  | router.get('/:id/submissions', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         submissions: [ '0' ], | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  |    | ||||||
|  | // the list of assignments a student has
 | ||||||
|  | router.get('/:id/assignments', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         assignments: [ '0' ], | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  |    | ||||||
|  | // the list of groups a student is in
 | ||||||
|  | router.get('/:id/groups', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         groups: [ '0' ], | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | export default router | ||||||
							
								
								
									
										26
									
								
								backend/src/routes/submission.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								backend/src/routes/submission.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | ||||||
|  | import express from 'express' | ||||||
|  | const router = express.Router(); | ||||||
|  | 
 | ||||||
|  | // root endpoint used to search objects
 | ||||||
|  | router.get('/', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         submissions: [ | ||||||
|  |             '0', | ||||||
|  |             '1', | ||||||
|  |         ] | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // information about an submission with id 'id'
 | ||||||
|  | router.get('/:id', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         id: req.params.id, | ||||||
|  |         student: '0', | ||||||
|  |         group: '0', | ||||||
|  |         time: new Date(2025, 1, 1), | ||||||
|  |         content: 'Wortel 2 is rationeel', | ||||||
|  |         learningObject: '0', | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | export default router | ||||||
							
								
								
									
										58
									
								
								backend/src/routes/teacher.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								backend/src/routes/teacher.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,58 @@ | ||||||
|  | import express from 'express' | ||||||
|  | const router = express.Router(); | ||||||
|  | 
 | ||||||
|  | // root endpoint used to search objects
 | ||||||
|  | router.get('/', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         teachers: [ | ||||||
|  |             '0', | ||||||
|  |             '1', | ||||||
|  |         ] | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // information about a teacher
 | ||||||
|  | router.get('/:id', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         id: req.params.id, | ||||||
|  |         firstName: 'John', | ||||||
|  |         lastName: 'Doe', | ||||||
|  |         username: 'JohnDoe1', | ||||||
|  |         links: { | ||||||
|  |             self: `${req.baseUrl}/${req.params.id}`, | ||||||
|  |             classes: `${req.baseUrl}/${req.params.id}/classes`, | ||||||
|  |             questions: `${req.baseUrl}/${req.params.id}/questions`, | ||||||
|  |             invitations: `${req.baseUrl}/${req.params.id}/invitations`, | ||||||
|  |         }, | ||||||
|  |     }); | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | // the questions students asked a teacher
 | ||||||
|  | router.get('/:id/questions', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         questions: [ | ||||||
|  |             '0' | ||||||
|  |         ], | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // invitations to other classes a teacher received
 | ||||||
|  | router.get('/:id/invitations', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         invitations: [ | ||||||
|  |             '0' | ||||||
|  |         ], | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | // a list with ids of classes a teacher is in
 | ||||||
|  | router.get('/:id/classes', (req, res) => { | ||||||
|  |     res.json({ | ||||||
|  |         classes: [ | ||||||
|  |             '0' | ||||||
|  |         ], | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | export default router | ||||||
		Reference in a new issue
	
	 Adriaan J.
						Adriaan J.