From 9113ba4c74e8a1171466a2745b80d96fefe2ff2f Mon Sep 17 00:00:00 2001 From: Ayobami Date: Fri, 18 Jul 2025 20:12:09 +0100 Subject: [PATCH] feat: complete day 14 --- day14/Controller_builder.js | 74 +++++++++++++++++++ day14/Model_builder.js | 43 ++++++++--- day14/configuration.json | 68 ++++++++--------- day14/generate.js | 7 ++ day14/release/controllers/email.controller.js | 51 +++++++++++++ .../controllers/location.controller.js | 51 +++++++++++++ day14/release/controllers/sms.controller.js | 51 +++++++++++++ day14/release/controllers/user.controller.js | 51 +++++++++++++ day14/release/models/email.model.js | 20 +++++ day14/release/models/location.model.js | 20 +++++ day14/release/models/sms.model.js | 20 +++++ day14/release/models/user.model.js | 24 ++++++ 12 files changed, 437 insertions(+), 43 deletions(-) create mode 100644 day14/Controller_builder.js create mode 100644 day14/generate.js create mode 100644 day14/release/controllers/email.controller.js create mode 100644 day14/release/controllers/location.controller.js create mode 100644 day14/release/controllers/sms.controller.js create mode 100644 day14/release/controllers/user.controller.js create mode 100644 day14/release/models/email.model.js create mode 100644 day14/release/models/location.model.js create mode 100644 day14/release/models/sms.model.js create mode 100644 day14/release/models/user.model.js diff --git a/day14/Controller_builder.js b/day14/Controller_builder.js new file mode 100644 index 0000000..6cb7b16 --- /dev/null +++ b/day14/Controller_builder.js @@ -0,0 +1,74 @@ +const fs = require("fs"); +const path = require("path"); + +class ControllerBuilder { + static build() { + const config = require("./configuration.json"); + const controllerDir = path.join(__dirname, "release/controllers"); + + // Create release/controllers directory + if (!fs.existsSync(controllerDir)) + fs.mkdirSync(controllerDir, { recursive: true }); + + config.model.forEach((model) => { + const controllerCode = `const express = require('express'); +const router = express.Router(); +const model = require('../models/${model.name}.model.js'); + +// CREATE +router.post('/', async (req, res) => { + try { + const data = await model.create(req.body); + res.status(201).json(data); + } catch (error) { + res.status(400).json({ error: error.message }); + } +}); + +// READ ALL +router.get('/', async (req, res) => { + try { + const data = await model.findAll(); + res.json(data); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// UPDATE +router.put('/:id', async (req, res) => { + try { + const updated = await model.update(req.body, { + where: { id: req.params.id } + }); + if (updated[0] === 0) return res.status(404).json({ error: 'Not found' }); + res.json(await model.findByPk(req.params.id)); + } catch (error) { + res.status(400).json({ error: error.message }); + } +}); + +// DELETE +router.delete('/:id', async (req, res) => { + try { + const deleted = await model.destroy({ + where: { id: req.params.id } + }); + if (!deleted) return res.status(404).json({ error: 'Not found' }); + res.status(204).send(); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +module.exports = router;`; + + fs.writeFileSync( + path.join(controllerDir, `${model.name}.controller.js`), + controllerCode + ); + }); + } +} + +module.exports = ControllerBuilder; diff --git a/day14/Model_builder.js b/day14/Model_builder.js index 6136b4d..0619d13 100644 --- a/day14/Model_builder.js +++ b/day14/Model_builder.js @@ -1,13 +1,38 @@ -let fs = require('fs'); +const fs = require("fs"); +const path = require("path"); -function Model_builder() { - let config = fs.readFileSync('configuration.json'); +class ModelBuilder { + static build() { + const config = require("./configuration.json"); + const modelDir = path.join(__dirname, "release/models"); - this.build = function () { - //generate files and put it into release folder - //Copy initialize files into release folder - //TODO + // Create release/models directory + if (!fs.existsSync(modelDir)) fs.mkdirSync(modelDir, { recursive: true }); + + config.model.forEach((model) => { + const modelCode = `const { DataTypes } = require('sequelize'); +module.exports = (sequelize) => { + return sequelize.define('${model.name}', { + ${model.field + .map( + (field) => ` + ${field[0]}: { + type: DataTypes.${field[1].toUpperCase()}, + allowNull: ${field[3] === "required" ? "false" : "true"} + }` + ) + .join(",")} + }, { + timestamps: true + }); +};`; + + fs.writeFileSync( + path.join(modelDir, `${model.name}.model.js`), + modelCode + ); + }); } +} - return this; -} \ No newline at end of file +module.exports = ModelBuilder; diff --git a/day14/configuration.json b/day14/configuration.json index 65313cc..44888a8 100644 --- a/day14/configuration.json +++ b/day14/configuration.json @@ -1,37 +1,37 @@ { -"model": [ - { - "name": "location", - "field: [ - ["id", "integer", "ID", "required"], - ["name", "string", "Name", "required"], - ["status", "integer", "Status", "required"], + "model": [ + { + "name": "location", + "field": [ + ["id", "integer", "ID", "required"], + ["name", "string", "Name", "required"], + ["status", "integer", "Status", "required"] + ] + }, + { + "name": "email", + "field": [ + ["id", "integer", "ID", "required"], + ["email", "string", "Email", "required"], + ["status", "integer", "Status", "required"] + ] + }, + { + "name": "sms", + "field": [ + ["id", "integer", "ID", "required"], + ["phone", "string", "Phone", "required"], + ["status", "integer", "Status", "required"] + ] + }, + { + "name": "user", + "field": [ + ["id", "integer", "ID", "required"], + ["name", "string", "Name", "required"], + ["email", "string", "Email", "required"], + ["status", "integer", "Status", "required"] + ] + } ] - }, - { - "name": "email", - "field: [ - ["id", "integer", "ID", "required"], - ["email", "string", "Email", "required"], - ["status", "integer", "Status", "required"], - ] - }, - { - "name": "sms", - "field: [ - ["id", "integer", "ID", "required"], - ["phone", "string", "Phone", "required"], - ["status", "integer", "Status", "required"], - ] - }, - { - "name": "user", - "field: [ - ["id", "integer", "ID", "required"], - ["name", "string", "Name", "required"], - ["email", "string", "Email", "required"], - ["status", "integer", "Status", "required"], - ] - } -] } diff --git a/day14/generate.js b/day14/generate.js new file mode 100644 index 0000000..b80af10 --- /dev/null +++ b/day14/generate.js @@ -0,0 +1,7 @@ +const Model_builder = require("./Model_builder"); +const Controller_builder = require("./Controller_builder"); + +Model_builder.build(); +Controller_builder.build(); + +console.log("Model and controller files generated in /release"); diff --git a/day14/release/controllers/email.controller.js b/day14/release/controllers/email.controller.js new file mode 100644 index 0000000..13f40de --- /dev/null +++ b/day14/release/controllers/email.controller.js @@ -0,0 +1,51 @@ +const express = require('express'); +const router = express.Router(); +const model = require('../models/email.model.js'); + +// CREATE +router.post('/', async (req, res) => { + try { + const data = await model.create(req.body); + res.status(201).json(data); + } catch (error) { + res.status(400).json({ error: error.message }); + } +}); + +// READ ALL +router.get('/', async (req, res) => { + try { + const data = await model.findAll(); + res.json(data); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// UPDATE +router.put('/:id', async (req, res) => { + try { + const updated = await model.update(req.body, { + where: { id: req.params.id } + }); + if (updated[0] === 0) return res.status(404).json({ error: 'Not found' }); + res.json(await model.findByPk(req.params.id)); + } catch (error) { + res.status(400).json({ error: error.message }); + } +}); + +// DELETE +router.delete('/:id', async (req, res) => { + try { + const deleted = await model.destroy({ + where: { id: req.params.id } + }); + if (!deleted) return res.status(404).json({ error: 'Not found' }); + res.status(204).send(); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/day14/release/controllers/location.controller.js b/day14/release/controllers/location.controller.js new file mode 100644 index 0000000..df519f1 --- /dev/null +++ b/day14/release/controllers/location.controller.js @@ -0,0 +1,51 @@ +const express = require('express'); +const router = express.Router(); +const model = require('../models/location.model.js'); + +// CREATE +router.post('/', async (req, res) => { + try { + const data = await model.create(req.body); + res.status(201).json(data); + } catch (error) { + res.status(400).json({ error: error.message }); + } +}); + +// READ ALL +router.get('/', async (req, res) => { + try { + const data = await model.findAll(); + res.json(data); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// UPDATE +router.put('/:id', async (req, res) => { + try { + const updated = await model.update(req.body, { + where: { id: req.params.id } + }); + if (updated[0] === 0) return res.status(404).json({ error: 'Not found' }); + res.json(await model.findByPk(req.params.id)); + } catch (error) { + res.status(400).json({ error: error.message }); + } +}); + +// DELETE +router.delete('/:id', async (req, res) => { + try { + const deleted = await model.destroy({ + where: { id: req.params.id } + }); + if (!deleted) return res.status(404).json({ error: 'Not found' }); + res.status(204).send(); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/day14/release/controllers/sms.controller.js b/day14/release/controllers/sms.controller.js new file mode 100644 index 0000000..b586686 --- /dev/null +++ b/day14/release/controllers/sms.controller.js @@ -0,0 +1,51 @@ +const express = require('express'); +const router = express.Router(); +const model = require('../models/sms.model.js'); + +// CREATE +router.post('/', async (req, res) => { + try { + const data = await model.create(req.body); + res.status(201).json(data); + } catch (error) { + res.status(400).json({ error: error.message }); + } +}); + +// READ ALL +router.get('/', async (req, res) => { + try { + const data = await model.findAll(); + res.json(data); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// UPDATE +router.put('/:id', async (req, res) => { + try { + const updated = await model.update(req.body, { + where: { id: req.params.id } + }); + if (updated[0] === 0) return res.status(404).json({ error: 'Not found' }); + res.json(await model.findByPk(req.params.id)); + } catch (error) { + res.status(400).json({ error: error.message }); + } +}); + +// DELETE +router.delete('/:id', async (req, res) => { + try { + const deleted = await model.destroy({ + where: { id: req.params.id } + }); + if (!deleted) return res.status(404).json({ error: 'Not found' }); + res.status(204).send(); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/day14/release/controllers/user.controller.js b/day14/release/controllers/user.controller.js new file mode 100644 index 0000000..4431833 --- /dev/null +++ b/day14/release/controllers/user.controller.js @@ -0,0 +1,51 @@ +const express = require('express'); +const router = express.Router(); +const model = require('../models/user.model.js'); + +// CREATE +router.post('/', async (req, res) => { + try { + const data = await model.create(req.body); + res.status(201).json(data); + } catch (error) { + res.status(400).json({ error: error.message }); + } +}); + +// READ ALL +router.get('/', async (req, res) => { + try { + const data = await model.findAll(); + res.json(data); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// UPDATE +router.put('/:id', async (req, res) => { + try { + const updated = await model.update(req.body, { + where: { id: req.params.id } + }); + if (updated[0] === 0) return res.status(404).json({ error: 'Not found' }); + res.json(await model.findByPk(req.params.id)); + } catch (error) { + res.status(400).json({ error: error.message }); + } +}); + +// DELETE +router.delete('/:id', async (req, res) => { + try { + const deleted = await model.destroy({ + where: { id: req.params.id } + }); + if (!deleted) return res.status(404).json({ error: 'Not found' }); + res.status(204).send(); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/day14/release/models/email.model.js b/day14/release/models/email.model.js new file mode 100644 index 0000000..3a1dac8 --- /dev/null +++ b/day14/release/models/email.model.js @@ -0,0 +1,20 @@ +const { DataTypes } = require('sequelize'); +module.exports = (sequelize) => { + return sequelize.define('email', { + + id: { + type: DataTypes.INTEGER, + allowNull: false + }, + email: { + type: DataTypes.STRING, + allowNull: false + }, + status: { + type: DataTypes.INTEGER, + allowNull: false + } + }, { + timestamps: true + }); +}; \ No newline at end of file diff --git a/day14/release/models/location.model.js b/day14/release/models/location.model.js new file mode 100644 index 0000000..9bacb19 --- /dev/null +++ b/day14/release/models/location.model.js @@ -0,0 +1,20 @@ +const { DataTypes } = require('sequelize'); +module.exports = (sequelize) => { + return sequelize.define('location', { + + id: { + type: DataTypes.INTEGER, + allowNull: false + }, + name: { + type: DataTypes.STRING, + allowNull: false + }, + status: { + type: DataTypes.INTEGER, + allowNull: false + } + }, { + timestamps: true + }); +}; \ No newline at end of file diff --git a/day14/release/models/sms.model.js b/day14/release/models/sms.model.js new file mode 100644 index 0000000..3a06099 --- /dev/null +++ b/day14/release/models/sms.model.js @@ -0,0 +1,20 @@ +const { DataTypes } = require('sequelize'); +module.exports = (sequelize) => { + return sequelize.define('sms', { + + id: { + type: DataTypes.INTEGER, + allowNull: false + }, + phone: { + type: DataTypes.STRING, + allowNull: false + }, + status: { + type: DataTypes.INTEGER, + allowNull: false + } + }, { + timestamps: true + }); +}; \ No newline at end of file diff --git a/day14/release/models/user.model.js b/day14/release/models/user.model.js new file mode 100644 index 0000000..84f4e8d --- /dev/null +++ b/day14/release/models/user.model.js @@ -0,0 +1,24 @@ +const { DataTypes } = require('sequelize'); +module.exports = (sequelize) => { + return sequelize.define('user', { + + id: { + type: DataTypes.INTEGER, + allowNull: false + }, + name: { + type: DataTypes.STRING, + allowNull: false + }, + email: { + type: DataTypes.STRING, + allowNull: false + }, + status: { + type: DataTypes.INTEGER, + allowNull: false + } + }, { + timestamps: true + }); +}; \ No newline at end of file