Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Language center view]: Make language center view visibility and backend functionality configurable #4613

Merged
merged 9 commits into from
Aug 27, 2024
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'
mattirasanen marked this conversation as resolved.
Show resolved Hide resolved

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
mattirasanen marked this conversation as resolved.
Show resolved Hide resolved
? true
: process.env.REACT_APP_LANGUAGE_CENTER_VIEW_ENABLED === 'true'