diff --git a/documentation/access_rights.md b/documentation/access_rights.md index b00b4f033..8d50f39cb 100644 --- a/documentation/access_rights.md +++ b/documentation/access_rights.md @@ -8,7 +8,6 @@ Roles are defined [here](../services/backend/src/config/roles.ts). Criteria for - courseStatistics - facultyStatistics - fullSisuAccess -- katselmusViewer - openUniSearch - studyGuidanceGroups - teachers @@ -23,10 +22,6 @@ The roles `openUniSearch` and `studyGuidanceGroups` simply enable certain views - Can see statistics of every course and year -### katselmusViewer - -- Enables the _Evaluation overview_ view (deprecated) - ### teachers - By default, the role only allows seeing the statistics of course providers (study programmes) they have full rights to (see [Programmes](#programmes)) @@ -52,7 +47,6 @@ The roles `openUniSearch` and `studyGuidanceGroups` simply enable certain views | Completed courses | ✅ | ✅ | ✅ | | Close to graduation | | ✅ | ✅ | | Open uni population | | ✅ | | -| Evaluation overview | | ✅ | | | Courses | | ✅ | ✅ | \* = anyone who can log in to Oodikone, check the [IAM groups](#iam-groups) section for more information @@ -72,7 +66,6 @@ A user must be a member of either the `grp-oodikone-basic-users` or `grp-oodikon | grp-oodikone-basic-users | courseStatistics | | grp-oodikone-users | facultyStatistics | | grp-toska | admin | -| grp-katselmus-\* | katselmusViewer | | hy-ypa-opa-dojo | openUniSearch | `grp-oodikone-basic-users`: basically the whole staff (hy-\*-allstaff) diff --git a/services/backend/src/config/roles.ts b/services/backend/src/config/roles.ts index e398639ab..901f589ea 100644 --- a/services/backend/src/config/roles.ts +++ b/services/backend/src/config/roles.ts @@ -3,7 +3,6 @@ export const roles = [ 'courseStatistics', 'facultyStatistics', 'fullSisuAccess', - 'katselmusViewer', 'openUniSearch', 'studyGuidanceGroups', 'teachers', diff --git a/services/backend/src/routes/faculties.ts b/services/backend/src/routes/faculties.ts index 722a0bf92..e08665442 100644 --- a/services/backend/src/routes/faculties.ts +++ b/services/backend/src/routes/faculties.ts @@ -43,35 +43,31 @@ interface GetStatsRequest extends Request { } } -router.get( - '/:id/basicstats', - auth.roles(['facultyStatistics', 'katselmusViewer']), - async (req: GetStatsRequest, res: Response) => { - const facultyId = req.params.id - const code = await getFacultyCodeById(facultyId) - if (!code) { - return res.status(422).end() - } - - const { year_type: yearType, programme_filter: programmeFilter, special_groups: specialGroups } = req.query - const data = await getBasicStats(code, yearType, programmeFilter, specialGroups) - if (data) { - return res.json(data) - } - - const programmes = await getDegreeProgrammesOfFaculty(code, programmeFilter === 'NEW_STUDY_PROGRAMMES') - if (!programmes.length) { - return res.status(422).end() - } - - // TODO: The types could be handled better. Possible null value is causing issues with TS. - let updatedStats: any = await combineFacultyBasics(code, programmes, yearType, specialGroups) - if (updatedStats) { - updatedStats = await setBasicStats(updatedStats, yearType, programmeFilter, specialGroups) - } - return res.json(updatedStats) +router.get('/:id/basicstats', auth.roles(['facultyStatistics']), async (req: GetStatsRequest, res: Response) => { + const facultyId = req.params.id + const code = await getFacultyCodeById(facultyId) + if (!code) { + return res.status(422).end() } -) + + const { year_type: yearType, programme_filter: programmeFilter, special_groups: specialGroups } = req.query + const data = await getBasicStats(code, yearType, programmeFilter, specialGroups) + if (data) { + return res.json(data) + } + + const programmes = await getDegreeProgrammesOfFaculty(code, programmeFilter === 'NEW_STUDY_PROGRAMMES') + if (!programmes.length) { + return res.status(422).end() + } + + // TODO: The types could be handled better. Possible null value is causing issues with TS. + let updatedStats: any = await combineFacultyBasics(code, programmes, yearType, specialGroups) + if (updatedStats) { + updatedStats = await setBasicStats(updatedStats, yearType, programmeFilter, specialGroups) + } + return res.json(updatedStats) +}) interface GetCreditStatsRequest extends Request { query: { @@ -79,46 +75,38 @@ interface GetCreditStatsRequest extends Request { } } -router.get( - '/:id/creditstats', - auth.roles(['facultyStatistics', 'katselmusViewer']), - async (req: GetCreditStatsRequest, res: Response) => { - const facultyId = req.params.id - const code = await getFacultyCodeById(facultyId) - const { year_type: yearType } = req.query - const stats = await getFacultyCredits(code, yearType === 'ACADEMIC_YEAR') - return res.json(stats) +router.get('/:id/creditstats', auth.roles(['facultyStatistics']), async (req: GetCreditStatsRequest, res: Response) => { + const facultyId = req.params.id + const code = await getFacultyCodeById(facultyId) + const { year_type: yearType } = req.query + const stats = await getFacultyCredits(code, yearType === 'ACADEMIC_YEAR') + return res.json(stats) +}) + +router.get('/:id/thesisstats', auth.roles(['facultyStatistics']), async (req: GetStatsRequest, res: Response) => { + const facultyId = req.params.id + const code = await getFacultyCodeById(facultyId) + if (!code) { + return res.status(422).end() } -) -router.get( - '/:id/thesisstats', - auth.roles(['facultyStatistics', 'katselmusViewer']), - async (req: GetStatsRequest, res: Response) => { - const facultyId = req.params.id - const code = await getFacultyCodeById(facultyId) - if (!code) { - return res.status(422).end() - } - - const { year_type: yearType, programme_filter: programmeFilter, special_groups: specialGroups } = req.query - const data = await getThesisWritersStats(code, yearType, programmeFilter, specialGroups) - if (data) { - return res.json(data) - } - - const programmes = await getDegreeProgrammesOfFaculty(code, programmeFilter === 'NEW_STUDY_PROGRAMMES') - if (!programmes.length) { - return res.status(422).end() - } - - let updatedStats: any = await combineFacultyThesisWriters(code, programmes, yearType, specialGroups) - if (updatedStats) { - updatedStats = await setThesisWritersStats(updatedStats, yearType, programmeFilter, specialGroups) - } - return res.json(updatedStats) + const { year_type: yearType, programme_filter: programmeFilter, special_groups: specialGroups } = req.query + const data = await getThesisWritersStats(code, yearType, programmeFilter, specialGroups) + if (data) { + return res.json(data) } -) + + const programmes = await getDegreeProgrammesOfFaculty(code, programmeFilter === 'NEW_STUDY_PROGRAMMES') + if (!programmes.length) { + return res.status(422).end() + } + + let updatedStats: any = await combineFacultyThesisWriters(code, programmes, yearType, specialGroups) + if (updatedStats) { + updatedStats = await setThesisWritersStats(updatedStats, yearType, programmeFilter, specialGroups) + } + return res.json(updatedStats) +}) interface GetGraduationStatsRequest extends Request { query: { @@ -128,7 +116,7 @@ interface GetGraduationStatsRequest extends Request { router.get( '/:id/graduationtimes', - auth.roles(['facultyStatistics', 'katselmusViewer']), + auth.roles(['facultyStatistics']), async (req: GetGraduationStatsRequest, res: Response) => { const facultyId = req.params.id const code = await getFacultyCodeById(facultyId) @@ -164,7 +152,7 @@ interface GetProgressStatsRequest extends Request { router.get( '/:id/progressstats', - auth.roles(['facultyStatistics', 'katselmusViewer']), + auth.roles(['facultyStatistics']), async (req: GetProgressStatsRequest, res: Response) => { const facultyId = req.params.id const code = await getFacultyCodeById(facultyId) @@ -195,7 +183,7 @@ interface GetStudentStatsRequest extends GetProgressStatsRequest {} router.get( '/:id/studentstats', - auth.roles(['facultyStatistics', 'katselmusViewer']), + auth.roles(['facultyStatistics']), async (req: GetStudentStatsRequest, res: Response) => { const facultyId = req.params.id const code = await getFacultyCodeById(facultyId) @@ -231,7 +219,7 @@ interface GetUpdateBasicViewRequest extends Request { router.get( '/:id/update_basicview', - auth.roles(['facultyStatistics', 'katselmusViewer']), + auth.roles(['facultyStatistics']), async (req: GetUpdateBasicViewRequest, res: Response) => { const facultyId = req.params.id const code = await getFacultyCodeById(facultyId) @@ -250,24 +238,20 @@ router.get( } ) -router.get( - '/:id/update_progressview', - auth.roles(['facultyStatistics', 'katselmusViewer']), - async (req: Request, res: Response) => { - const facultyId = req.params.id - const code = await getFacultyCodeById(facultyId) - if (!code) { - return res.status(422).end() - } - try { - const result = await updateFacultyProgressOverview(code) - return res.json(result) - } catch (error) { - const message = `Failed to update progress tab stats for faculty ${code}` - logger.error(message, { error }) - return res.status(500).json({ error: message }) - } +router.get('/:id/update_progressview', auth.roles(['facultyStatistics']), async (req: Request, res: Response) => { + const facultyId = req.params.id + const code = await getFacultyCodeById(facultyId) + if (!code) { + return res.status(422).end() } -) + try { + const result = await updateFacultyProgressOverview(code) + return res.json(result) + } catch (error) { + const message = `Failed to update progress tab stats for faculty ${code}` + logger.error(message, { error }) + return res.status(500).json({ error: message }) + } +}) export default router diff --git a/services/backend/src/services/userService.ts b/services/backend/src/services/userService.ts index 2f3a41c34..982c94bba 100644 --- a/services/backend/src/services/userService.ts +++ b/services/backend/src/services/userService.ts @@ -150,7 +150,7 @@ const updateAccessGroups = async ( specialGroup: Record, sisId: string ) => { - const { jory, superAdmin, openUni, katselmusViewer, fullSisuAccess } = specialGroup + const { jory, superAdmin, openUni, fullSisuAccess } = specialGroup const userFromDb = await User.findOne({ where: { username } }) if (!userFromDb) { throw new Error(`User ${username} not found`) @@ -166,7 +166,6 @@ const updateAccessGroups = async ( ...(currentAccessGroups.includes('teachers') ? ['teachers'] : []), ...(superAdmin || currentAccessGroups.includes('admin') ? ['admin'] : []), ...(openUni ? ['openUniSearch'] : []), - ...(katselmusViewer ? ['katselmusViewer'] : []), ...(fullSisuAccess ? ['fullSisuAccess'] : []), ] as Role[]