From d3d6c927e0db0cddf0657feb2ffe1cf11dcfabda Mon Sep 17 00:00:00 2001 From: kaustubhdeokar Date: Tue, 22 Oct 2024 23:24:10 +0530 Subject: [PATCH] structuring of backend side, env file, modularization added --- .env | 7 ++ package-lock.json | 13 ++++ package.json | 3 +- src/config/config.js | 13 ++++ .../controllers/eventController.js | 65 +++++-------------- src/index.js | 18 +++++ src/middlewares/errorHandler.js | 6 ++ src/models/db.js | 6 ++ src/routes/eventRoutes.js | 11 ++++ 9 files changed, 94 insertions(+), 48 deletions(-) create mode 100644 .env create mode 100644 src/config/config.js rename index.js => src/controllers/eventController.js (67%) create mode 100644 src/index.js create mode 100644 src/middlewares/errorHandler.js create mode 100644 src/models/db.js create mode 100644 src/routes/eventRoutes.js diff --git a/.env b/.env new file mode 100644 index 0000000..1f70251 --- /dev/null +++ b/.env @@ -0,0 +1,7 @@ +PORT=3000 +DB_USER=postgres +DB_HOST=localhost +DB_NAME=events_db +DB_PASSWORD=password +DB_PORT=5432 +CORS_ORIGIN=http://localhost:5173 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index bc83408..b74ea9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "body-parser": "^1.20.3", "cors": "^2.8.5", + "dotenv": "^16.4.5", "express": "^4.21.1", "pg": "^8.13.0" } @@ -180,6 +181,18 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", diff --git a/package.json b/package.json index 4341db0..a0af334 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "technexus-be", "version": "1.0.0", "description": "", - "main": "index.js", + "main": "src/index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, @@ -12,6 +12,7 @@ "dependencies": { "body-parser": "^1.20.3", "cors": "^2.8.5", + "dotenv": "^16.4.5", "express": "^4.21.1", "pg": "^8.13.0" } diff --git a/src/config/config.js b/src/config/config.js new file mode 100644 index 0000000..15ac295 --- /dev/null +++ b/src/config/config.js @@ -0,0 +1,13 @@ +require('dotenv').config(); + +module.exports = { + port: process.env.PORT || 3000, + db: { + user: process.env.DB_USER, + host: process.env.DB_HOST, + database: process.env.DB_NAME, + password: process.env.DB_PASSWORD, + port: process.env.DB_PORT, + }, + corsOrigin: process.env.CORS_ORIGIN || 'http://localhost:5173', +}; diff --git a/index.js b/src/controllers/eventController.js similarity index 67% rename from index.js rename to src/controllers/eventController.js index 97d77d5..e754c05 100644 --- a/index.js +++ b/src/controllers/eventController.js @@ -1,31 +1,6 @@ -const express = require('express'); -const bodyParser = require('body-parser'); -const cors = require('cors'); -const { Pool } = require('pg'); +const pool = require('../models/db'); -const app = express(); -const port = 3000; - -const pool = new Pool({ - user: 'postgres', - host: 'localhost', - database: 'events_db', - password: 'password', - port: 5432, -}); - -// Use CORS to allow requests from the React app -app.use(cors({ - origin: 'http://localhost:5173' -})); -app.use(bodyParser.json()); - -// Define a simple route -app.get('/', (req, res) => { - res.send('Hello from the Node.js backend!'); -}); - -app.get('/events', async (req, res) => { +const getAllEvents = async (req, res) => { try { const result = await pool.query('SELECT * FROM events'); res.json(result.rows); @@ -33,20 +8,20 @@ app.get('/events', async (req, res) => { console.error(err); res.status(500).send('Server error'); } -}); +}; -app.get('/events/online', async (req, res) => { +const getOnlineEvents = async (req, res) => { try { + console.log('in online events'); const result = await pool.query(`SELECT * FROM events WHERE type = 'online'`); - console.log('online events:', result.rows); res.json(result.rows); } catch (err) { console.error(err); res.status(500).send('Server error'); } -}); +}; -app.get('/events/offline', async (req, res) => { +const getOfflineEvents = async (req, res) => { try { const result = await pool.query(`SELECT * FROM events WHERE type = 'offline'`); res.json(result.rows); @@ -54,13 +29,10 @@ app.get('/events/offline', async (req, res) => { console.error(err); res.status(500).send('Server error'); } -}); - -//write a post request for api : return axios.post(`${API_BASE_URL}/createevent`, eventData); - - -app.post('/createevent', (req, res) => { +}; +const createEvent = async (req, res) => { + console.log('reaching create event api.'); const title = req.body.title ?? ''; const date = req.body.date ?? ''; const description = req.body.description ?? ''; @@ -77,7 +49,6 @@ app.post('/createevent', (req, res) => { const state = location.state ?? ''; const postalCode = location.postalCode ?? ''; - console.log(image, link, lat, lng, amenity, city, country, state, postalCode, title, description, date); const query = ` INSERT INTO events (title, date,type, description, image, link, lat, lng, amenity, city, country, state, postalCode) @@ -97,11 +68,11 @@ app.post('/createevent', (req, res) => { console.error('Error inserting event data:', err); res.status(500).json({ error: 'Failed to create event' }); } -}); - - - -// Start the server -app.listen(port, () => { - console.log(`Server is running on http://localhost:${port}`); -}); \ No newline at end of file +}; + +module.exports = { + getAllEvents, + getOnlineEvents, + getOfflineEvents, + createEvent, +}; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..e07b3bc --- /dev/null +++ b/src/index.js @@ -0,0 +1,18 @@ +const express = require('express'); +const cors = require('cors'); +const bodyParser = require('body-parser'); +const config = require('./config/config'); +const eventRoutes = require('./routes/eventRoutes'); +const errorHandler = require('./middlewares/errorHandler'); + +const app = express(); + +app.use(cors({ origin: config.corsOrigin })); +app.use(bodyParser.json()); + +app.use('/events', eventRoutes); +app.use(errorHandler); + +app.listen(config.port, () => { + console.log(`Server is running on http://localhost:${config.port}`); +}); \ No newline at end of file diff --git a/src/middlewares/errorHandler.js b/src/middlewares/errorHandler.js new file mode 100644 index 0000000..ae93f0c --- /dev/null +++ b/src/middlewares/errorHandler.js @@ -0,0 +1,6 @@ +const errorHandler = (err, req, res, next) => { + console.error(err.stack); + res.status(500).send('Something broke!'); +}; + +module.exports = errorHandler; \ No newline at end of file diff --git a/src/models/db.js b/src/models/db.js new file mode 100644 index 0000000..2559834 --- /dev/null +++ b/src/models/db.js @@ -0,0 +1,6 @@ +const { Pool } = require('pg'); +const config = require('../config/config'); + +const pool = new Pool(config.db); + +module.exports = pool; \ No newline at end of file diff --git a/src/routes/eventRoutes.js b/src/routes/eventRoutes.js new file mode 100644 index 0000000..0b9047e --- /dev/null +++ b/src/routes/eventRoutes.js @@ -0,0 +1,11 @@ +const express = require('express'); +const router = express.Router(); +const eventController = require('../controllers/eventController'); + + +router.get('/', eventController.getAllEvents); +router.get('/online', eventController.getOnlineEvents); +router.get('/offline', eventController.getOfflineEvents); +router.post('/createevent', eventController.createEvent); + +module.exports = router; \ No newline at end of file