let express = require ('express'), router = express.Router (); const constants = require ('../config/constants'); let databaseHelper = require ('../helpers/database'); let amazonHelper = require ('../helpers/amazon'); let skillValidator = require('../helpers/skillValidator'); let bodyParser = require ('body-parser'); let alexa = require ('../models/alexa'); router.get ('/:id', async (req, res, next) => { const id = req.params.id; if (id.length !== constants.SKILL_ID_LENGTH) { res.json ([]); } else { databaseHelper .getSkill (id) .then (result => { res.json (result); }) .catch (err => { res.json ([]); }); } }); router.put ('/:id', bodyParser.json (), async (req, res, next) => { let id = req.params.id; let dataFromWeb = JSON.stringify (req.body); let skill = JSON.parse (dataFromWeb); let updateOnAmazon = skill.updateOnAmazon; delete skill.updateOnAmazon; delete skill._id; //Validate skill if (!skillValidator.validateSkill(skill)){ //skill not valid res .status ( constants.HTTPResultCodes.INTERNAL_SERVER_ERROR ) .json ({ result: constants.apiResultCodes.INVALID_SKILL, message: '', }); return; } //First get current skill from DB databaseHelper .getSkill (id) .then (currentSkillState => { //Now let's update skill in DB databaseHelper .updateSkill (id, skill) .then (() => { //Ok, done, now update skill on Amazon (if needed) if (updateOnAmazon) { //We need to update skill on Amazon amazonHelper .updateSkill (skill) .then (amazonResult => { if ( amazonResult === constants.amazonResultCodes.OK || amazonResult === constants.amazonResultCodes.ACCEPTED ) { res.json ({result: constants.apiResultCodes.OK, message: ''}); alexa.updateModel (); } else { //Update on amazon failed, revert changes in database and send error to user databaseHelper .updateSkill (id, currentSkillState) .then (() => { res .status ( constants.HTTPResultCodes.INTERNAL_SERVER_ERROR ) .json ({ result: constants.apiResultCodes.AMAZON_ERROR, message: amazonResult, }); }) .catch (() => { //This should never happen, something is seriously wrong, like no database connection res .status ( constants.HTTPResultCodes.INTERNAL_SERVER_ERROR ) .json ({ result: constants.apiResultCodes.INCONSISTENT_STATE, message: '', }); }); } }) .catch (e => { //Update on amazon failed, revert changes in database and send error to user databaseHelper .updateSkill (id, currentSkillState) .then (() => { res .status (constants.HTTPResultCodes.INTERNAL_SERVER_ERROR) .json ({ result: constants.apiResultCodes.AMAZON_FAIL, message: e, }); }) .catch (() => { //This should never happen, something is seriously wrong, like no database connection res .status (constants.HTTPResultCodes.INTERNAL_SERVER_ERROR) .json ({ result: constants.apiResultCodes.INCONSISTENT_STATE, message: '', }); }); }); } else { //No need to update on Amazon, tell to user it's ok res.json ({result: constants.apiResultCodes.OK, message: ''}); alexa.updateModel (); } }) .catch (() => { //Update in database didn't go well, no need to revert since it failed to write in the first place //just send error to user res .status ( constants.HTTPResultCodes.INTERNAL_SERVER_ERROR ) .json ({ result: constants.apiResultCodes.DATABASE_ERROR, message: '', }); }); }) .catch (e => { //I don't know why, but something went wrong, possibly ID of skill is wrong, doesn't exist in DB res .status (constants.HTTPResultCodes.INTERNAL_SERVER_ERROR) .json ({result: constants.apiResultCodes.NO_SKILL, message: ''}); }); }); module.exports = router;