From 84edb5563febdcde2c2466f7063b2b70d2290590 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Thu, 25 Jan 2018 16:09:12 +0100 Subject: [PATCH 01/10] prevent space in question name --- web/src/components/IntentDetails.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/IntentDetails.js b/web/src/components/IntentDetails.js index 8e76100..a395bf7 100644 --- a/web/src/components/IntentDetails.js +++ b/web/src/components/IntentDetails.js @@ -126,7 +126,7 @@ class IntentDetails extends Component { handleIntentNameEdit(e){ if (e.length === INTENT_NAME_MAX_LENGTH) return; let newIntent = this.state.intent; - newIntent.intentName = e; + newIntent.intentName = e.replace(/\s/g, ''); //remove all spaces from intent name this.setState({intent: newIntent}); } } -- 2.47.3 From bca71604fbe4e75d01f0fb0be788273ef7c58cd1 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Thu, 25 Jan 2018 17:42:17 +0100 Subject: [PATCH 02/10] Allow only letters for question name --- web/src/App.js | 16 +++++++++------- web/src/components/IntentDetails.js | 5 ++++- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/web/src/App.js b/web/src/App.js index a91c5f6..b2ef726 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -132,7 +132,6 @@ class App extends Component { this.setState ({ selectedIntent: selectedIntent, selectedIndex: index, - launchRequest: false, }); } @@ -216,14 +215,18 @@ class App extends Component { } handleSaveIntentClick (selectedIntent) { + console.log("Save intent"); let newAllIntentsJSON = JSON.stringify (this.state.allIntents); let newAllIntents = JSON.parse (newAllIntentsJSON); + + let resolveState = null; + let rejectState = this.state; + rejectState.waiting = false; - let newState = null; if (this.state.selectedIndex === NEW_INTENT_SELECTED_INDEX) { //new intent newAllIntents.push (selectedIntent); - newState = { + resolveState = { allIntents: newAllIntents, selectedIntent: selectedIntent, selectedIndex: newAllIntents.length - 1, @@ -231,18 +234,17 @@ class App extends Component { }; } else { newAllIntents[this.state.selectedIndex] = selectedIntent; - newState = { + resolveState = { allIntents: newAllIntents, selectedIntent: selectedIntent, - waiting: false, }; } this.setState ({waiting: true}); this.sendSkill ( newAllIntents, true, - newState, - {waiting: false}, + resolveState, + rejectState, this.state.invocationName, this.state.invocationAnswer, this.state.contactEmail, diff --git a/web/src/components/IntentDetails.js b/web/src/components/IntentDetails.js index a395bf7..0552775 100644 --- a/web/src/components/IntentDetails.js +++ b/web/src/components/IntentDetails.js @@ -126,7 +126,10 @@ class IntentDetails extends Component { handleIntentNameEdit(e){ if (e.length === INTENT_NAME_MAX_LENGTH) return; let newIntent = this.state.intent; - newIntent.intentName = e.replace(/\s/g, ''); //remove all spaces from intent name + //Allow question name with only letters, and with one character minimum + if (/^[a-z]+$/i.test(e)){ + newIntent.intentName = e; + } this.setState({intent: newIntent}); } } -- 2.47.3 From 2870695b25554f82f4f34465a1151b011fbca77c Mon Sep 17 00:00:00 2001 From: GotPPay Date: Fri, 26 Jan 2018 15:35:38 +0100 Subject: [PATCH 03/10] Fix regex --- web/src/components/IntentDetails.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/IntentDetails.js b/web/src/components/IntentDetails.js index 0552775..9e2355f 100644 --- a/web/src/components/IntentDetails.js +++ b/web/src/components/IntentDetails.js @@ -127,7 +127,7 @@ class IntentDetails extends Component { if (e.length === INTENT_NAME_MAX_LENGTH) return; let newIntent = this.state.intent; //Allow question name with only letters, and with one character minimum - if (/^[a-z]+$/i.test(e)){ + if (/^[a-z]*$/i.test(e)){ newIntent.intentName = e; } this.setState({intent: newIntent}); -- 2.47.3 From 220d76c2be3932d67739c73d2a2006fb9954921b Mon Sep 17 00:00:00 2001 From: GotPPay Date: Fri, 26 Jan 2018 17:46:16 +0100 Subject: [PATCH 04/10] test saburly account --- backend/config/config.js | 3 ++- web/src/App.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/config/config.js b/backend/config/config.js index 67573de..fe78b81 100644 --- a/backend/config/config.js +++ b/backend/config/config.js @@ -7,7 +7,8 @@ config.TOKEN = 'Atza|IwEBIBe6gDqrrowEEav6N-_6s4NztYeP3oG8PGWmu8ZiZw6lbOh3wNla3TK config.REFRESH_TOKEN = 'Atzr|IwEBICA3kDhfSJxlwvnQp9AD1o115AC_KBbFd5GBg8oN_QHWn2or5xFQ09BruuK6a07tGHtTt_9q2Y21mnOMH4RDtYXTVG9ADgLE6mHWKZFxYVwt3kHMiUJdY5lJcsOtWLoblrS-bJ0BEXXK5nVDt_bSI5IB7NUf-9QVZxhovRH_ANSxdTjJT0_rMIAZY3WEj68FEap49q_pg72BhnxHVZD2TC3zvX96_DN65HE5SoSgT7OiMAeiJewB_SyemW_HxBwaB-_X-G1ifOtnrzZ4gXTpOrEUlHI2YPuvRMBMtmz1h-nXDZYv3vwU3RA57Qj_ZNVcScj8_RXf2xq8w48v0PzZFXYBSalfnqPq6eUvSSbAJUp6bB8y596JlvR5dFQe_Z--X0Gkfo85IcyrI9D44vK9sJhrGhCVi2FDDa8pHczmNSen99JYZvDif-zpYzgbcymAkOV0gC7JvYMxlZfETT3NTBy7eVA7fJI1SZaeA_qW49xRcBkZBu5gkqTpeGWUU1cGr2aXRVVmXGM22NfV5E7KzvEBsCeHml_tCfxZeKY8Msd8hJb0Cd59u-_hsuc8oNjsOpIdFF976dY3uTmAgHWpG2PH'; config.TOKEN_EXPIRES_IN = 1515100500; -config.SKILL_ID = 'amzn1.ask.skill.efbf0564-a732-4ba9-958f-57939138adae'; +//config.SKILL_ID = 'amzn1.ask.skill.efbf0564-a732-4ba9-958f-57939138adae'; //bilal +config.SKILL_ID = 'amzn1.ask.skill.2445552d-954d-4cd6-b77f-295368e02842'; //saburly //config.SKILL_DB_ID = '5a5016e775becaef2015da10'; //for server config.SKILL_DB_ID = '5a232fb86ce046c749739455'; //for local diff --git a/web/src/App.js b/web/src/App.js index b2ef726..15ee959 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -220,8 +220,7 @@ class App extends Component { let newAllIntents = JSON.parse (newAllIntentsJSON); let resolveState = null; - let rejectState = this.state; - rejectState.waiting = false; + let rejectState = {waiting:false} if (this.state.selectedIndex === NEW_INTENT_SELECTED_INDEX) { //new intent @@ -237,6 +236,7 @@ class App extends Component { resolveState = { allIntents: newAllIntents, selectedIntent: selectedIntent, + waiting:false, }; } this.setState ({waiting: true}); -- 2.47.3 From e712693dd09b7f84a4d7eb56376d375bbdea74c0 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Fri, 26 Jan 2018 23:21:18 +0100 Subject: [PATCH 05/10] switch to saburly amazon account --- README.md | 9 +++++++-- backend/config/config.js | 17 +++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fc36472..640eb59 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ -To obtain new Auth Code : +To obtain client ID and secret : +https://developer.amazon.com/lwa/sp/overview.html +Click create new security profile, and add whitelist redirect uri : https://layla.amazon.com/api/skill/link/M2ODJY6EXOY6KO -https://www.amazon.com/ap/oa?client_id=amzn1.application-oa2-client.c748ca56ded04a95b236979898585ff7&scope=alexa::ask:skills:readwrite alexa::ask:models:readwrite alexa::ask:skills:test&response_type=code&redirect_uri=https://layla.amazon.com/api/skill/link/M2ODJY6EXOY6KO + +To obtain new Auth Code : + +https://www.amazon.com/ap/oa?client_id=amzn1.application-oa2-client.8c183daec15c488c9126b62bda9f7832&scope=alexa::ask:skills:readwrite alexa::ask:models:readwrite alexa::ask:skills:test&response_type=code&redirect_uri=https://layla.amazon.com/api/skill/link/M2ODJY6EXOY6KO Response URL (Decoded) : diff --git a/backend/config/config.js b/backend/config/config.js index fe78b81..dbed9d1 100644 --- a/backend/config/config.js +++ b/backend/config/config.js @@ -3,16 +3,29 @@ var config = {}; config.DB_URL = 'mongodb://localhost:27017/tellall'; config.PORT = 5000; -config.TOKEN = 'Atza|IwEBIBe6gDqrrowEEav6N-_6s4NztYeP3oG8PGWmu8ZiZw6lbOh3wNla3TK6pY-VEpT1d8an-dVf_n3kXJzVFsNo_4xBfZyFHGoCTDTFjs3yBRul4PVdBOhwwiH3-sgRLcUofZbe2oE06GmTcbfYtaStfXpQI5dfpldfnsJg_CvhSA6AHb_snJT3F6lyXzbV076d_3cYUMJxFldJGnYcviNHHxjjmuQTD06hhGzCbAxxe9eBmkuopRsNfyedLT2UlKP_ublah9CUGA3AdIX_3Iuke82jMwGnNl9gv7pbaDNEjAbj7IQSl3B08uuREtJq-oTBOjALNXRvFxTJmQjZwXNf9eHC7fSHJDdEPdZQU0AcffRQObAyAkUuL6Jv39OHzhb3Q64-zzoyODqnJyLP5SQZ2JVF53Kc_cTBqjIc9pXljqe7yEVk6JDs7q1zKbBibx_AQm57TO79IzWyLBzBMlYL5HdTsqEfRzLeDw2tws-hGMgkx2HWfdbYnmf5Qb4SyIhzvmmdfPLg3MVKTxjIBu1rx0xf3n0PLZP1EO6jsJPoMRPg77Gm4oit5Zp6s37ek3A3Vxh-ntoASpkrkxGTG9kVtRNt'; -config.REFRESH_TOKEN = 'Atzr|IwEBICA3kDhfSJxlwvnQp9AD1o115AC_KBbFd5GBg8oN_QHWn2or5xFQ09BruuK6a07tGHtTt_9q2Y21mnOMH4RDtYXTVG9ADgLE6mHWKZFxYVwt3kHMiUJdY5lJcsOtWLoblrS-bJ0BEXXK5nVDt_bSI5IB7NUf-9QVZxhovRH_ANSxdTjJT0_rMIAZY3WEj68FEap49q_pg72BhnxHVZD2TC3zvX96_DN65HE5SoSgT7OiMAeiJewB_SyemW_HxBwaB-_X-G1ifOtnrzZ4gXTpOrEUlHI2YPuvRMBMtmz1h-nXDZYv3vwU3RA57Qj_ZNVcScj8_RXf2xq8w48v0PzZFXYBSalfnqPq6eUvSSbAJUp6bB8y596JlvR5dFQe_Z--X0Gkfo85IcyrI9D44vK9sJhrGhCVi2FDDa8pHczmNSen99JYZvDif-zpYzgbcymAkOV0gC7JvYMxlZfETT3NTBy7eVA7fJI1SZaeA_qW49xRcBkZBu5gkqTpeGWUU1cGr2aXRVVmXGM22NfV5E7KzvEBsCeHml_tCfxZeKY8Msd8hJb0Cd59u-_hsuc8oNjsOpIdFF976dY3uTmAgHWpG2PH'; +//Bilal TOKENS +//config.TOKEN = 'Atza|IwEBIBe6gDqrrowEEav6N-_6s4NztYeP3oG8PGWmu8ZiZw6lbOh3wNla3TK6pY-VEpT1d8an-dVf_n3kXJzVFsNo_4xBfZyFHGoCTDTFjs3yBRul4PVdBOhwwiH3-sgRLcUofZbe2oE06GmTcbfYtaStfXpQI5dfpldfnsJg_CvhSA6AHb_snJT3F6lyXzbV076d_3cYUMJxFldJGnYcviNHHxjjmuQTD06hhGzCbAxxe9eBmkuopRsNfyedLT2UlKP_ublah9CUGA3AdIX_3Iuke82jMwGnNl9gv7pbaDNEjAbj7IQSl3B08uuREtJq-oTBOjALNXRvFxTJmQjZwXNf9eHC7fSHJDdEPdZQU0AcffRQObAyAkUuL6Jv39OHzhb3Q64-zzoyODqnJyLP5SQZ2JVF53Kc_cTBqjIc9pXljqe7yEVk6JDs7q1zKbBibx_AQm57TO79IzWyLBzBMlYL5HdTsqEfRzLeDw2tws-hGMgkx2HWfdbYnmf5Qb4SyIhzvmmdfPLg3MVKTxjIBu1rx0xf3n0PLZP1EO6jsJPoMRPg77Gm4oit5Zp6s37ek3A3Vxh-ntoASpkrkxGTG9kVtRNt'; +//config.REFRESH_TOKEN = 'Atzr|IwEBICA3kDhfSJxlwvnQp9AD1o115AC_KBbFd5GBg8oN_QHWn2or5xFQ09BruuK6a07tGHtTt_9q2Y21mnOMH4RDtYXTVG9ADgLE6mHWKZFxYVwt3kHMiUJdY5lJcsOtWLoblrS-bJ0BEXXK5nVDt_bSI5IB7NUf-9QVZxhovRH_ANSxdTjJT0_rMIAZY3WEj68FEap49q_pg72BhnxHVZD2TC3zvX96_DN65HE5SoSgT7OiMAeiJewB_SyemW_HxBwaB-_X-G1ifOtnrzZ4gXTpOrEUlHI2YPuvRMBMtmz1h-nXDZYv3vwU3RA57Qj_ZNVcScj8_RXf2xq8w48v0PzZFXYBSalfnqPq6eUvSSbAJUp6bB8y596JlvR5dFQe_Z--X0Gkfo85IcyrI9D44vK9sJhrGhCVi2FDDa8pHczmNSen99JYZvDif-zpYzgbcymAkOV0gC7JvYMxlZfETT3NTBy7eVA7fJI1SZaeA_qW49xRcBkZBu5gkqTpeGWUU1cGr2aXRVVmXGM22NfV5E7KzvEBsCeHml_tCfxZeKY8Msd8hJb0Cd59u-_hsuc8oNjsOpIdFF976dY3uTmAgHWpG2PH'; + +//Saburly TOKENS +config.TOKEN = 'Atza|IwEBIH9S1LxccG6c3e1qKZ1PFY4XGF9-tqEeGyCeGKBcR8-lAgQPpfKQMeA992fHhRtz1gnpWngKi7eyB_AkjgloT8mx2mM3o02VGq6ef2-yJhYf05sEXbU3muWe-IipgxWoFjDHPPt7teRqIKX02H9jZ-Gnb7pB8G3J1gOX7mTUFM0N5qgFJyt-H0B5o-eAAn3Ij3S3Ix4MH_qcz0ZeSvemJ1vbhDm2NLm_RhEbCI5dRVMCtQkFqBKVBqbB7Og_NrTTmrOOgWpOo-NfmyPy9SsSFShVffUglTWhvDPjm52N0P79YXVeUOPgZyDijPneoPWgrbhFvgtE0YwjAIsSxdIjxFlOes9m9io0QZvEBqJvYm3vxzhPNea4IKq_NXCPdw4ncJvH5l25BNfYaokV14yKY9-2YqrO2AVTaV81j1f0JPOxBbCAQ0CvHmVJ_Fn48WxTAy3WXaRNw8b5tTcKGrKtIBbLSg829docjZKn75SeFv0Ja8ugqSdf9e8qoKRtG6_CkpfQAkSBXMZxqNac5f65MiTO6_BgO7ldwAN5MAuQPOltYjp3FuP2WlfUbFLE_YqToeICYWYehLpRWgrRAjAan4mB'; +config.REFRESH_TOKEN = 'Atzr|IwEBICMLPfBbETehGJ53gtgbNMoNsPqwN3aBseFTS7z2rwSeyYInq68wrW5Z9Jz_NEjULQ3SLdEI2aII9sKcpo7_QIlFdl1PaY0TKx8VJrgGtmA9mT0-8ULw-FgwUKfo-qQFIvuekniC6z7f-XKLP-PbP186FHlscixfakd-oquxzmt0R_i_pCytI4Stm5FJrxnA-e0ucVXjZ0sf95CB5QC_6YYR2UJlrhhGBRxDAyQKcA40SgEkaAj8elEh9ilItVz2HpN1yY_UvPf5A65aUrH1KmcXcY-K1BbwDhMmrFF3EZGPbRWPLPGyB0fZ2RP_6hVPGyJerTfrYQMENJRkajvtlUqBwxahyoEC4L4tBzj6aYyhnK9xXdSReTtwGCwShc_aOPwHjTJdFC_48klTP19jlhaSag4YsdyuMuGgRiTBWfmGfL1rZbSTddJ35_8zlo1vexXjlqOeJuXWkh62WUutQ3PUHu3Pz1WIXE7yzIN0yQZ34lmk3vnV5KMSAebJIobEtvn-BDuKWaQONCyrri-484CPis9VvjFKwow15_g3So8VQKqx_vMRoyobMA7IQ6bA1Jf5ff1kZL_c0pXoMEhZ-anRwOJjyVzj6EHY6gdPTXp7ag'; + config.TOKEN_EXPIRES_IN = 1515100500; + + //config.SKILL_ID = 'amzn1.ask.skill.efbf0564-a732-4ba9-958f-57939138adae'; //bilal config.SKILL_ID = 'amzn1.ask.skill.2445552d-954d-4cd6-b77f-295368e02842'; //saburly //config.SKILL_DB_ID = '5a5016e775becaef2015da10'; //for server config.SKILL_DB_ID = '5a232fb86ce046c749739455'; //for local +//Bilal config.CLIENT_ID = 'amzn1.application-oa2-client.c748ca56ded04a95b236979898585ff7'; config.CLIENT_SECRET = '6dea8125cecd049d3c4cff7bb5bdfd3ff17bc6fed246c4c8f6b519d9ed08d0b3'; +//Saburly +config.CLIENT_ID = 'amzn1.application-oa2-client.8c183daec15c488c9126b62bda9f7832'; +config.CLIENT_SECRET = '3acaa0755291132ee11e1cceaa100feef96a0244662df712a52189199cc655de'; + module.exports = config; -- 2.47.3 From 6b4256b7ab42cc287e293e555b4da690dda115b8 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Fri, 26 Jan 2018 23:21:59 +0100 Subject: [PATCH 06/10] switch to saburly amazon account --- backend/config/config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/config/config.js b/backend/config/config.js index dbed9d1..2380941 100644 --- a/backend/config/config.js +++ b/backend/config/config.js @@ -10,7 +10,6 @@ config.PORT = 5000; //Saburly TOKENS config.TOKEN = 'Atza|IwEBIH9S1LxccG6c3e1qKZ1PFY4XGF9-tqEeGyCeGKBcR8-lAgQPpfKQMeA992fHhRtz1gnpWngKi7eyB_AkjgloT8mx2mM3o02VGq6ef2-yJhYf05sEXbU3muWe-IipgxWoFjDHPPt7teRqIKX02H9jZ-Gnb7pB8G3J1gOX7mTUFM0N5qgFJyt-H0B5o-eAAn3Ij3S3Ix4MH_qcz0ZeSvemJ1vbhDm2NLm_RhEbCI5dRVMCtQkFqBKVBqbB7Og_NrTTmrOOgWpOo-NfmyPy9SsSFShVffUglTWhvDPjm52N0P79YXVeUOPgZyDijPneoPWgrbhFvgtE0YwjAIsSxdIjxFlOes9m9io0QZvEBqJvYm3vxzhPNea4IKq_NXCPdw4ncJvH5l25BNfYaokV14yKY9-2YqrO2AVTaV81j1f0JPOxBbCAQ0CvHmVJ_Fn48WxTAy3WXaRNw8b5tTcKGrKtIBbLSg829docjZKn75SeFv0Ja8ugqSdf9e8qoKRtG6_CkpfQAkSBXMZxqNac5f65MiTO6_BgO7ldwAN5MAuQPOltYjp3FuP2WlfUbFLE_YqToeICYWYehLpRWgrRAjAan4mB'; config.REFRESH_TOKEN = 'Atzr|IwEBICMLPfBbETehGJ53gtgbNMoNsPqwN3aBseFTS7z2rwSeyYInq68wrW5Z9Jz_NEjULQ3SLdEI2aII9sKcpo7_QIlFdl1PaY0TKx8VJrgGtmA9mT0-8ULw-FgwUKfo-qQFIvuekniC6z7f-XKLP-PbP186FHlscixfakd-oquxzmt0R_i_pCytI4Stm5FJrxnA-e0ucVXjZ0sf95CB5QC_6YYR2UJlrhhGBRxDAyQKcA40SgEkaAj8elEh9ilItVz2HpN1yY_UvPf5A65aUrH1KmcXcY-K1BbwDhMmrFF3EZGPbRWPLPGyB0fZ2RP_6hVPGyJerTfrYQMENJRkajvtlUqBwxahyoEC4L4tBzj6aYyhnK9xXdSReTtwGCwShc_aOPwHjTJdFC_48klTP19jlhaSag4YsdyuMuGgRiTBWfmGfL1rZbSTddJ35_8zlo1vexXjlqOeJuXWkh62WUutQ3PUHu3Pz1WIXE7yzIN0yQZ34lmk3vnV5KMSAebJIobEtvn-BDuKWaQONCyrri-484CPis9VvjFKwow15_g3So8VQKqx_vMRoyobMA7IQ6bA1Jf5ff1kZL_c0pXoMEhZ-anRwOJjyVzj6EHY6gdPTXp7ag'; - config.TOKEN_EXPIRES_IN = 1515100500; -- 2.47.3 From 7ffbf42da91c9e9275f2101d53e39c9064441702 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Sat, 27 Jan 2018 03:15:47 +0100 Subject: [PATCH 07/10] update tokens --- backend/config/config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/config/config.js b/backend/config/config.js index 2380941..4dc362f 100644 --- a/backend/config/config.js +++ b/backend/config/config.js @@ -8,8 +8,8 @@ config.PORT = 5000; //config.REFRESH_TOKEN = 'Atzr|IwEBICA3kDhfSJxlwvnQp9AD1o115AC_KBbFd5GBg8oN_QHWn2or5xFQ09BruuK6a07tGHtTt_9q2Y21mnOMH4RDtYXTVG9ADgLE6mHWKZFxYVwt3kHMiUJdY5lJcsOtWLoblrS-bJ0BEXXK5nVDt_bSI5IB7NUf-9QVZxhovRH_ANSxdTjJT0_rMIAZY3WEj68FEap49q_pg72BhnxHVZD2TC3zvX96_DN65HE5SoSgT7OiMAeiJewB_SyemW_HxBwaB-_X-G1ifOtnrzZ4gXTpOrEUlHI2YPuvRMBMtmz1h-nXDZYv3vwU3RA57Qj_ZNVcScj8_RXf2xq8w48v0PzZFXYBSalfnqPq6eUvSSbAJUp6bB8y596JlvR5dFQe_Z--X0Gkfo85IcyrI9D44vK9sJhrGhCVi2FDDa8pHczmNSen99JYZvDif-zpYzgbcymAkOV0gC7JvYMxlZfETT3NTBy7eVA7fJI1SZaeA_qW49xRcBkZBu5gkqTpeGWUU1cGr2aXRVVmXGM22NfV5E7KzvEBsCeHml_tCfxZeKY8Msd8hJb0Cd59u-_hsuc8oNjsOpIdFF976dY3uTmAgHWpG2PH'; //Saburly TOKENS -config.TOKEN = 'Atza|IwEBIH9S1LxccG6c3e1qKZ1PFY4XGF9-tqEeGyCeGKBcR8-lAgQPpfKQMeA992fHhRtz1gnpWngKi7eyB_AkjgloT8mx2mM3o02VGq6ef2-yJhYf05sEXbU3muWe-IipgxWoFjDHPPt7teRqIKX02H9jZ-Gnb7pB8G3J1gOX7mTUFM0N5qgFJyt-H0B5o-eAAn3Ij3S3Ix4MH_qcz0ZeSvemJ1vbhDm2NLm_RhEbCI5dRVMCtQkFqBKVBqbB7Og_NrTTmrOOgWpOo-NfmyPy9SsSFShVffUglTWhvDPjm52N0P79YXVeUOPgZyDijPneoPWgrbhFvgtE0YwjAIsSxdIjxFlOes9m9io0QZvEBqJvYm3vxzhPNea4IKq_NXCPdw4ncJvH5l25BNfYaokV14yKY9-2YqrO2AVTaV81j1f0JPOxBbCAQ0CvHmVJ_Fn48WxTAy3WXaRNw8b5tTcKGrKtIBbLSg829docjZKn75SeFv0Ja8ugqSdf9e8qoKRtG6_CkpfQAkSBXMZxqNac5f65MiTO6_BgO7ldwAN5MAuQPOltYjp3FuP2WlfUbFLE_YqToeICYWYehLpRWgrRAjAan4mB'; -config.REFRESH_TOKEN = 'Atzr|IwEBICMLPfBbETehGJ53gtgbNMoNsPqwN3aBseFTS7z2rwSeyYInq68wrW5Z9Jz_NEjULQ3SLdEI2aII9sKcpo7_QIlFdl1PaY0TKx8VJrgGtmA9mT0-8ULw-FgwUKfo-qQFIvuekniC6z7f-XKLP-PbP186FHlscixfakd-oquxzmt0R_i_pCytI4Stm5FJrxnA-e0ucVXjZ0sf95CB5QC_6YYR2UJlrhhGBRxDAyQKcA40SgEkaAj8elEh9ilItVz2HpN1yY_UvPf5A65aUrH1KmcXcY-K1BbwDhMmrFF3EZGPbRWPLPGyB0fZ2RP_6hVPGyJerTfrYQMENJRkajvtlUqBwxahyoEC4L4tBzj6aYyhnK9xXdSReTtwGCwShc_aOPwHjTJdFC_48klTP19jlhaSag4YsdyuMuGgRiTBWfmGfL1rZbSTddJ35_8zlo1vexXjlqOeJuXWkh62WUutQ3PUHu3Pz1WIXE7yzIN0yQZ34lmk3vnV5KMSAebJIobEtvn-BDuKWaQONCyrri-484CPis9VvjFKwow15_g3So8VQKqx_vMRoyobMA7IQ6bA1Jf5ff1kZL_c0pXoMEhZ-anRwOJjyVzj6EHY6gdPTXp7ag'; +config.TOKEN = 'Atza|IwEBIEUmFu2ObEzFj5JTQzXHkW1J5AzVK2nH2-JJGDw-PXUkMBvzPJo4iXYFSD1yZj8QKRAx5s-fyn2hJeobjSB9kaI-GlKcEeXGpziDndyaUAE5Lk9xG8LkRAbyCHHuH1erEDnb9Z8TH9cEyiWpl-zVaE0zAwsJGJN-BGStm7kTS9HgEFrv9sZ5r6C-R5qzH7t6DsDGCPlj5K7YqrNXgJhPcXtBWtdu60cy8SaVMZS2HN0Y7NjwFcy5uRa_OogQfmFP2-M2sdnfpqZ7Xi_Qog0kjf0YEYIFG9Djqr9sB5zC5Db5s8hPweBiTZ5TUfPx9vphIZlinc2BJkqcRU-nUDi9pMJZ2Bo_4xuapeZW7LOd7YO-zCPraBzsoBHq-yqfPiDhdgSdFzwJ2hUhT0j9BfUujnnqVwSpi4vRJqNLJ6tcXl1WNSZWfatYu-jY5KEg9uKB7Dds1vj4KZl4PQi7QZ43aWjLW-Etty2w4qLYWYiWNFgo6GZwYKvxlbsv1AznSpbwj_ZLrLjEo3bIfF2tg9ksbuAY9_JejZLGd6V96Ul7pfUfwjKMGxJJhF8_VFQnd6vBbup5qQwQcnlGqrV5VM4UI9bY-HRSdJ1Md9oBAwk7xbEPG9b_UThQCOZ28Fg7oLbh2gU'; +config.REFRESH_TOKEN = 'Atzr|IwEBIENdBZntrzvJYesv8SGhnty4Nyk2ZySL09elw5N0wH8S1Brz1UgIYLqenw3sKKxnc-VrIUbNtl1Ka4GDKwcTr2fDU_AbKQ6YXzeRBrfRQVvNOeCtjZE8P6Kg1PxAeQoCsqo7WPxK8ZdUaLwPjt_xiZ1FXtr01g-211PJs4KEg5jyF5nY2S14jA_TbwDW6ihpNqWd6ZklTZSRaOeSGa1mXZCSZ5yTsZIQV1Pn0fKhCXtcVg2L833YqRmextmHij4-2NtBQdW3gif5MPdhYjTqDNwgxO3OOagK1uSFqXOnMcmEDnxZuQQApugfDzClfN6DiDALCKN4dVAX8-OU_L2xsUkKiFP9rQjvHWJoRFBT1FpXjBfoVyzM1AaJ6C83WX6SjOBE0hhikQKIaPSe1ikK8_MzOIs2wqLLPnLGnKj3kcKMkDmY6DMgxfWj2H0hwLy0oZ7_qykS7wUHMGjRO5yScuBWFIr0RFFu00GS7zrKjkhFc_E4ZBBKskn0gywS-5pogo0U1rQtLg8lQJsVbxXQwtq2TxkGFMBiVxtQcXtHM1qbCVXpZQbk7ezxvasj4yAIsF4H7KBiZSGmWHkk4yADykWJSntTjFcM2wG0wSiEYoYzJQ'; config.TOKEN_EXPIRES_IN = 1515100500; -- 2.47.3 From 3b5c287ef9849edb2ff7eb7b84741c0f89a7c26d Mon Sep 17 00:00:00 2001 From: GotPPay Date: Sat, 27 Jan 2018 10:53:06 +0100 Subject: [PATCH 08/10] . --- backend/config/config.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/config/config.js b/backend/config/config.js index 4dc362f..b0dcc64 100644 --- a/backend/config/config.js +++ b/backend/config/config.js @@ -8,7 +8,7 @@ config.PORT = 5000; //config.REFRESH_TOKEN = 'Atzr|IwEBICA3kDhfSJxlwvnQp9AD1o115AC_KBbFd5GBg8oN_QHWn2or5xFQ09BruuK6a07tGHtTt_9q2Y21mnOMH4RDtYXTVG9ADgLE6mHWKZFxYVwt3kHMiUJdY5lJcsOtWLoblrS-bJ0BEXXK5nVDt_bSI5IB7NUf-9QVZxhovRH_ANSxdTjJT0_rMIAZY3WEj68FEap49q_pg72BhnxHVZD2TC3zvX96_DN65HE5SoSgT7OiMAeiJewB_SyemW_HxBwaB-_X-G1ifOtnrzZ4gXTpOrEUlHI2YPuvRMBMtmz1h-nXDZYv3vwU3RA57Qj_ZNVcScj8_RXf2xq8w48v0PzZFXYBSalfnqPq6eUvSSbAJUp6bB8y596JlvR5dFQe_Z--X0Gkfo85IcyrI9D44vK9sJhrGhCVi2FDDa8pHczmNSen99JYZvDif-zpYzgbcymAkOV0gC7JvYMxlZfETT3NTBy7eVA7fJI1SZaeA_qW49xRcBkZBu5gkqTpeGWUU1cGr2aXRVVmXGM22NfV5E7KzvEBsCeHml_tCfxZeKY8Msd8hJb0Cd59u-_hsuc8oNjsOpIdFF976dY3uTmAgHWpG2PH'; //Saburly TOKENS -config.TOKEN = 'Atza|IwEBIEUmFu2ObEzFj5JTQzXHkW1J5AzVK2nH2-JJGDw-PXUkMBvzPJo4iXYFSD1yZj8QKRAx5s-fyn2hJeobjSB9kaI-GlKcEeXGpziDndyaUAE5Lk9xG8LkRAbyCHHuH1erEDnb9Z8TH9cEyiWpl-zVaE0zAwsJGJN-BGStm7kTS9HgEFrv9sZ5r6C-R5qzH7t6DsDGCPlj5K7YqrNXgJhPcXtBWtdu60cy8SaVMZS2HN0Y7NjwFcy5uRa_OogQfmFP2-M2sdnfpqZ7Xi_Qog0kjf0YEYIFG9Djqr9sB5zC5Db5s8hPweBiTZ5TUfPx9vphIZlinc2BJkqcRU-nUDi9pMJZ2Bo_4xuapeZW7LOd7YO-zCPraBzsoBHq-yqfPiDhdgSdFzwJ2hUhT0j9BfUujnnqVwSpi4vRJqNLJ6tcXl1WNSZWfatYu-jY5KEg9uKB7Dds1vj4KZl4PQi7QZ43aWjLW-Etty2w4qLYWYiWNFgo6GZwYKvxlbsv1AznSpbwj_ZLrLjEo3bIfF2tg9ksbuAY9_JejZLGd6V96Ul7pfUfwjKMGxJJhF8_VFQnd6vBbup5qQwQcnlGqrV5VM4UI9bY-HRSdJ1Md9oBAwk7xbEPG9b_UThQCOZ28Fg7oLbh2gU'; +config.TOKEN = 'Atza|IwEBIABS0RvlVshGGO64X0tabhUuzpJKjbWNgxpRiy7YTftFD_lWlp-cbeXuVjRAu8kior2W2C5swf_rEHYvELQXdw78gB9WJQh4ITncPgqNCxvEnwVpIXiyeC_O287DRErnTYbI3s34i4NcxrXzobB8fIpTZxOkg6BI6vQGvvaiNLsTim2ElDYgAEmdgTN77llcMai521aovDqEw_XFc6GspeXhiGKxRomCMIL2UaT649owapDQ3y3Ug9eHvEaBzqjYdOUAtRtv19BGkG8YPs3npHmP5AD0Oc3ByCfrofcGk7fdd_nq28pRX6h4LXk4ylM279qlneWh9EErsWh8vtWuGEGusnDxW17OzEzf7HuwNDqdCJ6gCrIEkZaHISrSQ-vTsYGhKbv0z4nNjf_W_aoc9UJr9LnISCXx424R--iGDKZXhYWlZRjaiHsXE33MpS_M-sdN6GXYQwIjanTUahVXh5h-IBam5uJzTejE6CkIh5iUJ6um2IlDelJRMGS-T_aaG3zUvEagvEd9V9Z5mVN_kmO8bH4H2VefZuFGHRsCPa6SoLrlN0rkXK5fMw-zXfV2MHvQFdkgqYqGKxiEwWJ-g4n1ZrcPtWQowHT2z2yWrfnM2A6g8GIdPT23znmRcrdz4EU'; config.REFRESH_TOKEN = 'Atzr|IwEBIENdBZntrzvJYesv8SGhnty4Nyk2ZySL09elw5N0wH8S1Brz1UgIYLqenw3sKKxnc-VrIUbNtl1Ka4GDKwcTr2fDU_AbKQ6YXzeRBrfRQVvNOeCtjZE8P6Kg1PxAeQoCsqo7WPxK8ZdUaLwPjt_xiZ1FXtr01g-211PJs4KEg5jyF5nY2S14jA_TbwDW6ihpNqWd6ZklTZSRaOeSGa1mXZCSZ5yTsZIQV1Pn0fKhCXtcVg2L833YqRmextmHij4-2NtBQdW3gif5MPdhYjTqDNwgxO3OOagK1uSFqXOnMcmEDnxZuQQApugfDzClfN6DiDALCKN4dVAX8-OU_L2xsUkKiFP9rQjvHWJoRFBT1FpXjBfoVyzM1AaJ6C83WX6SjOBE0hhikQKIaPSe1ikK8_MzOIs2wqLLPnLGnKj3kcKMkDmY6DMgxfWj2H0hwLy0oZ7_qykS7wUHMGjRO5yScuBWFIr0RFFu00GS7zrKjkhFc_E4ZBBKskn0gywS-5pogo0U1rQtLg8lQJsVbxXQwtq2TxkGFMBiVxtQcXtHM1qbCVXpZQbk7ezxvasj4yAIsF4H7KBiZSGmWHkk4yADykWJSntTjFcM2wG0wSiEYoYzJQ'; config.TOKEN_EXPIRES_IN = 1515100500; @@ -20,8 +20,8 @@ config.SKILL_ID = 'amzn1.ask.skill.2445552d-954d-4cd6-b77f-295368e02842'; //sabu config.SKILL_DB_ID = '5a232fb86ce046c749739455'; //for local //Bilal -config.CLIENT_ID = 'amzn1.application-oa2-client.c748ca56ded04a95b236979898585ff7'; -config.CLIENT_SECRET = '6dea8125cecd049d3c4cff7bb5bdfd3ff17bc6fed246c4c8f6b519d9ed08d0b3'; +//config.CLIENT_ID = 'amzn1.application-oa2-client.c748ca56ded04a95b236979898585ff7'; +//config.CLIENT_SECRET = '6dea8125cecd049d3c4cff7bb5bdfd3ff17bc6fed246c4c8f6b519d9ed08d0b3'; //Saburly config.CLIENT_ID = 'amzn1.application-oa2-client.8c183daec15c488c9126b62bda9f7832'; -- 2.47.3 From 5e923149389c016a0e636cb7566977efccc06417 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Mon, 29 Jan 2018 21:32:24 +0100 Subject: [PATCH 09/10] frontend user input handling --- web/src/App.js | 78 ++++++++++++++++++++++++----- web/src/components/IntentDetails.js | 13 ++--- web/src/components/LaunchRequest.js | 4 +- web/src/config/constants.js | 11 +++- web/src/lib/helpers.js | 5 ++ 5 files changed, 87 insertions(+), 24 deletions(-) create mode 100644 web/src/lib/helpers.js diff --git a/web/src/App.js b/web/src/App.js index 15ee959..f99b096 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -7,11 +7,16 @@ import LaunchRequest from './components/LaunchRequest'; import Contact from './components/Contact'; import Popup from 'react-popup'; import {getSkill, updateSkill} from './lib/api'; +import {isEmailValid} from './lib/helpers'; import { NEW_INTENT_SELECTED_INDEX, LAUNCH_REQUEST_SELECTED_INDEX, CONTACT_SELECTED_INDEX, RESULT_CODES, + INVOCATION_NAME_MIN_LENGTH, + INTENT_NAME_MIN_LENGTH, + QUESTION_MIN_LENGTH, + ANSWER_MIN_LENGTH, } from './config/constants'; class App extends Component { @@ -144,6 +149,12 @@ class App extends Component { } handleSaveLaunchRequestClick (name, answer) { + + if (name.length < INVOCATION_NAME_MIN_LENGTH){ + Popup.alert ('Invocation name should be at least 2 characters long'); + return; + } + this.setState ({ waiting: true, invocationName: name, @@ -162,17 +173,21 @@ class App extends Component { } handleSaveEmailClick (email) { - this.setState ({waiting: true}); - this.sendSkill ( - this.state.allIntents, - true, - {contactEmail: email, waiting: false}, - {waiting: false}, - this.state.invocationName, - this.state.invocationAnswer, - email, - false - ); + if (isEmailValid(email)){ + this.setState ({waiting: true}); + this.sendSkill ( + this.state.allIntents, + true, + {contactEmail: email, waiting: false}, + {waiting: false}, + this.state.invocationName, + this.state.invocationAnswer, + email, + false + ); + }else{ + Popup.alert ('Please enter valid email'); + } } handleDeleteIntentClick (selectedIntent) { @@ -215,7 +230,46 @@ class App extends Component { } handleSaveIntentClick (selectedIntent) { - console.log("Save intent"); + + if (selectedIntent.intentName.length < INTENT_NAME_MIN_LENGTH){ + Popup.alert ('Question name should have at least 2 characters'); + return; + } + + if (selectedIntent.answer.length < ANSWER_MIN_LENGTH){ + Popup.alert('Answer should have at least 2 characters'); + return; + } + + for(let i=0;i { + let validEmailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + + return validEmailRegex.test (email); +}; -- 2.47.3 From 779e2d61f4d76a6ac3769eb32cb2f14a8da4f149 Mon Sep 17 00:00:00 2001 From: GotPPay Date: Mon, 29 Jan 2018 23:23:36 +0100 Subject: [PATCH 10/10] backend user input handling --- backend/config/constants.js | 70 +++++++++++++-------- backend/controllers/skill.js | 15 +++++ backend/helpers/skillValidator.js | 100 ++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 26 deletions(-) create mode 100644 backend/helpers/skillValidator.js diff --git a/backend/config/constants.js b/backend/config/constants.js index 093f427..ef7c57f 100644 --- a/backend/config/constants.js +++ b/backend/config/constants.js @@ -1,43 +1,61 @@ const constants = {}; constants.amazonResultCodes = { - OK:200, - ACCEPTED:202, - BAD_REQUEST:400, - UNAUTHORIZED:401, - NOT_FOUND:404, - CONFLICT:409, - PAYLOAD_TOO_LARGE:413 -} + OK: 200, + ACCEPTED: 202, + BAD_REQUEST: 400, + UNAUTHORIZED: 401, + NOT_FOUND: 404, + CONFLICT: 409, + PAYLOAD_TOO_LARGE: 413, +}; constants.apiResultCodes = { - GENERIC_ERROR : -1, - OK:0, - AMAZON_ERROR:1, //amazon api works, but error is some of the amazonResultCodes - AMAZON_FAIL:2, //amazon api doesn't work - DATABASE_ERROR:3, - NO_SKILL:4, - INCONSISTENT_STATE:5, -} + GENERIC_ERROR: -1, + OK: 0, + AMAZON_ERROR: 1, //amazon api works, but error is some of the amazonResultCodes + AMAZON_FAIL: 2, //amazon api doesn't work + DATABASE_ERROR: 3, + NO_SKILL: 4, + INCONSISTENT_STATE: 5, + INVALID_SKILL: 6, +}; constants.HTTPResultCodes = { - INTERNAL_SERVER_ERROR : 500, -} + INTERNAL_SERVER_ERROR: 500, +}; constants.SKILL_ID_LENGTH = 24; constants.voiceResponseStrings = { - QUESTION_NOT_FOUND : 'Sorry, I didnt understand', - GENERIC_CONTINUE : 'Say something to continue', - DIDNT_ASK_ANYTHING : 'There was no question to answer to', -} + QUESTION_NOT_FOUND: 'Sorry, I didnt understand', + GENERIC_CONTINUE: 'Say something to continue', + DIDNT_ASK_ANYTHING: 'There was no question to answer to', +}; //Timing is given in [ms] constants.voiceResponseTimings = { - PAUSE_BETWEEN_QUESTIONS : 650, - PAUSE_AFTER_WELCOME_MESSAGE : 650, -} + PAUSE_BETWEEN_QUESTIONS: 650, + PAUSE_AFTER_WELCOME_MESSAGE: 650, +}; +constants.stringConstraints = { + INTENT_EXPLANATION_MAX_LENGTH: 70, + INTENT_NAME_MAX_LENGTH: 30, + INTENT_NAME_MIN_LENGTH: 2, -module.exports = constants; \ No newline at end of file + QUESTION_MAX_LENGTH: 150, + QUESTION_MIN_LENGTH: 2, + + ANSWER_MAX_LENGTH: 150, + ANSWER_MIN_LENGTH: 2, + + INVOCATION_NAME_MAX_LENGTH: 50, + INVOCATION_NAME_MIN_LENGTH: 2, + INVOCATION_ANSWER_MAX_LENGTH: 100, + + EMAIL_MAX_LENGTH: 100, +}; + +module.exports = constants; diff --git a/backend/controllers/skill.js b/backend/controllers/skill.js index a0c2f5f..6ee4906 100644 --- a/backend/controllers/skill.js +++ b/backend/controllers/skill.js @@ -2,6 +2,7 @@ var express = require ('express'), router = express.Router (); const constants = require ('../config/constants'); var databaseHelper = require ('../helpers/database'); var amazonHelper = require ('../helpers/amazon'); +var skillValidator = require('../helpers/skillValidator'); var bodyParser = require ('body-parser'); var alexa = require ('../models/alexa'); @@ -31,6 +32,20 @@ router.put ('/:id', bodyParser.json (), async (req, res, next) => { 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) diff --git a/backend/helpers/skillValidator.js b/backend/helpers/skillValidator.js new file mode 100644 index 0000000..6d78cdf --- /dev/null +++ b/backend/helpers/skillValidator.js @@ -0,0 +1,100 @@ +const constants = require ('../config/constants'); + +validateEmail = function (email) { + if (email.length > constants.stringConstraints.EMAIL_MAX_LENGTH) return false; + let validEmailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return validEmailRegex.test (email); +}; + +validateIntentName = function (intentName) { + if ( + intentName.length < constants.stringConstraints.INTENT_NAME_MIN_LENGTH || + intentName.length > constants.stringConstraints.INTENT_NAME_MAX_LENGTH + ) + return false; + let validIntentNameRegex = /^[a-z]*$/i; + return validIntentNameRegex.test (intentName); +}; + +validateQuestion = function (question) { + if ( + question.length < constants.stringConstraints.QUESTION_MIN_LENGTH || + question.length > constants.stringConstraints.QUESTION_MAX_LENGTH + ) + return false; + let validQuestionNameRegex = /^[a-z,.' ]*$/i; + return validQuestionNameRegex.test (question); +}; + +validateAnswer = function (answer) { + if ( + answer.length < constants.stringConstraints.ANSWER_MIN_LENGTH || + answer.length > constants.stringConstraints.ANSWER_MAX_LENGTH + ) + return false; + let validAnswerRegex = /^[a-z,.' ]*$/i; + return validAnswerRegex.test (answer); +}; + +validateInvocationName = function (invocationName) { + if ( + invocationName.length < constants.stringConstraints.INVOCATION_NAME_MIN_LENGTH || + invocationName.length > constants.stringConstraints.INVOCATION_NAME_MAX_LENGTH + ) + return false; + let validInvocationNameRegex = /^[a-z,.' ]*$/i; + return validInvocationNameRegex.test (invocationName); +}; + +validateInvocationAnswer = function (invocationAnswer) { + if (invocationAnswer.length > constants.stringConstraints.INVOCATION_ANSWER_MAX_LENGTH) + return false; + let validInvocationAnswerRegex = /^[a-z,.' ]*$/i; + return validInvocationAnswerRegex.test (invocationAnswer); +}; + +validateIntentExplanation = function (explanation) { + if (explanation.length > constants.stringConstraints.INTENT_EXPLANATION_MAX_LENGTH) + return false; + let validExplanationRegex = /^[a-z,.' ]*$/i; + return validExplanationRegex.test (explanation); +}; + +module.exports = { + validateSkill: function (skill) { + try { + if ( + !validateEmail (skill.contactEmail) || + !validateInvocationName (skill.invocationName) || + !validateInvocationAnswer (skill.invocationAnswer) + ) + return false; + + for (let i = 0; i < skill.intents.length; i++) { + if (!validateIntentName (skill.intents[i].intentName)) return false; + if (!validateAnswer (skill.intents[i].answer)) return false; + + for (let j = 0; j < skill.intents.length; j++) { + if (i === j) continue; + if (skill.intents[i].intentName === skill.intents[j].intentName) + return false; + } + + for (let j = 0; j < skill.intents[i].questions.length; j++) { + if (!validateQuestion (skill.intents[i].questions[j])) return false; + + for (let k = 0; k < skill.intents[i].questions.length; k++) { + if (j === k) continue; + if (skill.intents[i].questions[j] === skill.intents[i].questions[k]) + return false; + } + } + } + + return true; + } catch (e) { + console.log ('Error : ' + e); + return false; + } + }, +}; -- 2.47.3