diff --git a/Backend/Middleware/multer.js b/Backend/Middleware/multer.js index c9a5593813389d95ead76f1cfd160a75dc802bba..fd71c5ccb6232ebff55ac1e738e522e0e6e7459a 100644 --- a/Backend/Middleware/multer.js +++ b/Backend/Middleware/multer.js @@ -2,7 +2,7 @@ const multer = require('multer') const storage = multer.diskStorage({ destination: function (req, file, cb) { - cb(null, 'uploads') + cb(null, '/uploads') }, filename: function (req, file, cb) { diff --git a/Backend/Middleware/validator.js b/Backend/Middleware/validator.js index 263f3a03c3461d9eff0d8d0b43ddc150ea2f8cfa..d65a15b98f7de0ddef4ff9b06dcd7003449941a9 100644 --- a/Backend/Middleware/validator.js +++ b/Backend/Middleware/validator.js @@ -18,8 +18,7 @@ exports.eventValidator = [ body('startTime').isLength({min: 5}).withMessage("Event date must be 5 characters long"), body('endTime').not().isEmpty().trim().withMessage("End time is required"), body('ticketPrice').not().isEmpty().trim().withMessage("Ticket price is required"), - body('ticketQty').isEmail().normalizeEmail().withMessage("Ticket quantity is required"), - body('eventImage').not().isEmpty().trim().withMessage("Image is required"), + body('ticketQty').not().isEmpty().trim().withMessage("Ticket quantity is required"), body('eventDescription').isLength({min: 6}).withMessage("Description is required"), ] @@ -28,6 +27,10 @@ exports.signinValidator = [ body('password').isLength({min: 6}).withMessage("Password must be at least 6 characters long"), ] +exports.imageValidator = [ + body('eventImage').not().isEmpty().trim().withMessage("Image is required"), +] + exports.validatorResult = (req, res, next) => { const result = validationResult(req); const hasErrors = !result.isEmpty(); diff --git a/Backend/controllers/eventControllers.js b/Backend/controllers/eventControllers.js index 87d43ec517e1de7d4307d8eacf6fdce58703b957..2315e532acd6214b8adca6f2c3b71b47cb42fa80 100644 --- a/Backend/controllers/eventControllers.js +++ b/Backend/controllers/eventControllers.js @@ -1,19 +1,67 @@ import mongoose from 'mongoose'; -import { EventSchema } from '../models/eventModel'; +import Event from '../models/eventModel'; +import Image from "../models/userModel"; -// Creating event object -const Event = mongoose.model('Event', EventSchema); +// export vs module exports (which works) - fix refactor later +exports.eventController = async (req, res) => { + console.log("inside controller", req.body); + + try{ + // Destructuring sign up post request body into seperate variables for ref + const { + eventTitle, + organiser, + venueName, + venueAddress, + eventGenre, + startDate, + endDate, + startTime, + endTime, + ticketPrice, + ticketQty, + eventImage, + eventDescription, + errorMsg + } = req.body; -exports.addNewEvent = async (req, res) => { + // Creating new instance of user from model + // const newImage = new Image(); + // newImage.image = eventImage; - console.log("req", req) - console.log("server request body:", req.body) - console.log("server request file:", req.file) - console.log("server request user:", req.user) + const newEvent = new Event(); + newEvent.eventTitle = eventTitle; + newEvent.organiser = organiser; + newEvent.venueName = venueName; + newEvent.venueAddress = venueAddress; + newEvent.eventGenre = eventGenre; + newEvent.startDate = startDate; + newEvent.endDate = endDate; + newEvent.startTime = startTime; + newEvent.endTime = endTime; + newEvent.ticketPrice = ticketPrice; + newEvent.ticketQty = ticketQty; + newEvent.eventImageId = "newImage"; + newEvent.eventDescription = eventDescription; - res.json({ - message: "Inside create event fucntion in controller" - }) + console.log("req", req) + console.log("server request body:", req.body) + console.log("server request file:", req.file) + console.log("server request user:", req.user) + + res.json({ + message: "Inside create event fucntion in controller" + }) + // await newImage.save(); + await newEvent.save(); + } catch (err){ + console.log("event controller error:", err) + + res.status(500).json({ + errorMessage: "Server error" + }) + } + // let newEvent = new Event(req.body); diff --git a/Backend/controllers/imageControllers.js b/Backend/controllers/imageControllers.js new file mode 100644 index 0000000000000000000000000000000000000000..5b026294f1c04aef06883ceab168d071497f67fa --- /dev/null +++ b/Backend/controllers/imageControllers.js @@ -0,0 +1,88 @@ +import mongoose from 'mongoose'; +import Event from '../models/eventModel'; +import Image from "../models/userModel"; + +// export vs module exports (which works) - fix refactor later +exports.imageController = async (req, res) => { + console.log("inside controller", req.body); + + try{ + // Destructuring sign up post request body into seperate variables for ref + const { + eventTitle, + organiser, + venueName, + venueAddress, + eventGenre, + startDate, + endDate, + startTime, + endTime, + ticketPrice, + ticketQty, + eventImage, + eventDescription, + errorMsg + } = req.body; + + // Creating new instance of user from model + // const newImage = new Image(); + // newImage.image = eventImage; + + const newEvent = new Event(); + newEvent.eventTitle = eventTitle; + newEvent.organiser = organiser; + newEvent.venueName = venueName; + newEvent.venueAddress = venueAddress; + newEvent.eventGenre = eventGenre; + newEvent.startDate = startDate; + newEvent.endDate = endDate; + newEvent.startTime = startTime; + newEvent.endTime = endTime; + newEvent.ticketPrice = ticketPrice; + newEvent.ticketQty = ticketQty; + newEvent.eventImageId = "newImage"; + newEvent.eventDescription = eventDescription; + + console.log("req", req) + console.log("server request body:", req.body) + console.log("server request file:", req.file) + console.log("server request user:", req.user) + + res.json({ + message: "Inside create event fucntion in controller" + }) + // await newImage.save(); + await newEvent.save(); + } catch (err){ + console.log("event controller error:", err) + + res.status(500).json({ + errorMessage: "Server error" + }) + } + + + + // let newEvent = new Event(req.body); + // newEvent.save((err, Event) => { + // if (err) { + // res.send(err); + // } + // res.json(Event) + // }); +}; + +export const getEvents = (req, res) => { + Event.find({}, (err, Event) => { + if (err) { + res.send(err); + } + res.json(Event) + }); +}; + + + + + diff --git a/Backend/index.js b/Backend/index.js index d70a9ac9100a41c582ebdc652a55bc6935246fb7..aac441846bbaf9d6020c3f17eaabfef2a65cf755 100644 --- a/Backend/index.js +++ b/Backend/index.js @@ -10,6 +10,10 @@ const app = express(); const PORT = 4000; var bodyParser = require('body-parser') +//Multer +const multer = require('multer'); +const upload = multer({dest: 'uploads/'}); + // MongoDB connection mongoose.Promise = global.Promise; mongoose.connect('mongodb://localhost/TickcryptDB', { @@ -42,9 +46,27 @@ authRoutes(app) app.get('/', (req, res) => res.send(`Tickcrypt app is running on ${PORT}`) - ); +app.post('/image', upload.single('file'), (req, res) => { + if (!req.file) { + console.log("No file received"); + + //Get file name to save to db + const host = req.host; + const filePath = req.protocol + "://" + host + '/' + req.file.path; + return res.send({ + success: false + }); + + } else { + console.log('file received'); + return res.send({ + success: true + }) + } + }); + app.listen(PORT, () => console.log(`Your app server is running on port ${PORT}`) ); diff --git a/Backend/models/eventModel.js b/Backend/models/eventModel.js index 2efdff7b98a873272c664c52ec98448e0168f081..407548e4b6003c253ac70bec377a1d4712f0bf88 100644 --- a/Backend/models/eventModel.js +++ b/Backend/models/eventModel.js @@ -51,6 +51,10 @@ export const EventSchema = new Schema({ type: String, // required: true }, + eventImageId: { + type: String, + required: true + }, eventDescription: { type: String, required: true @@ -61,3 +65,7 @@ export const EventSchema = new Schema({ } }) + +const Event = mongoose.model('Event', EventSchema); + +module.exports = Event \ No newline at end of file diff --git a/Backend/models/imageModel.js b/Backend/models/imageModel.js new file mode 100644 index 0000000000000000000000000000000000000000..ed3d021ede19e604d06611c41098923078d42c91 --- /dev/null +++ b/Backend/models/imageModel.js @@ -0,0 +1,15 @@ +import mongoose from 'mongoose'; + +const Schema = mongoose.Schema + +export const ImageSchema = new Schema({ + img: + { + data: Buffer, + contentType: String + } +}) + +const Image = mongoose.model('Image', ImageSchema); + +module.exports = Image \ No newline at end of file diff --git a/Backend/package-lock.json b/Backend/package-lock.json index ac64276cb0e1197d6b2158bbf7fb66ba0f639a0f..5ca64dc2b8b812ffa763674dc03932578c41fdeb 100644 --- a/Backend/package-lock.json +++ b/Backend/package-lock.json @@ -18,6 +18,7 @@ "express-validator": "^6.14.0", "jsonwebtoken": "^8.5.1", "mongoose": "^6.0.13", + "multer": "^1.4.4", "nodemon": "^2.0.15" }, "devDependencies": { @@ -124,6 +125,11 @@ "node": ">= 8" } }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, "node_modules/arr-diff": { "version": "4.0.0", "dev": true, @@ -1676,6 +1682,39 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "dependencies": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/busboy/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/busboy/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -1972,6 +2011,20 @@ "version": "0.0.1", "license": "MIT" }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -2059,9 +2112,7 @@ }, "node_modules/core-util-is": { "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", @@ -2240,6 +2291,34 @@ "node": ">=0.10.0" } }, + "node_modules/dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "dependencies": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/dicer/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/dicer/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -2947,7 +3026,6 @@ }, "node_modules/inherits": { "version": "2.0.4", - "dev": true, "license": "ISC" }, "node_modules/ini": { @@ -3247,9 +3325,7 @@ }, "node_modules/isarray": { "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/isobject": { "version": "3.0.1", @@ -3576,7 +3652,6 @@ }, "node_modules/mkdirp": { "version": "0.5.5", - "dev": true, "license": "MIT", "dependencies": { "minimist": "^1.2.5" @@ -3710,6 +3785,24 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "node_modules/multer": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", + "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/nan": { "version": "2.14.2", "dev": true, @@ -4127,9 +4220,7 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", - "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -4262,9 +4353,7 @@ }, "node_modules/readable-stream": { "version": "2.3.7", - "dev": true, "license": "MIT", - "optional": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4277,9 +4366,7 @@ }, "node_modules/readable-stream/node_modules/string_decoder": { "version": "1.1.1", - "dev": true, "license": "MIT", - "optional": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -4797,6 +4884,19 @@ "node": ">= 0.6" } }, + "node_modules/streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4988,6 +5088,11 @@ "node": ">= 0.6" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -5164,9 +5269,7 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -5274,6 +5377,14 @@ "node": ">=8" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -5357,6 +5468,11 @@ "picomatch": "^2.0.4" } }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, "arr-diff": { "version": "4.0.0", "dev": true, @@ -6740,6 +6856,38 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -6955,6 +7103,17 @@ "concat-map": { "version": "0.0.1" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "configstore": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -7020,9 +7179,7 @@ "optional": true }, "core-util-is": { - "version": "1.0.2", - "dev": true, - "optional": true + "version": "1.0.2" }, "cors": { "version": "2.8.5", @@ -7154,6 +7311,33 @@ "repeating": "^2.0.0" } }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -7682,8 +7866,7 @@ } }, "inherits": { - "version": "2.0.4", - "dev": true + "version": "2.0.4" }, "ini": { "version": "2.0.0", @@ -7888,9 +8071,7 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, "isarray": { - "version": "1.0.0", - "dev": true, - "optional": true + "version": "1.0.0" }, "isobject": { "version": "3.0.1", @@ -8145,7 +8326,6 @@ }, "mkdirp": { "version": "0.5.5", - "dev": true, "requires": { "minimist": "^1.2.5" } @@ -8249,6 +8429,21 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multer": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz", + "integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, "nan": { "version": "2.14.2", "dev": true, @@ -8546,9 +8741,7 @@ "dev": true }, "process-nextick-args": { - "version": "2.0.1", - "dev": true, - "optional": true + "version": "2.0.1" }, "proxy-addr": { "version": "2.0.7", @@ -8655,8 +8848,6 @@ }, "readable-stream": { "version": "2.3.7", - "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8669,8 +8860,6 @@ "dependencies": { "string_decoder": { "version": "1.1.1", - "dev": true, - "optional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -9075,6 +9264,16 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -9208,6 +9407,11 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -9337,9 +9541,7 @@ "dev": true }, "util-deprecate": { - "version": "1.0.2", - "dev": true, - "optional": true + "version": "1.0.2" }, "utils-merge": { "version": "1.0.1", @@ -9416,6 +9618,11 @@ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/Backend/package.json b/Backend/package.json index 21765661af3c98912bf6fda1ddfe5286395dd349..af6d1d7489d0558717d20268305d54dae26e1d9c 100644 --- a/Backend/package.json +++ b/Backend/package.json @@ -24,6 +24,7 @@ "express-validator": "^6.14.0", "jsonwebtoken": "^8.5.1", "mongoose": "^6.0.13", + "multer": "^1.4.4", "nodemon": "^2.0.15" } } diff --git a/Backend/routes/eventRoutes.js b/Backend/routes/eventRoutes.js index f7c30a672beec2a5078ca80011777c452460dc86..17936472f5c3dad0799a776a7e69a5d1291286a5 100644 --- a/Backend/routes/eventRoutes.js +++ b/Backend/routes/eventRoutes.js @@ -1,5 +1,5 @@ // Import controllers to connect to routes so the req can call the controller function based on the URL route -import {addNewEvent, getEvents} from "../controllers/eventControllers" +import {eventController, getEvents} from "../controllers/eventControllers" import {authenticateJWT} from "../middleware/authenticator" import {upload} from "../middleware/multer" import {eventValidator, validatorResult} from "../middleware/validator"; @@ -8,7 +8,7 @@ import {eventValidator, validatorResult} from "../middleware/validator"; const eventRoutes = (app) => { app.route('/api/event') - .post(eventValidator, validatorResult, addNewEvent) + .post(eventValidator, validatorResult, eventController) .get(getEvents) }; diff --git a/Backend/routes/imageRoutes.js b/Backend/routes/imageRoutes.js new file mode 100644 index 0000000000000000000000000000000000000000..9d4b78d80563db719cedf5a2e96a6c4b58d09c00 --- /dev/null +++ b/Backend/routes/imageRoutes.js @@ -0,0 +1,15 @@ +// Import controllers to connect to routes so the req can call the controller function based on the URL route +import {eventController, getEvents} from "../controllers/eventControllers" +import {authenticateJWT} from "../middleware/authenticator" +import {upload} from "../middleware/multer" +import {imageValidator, validatorResult} from "../middleware/validator"; + +// upload.single("eventImage") + +const imageRoutes = (app) => { + app.route('/api/event') + .post(imageValidator, validatorResult, eventController) + +}; + +export default eventRoutes; \ No newline at end of file diff --git a/frontend/src/Components/CreateEventForm.js b/frontend/src/Components/CreateEventForm.js index 67056b5be32d99c8dfea40289b33a16c73c939ef..be00829adc25acb595e6fd648e1980b06edc8658 100644 --- a/frontend/src/Components/CreateEventForm.js +++ b/frontend/src/Components/CreateEventForm.js @@ -2,6 +2,7 @@ import React, { useState } from "react"; import errorAlert from "../Helpers/errorAlert"; import isEmpty from 'validator/lib/isEmpty'; import {createEvent} from '../api/event'; +import {createImage} from '../api/images'; const CreateEventForm = () => { @@ -72,31 +73,33 @@ const CreateEventForm = () => { }) } else { - const formData = {eventTitle, organiser, venueName, venueAddress, eventGenre, startDate, endDate, startTime, endTime, ticketPrice, ticketQty, eventImage, eventDescription } + const formData = {eventTitle, organiser, venueName, venueAddress, eventGenre, startDate, endDate, startTime, endTime, ticketPrice, ticketQty, eventDescription } // for (var pair of formData.entries()) { // console.log("axios got it", pair[0]+ ', ' + pair[1]); // } - console.log(formData) - createEvent(formData) - .then(response => { - console.log("Server response", response) - }) - .catch((err) => { - console.log("error", err) - setEventData({ - ...eventData, - errorMsg: err.response.data.errorMessage + console.log("FD: ", formData) + createImage({eventImage}) + .then((reponse) => { + createEvent(formData) + .then((inner_response) => { + console.log("Server response", inner_response) }) + .catch((err) => { + console.log("error", err) + setEventData({ + ...eventData, + errorMsg: err.response.data.errorMessage + }) + }) }) - } } return ( - <form onSubmit={handleEventSubmit} encType="multipart/form-data"> + <form onSubmit={handleEventSubmit} encType="multipart/form-data" noValidate> <div className="mt-16 mx-20"> <div className="px-2"> <div className="flex -mx-2"> diff --git a/frontend/src/api/event.js b/frontend/src/api/event.js index 2d5a4eeeea9b705cea8fa241f663777c6ef2dbe0..2ed927b39e13c9d4c61bb5d9e095ed35c29e2160 100644 --- a/frontend/src/api/event.js +++ b/frontend/src/api/event.js @@ -4,8 +4,7 @@ export const createEvent = async (formData) => { const config = { headers: { - 'Content-Type': 'multipart/form-data', - 'Accept': 'application/json' + 'Content-Type': 'application/json' } } console.log("FORM DATA", formData) diff --git a/frontend/src/api/images.js b/frontend/src/api/images.js new file mode 100644 index 0000000000000000000000000000000000000000..f474a9a2b48ad11b1fe0a1818d73aee19571c0b4 --- /dev/null +++ b/frontend/src/api/images.js @@ -0,0 +1,27 @@ +import axios from 'axios' + +export const createImage = async (data) => { + + const config = { + headers: { + 'Content-Type': 'application/json' + } + } + + const response = await axios.post('/images', data, config) + + return response +}; + +export const signIn = async (data) => { + + const config = { + headers: { + 'Content-Type': 'application/json' + } + } + + const response = await axios.post('/api/auth/signin', data, config) + + return response +};