Skip to content

Commit

Permalink
Merge pull request #4613 from UniversityOfHelsinkiCS/OOD-50
Browse files Browse the repository at this point in the history
[Language center view]: Make language center view visibility and backend functionality configurable
  • Loading branch information
valtterikantanen committed Aug 27, 2024
2 parents 3e50a40 + 3d008c7 commit b80ef23
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 13 deletions.
4 changes: 4 additions & 0 deletions docker-compose.fd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,13 @@ services:
IMPORTER_DB_API_USER: dev_user
IMPORTER_DB_API_PASSWORD: dev_password
ROOT_ORG_ID: ${ROOT_ORG_ID}
LANGUAGE_CENTER_VIEW_ENABLED: 'false'
ports:
- 8080:8080
volumes:
- ./environments/ha:/opt/app-root/src/src/environment
- ./services/backend/src:/opt/app-root/src/src
- ./services/shared/:/opt/app-root/src/src/shared

frontend:
<<: *defaults
Expand All @@ -61,8 +63,10 @@ services:
- 3000:3000
environment:
REACT_APP_SERVICE_PROVIDER: fd
REACT_APP_LANGUAGE_CENTER_VIEW_ENABLED: 'false'
volumes:
- ./services/frontend/src/:/opt/app-root/src/src
- ./services/shared/:/opt/app-root/src/src/shared

kone-db:
<<: *defaults
Expand Down
7 changes: 7 additions & 0 deletions services/backend/src/config/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ const { DB_URL_KONE, DB_URL_USER, SECRET_TOKEN, SIS_DB_URL, SIS_UPDATER_URL, CRY

const rootOrgId = process.env.ROOT_ORG_ID || 'hy-university-root-id'

const languageCenterViewEnabled =
process.env.LANGUAGE_CENTER_VIEW_ENABLED == null ? true : process.env.LANGUAGE_CENTER_VIEW_ENABLED === 'true'

const concurrentWorkers = process.env.CONCURRENT_WORKERS ? parseInt(process.env.CONCURRENT_WORKERS, 10) : 2

let DB_MAX_CONNECTIONS = parseInt(process.env.DB_MAX_CONNECTIONS, 10)
if (Number.isNaN(DB_MAX_CONNECTIONS)) {
DB_MAX_CONNECTIONS = 5 // sequelize's default
Expand Down Expand Up @@ -100,4 +105,6 @@ module.exports = {
sisUrl,
sisGrapqlAppAccount,
sisGrapqlAppKey,
languageCenterViewEnabled,
concurrentWorkers,
}
4 changes: 2 additions & 2 deletions services/backend/src/events.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { CronJob } from 'cron'

import { isProduction, runningInCI } from './config'
import { isProduction, runningInCI, languageCenterViewEnabled } from './config'
import { getDegreeProgrammesOfFaculty } from './services/faculty/faculty'
import { getFaculties } from './services/faculty/facultyHelpers'
import { updateFacultyOverview, updateFacultyProgressOverview } from './services/faculty/facultyUpdates'
Expand Down Expand Up @@ -93,7 +93,7 @@ const dailyJobs = async () => {
try {
await refreshTeacherLeaderboard()
await refreshProgrammesAndFaculties()
jobMaker.languagecenter()
if (languageCenterViewEnabled) jobMaker.languagecenter()
jobMaker.closeToGraduation()
} catch (error) {
logger.error('Daily jobs failed', error)
Expand Down
6 changes: 4 additions & 2 deletions services/backend/src/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import compression from 'compression'
import cors from 'cors'
import express, { Express } from 'express'

import { frontUrl, serviceProvider } from './config'
import { frontUrl, languageCenterViewEnabled, serviceProvider } from './config'
import accessLogger from './middleware/accessLogger'
import * as auth from './middleware/auth'
import currentUserMiddleware from './middleware/currentUser'
Expand Down Expand Up @@ -65,7 +65,9 @@ const routes = (app: Express, url: string) => {
app.use(`${url}/openunisearch`, auth.roles(['openUniSearch']), customOpenUniSearch)
app.use(`${url}/changelog`, changelog)
app.use(`${url}/completedcoursessearch`, completedCoursesSearch)
app.use(`${url}/languagecenterdata`, languageCenterData)
if (languageCenterViewEnabled) {
app.use(`${url}/languagecenterdata`, languageCenterData)
}
app.use(`${url}/faculties`, faculties)
app.use(`${url}/university`, university)
app.use(`${url}/updater`, auth.roles(['admin']), updater)
Expand Down
3 changes: 3 additions & 0 deletions services/backend/src/routes/updater.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Request, Response, Router } from 'express'

import { languageCenterViewEnabled } from '../config'
import { refreshFaculties, refreshProgrammes } from '../events'
import {
abortUpdate,
Expand Down Expand Up @@ -106,6 +107,8 @@ router.post('/refresh_faculties_v2', async (req: Request, res: Response) => {

router.post('/refresh_language_center_data', async (req: Request, res: Response) => {
logger.info(`${req.user.username} requested refresh of language center data`)
if (!languageCenterViewEnabled)
res.status(418).json({ error: 'The language center functionality is not activated in your environment.' })
jobMaker.languagecenter()
res.status(200).json('Added job for refreshing language center data')
})
Expand Down
4 changes: 2 additions & 2 deletions services/backend/src/worker/worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const Sentry = require('@sentry/node')
const { Worker } = require('bullmq')
const moment = require('moment')

const { redis } = require('../config')
const { redis, concurrentWorkers } = require('../config')
const logger = require('../util/logger')
const { defaultJobOptions, queueName } = require('./queue')

Expand All @@ -17,7 +17,7 @@ process.execArgv = process.execArgv.filter(arg => !arg.includes('--max_old_space
const worker = new Worker(queueName, `${__dirname}/processor.js`, {
connection,
useWorkerThreads: true,
concurrency: 2,
concurrency: concurrentWorkers,
})

worker.on('completed', job => {
Expand Down
4 changes: 2 additions & 2 deletions services/frontend/src/components/NavigationBar/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Button, Dropdown, Label, Menu } from 'semantic-ui-react'

import { checkUserAccess, getFullStudyProgrammeRights, isDefaultServiceProvider } from '@/common'
import { LanguagePicker } from '@/components/LanguagePicker'
import { adminerUrls, isDev } from '@/conf'
import { adminerUrls, isDev, languageCenterViewEnabled } from '@/conf'
import { useGetAuthorizedUserQuery, useLogoutMutation, useShowAsUser } from '@/redux/auth'
import './navigationBar.css'

Expand Down Expand Up @@ -112,7 +112,7 @@ export const NavigationBar = () => {
if (
(checkUserAccess(['admin'], roles) || iamGroups.includes('grp-kielikeskus-esihenkilot')) &&
item.key === 'languageCenterView' &&
isDefaultServiceProvider()
languageCenterViewEnabled
)
return true
if (item.key === 'closeToGraduation' && checkUserAccess(['admin', 'fullSisuAccess', 'studyGuidanceGroups'], roles))
Expand Down
3 changes: 2 additions & 1 deletion services/frontend/src/components/Routes/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { StudyProgramme } from '@/components/StudyProgramme'
import { Teachers } from '@/components/Teachers'
import { Updater } from '@/components/Updater'
import { Users } from '@/components/Users'
import { languageCenterViewEnabled } from '@/conf'
import { ProtectedRoute } from './ProtectedRoute'

const routes = {
Expand Down Expand Up @@ -115,7 +116,7 @@ export const Routes = () => (
path={routes.studyGuidanceGroups}
requiredRoles={['studyGuidanceGroups']}
/>
{isDefaultServiceProvider() && (
{languageCenterViewEnabled && (
<ProtectedRoute
component={LanguageCenterView}
exact
Expand Down
14 changes: 10 additions & 4 deletions services/frontend/src/components/Updater/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import ReactMarkdown from 'react-markdown'
import { Button, Form, Header, Message, Radio, Segment, Table, TextArea } from 'semantic-ui-react'

import { callApi } from '@/apiConnection'
import { isDefaultServiceProvider } from '@/common'
import { useTitle } from '@/common/hooks'
import { languageCenterViewEnabled } from '@/conf'

export const Updater = () => {
const [messages, setMessages] = useState([])
Expand Down Expand Up @@ -90,9 +92,11 @@ export const Updater = () => {
**Oodikone redis - Refresh language center data** Refresh data for language center view.
**Oodikone redis - Refresh close to graduation data** Refresh data for close to graduation view.`}
</ReactMarkdown>
<Button color="red" onClick={() => setError(true)}>
Cause frontend crash
</Button>
{isDefaultServiceProvider() && (
<Button color="red" onClick={() => setError(true)}>
Cause frontend crash
</Button>
)}
</Message>
<Form>
<Header>Updater (data pulled from importer db and brought to oodikone db)</Header>
Expand Down Expand Up @@ -121,7 +125,9 @@ export const Updater = () => {
<Form.Button content="Refresh oodikone statistics" onClick={refreshStatisticsV2} />
<Form.Button content="Refresh faculties" onClick={refreshFaculties} />
<Form.Button content="Refresh study programmes" onClick={refreshStudyProgrammes} />
<Form.Button content="Refresh language center data" onClick={refreshLanguageCenterData} />
{languageCenterViewEnabled && (
<Form.Button content="Refresh language center data" onClick={refreshLanguageCenterData} />
)}
<Form.Button content="Refresh close to graduation data" onClick={refreshCloseToGraduationData} />
</Form.Group>
</Form>
Expand Down
6 changes: 6 additions & 0 deletions services/frontend/src/conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,9 @@ export const builtAt = process.env.REACT_APP_BUILT_AT || ''
export const serviceProvider = process.env.REACT_APP_SERVICE_PROVIDER
? process.env.REACT_APP_SERVICE_PROVIDER.toLowerCase()
: 'toska'

// Variable that can be used to disable the language center view, by default the view is enabled
export const languageCenterViewEnabled =
process.env.REACT_APP_LANGUAGE_CENTER_VIEW_ENABLED == null
? true
: process.env.REACT_APP_LANGUAGE_CENTER_VIEW_ENABLED === 'true'

0 comments on commit b80ef23

Please sign in to comment.