446 lines
12 KiB
JavaScript
446 lines
12 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const db = require('@QMI/qmi-cloud-common/mongo');
|
|
const passport = require('../passport-okta');
|
|
const cloudshare = require('../training/cloudshare');
|
|
const qa = require('../training/automations');
|
|
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/sessions:
|
|
* get:
|
|
* description: Get all training sessions (admin)
|
|
* summary: Get all training sessions (admin)
|
|
* tags:
|
|
* - admin
|
|
* produces:
|
|
* - application/json
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingTemplate
|
|
*/
|
|
router.get('/sessions', passport.ensureAuthenticatedAndAdmin, async (req, res, next) => {
|
|
try {
|
|
const filter = req.query.filter? JSON.parse(req.query.filter) : {};
|
|
const result = await db.trainingSession.get(filter);
|
|
return res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/templates:
|
|
* get:
|
|
* description: Get all training templates
|
|
* summary: Get all training templates
|
|
* produces:
|
|
* - application/json
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingTemplate
|
|
*/
|
|
router.get('/templates', passport.ensureAuthenticated, async (req, res, next) => {
|
|
try {
|
|
const filter = req.query.filter? JSON.parse(req.query.filter) : {};
|
|
const result = await db.trainingTemplate.get(filter);
|
|
return res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/session/{id}:
|
|
* get:
|
|
* description: Get training session by ID
|
|
* summary: Get training session by ID
|
|
* produces:
|
|
* - application/json
|
|
* parameters:
|
|
* - name: id
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingTemplate
|
|
*/
|
|
router.get('/session/:id', async (req, res, next) => {
|
|
try {
|
|
const result = await db.trainingSession.get({"_id":req.params.id}, 'passwd -user description status created updated studentEmailFilter');
|
|
if (!result || !result.results || result.results.length === 0 ){
|
|
return res.status(404).json({"msg": "Not found"});
|
|
}
|
|
return res.json(result.results[0]);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/session/{id}:
|
|
* post:
|
|
* description: Post new student for session by ID
|
|
* summary: Post new student for session by ID
|
|
* produces:
|
|
* - application/json
|
|
* parameters:
|
|
* - name: id
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingTemplate
|
|
*/
|
|
router.post('/session/:id', async (req, res, next) => {
|
|
try {
|
|
const session = await db.trainingSession.getById(req.params.id);
|
|
if (!session){
|
|
return res.status(404).json({"msg": "Not found"});
|
|
}
|
|
|
|
let student = await db.trainingStudent.getOne({"email": req.body.email, "session": session._id});
|
|
let isNew = false;
|
|
if ( !student ) {
|
|
let data = req.body;
|
|
data.session = session._id;
|
|
student = await db.trainingStudent.add(data);
|
|
isNew = true;
|
|
}
|
|
|
|
let result1, result2;
|
|
if ( session.template.cloudshare && session.cloudshareClass ) {
|
|
result1 = await cloudshare.addStudentToClass(session, student.email);
|
|
}
|
|
if ( session.template.needQcsAutomation && session.qaUrl && session.qaToken ) {
|
|
result2 = await qa.runQlikAutomation(session, student.email);
|
|
}
|
|
|
|
if (result1 && result1.error || result2 && result2.error) {
|
|
return res.status(500).json({"msg": "Something went wrong when registering studeent", err: result1.error? result1.error : result2.error});
|
|
} else {
|
|
student = await db.trainingStudent.update(student._id, {"status": "sent", "created": new Date()});
|
|
if ( isNew ) {
|
|
db.trainingSession.update({ _id: session._id }, { $inc: { studentsCount: 1 } });
|
|
}
|
|
return res.json(student);
|
|
}
|
|
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/session/{id}:
|
|
* delete:
|
|
* description: Delete session by ID
|
|
* summary: Delete session by ID
|
|
* tags:
|
|
* - admin
|
|
* produces:
|
|
* - application/json
|
|
* parameters:
|
|
* - name: id
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingTemplate
|
|
*/
|
|
router.delete('/session/:id', passport.ensureAuthenticatedAndAdmin, async (req, res, next) => {
|
|
try {
|
|
const result = await db.trainingSession.update(req.params.id, {status: "terminated"});
|
|
return res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/templates:
|
|
* post:
|
|
* description: Create new training template
|
|
* summary: Create new training template
|
|
* tags:
|
|
* - admin
|
|
* produces:
|
|
* - application/json
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* description:
|
|
* type: string
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingTemplate
|
|
*/
|
|
router.post('/templates', passport.ensureAuthenticatedAndAdmin, async (req, res, next) => {
|
|
try {
|
|
let data = req.body;
|
|
const result = await db.trainingTemplate.add(data);
|
|
return res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/{userId}/sessions:
|
|
* post:
|
|
* description: Add new training session
|
|
* summary: Add new training session
|
|
* parameters:
|
|
* - name: userId
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* produces:
|
|
* - application/json
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingSession
|
|
*/
|
|
router.post('/:userId/sessions', passport.ensureAuthenticatedAndIsMe, async (req, res, next) => {
|
|
try {
|
|
const userId = req.params.userId === 'me'? req.user._id : req.params.userId;
|
|
let data = req.body;
|
|
data.user = userId;
|
|
let session = await db.trainingSession.add(data);
|
|
session = await db.trainingSession.getById(session._id);
|
|
|
|
let mainAutomation = await qa.getAutomation(session, 'main');
|
|
if (!mainAutomation) {
|
|
let result = await qa.createAutomations(session);
|
|
mainAutomation = result.main;
|
|
}
|
|
session = await db.trainingSession.update(session._id, {qaToken: mainAutomation.executionToken, qaUrl: `https://${session.qcsTenantHost}/api/v1/automations/${mainAutomation.id}/actions/execute`})
|
|
|
|
return res.json(session);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/{userId}/sessions:
|
|
* get:
|
|
* description: Get all training session by user
|
|
* summary: Get all training session by user
|
|
* parameters:
|
|
* - name: userId
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* produces:
|
|
* - application/json
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingSession
|
|
*/
|
|
router.get('/:userId/sessions', passport.ensureAuthenticatedAndIsMe, async (req, res, next) => {
|
|
try {
|
|
const userId = req.params.userId === 'me'? req.user._id : req.params.userId;
|
|
const result = await db.trainingSession.get({user: userId, status: {"$ne": "terminated"}});
|
|
return res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/{userId}/sessions/{id}:
|
|
* get:
|
|
* description: Get training session by Id for a user
|
|
* summary: Get training session by Id for a user
|
|
* parameters:
|
|
* - name: userId
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* - name: id
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* produces:
|
|
* - application/json
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingSession
|
|
*/
|
|
router.get('/:userId/sessions/:id', passport.ensureAuthenticatedAndIsMe, async (req, res, next) => {
|
|
try {
|
|
const userId = req.params.userId === 'me'? req.user._id : req.params.userId;
|
|
const id = req.params.id;
|
|
const result = await db.trainingSession.getOne({user: userId, _id: id});
|
|
return res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/{userId}/sessions/{id}/automation:
|
|
* get:
|
|
* description: Test if automation exists in tenant
|
|
* summary: Test if automation exists in tenant
|
|
* parameters:
|
|
* - name: userId
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* - name: id
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* produces:
|
|
* - application/json
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingSession
|
|
*/
|
|
router.get('/:userId/sessions/:id/automation', passport.ensureAuthenticatedAndIsMe, async (req, res, next) => {
|
|
try {
|
|
const id = req.params.id;
|
|
let session = await db.trainingSession.getById(id);
|
|
|
|
let automation = await qa.getAutomation(session);
|
|
if (automation) {
|
|
session = await db.trainingSession.update(session._id, {qaToken: automation.executionToken, qaUrl: `https://${session.qcsTenantHost}/api/v1/automations/${automation.id}/actions/execute`})
|
|
}
|
|
return res.json(session);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/session/{id}/students:
|
|
* get:
|
|
* description: Get studetns for a session
|
|
* summary: Get studetns for a session
|
|
* parameters:
|
|
* - name: userId
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* - name: id
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* produces:
|
|
* - application/json
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingSession
|
|
*/
|
|
router.get('/session/:id/students', passport.ensureAuthenticated, async (req, res, next) => {
|
|
try {
|
|
const id = req.params.id;
|
|
const result = await db.trainingStudent.get({session: id});
|
|
return res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/{userId}/sessions/{id}:
|
|
* put:
|
|
* description: Update training session
|
|
* summary: Update training session
|
|
* parameters:
|
|
* - name: userId
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* - name: id
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* produces:
|
|
* - application/json
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingSession
|
|
*/
|
|
router.put('/:userId/sessions/:id', passport.ensureAuthenticatedAndIsMe, async (req, res, next) => {
|
|
|
|
try {
|
|
const result = await db.trainingSession.update(req.params.id, req.body);
|
|
return res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @swagger
|
|
* /training/{userId}/sessions/{id}:
|
|
* put:
|
|
* description: Update training session
|
|
* summary: Update training session
|
|
* parameters:
|
|
* - name: userId
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* - name: id
|
|
* in: path
|
|
* type: string
|
|
* required: true
|
|
* produces:
|
|
* - application/json
|
|
* responses:
|
|
* 200:
|
|
* description: TrainingSession
|
|
*/
|
|
router.delete('/:userId/sessions/:id', passport.ensureAuthenticatedAndIsMe, async (req, res, next) => {
|
|
|
|
try {
|
|
const result = await db.trainingSession.update(req.params.id, {status: "terminated"});
|
|
return res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
module.exports = router; |