fix: teacher invitations middelware en questions
This commit is contained in:
		
							parent
							
								
									e799705a09
								
							
						
					
					
						commit
						c054eb9335
					
				
					 4 changed files with 18 additions and 7 deletions
				
			
		|  | @ -3,6 +3,7 @@ import { AuthenticationInfo } from '../authentication-info.js'; | ||||||
| import { AuthenticatedRequest } from '../authenticated-request.js'; | import { AuthenticatedRequest } from '../authenticated-request.js'; | ||||||
| import { fetchClass } from '../../../services/classes.js'; | import { fetchClass } from '../../../services/classes.js'; | ||||||
| import { mapToUsername } from '../../../interfaces/user.js'; | import { mapToUsername } from '../../../interfaces/user.js'; | ||||||
|  | import {getAllInvitations} from "../../../services/teacher-invitations"; | ||||||
| 
 | 
 | ||||||
| async function teaches(teacherUsername: string, classId: string): Promise<boolean> { | async function teaches(teacherUsername: string, classId: string): Promise<boolean> { | ||||||
|     const clazz = await fetchClass(classId); |     const clazz = await fetchClass(classId); | ||||||
|  | @ -44,6 +45,16 @@ export const onlyAllowIfInClass = authorize(async (auth: AuthenticationInfo, req | ||||||
|     return clazz.students.map(mapToUsername).includes(auth.username); |     return clazz.students.map(mapToUsername).includes(auth.username); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  | export const onlyAllowIfInClassOrInvited = authorize(async (auth: AuthenticationInfo, req: AuthenticatedRequest) => { | ||||||
|  |     const classId = req.params.classId ?? req.params.classid ?? req.params.id; | ||||||
|  |     const clazz = await fetchClass(classId); | ||||||
|  |     if (auth.accountType === 'teacher') { | ||||||
|  |         const invitations = await getAllInvitations(auth.username, false); | ||||||
|  |         return clazz.teachers.map(mapToUsername).includes(auth.username) || invitations.some(invitation => invitation.classId == classId); | ||||||
|  |     } | ||||||
|  |     return clazz.students.map(mapToUsername).includes(auth.username); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * Only allows the request to pass if the 'class' property in its body is a class the current user is a member of. |  * Only allows the request to pass if the 'class' property in its body is a class the current user is a member of. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | @ -1,11 +1,11 @@ | ||||||
| import express from 'express'; | import express from 'express'; | ||||||
| import { createAnswerHandler, deleteAnswerHandler, getAnswerHandler, getAllAnswersHandler, updateAnswerHandler } from '../controllers/answers.js'; | import { createAnswerHandler, deleteAnswerHandler, getAnswerHandler, getAllAnswersHandler, updateAnswerHandler } from '../controllers/answers.js'; | ||||||
| import { adminOnly, teachersOnly } from '../middleware/auth/checks/auth-checks.js'; | import {adminOnly, authenticatedOnly, teachersOnly} from '../middleware/auth/checks/auth-checks.js'; | ||||||
| import { onlyAllowAuthor, onlyAllowAuthorRequestAnswer, onlyAllowIfHasAccessToQuestion } from '../middleware/auth/checks/question-checks.js'; | import { onlyAllowAuthor, onlyAllowAuthorRequestAnswer, onlyAllowIfHasAccessToQuestion } from '../middleware/auth/checks/question-checks.js'; | ||||||
| 
 | 
 | ||||||
| const router = express.Router({ mergeParams: true }); | const router = express.Router({ mergeParams: true }); | ||||||
| 
 | 
 | ||||||
| router.get('/', adminOnly, getAllAnswersHandler); | router.get('/', authenticatedOnly, getAllAnswersHandler); | ||||||
| 
 | 
 | ||||||
| router.post('/', teachersOnly, onlyAllowAuthor, createAnswerHandler); | router.post('/', teachersOnly, onlyAllowAuthor, createAnswerHandler); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ import { | ||||||
| } from '../controllers/classes.js'; | } from '../controllers/classes.js'; | ||||||
| import assignmentRouter from './assignments.js'; | import assignmentRouter from './assignments.js'; | ||||||
| import { adminOnly, teachersOnly } from '../middleware/auth/checks/auth-checks.js'; | import { adminOnly, teachersOnly } from '../middleware/auth/checks/auth-checks.js'; | ||||||
| import { onlyAllowIfInClass } from '../middleware/auth/checks/class-auth-checks.js'; | import {onlyAllowIfInClass, onlyAllowIfInClassOrInvited} from '../middleware/auth/checks/class-auth-checks.js'; | ||||||
| 
 | 
 | ||||||
| const router = express.Router(); | const router = express.Router(); | ||||||
| 
 | 
 | ||||||
|  | @ -23,7 +23,7 @@ router.get('/', adminOnly, getAllClassesHandler); | ||||||
| 
 | 
 | ||||||
| router.post('/', teachersOnly, createClassHandler); | router.post('/', teachersOnly, createClassHandler); | ||||||
| 
 | 
 | ||||||
| router.get('/:id', onlyAllowIfInClass, getClassHandler); | router.get('/:id', onlyAllowIfInClassOrInvited, getClassHandler); | ||||||
| 
 | 
 | ||||||
| router.put('/:id', teachersOnly, onlyAllowIfInClass, putClassHandler); | router.put('/:id', teachersOnly, onlyAllowIfInClass, putClassHandler); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| import express from 'express'; | import express from 'express'; | ||||||
| import { createQuestionHandler, deleteQuestionHandler, getAllQuestionsHandler, getQuestionHandler } from '../controllers/questions.js'; | import { createQuestionHandler, deleteQuestionHandler, getAllQuestionsHandler, getQuestionHandler } from '../controllers/questions.js'; | ||||||
| import answerRoutes from './answers.js'; | import answerRoutes from './answers.js'; | ||||||
| import { adminOnly, studentsOnly } from '../middleware/auth/checks/auth-checks.js'; | import {adminOnly, authenticatedOnly, studentsOnly} from '../middleware/auth/checks/auth-checks.js'; | ||||||
| import { updateAnswerHandler } from '../controllers/answers.js'; | import { updateAnswerHandler } from '../controllers/answers.js'; | ||||||
| import { onlyAllowAuthor, onlyAllowAuthorRequest, onlyAllowIfHasAccessToQuestion } from '../middleware/auth/checks/question-checks.js'; | import { onlyAllowAuthor, onlyAllowAuthorRequest, onlyAllowIfHasAccessToQuestion } from '../middleware/auth/checks/question-checks.js'; | ||||||
| 
 | 
 | ||||||
|  | @ -10,9 +10,9 @@ const router = express.Router({ mergeParams: true }); | ||||||
| // Query language
 | // Query language
 | ||||||
| 
 | 
 | ||||||
| // Root endpoint used to search objects
 | // Root endpoint used to search objects
 | ||||||
| router.get('/', adminOnly, getAllQuestionsHandler); | router.get('/', authenticatedOnly, getAllQuestionsHandler); | ||||||
| 
 | 
 | ||||||
| router.post('/', studentsOnly, onlyAllowAuthor, createQuestionHandler); | router.post('/', studentsOnly, onlyAllowAuthor, createQuestionHandler); // TODO part of group
 | ||||||
| 
 | 
 | ||||||
| // Information about a question with id
 | // Information about a question with id
 | ||||||
| router.get('/:seq', onlyAllowIfHasAccessToQuestion, getQuestionHandler); | router.get('/:seq', onlyAllowIfHasAccessToQuestion, getQuestionHandler); | ||||||
|  |  | ||||||
		Reference in a new issue
	
	 Gabriellvl
						Gabriellvl