Compare commits

...
14 Commits
17 changed files with 280 additions and 314 deletions
+3 -2
View File
@@ -1,5 +1,5 @@
const router = require('express').Router()
const userService = require('../services/userService')
const { getUserDataFor } = require('../services/userService')
const { sendFeedbackToToska } = require('../services/mailservice')
const logger = require('../util/logger')
@@ -8,7 +8,8 @@ router.post('/email', async (req, res) => {
const {
decodedToken: { userId },
} = req
const { email, full_name } = await userService.byUsername(userId)
const { email, full_name } = await getUserDataFor(userId)
const result = await sendFeedbackToToska({
feedbackContent: content,
+4 -2
View File
@@ -25,9 +25,11 @@ router.get('/access_groups', async (req, res) => {
router.post('/modifyaccess', async (req, res) => {
try {
const { uid } = req.body
const { username } = req.body
const result = await userService.modifyAccess(req.body)
const user = await userService.byId(uid)
const user = {
username,
}
await addUserToBlacklist(user, req.decodedToken)
res.status(200).json(result)
} catch (e) {
@@ -3,6 +3,154 @@ const { Organization, ProgrammeModule } = require('../models')
const Op = Sequelize.Op
const { dbConnections } = require('../database/connection')
// temp refactoring faculty <-> userservice mappings away from userservice
const facultiesAndProgrammesInUserService = [
['H10', 'MH10_001'],
['H10', 'MH40_011'],
['H10', 'KH10_001'],
['H20', 'KH20_001'],
['H20', 'MH20_001'],
['H20', 'MH20_002'],
['H30', 'KH30_001'],
['H30', 'KH30_002'],
['H30', 'MH30_002'],
['H30', 'MH30_003'],
['H30', 'MH30_004'],
['H30', 'MH30_005'],
['H30', 'MH30_001'],
['H40', 'KH40_001'],
['H40', 'KH40_002'],
['H40', 'KH40_003'],
['H40', 'KH40_004'],
['H40', 'KH40_005'],
['H40', 'KH40_006'],
['H40', 'MH40_001'],
['H40', 'MH40_002'],
['H40', 'MH40_003'],
['H40', 'MH40_004'],
['H40', 'MH40_005'],
['H40', 'MH40_006'],
['H40', 'MH40_007'],
['H40', 'MH40_008'],
['H40', 'MH40_009'],
['H40', 'MH40_010'],
['H40', 'MH40_011'],
['H40', 'MH40_012'],
['H40', 'MH40_013'],
['H40', 'MH40_014'],
['H40', 'MH40_015'],
['H40', 'MH70_001'],
['H40', 'MH70_006'],
['H50', 'KH50_001'],
['H50', 'KH50_002'],
['H50', 'KH50_003'],
['H50', 'KH50_004'],
['H50', 'KH50_005'],
['H50', 'KH50_006'],
['H50', 'KH50_007'],
['H50', 'MH50_001'],
['H50', 'MH50_002'],
['H50', 'MH50_003'],
['H50', 'MH50_004'],
['H50', 'MH50_005'],
['H50', 'MH50_006'],
['H50', 'MH50_007'],
['H50', 'MH50_008'],
['H50', 'MH50_009'],
['H50', 'MH50_010'],
['H50', 'MH50_011'],
['H50', 'MH50_012'],
['H50', 'MH50_013'],
['H55', 'KH55_001'],
['H55', 'MH55_001'],
['H57', 'KH57_001'],
['H57', 'KH57_002'],
['H57', 'KH57_003'],
['H57', 'MH50_002'],
['H57', 'MH50_013'],
['H57', 'MH57_001'],
['H57', 'MH57_002'],
['H57', 'MH57_003'],
['H57', 'MH57_004'],
['H57', 'MH57_005'],
['H57', 'MH80_007'],
['H60', 'KH60_001'],
['H60', 'MH60_001'],
['H70', 'KH40_001'],
['H70', 'KH50_001'],
['H70', 'KH70_001'],
['H70', 'KH70_002'],
['H70', 'KH70_003'],
['H70', 'KH70_004'],
['H70', 'MH50_001'],
['H70', 'MH57_005'],
['H70', 'MH70_001'],
['H70', 'MH70_002'],
['H70', 'MH70_003'],
['H70', 'MH70_004'],
['H70', 'MH70_005'],
['H70', 'MH70_006'],
['H70', 'MH70_007'],
['H70', 'MH70_008'],
['H70', 'MH70_009'],
['H70', 'MH70_010'],
['H74', 'KH74_001'],
['H80', 'KH57_002'],
['H80', 'KH80_001'],
['H80', 'KH80_002'],
['H80', 'KH80_003'],
['H80', 'KH80_004'],
['H80', 'MH57_002'],
['H80', 'MH57_003'],
['H80', 'MH57_005'],
['H80', 'MH80_001'],
['H80', 'MH80_002'],
['H80', 'MH80_003'],
['H80', 'MH80_004'],
['H80', 'MH80_005'],
['H80', 'MH80_006'],
['H80', 'MH80_007'],
['H90', 'KH90_001'],
['H30', '447000'],
['H30', '447001'],
['H30', '447002'],
['H60', 'EDUK730'],
['H60', 'K-MUUT-ERIL'],
['H60', 'ED400'],
['H60', 'ED200'],
['H60', 'ED700'],
['H60', 'ED100'],
['H60', 'ED300'],
['H60', 'ED600'],
['H60', '8009'],
['H60', '8118'],
['H60', '8600'],
['H60', 'DUK-PED'],
['H60', '65'],
['H60', '1102'],
['H60', '20018'],
['H60', '8601'],
['H60', '9290'],
['H60', '8172'],
['H60', '83600'],
['H60', 'DUM-PED'],
['H60', 'ED500'],
['H60', '83601'],
['H60', '0130'],
['H60', '20005-e'],
['H60', '1040'],
['H60', '8703'],
['H60', '0005'],
['H60', '7900'],
['H60', '0152 '],
['H90', 'MH90_001'],
]
const facultiesAndProgrammesForTrends = facultiesAndProgrammesInUserService.map(f => ({
faculty_code: f[0],
programme_code: f[1],
}))
// Have facultyfetching to work like it worked during oodi-db time
const facultiesInOodi = [
'H10',
@@ -66,4 +214,5 @@ module.exports = {
degreeProgrammeCodesOfFaculty,
isFaculty,
providersOfFaculty,
facultiesAndProgrammesForTrends,
}
@@ -6,7 +6,6 @@ const logger = require('../util/logger')
const { dbConnections } = require('../database/connection')
const recursivelyGetModuleAndChildren = async (code, type) => {
// TODO use only sis connection once sis is stable
const connection = dbConnections.sequelize
try {
const [result] = await connection.query(
@@ -2,7 +2,6 @@ const {
dbConnections: { sequelize },
} = require('../database/connection')
const { Studyright, StudyrightElement, ElementDetail } = require('../models')
const { getUserElementDetails } = require('./userService')
const moment = require('moment')
const { redisClient } = require('../services/redis')
const _ = require('lodash')
@@ -140,15 +139,6 @@ const getAllStudyrightElementsAndAssociations = async () => {
return JSON.parse(studyright_elements)
}
const getStudyrightElementsAndAssociationsForUser = async username => {
const studyrightelementcodes = await getUserElementDetails(username)
if (studyrightelementcodes.length === 0) {
return []
}
const associations = await getAssociatedStudyrights(studyrightelementcodes)
return formatStudyrightElements(studyrightelementcodes, associations)
}
const getAllProgrammes = async () => {
const elementDetails = ElementDetail.findAll({
where: {
@@ -324,21 +314,13 @@ const getFilteredAssociations = async codes => {
return associations
}
const getUserAssociations = async userid => {
const codes = await getUserElementDetails(userid)
const associations = await getFilteredAssociations(codes)
return associations
}
module.exports = {
byStudent,
studentNumbersWithAllStudyRightElements,
getAssociatedStudyrights,
getAllStudyrightElementsAndAssociations,
getStudyrightElementsAndAssociationsForUser,
getAssociations,
getFilteredAssociations,
getUserAssociations,
refreshAssociationsInRedis,
getAllProgrammes,
getAllElementDetails,
@@ -1,15 +1,8 @@
const axios = require('axios')
const { redisClient } = require('../../services/redis')
const { USERSERVICE_URL } = require('../../conf-backend')
const {
dbConnections: { sequelize },
} = require('../../database/connection')
const userServiceClient = axios.create({
baseURL: USERSERVICE_URL,
headers: { secret: process.env.USERSERVICE_SECRET },
})
const getRedisCDS = async REDIS_KEY => {
const raw = await redisClient.getAsync(REDIS_KEY)
return raw && JSON.parse(raw)
@@ -177,6 +170,5 @@ const getTargetStudentCounts = async ({ codes, includeOldAttainments, excludeNon
module.exports = {
getRedisCDS,
saveToRedis,
userServiceClient,
getTargetStudentCounts,
}
@@ -4,7 +4,8 @@ const {
} = require('../../database/connection')
const { mapToProviders } = require('../../util/utils')
const { ElementDetail, Organization } = require('../../models')
const { getRedisCDS, saveToRedis, userServiceClient } = require('./shared')
const { getRedisCDS, saveToRedis } = require('./shared')
const { facultiesAndProgrammesForTrends } = require('../../services/organisations')
const REDIS_KEY_STATUS = 'STATUS_DATA_V3'
@@ -244,14 +245,13 @@ const calculateStatusStatistics = async (unixMillis, showByYear) => {
)
/* Gather all required data */
const [yearlyAccCredits, yearlyTotalCredits, elementDetails, faculties, { data: facultyProgrammes }] =
await Promise.all([
Promise.all(yearlyAccCreditsPromises),
Promise.all(yearlyTotalCreditsPromises),
ElementDetail.findAll(),
Organization.findAll(),
userServiceClient.get('/faculty_programmes'),
])
const [yearlyAccCredits, yearlyTotalCredits, elementDetails, faculties] = await Promise.all([
Promise.all(yearlyAccCreditsPromises),
Promise.all(yearlyTotalCreditsPromises),
ElementDetail.findAll(),
Organization.findAll(),
])
const facultyProgrammes = facultiesAndProgrammesForTrends
const yearlyOrgStatPromises = yearRange.map(async year => [
year,
+96 -108
View File
@@ -1,24 +1,42 @@
const axios = require('axios')
const _ = require('lodash')
const { USERSERVICE_URL } = require('../conf-backend')
const UnitService = require('./units')
const elementDetailService = require('./elementdetails')
const { filterStudentnumbersByAccessrights } = require('./students')
const { userDataCache } = require('./cache')
const client = axios.create({ baseURL: USERSERVICE_URL, headers: { secret: process.env.USERSERVICE_SECRET } })
const { getImporterClient } = require('../util/importerClient')
const logger = require('../util/logger')
const { facultiesAndProgrammesForTrends } = require('../services/organisations')
const ping = async () => {
const url = '/ping'
const response = await axios.get(url)
return response.data
const client = axios.create({ baseURL: USERSERVICE_URL, headers: { secret: process.env.USERSERVICE_SECRET } })
// Private helpers
const enrichProgrammesFromFaculties = faculties =>
facultiesAndProgrammesForTrends.filter(f => faculties.includes(f.faculty_code)).map(f => f.programme_code)
const enrichWithProgrammes = toEnrich => {
if (Array.isArray(toEnrich)) {
return toEnrich.map(obj => enrichWithProgrammes(obj))
}
if (toEnrich.rights) {
return {
...toEnrich,
rights: _.union(toEnrich.rights, enrichProgrammesFromFaculties(toEnrich.faculties)),
}
}
if (toEnrich.elementdetails) {
return {
...toEnrich,
elementdetails: _.union(
toEnrich.elementdetails,
enrichProgrammesFromFaculties(toEnrich.faculty.map(f => f.faculty_code))
),
}
}
return toEnrich
}
const findAll = async () => {
const response = await client.get('/findall')
return response.data
}
const checkStudyGuidanceGroupsAccess = async hyPersonSisuId => {
if (!hyPersonSisuId) {
logger.error('Not possible to get groups without personId header')
@@ -30,101 +48,20 @@ const checkStudyGuidanceGroupsAccess = async hyPersonSisuId => {
return data && Object.values(data).length > 0
}
const login = async (uid, full_name, hyGroups, affiliations, email, hyPersonSisuId) => {
const hasStudyGuidanceGroupAccess = await checkStudyGuidanceGroupsAccess(hyPersonSisuId)
const response = await client.post('/login', {
uid,
full_name,
hyGroups,
affiliations,
email,
hyPersonSisuId,
hasStudyGuidanceGroupAccess,
})
return response.data
}
const superlogin = async (uid, asUser) => {
const response = await client.post('/superlogin', {
uid,
asUser,
})
return response.data
}
const byUsername = async uid => {
const url = `/user/${uid}`
const byUsernameData = async username => {
// OK, enriched
const url = `/user/${username}/user_data`
const response = await client.get(url)
return response.data
return enrichWithProgrammes(response.data)
}
const byUsernameData = async uid => {
const url = `/user/${uid}/user_data`
const response = await client.get(url)
return response.data
}
const getUserElementDetails = async username => {
const url = `/user/elementdetails/${username}`
const response = await client.get(url)
const elementdetailcodes = response.data
return elementDetailService.byCodes(elementdetailcodes)
}
const byId = async id => {
const url = `/user/id/${id}`
const response = await client.get(url)
return response.data
}
const updateUser = async (uid, fields) => {
userDataCache.del(uid)
const url = `/user/${uid}`
const response = await client.put(url, fields)
return response.data
}
const getRolesFor = async user => {
const url = `/get_roles/${user}`
const response = await client.get(url)
return response.data
}
const enableElementDetails = async (uid, codes) => {
const response = await client.post('/add_rights', { uid, codes })
return response.data.user
}
const removeElementDetails = async (uid, codes) => {
const response = await client.post('/remove_rights', { uid, codes })
return response.data.user
}
const setFaculties = async (uid, faculties) => {
const response = await client.post('/set_faculties', { uid, faculties })
return response.data.user
}
const getUnitsFromElementDetails = async username => {
const elementDetails = await getUserElementDetails(username)
return elementDetails.map(element => UnitService.parseUnitFromElement(element))
}
const modifyAccess = async body => {
const response = await client.post('/modifyaccess', body)
return response.data
}
const getAccessGroups = async () => {
const response = await client.get('/access_groups')
return response.data
}
const getUserDataFor = async uid => {
let userData = userDataCache.get(uid)
// Exported helpers
const getUserDataFor = async username => {
// no need to enrich
let userData = userDataCache.get(username)
if (!userData) {
userData = await byUsernameData(uid)
userDataCache.set(uid, userData)
userData = await byUsernameData(username)
userDataCache.set(username, userData)
}
return {
@@ -133,9 +70,21 @@ const getUserDataFor = async uid => {
}
}
const getUnitsFromElementDetails = async username => {
// No need to enrich
let userData = userDataCache.get(username)
if (!userData) {
userData = await byUsernameData(username)
userDataCache.set(username, userData)
}
const elementDetails = await elementDetailService.byCodes(userData.rights)
return elementDetails.map(element => UnitService.parseUnitFromElement(element))
}
const getStudentsUserCanAccess = async (studentnumbers, roles, userId) => {
// No need to enrich
let studentsUserCanAccess
if (roles && roles.includes('admin')) {
if (roles?.includes('admin')) {
studentsUserCanAccess = new Set(studentnumbers)
} else {
const unitsUserCanAccess = await getUnitsFromElementDetails(userId)
@@ -145,12 +94,52 @@ const getStudentsUserCanAccess = async (studentnumbers, roles, userId) => {
return studentsUserCanAccess
}
// FOR ROUTES 1-to-1 mapping
const modifyAccess = async body => enrichWithProgrammes((await client.post('/modifyaccess', body)).data)
const getAccessGroups = async () => enrichWithProgrammes((await client.get('/access_groups')).data)
const enableElementDetails = async (uid, codes) =>
enrichWithProgrammes((await client.post('/add_rights', { uid, codes })).data.user)
const findAll = async () => enrichWithProgrammes((await client.get('/findall')).data)
const setFaculties = async (uid, faculties) =>
enrichWithProgrammes((await client.post('/set_faculties', { uid, faculties })).data.user)
const removeElementDetails = async (uid, codes) =>
enrichWithProgrammes((await client.post('/remove_rights', { uid, codes })).data.user)
const updateUser = async (username, fields) => {
userDataCache.del(username)
return enrichWithProgrammes((await client.put(`/user/${username}`, fields)).data)
}
const login = async (uid, full_name, hyGroups, affiliations, email, hyPersonSisuId) => {
const hasStudyGuidanceGroupAccess = await checkStudyGuidanceGroupsAccess(hyPersonSisuId)
return (
await client.post('/login', {
uid,
full_name,
hyGroups,
affiliations,
email,
hyPersonSisuId,
hasStudyGuidanceGroupAccess,
})
).data
}
const superlogin = async (uid, asUser) =>
(
await client.post('/superlogin', {
uid,
asUser,
})
).data
module.exports = {
ping,
byUsername,
updateUser,
byId,
getUserElementDetails,
login,
superlogin,
enableElementDetails,
@@ -159,7 +148,6 @@ module.exports = {
modifyAccess,
getAccessGroups,
getUnitsFromElementDetails,
getRolesFor,
setFaculties,
getUserDataFor,
getStudentsUserCanAccess,
@@ -1,5 +1,4 @@
import React, { useEffect } from 'react'
import { string, func, shape, bool, oneOfType, array } from 'prop-types'
import { connect } from 'react-redux'
import ProductivityTable from '../ProductivityTable'
import ThroughputTable from '../ThroughputTable'
@@ -53,29 +52,6 @@ const Overview = props => {
)
}
Overview.propTypes = {
studyprogramme: string.isRequired,
dispatchGetProductivity: func.isRequired,
dispatchGetThroughput: func.isRequired,
dispatchGetBachelors: func.isRequired,
history: shape({}).isRequired,
productivity: shape({
error: bool,
pending: bool,
data: shape({}),
}).isRequired, // eslint-disable-line
throughput: shape({
error: bool,
pending: bool,
data: shape({}),
}).isRequired, // eslint-disable-line
bachelors: shape({
error: bool,
pending: bool,
data: oneOfType([shape({}), array]),
}).isRequired // eslint-disable-line
}
const mapStateToProps = ({ studyProgrammeProductivity, studyProgrammeThroughput, studyProgrammeBachelors }) => ({
productivity: studyProgrammeProductivity,
throughput: studyProgrammeThroughput,
@@ -30,7 +30,7 @@ const AccessGroups = ({
selected.forEach(value => {
rights[value] = true
})
modifyAccessGroups(user.id, rights)
modifyAccessGroups(user.username, rights)
}
return (
+2 -2
View File
@@ -6,11 +6,11 @@ export const getUsers = () => {
return callController(route, prefix)
}
export const modifyAccessGroups = (uid, accessgroups) => {
export const modifyAccessGroups = (username, accessgroups) => {
const route = '/users/modifyaccess'
const prefix = 'MODIFY_ACCESSGROUPS_'
const method = 'post'
const data = { uid, accessgroups }
const data = { username, accessgroups }
return callController(route, prefix, data, method)
}
+5 -45
View File
@@ -3,7 +3,6 @@ const Sentry = require('@sentry/node')
const User = require('./src/services/users')
const AccessGroup = require('./src/services/accessgroups')
const FacultyProgrammes = require('./src/services/facultyprogrammes')
const { initializeDatabaseConnection } = require('./src/database/connection')
const initializeSentry = require('./src/util/sentry')
@@ -26,12 +25,6 @@ initializeDatabaseConnection()
res.json(users.map(User.getUserData))
})
app.get('/user/:uid', async (req, res) => {
const uid = req.params.uid
const user = await User.byUsername(uid)
res.json(User.getUserData(user))
})
app.get('/user/:uid/user_data', async (req, res) => {
const uid = req.params.uid
const user = await User.byUsernameMinified(uid)
@@ -40,28 +33,14 @@ initializeDatabaseConnection()
const faculties = user.faculty.map(({ faculty_code }) => faculty_code)
res.json({
email: user.email,
full_name: user.full_name,
roles,
rights,
faculties,
})
})
app.get('/user/elementdetails/:username', async (req, res) => {
const username = req.params.username
const user = await User.byUsername(username)
const programmes = User.getUserProgrammes(user)
res.json(programmes)
})
app.get('/user/id/:id', async (req, res) => {
const id = req.params.id
const user = await User.byId(id)
console.log(JSON.stringify(user))
res.json(User.getUserData(user))
})
app.post('/login', async (req, res) => {
const { uid, full_name, hyGroups, affiliations, email, hyPersonSisuId, hasStudyGuidanceGroupAccess } = req.body
console.log(uid, full_name, 'logging in!')
@@ -99,10 +78,10 @@ initializeDatabaseConnection()
})
app.post('/modifyaccess', async (req, res) => {
const { uid, accessgroups } = req.body
const { username, accessgroups } = req.body
try {
await User.modifyRights(uid, accessgroups)
const user = await User.byId(uid)
await User.modifyRights(username, accessgroups)
const user = await User.byUsername(username)
res.status(200).json(User.getUserData(user))
} catch (e) {
res.status(400).json({ e })
@@ -152,25 +131,6 @@ initializeDatabaseConnection()
}
})
app.get('/get_roles/:user', async (req, res) => {
const user = req.params.user
try {
const roles = await User.getRoles(user)
res.status(200).json(roles)
} catch (e) {
res.status(400).json({ e })
}
})
app.get('/faculty_programmes', async (req, res) => {
try {
const facultyProgrammes = await FacultyProgrammes.findAll()
res.status(200).json(facultyProgrammes)
} catch (e) {
res.status(400).json({ e })
}
})
const server = app.listen(port, () => console.log(`Userservice listening on port ${port}!`))
process.on('SIGTERM', () => {
server.close(() => {
@@ -0,0 +1,6 @@
module.exports = {
up: async queryInterface => {
await queryInterface.dropTable('faculty_programmes')
},
down: async () => {},
}
-22
View File
@@ -59,22 +59,6 @@ const UserFaculties = sequelize.define('user_faculties', {
type: Sequelize.DATE,
},
})
const FacultyProgrammes = sequelize.define('faculty_programmes', {
faculty_code: {
primaryKey: true,
type: Sequelize.STRING,
},
programme_code: {
primaryKey: true,
type: Sequelize.STRING,
},
createdAt: {
type: Sequelize.DATE,
},
updatedAt: {
type: Sequelize.DATE,
},
})
const User = sequelize.define(
'users',
@@ -154,11 +138,6 @@ User.belongsToMany(Affiliation, {
Affiliation.belongsToMany(User, { through: 'user_affiliation' })
User.hasMany(UserFaculties, { as: 'faculty', foreignKey: 'userId' })
UserFaculties.hasMany(FacultyProgrammes, {
as: 'programme',
foreignKey: 'faculty_code',
sourceKey: 'faculty_code',
})
module.exports = {
User,
@@ -167,6 +146,5 @@ module.exports = {
HyGroup,
Affiliation,
UserFaculties,
FacultyProgrammes,
sequelize,
}
@@ -1,37 +0,0 @@
const { sequelize, forceSyncDatabase } = require('../database/connection')
const { FacultyProgrammes } = require('../models/index')
const facultyProgrammeService = require('./facultyprogrammes')
const facultyprogrammes = [
{
faculty_code: 'H10',
programme_code: 'MH10_001',
},
{
faculty_code: 'H50',
programme_code: 'MH50_003',
},
]
beforeAll(async () => {
await forceSyncDatabase()
FacultyProgrammes.bulkCreate(facultyprogrammes)
})
afterAll(async () => {
await forceSyncDatabase()
await sequelize.close()
})
describe('after running migrations the faculties faculty table', () => {
test('includes some correct faculty & programme codes', async () => {
const faculties = await facultyProgrammeService.findAll()
expect(faculties.some(f => f.faculty_code === 'H10' && f.programme_code === 'MH10_001')).toBe(true)
expect(faculties.some(f => f.faculty_code === 'H50' && f.programme_code === 'MH50_003')).toBe(true)
})
test('does not include incorrect faculty & programme codes', async () => {
const faculties = await facultyProgrammeService.findAll()
expect(faculties.some(f => f.faculty_code === 'KH4000')).toBe(false)
expect(faculties.some(f => f.programme_code === 'SWAGLITTINEN')).toBe(false)
})
})
@@ -1,5 +0,0 @@
const { FacultyProgrammes } = require('../models/index')
const findAll = () => FacultyProgrammes.findAll()
module.exports = { findAll }
+5 -30
View File
@@ -2,17 +2,7 @@ const Sequelize = require('sequelize')
const jwt = require('jsonwebtoken')
const _ = require('lodash')
const moment = require('moment')
const { flatMap } = require('lodash')
const {
User,
UserElementDetails,
AccessGroup,
HyGroup,
Affiliation,
FacultyProgrammes,
UserFaculties,
sequelize,
} = require('../models')
const { User, UserElementDetails, AccessGroup, HyGroup, Affiliation, UserFaculties, sequelize } = require('../models')
const AccessService = require('./accessgroups')
const AffiliationService = require('./affiliations')
const HyGroupService = require('./hygroups')
@@ -152,10 +142,6 @@ const userIncludes = [
separate: true,
model: UserFaculties,
as: 'faculty',
include: {
model: FacultyProgrammes,
as: 'programme',
},
},
{
model: Affiliation,
@@ -194,11 +180,6 @@ const byUsernameMinified = async username => {
separate: true,
model: UserFaculties,
as: 'faculty',
include: {
model: FacultyProgrammes,
as: 'programme',
attributes: ['programme_code'],
},
attributes: ['faculty_code'],
},
],
@@ -245,13 +226,8 @@ const byId = async id => {
return user
}
const getUserProgrammes = user => {
const elementdetails = [
...user.programme.map(p => p.elementDetailCode),
...flatMap(user.faculty, f => f.programme.map(p => p.programme_code)),
]
return elementdetails
}
const getUserProgrammes = user => user.programme.map(p => p.elementDetailCode)
const getUserAccessGroups = async username => {
const user = await byUsername(username)
return await user.getAccessgroup()
@@ -287,8 +263,7 @@ const setFaculties = async (uid, faculties) => {
})
}
const modifyRights = async (uid, rights) => {
console.log(uid, rights)
const modifyRights = async (username, rights) => {
const rightsToAdd = Object.entries(rights)
.map(([code, val]) => {
if (val === true) {
@@ -304,7 +279,7 @@ const modifyRights = async (uid, rights) => {
})
.filter(code => code)
const user = await byId(uid)
const user = await byUsername(username)
const accessGroupsToAdd = await AccessService.byCodes(rightsToAdd)
const accessGroupsToRemove = await AccessService.byCodes(rightsToRemove)