diff --git a/backend/servpulse-backend/.env.dist b/backend/servpulse-backend/.env.dist new file mode 100644 --- /dev/null +++ b/backend/servpulse-backend/.env.dist @@ -0,0 +1,2 @@ +POSTGRES_CONNECTION_STRING="postgresql://postgres:password@localhost:5432/postgres" +EXPRESS_PORT=3000 diff --git a/backend/servpulse-backend/app.js b/backend/servpulse-backend/app.js new file mode 100644 --- /dev/null +++ b/backend/servpulse-backend/app.js @@ -0,0 +1,23 @@ +// app.js +require('dotenv').config(); // Set up .env file +require('./config/database.js'); // Set up database connection + +const express = require('express'); +const app = express(); + +// Middleware to parse JSON requests +app.use(express.json()); + +// Import routes +const serviceRoutes = require('./routes/serviceRoutes.js'); +const incidentRoutes = require('./routes/incidentRoutes.js'); + +// Use the routes +app.use('/api', serviceRoutes); +app.use('/api', incidentRoutes); + +// Start the server +const PORT = process.env.EXPRESS_PORT || 3000; +app.listen(PORT, () => { + console.log(`Server running on port ${PORT}`); +}); diff --git a/backend/servpulse-backend/config/database.js b/backend/servpulse-backend/config/database.js new file mode 100644 --- /dev/null +++ b/backend/servpulse-backend/config/database.js @@ -0,0 +1,8 @@ +require('dotenv').config({ path: '../.env' }); +const { Pool } = require('pg'); + +const pool = new Pool({ + connectionString: process.env.POSTGRES_CONNECTION_STRING, +}); + +module.exports = pool; diff --git a/backend/servpulse-backend/controllers/incidentController.js b/backend/servpulse-backend/controllers/incidentController.js new file mode 100644 --- /dev/null +++ b/backend/servpulse-backend/controllers/incidentController.js @@ -0,0 +1,18 @@ +// incidentController.js +const incidentModel = require('../models/incidentModel.js'); +const incidentServiceModel = require('../models/incidentServiceModel.js'); +const incidentPostModel = require('../models/incidentPostModel.js'); +const incidentPostStatusModel = require('../models/incidentPostStatusModel.js'); + +const getIncidents = async (req, res) => { + try { + const incidents = await incidentModel.getIncidents(); + res.status(200).json(incidents); + } catch (error) { + res.status(500).json({ message: 'Error fetching services', error: error.message }); + } +}; + +// ... CRUD methods for incident controller using the respective models + +module.exports = { getIncidents, /* ... CRUD methods for incident controller */ }; diff --git a/backend/servpulse-backend/controllers/serviceController.js b/backend/servpulse-backend/controllers/serviceController.js new file mode 100644 --- /dev/null +++ b/backend/servpulse-backend/controllers/serviceController.js @@ -0,0 +1,26 @@ +// serviceController.js +const serviceModel = require('../models/serviceModel.js'); + +const addService = async (req, res) => { + try { + const serviceData = req.body; + const result = await serviceModel.addService(serviceData); + + res.status(201).json(result); + } catch (error) { + res.status(500).json({ message: 'Error creating service', error: error.message }); + } +}; + +const getServices = async (req, res) => { + try { + const services = await serviceModel.getServices(); + res.status(200).json(services); + } catch (error) { + res.status(500).json({ message: 'Error fetching services', error: error.message }); + } +}; + +// ... other CRUD methods for service controller + +module.exports = { addService, getServices, /* ... other CRUD methods */ }; diff --git a/backend/servpulse-backend/index.js b/backend/servpulse-backend/index.js deleted file mode 100644 --- a/backend/servpulse-backend/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const express = require('express') -const app = express() -const port = 3000 - -app.get('/', (req, res) => { - res.send('Hello World!') -}) - -app.listen(port, () => { - console.log(`Example app listening on port ${port}`) -}) diff --git a/backend/servpulse-backend/models/incidentModel.js b/backend/servpulse-backend/models/incidentModel.js new file mode 100644 --- /dev/null +++ b/backend/servpulse-backend/models/incidentModel.js @@ -0,0 +1,14 @@ +// incidentModel.js +const pool = require('../config/database.js'); + +const createIncident = async (data) => { + return await pool.query('INSERT INTO incident (title, start_date, update_date, type_id, status) VALUES (\$1, \$2, \$3, \$4, \$5) RETURNING *', [data.title, data.start_date, data.update_date, data.type_id, data.status]); +}; + +const getIncidents = async () => { + return await pool.query('SELECT * FROM incident;'); +}; + +// ... other CRUD methods for incident table + +module.exports = { createIncident, getIncidents /* ... other CRUD methods */ }; diff --git a/backend/servpulse-backend/models/serviceModel.js b/backend/servpulse-backend/models/serviceModel.js new file mode 100644 --- /dev/null +++ b/backend/servpulse-backend/models/serviceModel.js @@ -0,0 +1,14 @@ +// serviceModel.js +const pool = require('../config/database.js'); + +const addService = async (data) => { + return await pool.query('INSERT INTO service (name, "group", description, status) VALUES (\$1, \$2, \$3, \$4) RETURNING *', [data.name, data.group, data.description, data.status]); +}; + +const getServices = async () => { + return await pool.query('SELECT * FROM service;'); +}; + +// ... other CRUD methods for service table + +module.exports = { addService, getServices, /* ... other CRUD methods */ }; diff --git a/backend/servpulse-backend/package.json b/backend/servpulse-backend/package.json --- a/backend/servpulse-backend/package.json +++ b/backend/servpulse-backend/package.json @@ -1,14 +1,17 @@ { - "name": "servpulse-backend", - "version": "1.0.0", - "description": "Backend API for the ServPulse frontend.", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.18.2" - } + "name": "servpulse-backend", + "version": "1.0.0", + "description": "Backend API for the ServPulse frontend.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "dotenv": "^16.0.3", + "express": "^4.18.2", + "pg": "^8.11.0", + "sequelize": "^6.31.1" + } } diff --git a/backend/servpulse-backend/routes/incidentRoutes.js b/backend/servpulse-backend/routes/incidentRoutes.js new file mode 100644 --- /dev/null +++ b/backend/servpulse-backend/routes/incidentRoutes.js @@ -0,0 +1,10 @@ +// incidentRoutes.js +const express = require('express'); +const router = express.Router(); +const incidentController = require('../controllers/incidentController.js'); + +router.get('/incident/getAll', incidentController.getIncidents); + +// ... other routes for incident controller + +module.exports = router; diff --git a/backend/servpulse-backend/routes/serviceRoutes.js b/backend/servpulse-backend/routes/serviceRoutes.js new file mode 100644 --- /dev/null +++ b/backend/servpulse-backend/routes/serviceRoutes.js @@ -0,0 +1,11 @@ +// serviceRoutes.js +const express = require('express'); +const router = express.Router(); +const serviceController = require('../controllers/serviceController.js'); + +router.get('/service/getAll', serviceController.getServices); +router.post('/service', serviceController.addService); + +// ... other routes for service controller + +module.exports = router; diff --git a/database/README.md b/database/README.md new file mode 100644 --- /dev/null +++ b/database/README.md @@ -0,0 +1,5 @@ +<!-- RUN DB --> +`docker run --name servpulse_db -p 5432:5432 -e POSTGRES_PASSWORD="yourpassword" -d postgres` + +<!-- DIAGRAM DESIGN PROJECT --> +https://dbdiagram.io/d/643dab996b31947051bf53e7 diff --git a/database/scripts/populate_data.sql b/database/scripts/populate_data.sql new file mode 100644 --- /dev/null +++ b/database/scripts/populate_data.sql @@ -0,0 +1,14 @@ +-- POPULATE DB + +---- Create a new group +INSERT INTO service_group (name, description) +VALUES ('Group 1', 'This is the first service group.'), + ('Group 2', 'This is the second service group.') +RETURNING *; + +---- Insert data into the service table: +INSERT INTO service (name, "group", description, status) +VALUES ('Service A', 1, 'Description A', 'Active'), + ('Service B', 2, 'Description B', 'Inactive'), + ('Service C', 1, 'Description C', 'Active') +RETURNING *; diff --git a/database/servpulse.sql b/database/servpulse.sql new file mode 100644 --- /dev/null +++ b/database/servpulse.sql @@ -0,0 +1,59 @@ +CREATE TABLE "service" ( + "id" serial PRIMARY KEY, + "name" varchar, + "group" int, + "description" varchar, + "status" varchar +); + +CREATE TABLE "service_group" ( + "id" serial PRIMARY KEY, + "name" varchar, + "description" varchar +); + +CREATE TABLE "incident" ( + "id" serial PRIMARY KEY, + "title" varchar, + "start_date" timestamp, + "update_date" timestamp, + "type_id" int, + "status" varchar +); + +CREATE TABLE "incident_service" ( + "id" serial PRIMARY KEY, + "incident" int, + "service" int +); + +CREATE TABLE "incident_type" ( + "id" serial PRIMARY KEY, + "label" varchar, + "color" varchar +); + +CREATE TABLE "incident_post" ( + "id" serial PRIMARY KEY, + "incident_id" int, + "date" timestamp, + "step_id" int, + "note" varchar +); + +CREATE TABLE "incident_post_steps" ( + "id" serial PRIMARY KEY, + "label" varchar +); + +ALTER TABLE "service" ADD FOREIGN KEY ("group") REFERENCES "service_group" ("id"); + +ALTER TABLE "incident" ADD FOREIGN KEY ("type_id") REFERENCES "incident_type" ("id"); + +ALTER TABLE "incident_service" ADD FOREIGN KEY ("incident") REFERENCES "incident" ("id"); + +ALTER TABLE "incident_service" ADD FOREIGN KEY ("service") REFERENCES "service" ("id"); + +ALTER TABLE "incident_post" ADD FOREIGN KEY ("incident_id") REFERENCES "incident" ("id"); + +ALTER TABLE "incident_post" ADD FOREIGN KEY ("step_id") REFERENCES "incident_post_steps" ("id");