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
|
Loading…
Add table
Add a link
Reference in a new issue