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

EGC-7: UI- Grad file upload #1972

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions .github/workflows/deploy-to.openshift-dev-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ env:
PEN_NAMESPACE_DEV: ${{ secrets.PEN_NAMESPACE_NO_ENV }}-dev
PEN_NAMESPACE_TEST: ${{ secrets.PEN_NAMESPACE_NO_ENV }}-test

GRAD_DATA_COLLECTION_NAMESPACE_DEV: ${{ secrets.GRAD_DATA_COLLECTION_NAMESPACE_NO_ENV }}-dev
GRAD_DATA_COLLECTION_NAMESPACE_TEST: ${{ secrets.GRAD_DATA_COLLECTION_NAMESPACE_NO_ENV }}-test

SPLUNK_TOKEN: ${{ secrets.SPLUNK_TOKEN }}

CA_CERT: ${{ secrets.CA_CERT }}
Expand Down Expand Up @@ -204,7 +207,7 @@ jobs:
oc process -f tools/openshift/frontend-static.dc.yaml -p APP_NAME=${{ env.APP_NAME }} -p REPO_NAME=${{ env.REPO_NAME }} -p BRANCH=${{ env.BRANCH }} -p NAMESPACE=${{ env.OPENSHIFT_NAMESPACE_DEV }} -p TAG=${{ env.TAG }} -p MIN_REPLICAS=${{ env.MIN_REPLICAS_DEV }} -p MAX_REPLICAS=${{ env.MAX_REPLICAS_DEV }} -p MIN_CPU=${{ env.MIN_CPU }} -p MAX_CPU=${{ env.MAX_CPU }} -p MIN_MEM=${{ env.MIN_MEM }} -p MAX_MEM=${{ env.MAX_MEM }} -p HOST_ROUTE=${{ env.HOST_ROUTE }} -p CA_CERT="${{ env.CA_CERT }}" -p CERTIFICATE="${{ env.CERTIFICATE }}" -p PRIVATE_KEY="${{ env.PRIVATE_KEY }}"\
| oc apply -f -

curl -s https://raw.githubusercontent.com/bcgov/${{ env.REPO_NAME }}/master/tools/config/update-configmap.sh | bash /dev/stdin dev ${{ env.APP_NAME }} ${{ env.NAMESPACE }} ${{ env.COMMON_NAMESPACE }} ${{ env.PEN_NAMESPACE_DEV }} ${{ env.SPLUNK_TOKEN }}
curl -s https://raw.githubusercontent.com/bcgov/${{ env.REPO_NAME }}/master/tools/config/update-configmap.sh | bash /dev/stdin dev ${{ env.APP_NAME }} ${{ env.NAMESPACE }} ${{ env.COMMON_NAMESPACE }} ${{ env.PEN_NAMESPACE_DEV }} ${{ env.GRAD_DATA_COLLECTION_NAMESPACE_DEV}} ${{ env.SPLUNK_TOKEN }}

# Start rollout (if necessary) and follow it
oc rollout latest dc/${{ env.IMAGE_NAME }} 2> /dev/null \
Expand Down Expand Up @@ -299,7 +302,7 @@ jobs:
oc process -f tools/openshift/frontend-static.dc.yaml -p APP_NAME=${{ env.APP_NAME }} -p REPO_NAME=${{ env.REPO_NAME }} -p BRANCH=${{ env.BRANCH }} -p NAMESPACE=${{ env.OPENSHIFT_NAMESPACE_TEST }} -p TAG=${{ env.TAG }} -p MIN_REPLICAS=${{ env.MIN_REPLICAS_TEST }} -p MAX_REPLICAS=${{ env.MAX_REPLICAS_TEST }} -p MIN_CPU=${{ env.MIN_CPU }} -p MAX_CPU=${{ env.MAX_CPU }} -p MIN_MEM=${{ env.MIN_MEM }} -p MAX_MEM=${{ env.MAX_MEM }} -p HOST_ROUTE=${{ env.HOST_ROUTE }} -p CA_CERT="${{ env.CA_CERT }}" -p CERTIFICATE="${{ env.CERTIFICATE }}" -p PRIVATE_KEY="${{ env.PRIVATE_KEY }}"\
| oc apply -f -

curl -s https://raw.githubusercontent.com/bcgov/${{ env.REPO_NAME }}/master/tools/config/update-configmap.sh | bash /dev/stdin test ${{ env.APP_NAME }} ${{ env.NAMESPACE }} ${{ env.COMMON_NAMESPACE }} ${{ env.PEN_NAMESPACE_TEST }} ${{ env.SPLUNK_TOKEN }}
curl -s https://raw.githubusercontent.com/bcgov/${{ env.REPO_NAME }}/master/tools/config/update-configmap.sh | bash /dev/stdin test ${{ env.APP_NAME }} ${{ env.NAMESPACE }} ${{ env.COMMON_NAMESPACE }} ${{ env.PEN_NAMESPACE_TEST }} ${{ env.GRAD_DATA_COLLECTION_NAMESPACE_TEST}} ${{ env.SPLUNK_TOKEN }}

# Start rollout (if necessary) and follow it
oc rollout latest dc/${{ env.IMAGE_NAME }} 2> /dev/null \
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/deploy-to.openshift-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ env:
# 🖊️ EDIT to set the kube context's namespace after login. Leave blank to use your user's default namespace.
OPENSHIFT_NAMESPACE: ${{ secrets.EDX_NAMESPACE_NO_ENV }}-test
PEN_NAMESPACE: ${{ secrets.PEN_NAMESPACE_NO_ENV }}-test
GRAD_DATA_COLLECTION_NAMESPACE: ${{ secrets.GRAD_DATA_COLLECTION_NAMESPACE_NO_ENV }}-test
SPLUNK_TOKEN: ${{ secrets.SPLUNK_TOKEN }}

CA_CERT: ${{ secrets.CA_CERT }}
Expand Down Expand Up @@ -133,7 +134,7 @@ jobs:
| oc apply -f -


curl -s https://raw.githubusercontent.com/bcgov/${{ env.REPO_NAME }}/${{ steps.get-latest-tag.outputs.tag }}/tools/config/update-configmap.sh | bash /dev/stdin ${{ env.TARGET_ENV }} ${{ env.APP_NAME }} ${{ env.NAMESPACE }} ${{ env.COMMON_NAMESPACE }} ${{ env.PEN_NAMESPACE }} ${{ env.SPLUNK_TOKEN }}
curl -s https://raw.githubusercontent.com/bcgov/${{ env.REPO_NAME }}/${{ steps.get-latest-tag.outputs.tag }}/tools/config/update-configmap.sh | bash /dev/stdin ${{ env.TARGET_ENV }} ${{ env.APP_NAME }} ${{ env.NAMESPACE }} ${{ env.COMMON_NAMESPACE }} ${{ env.PEN_NAMESPACE }} ${{env.GRAD_DATA_COLLECTION_NAMESPACE}} ${{ env.SPLUNK_TOKEN }}

# Start rollout (if necessary) and follow it
oc rollout latest dc/${{ env.IMAGE_NAME }} 2> /dev/null \
Expand Down
2 changes: 2 additions & 0 deletions backend/src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ const studentRouter = require('./routes/student');
const instituteRouter = require('./routes/institute');
const configRouter = require('./routes/config');
const sdcRouter = require('./routes/sdc');
const gradRouter = require('./routes/grad');
const promMid = require('express-prometheus-middleware');
const messagePubSub = require('./messaging/message-pub-sub');
messagePubSub.init().then(() => {
Expand Down Expand Up @@ -211,6 +212,7 @@ apiRouter.use('/config',configRouter);
apiRouter.use('/student', studentRouter);
apiRouter.use('/institute',instituteRouter);
apiRouter.use('/sdc',sdcRouter);
apiRouter.use('/grad',gradRouter);

//Handle 500 error
app.use((err, _req, res, next) => {
Expand Down
44 changes: 44 additions & 0 deletions backend/src/components/grad.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
'use strict';
const { getAccessToken, handleExceptionResponse, getData, postData, getCreateOrUpdateUserValue} = require('./utils');
const HttpStatus = require('http-status-codes');
const log = require('./logger');
const config = require('../config');

async function uploadFile(req, res) {
try {
let createUpdateUser = getCreateOrUpdateUserValue(req);
const payload = {
fileContents: req.body.fileContents,
fileName: req.body.fileName,
fileType: req.body.fileType,
createUser: createUpdateUser,
updateUser: createUpdateUser
};
const token = getAccessToken(req);
let data = await postData(token, payload, `${config.get('grad:rootURL')}/${req.params.schoolID}/file`, req.session?.correlationID);
return res.status(HttpStatus.OK).json(data);
} catch (e) {
console.log(JSON.stringify(e));
if (e.status === 400) {
return res.status(HttpStatus.BAD_REQUEST).json(e.data.subErrors[0].message);
}
log.error('uploadFile Error', e.stack);
return handleExceptionResponse(e, res);
}
}

async function getSdcFileProgress(req, res) {
try {
const token = getAccessToken(req);
const data = await getData(token, `${config.get('grad:rootURL')}/${req.params.schoolID}/file`, req.session?.correlationID);
return res.status(HttpStatus.OK).json(data);
} catch (e) {
log.error('getSdcFileProgress Error', e.stack);
return handleExceptionResponse(e, res);
}
}

module.exports = {
uploadFile,
getSdcFileProgress
};
3 changes: 3 additions & 0 deletions backend/src/config/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,9 @@ nconf.defaults({
sdcDuplicateURL: process.env.SDC_API_ENDPOINT + '/sdc-duplicate',
collectionTypeCodesURL: process.env.SDC_API_ENDPOINT + '/collection-type-codes',
},
grad: {
rootURL: process.env.GRAD_API_ENDPOINT,
},
frontendConfig: {
bannerEnvironment: process.env.BANNER_ENVIRONMENT,
bannerColor: process.env.BANNER_COLOR,
Expand Down
19 changes: 19 additions & 0 deletions backend/src/routes/grad.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const passport = require('passport');
const express = require('express');
const router = express.Router();
const auth = require('../components/auth');
const isValidBackendToken = auth.isValidBackendToken();
const { validateAccessToken, checkEdxUserPermission} = require('../components/permissionUtils');
const { scanFilePayload } = require('../components/fileUtils');
const { uploadFile, getSdcFileProgress} = require('../components/grad');
const { PERMISSION } = require('../util/Permission');
const validate = require('../components/validator');
const { gradFileUploadSchema, gradFileBySchoolIDSchema} = require('../validations/grad');

router.post('/school/:schoolID/upload-file', passport.authenticate('jwt', {session: false}, undefined), isValidBackendToken, validateAccessToken,
checkEdxUserPermission(PERMISSION.GRAD_SCH_EDIT), validate(gradFileUploadSchema), scanFilePayload, uploadFile);

router.get('/school/:schoolID/file-progress', passport.authenticate('jwt', {session: false}, undefined), isValidBackendToken, validateAccessToken,
checkEdxUserPermission(PERMISSION.GRAD_SCH_EDIT), validate(gradFileBySchoolIDSchema), getSdcFileProgress);

module.exports = router;
3 changes: 2 additions & 1 deletion backend/src/util/Permission.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ const PERMISSION = Object.freeze(
DISTRICT_SDC_VIEW: 'DIS_SDC_VIEW',
SCHOOL_SDC_VIEW: 'SCH_SDC_VIEW',
SUPERINT: 'SUPERINT',
SECR_TRES: 'SECR_TRES'
SECR_TRES: 'SECR_TRES',
GRAD_SCH_EDIT: 'GRAD_SCH_EDIT'
}
);

Expand Down
27 changes: 27 additions & 0 deletions backend/src/validations/grad.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
const { object, string } = require('yup');
const {baseRequestSchema} = require('./base');

const gradFileUploadSchema = object({
body:object({
fileName: string().nonNullable(),
fileContents: string().nonNullable(),
fileType: string().nonNullable()
}).concat(baseRequestSchema).noUnknown(),
params: object({
schoolID: string().nonNullable()
}).noUnknown(),
query: object().noUnknown(),
}).noUnknown();

const gradFileBySchoolIDSchema = object({
body: object().noUnknown(),
params: object({
schoolID: string().nonNullable()
}).noUnknown(),
query: object().noUnknown(),
}).noUnknown();

module.exports = {
gradFileUploadSchema,
gradFileBySchoolIDSchema
};
41 changes: 36 additions & 5 deletions frontend/src/components/graduation/GraduationTableComponent.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
<template>
<v-container>
<v-container class="containerSetup"
fluid>
<v-row class="mt-1 mb-1">
<v-icon
small
color="#1976d2"
>
mdi-arrow-left
</v-icon>
<a
class="ml-1"
@click="backButtonClick"
>Return to Dashboard</a>
</v-row>
<v-row
justify="start"
align="center"
Expand Down Expand Up @@ -85,7 +98,10 @@ export default {
return (this.userInfo?.activeInstitutePermissions?.filter(perm => perm === permission).length > 0);
},
uploadFiles() {

this.$router.push({name: 'grad-upload', params: {schoolID: this.userInfo.activeInstituteIdentifier}});
},
backButtonClick() {
this.$router.push({name: 'home'});
}
}
};
Expand All @@ -96,7 +112,22 @@ export default {
word-break: break-word;
font-size: 20px;
}
.v-container {
max-width: 51.5em !important;
}
.containerSetup{
padding-right: 24em !important;
padding-left: 24em !important;
}

@media screen and (max-width: 1950px) {
.containerSetup{
padding-right: 20em !important;
padding-left: 20em !important;
}
}

@media screen and (max-width: 1800px) {
.containerSetup{
padding-right: 10em !important;
padding-left: 10em !important;
}
}
</style>
Loading
Loading