diff --git a/README.md b/README.md index c1e95b5..3c70108 100644 --- a/README.md +++ b/README.md @@ -4,21 +4,28 @@ ### Endpoints Available +#### Questionnaire + +- Get All: `GET /questionnaire` +- Create: `POST /questionnaire` +- Update: `PATCH /questionnaire/:id` +- Delete: `DELETE /questionnaire/:id` + #### Usecases -- Get All: ```GET /usecases``` -- Create: ```POST /usecases``` -- Update: ```PATCH /usecases/:id``` -- Delete: ```DELETE /usecases/:id``` +- Get All: `GET /usecases` +- Create: `POST /usecases` +- Update: `PATCH /usecases/:id` +- Delete: `DELETE /usecases/:id` #### Usecases => Personas -- Add New: ```POST /usecases/:id/persona``` -- Update: ```PATCH /usecases/:id/persona/:personaId``` -- Delete: ```DELETE /usecases/:id/persona/:personaId``` - +- Add New: `POST /usecases/:id/persona` +- Update: `PATCH /usecases/:id/persona/:personaId` +- Delete: `DELETE /usecases/:id/persona/:personaId` ### Setup + ``` npm install ``` diff --git a/index.js b/index.js index 6fe8739..484840d 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,6 @@ require('dotenv').config(); +const cors = require('cors') const express = require('express'); const mongoose = require('mongoose'); const mongoString = process.env.DATABASE_URL; @@ -16,12 +17,14 @@ database.once('connected', () => { }) const usecases = require('./src/routes/usecases'); +const questionnaire = require('./src/routes/questionnaire'); // Add other service routes here. e.g. questionaires // const usecases = require('./src/routes/usecases'); const app = express(); const PORT = process.env.PORT || 3000; app.use(express.json()); +app.use(cors()); // For testing purposes app.get("/", (req, res) => { @@ -32,4 +35,5 @@ app.listen(PORT, () => { console.log(`API is listening on port ${PORT}`); }); -app.use('/api/usecases/', usecases) \ No newline at end of file +app.use('/api/usecases/', usecases) +app.use('/api/questionnaire/', questionnaire) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a05d81d..11e24ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,8 @@ "dotenv": "^16.0.1", "express": "^4.18.1", "mongoose": "^6.3.5", - "nodemon": "^2.0.16" + "nodemon": "^2.0.16", + "uuid": "^8.3.2" } }, "node_modules/@sindresorhus/is": { @@ -1985,6 +1986,14 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -3503,6 +3512,11 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index a3e964a..1ae9e14 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dotenv": "^16.0.1", "express": "^4.18.1", "mongoose": "^6.3.5", - "nodemon": "^2.0.16" + "nodemon": "^2.0.16", + "uuid": "^8.3.2" } } diff --git a/src/controllers/intent.js b/src/controllers/intent.js new file mode 100644 index 0000000..5052342 --- /dev/null +++ b/src/controllers/intent.js @@ -0,0 +1,49 @@ +const Usecase = require('../models/usecase'); + +module.exports.add = async (req, res) => { + try { + const usecase = await Usecase.findById(req.params.id); + let persona = usecase.personas.id(req.params.personaId); + + persona.intents.push(req.body) + + const save = await usecase.save(); + res.status(200).json(save) + } + catch (error) { + res.status(400).json({ message: error.message }) + } +} + +module.exports.delete = async (req, res) => { + try { + const usecase = await Usecase.findById(req.params.id); + let persona = usecase.personas.id(req.params.personaId); + + persona.intents = persona.intents.filter((intent) => intent.id != req.params.intentId) + + const save = await usecase.save(); + res.status(200).json(save) + } + catch (error) { + res.status(400).json({ message: error.message }) + } +} + +module.exports.update = async (req, res) => { + try { + const usecase = await Usecase.findById(req.params.id); + let persona = usecase.personas.id(req.params.personaId); + + const intentIndex = persona.intents.map((e) => e.id).indexOf(req.params.intentId); + + persona.intents[intentIndex] = req.body; + + + const save = await usecase.save(); + res.status(200).json(save) + } + catch (error) { + res.status(400).json({ message: error.message }) + } +} diff --git a/src/controllers/persona.js b/src/controllers/persona.js index d3d3134..14b152e 100644 --- a/src/controllers/persona.js +++ b/src/controllers/persona.js @@ -22,6 +22,7 @@ module.exports.updateDetails = async (req, res) => { console.log("personaId", personaId) let persona = usecase.personas.id(personaId); + console.log(persona) persona.details = req.body; const save = await usecase.save(); diff --git a/src/controllers/questionnaire.js b/src/controllers/questionnaire.js new file mode 100644 index 0000000..cfb9303 --- /dev/null +++ b/src/controllers/questionnaire.js @@ -0,0 +1,61 @@ +const questionnaire = require("../models/questionnaire"); + +module.exports.create = async (req, res) => { + const data = new questionnaire(req.body); + + try { + const result = await data.save(); + res.status(200).json(result); + } catch (error) { + res + .status(400) + .send({ + message: + error.message || + "Some error occurred while creating the questionnaire.", + }); + } +}; + +module.exports.findAll = async (req, res) => { + try { + const data = await questionnaire.find(); + res.json(data); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +module.exports.findOne = async (req, res) => { + try { + const data = await questionnaire.findById(req.params.id); + res.json(data); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + +module.exports.update = async (req, res) => { + try { + const data = await questionnaire.findByIdAndUpdate( + req.params.id, + req.body + ); + res.send(`Questionnaire ${data._id} has been updated.`); + } catch (error) { + res.status(500).send({ + message: "Error updating questionnaire with id=" + req.params.id, + }); + } +}; + +module.exports.remove = async (req, res) => { + try { + const data = await questionnaire.findByIdAndRemove(req.params.id); + res.send(`Questionnaire ${data._id} has been deleted.`); + } catch (error) { + res.status(500).json({ + message: "Could not delete Questionnaire with id=" + req.params.id, + }); + } +}; diff --git a/src/controllers/usecase.js b/src/controllers/usecase.js index 0a060aa..163c864 100644 --- a/src/controllers/usecase.js +++ b/src/controllers/usecase.js @@ -2,7 +2,6 @@ const Usecase = require('../models/usecase'); module.exports.create = async (req, res) => { const data = new Usecase(req.body) - try { const dataToSave = await data.save(); res.status(200).json(dataToSave) @@ -39,6 +38,7 @@ module.exports.update = async (req, res) => { } module.exports.updateSettings = async (req, res) => { + console.log("test") try { const id = req.params.id; const updatedData = { "settings": req.body.settings }; @@ -54,6 +54,7 @@ module.exports.updateSettings = async (req, res) => { } } catch (error) { + console.log(error) res.status(400).json({ message: error.message }) } } @@ -81,4 +82,19 @@ module.exports.delete = async (req, res) => { } } +module.exports.updatePublish = async (req, res) => { + try { + const id = req.params.id; + const data = await Usecase.findById(id) + + data.published = req.body.status + + data.save() + + res.send(`Publish state of ${data.name} has been updated.`) + } + catch (error) { + res.status(400).json({ message: error.message }) + } +} diff --git a/src/models/questionnaire.js b/src/models/questionnaire.js new file mode 100644 index 0000000..a2a4718 --- /dev/null +++ b/src/models/questionnaire.js @@ -0,0 +1,25 @@ +const mongoose = require('mongoose'); + +const questionnaireschema = new mongoose.Schema({ + _id: String, + name: String, + dimension: String, + questions: [{ + id: String, + content: String, + responseType: String, + dimension: String, + answer: [String], + responseOptions: [{ + val: String, + }], + required: Boolean, + completed: Boolean, + validators: { + min: Number, + max: Number, + } + }], +}, { strict: false, timestamps: true }) + +module.exports = mongoose.model('questionnaires', questionnaireschema); \ No newline at end of file diff --git a/src/models/usecase.js b/src/models/usecase.js index e2f949e..4328ea0 100644 --- a/src/models/usecase.js +++ b/src/models/usecase.js @@ -35,6 +35,9 @@ const usecaseSchema = new mongoose.Schema({ stats: { type: Object }, + published: { + type: Boolean + }, personas: { type: [personaSchema] } diff --git a/src/routes/questionnaire.js b/src/routes/questionnaire.js new file mode 100644 index 0000000..b0c2277 --- /dev/null +++ b/src/routes/questionnaire.js @@ -0,0 +1,16 @@ +const express = require('express'); +const controller = require('../controllers/questionnaire'); + +const router = express.Router(); + +router.get('/', controller.findAll); + +router.get('/:id', controller.findOne); + +router.post('/', controller.create); + +router.delete('/:id', controller.remove); + +router.patch('/:id', controller.update); + +module.exports = router; \ No newline at end of file diff --git a/src/routes/usecases.js b/src/routes/usecases.js index 9e136ec..68aaf00 100644 --- a/src/routes/usecases.js +++ b/src/routes/usecases.js @@ -2,6 +2,7 @@ const express = require('express'); const router = express.Router() const usecasectrl = require('../controllers/usecase'); const personactrl = require('../controllers/persona'); +const intentctrl = require('../controllers/intent'); //---------------------------------------------------- // Usecase Related Endpoints @@ -22,6 +23,9 @@ router.get('/', usecasectrl.list); // Update Settings router.patch('/:id/settings', usecasectrl.updateSettings); +// Update published state +router.patch('/:id/publish', usecasectrl.updatePublish); + // Delete by ID router.delete('/:id', usecasectrl.delete); @@ -39,4 +43,15 @@ router.patch('/:id/persona/:personaId', personactrl.updateDetails); // Delete Persona Details router.delete('/:id/persona/:personaId', personactrl.delete); + +//---------------------------------------------------- +// Intent Related Endpoints +//--------------------------------------------------- + +// Add intent to Persona +router.post('/:id/persona/:personaId/intent', intentctrl.add); +router.delete('/:id/persona/:personaId/intent/:intentId', intentctrl.delete); +router.patch('/:id/persona/:personaId/intent/:intentId', intentctrl.update); + + module.exports = router; \ No newline at end of file