diff --git a/controllers/message.js b/controllers/message.js new file mode 100644 index 0000000..a3ef585 --- /dev/null +++ b/controllers/message.js @@ -0,0 +1,33 @@ +const Message = require('../model/messages'); +const { validateContactUsSchema } = require('../middleware/validators'); + +exports.contactUs = async (req, res) => { + try { + const { error, value } = validateContactUsSchema(req.body); + if (error) return res.status(400).send(error.details); + const { first_name, last_name, email, message, additional_details } = value; + + const newMessage = await Message.create([ + { + first_name: first_name, + last_name: last_name, + email: email, + message: message, + additional_details: additional_details + } + ]); + + await newMessage[0].save(); + + return res.status(200).json({ + success: true, + message: 'Message sent successfully' + }); + } catch (error) { + return res.status(500).json({ + success: false, + message: 'Unable to send message', + error: error + }); + } +}; diff --git a/middleware/validators.js b/middleware/validators.js index 0e028ab..4dad93b 100644 --- a/middleware/validators.js +++ b/middleware/validators.js @@ -120,6 +120,14 @@ const changePasswordSchema = Joi.object({ ) }); +const contactUsSchema = Joi.object({ + first_name: Joi.string().required(), + last_name: Joi.string().required(), + email: Joi.string().email().required(), + message: Joi.string().required(), + additional_details: Joi.string().optional() +}); + const validateAdminInvite = validator(inviteAdminSchema); const validateAdminLogin = validator(loginAdminSchema); const validateJobStatus = validator(jobStatus); @@ -130,6 +138,7 @@ const validatePasswordSchema = validator(passwordSchema); const validateCreateJob = validator(jobSchema); const validateApplyJobSchema = validator(applyJobSchema); const validateChangePasswordSchema = validator(changePasswordSchema); +const validateContactUsSchema = validator(contactUsSchema); const joiErrorMessage = (error) => { return error.details.map((detail) => { @@ -151,5 +160,6 @@ module.exports = { validatePasswordSchema, validateCreateJob, validateApplyJobSchema, - validateChangePasswordSchema + validateChangePasswordSchema, + validateContactUsSchema }; diff --git a/model/messages.js b/model/messages.js new file mode 100644 index 0000000..4ad8554 --- /dev/null +++ b/model/messages.js @@ -0,0 +1,38 @@ +const mongoose = require('mongoose'); + +const messageSchema = new mongoose.Schema({ + first_name: { + type: String, + required: [true, 'Please enter your First name'], + trim: true + }, + + last_name: { + type: String, + required: [true, 'Please enter your Last name'], + trim: true + }, + email: { + type: String, + required: [true, 'Please enter Email address'], + trim: true, + unique: true, + lowercase: true, + match: [ + /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/, + 'Please enter a valid Email address' + ] + }, + message: { + type: String, + required: true + }, + additional_details: { + type: String, + required: false + } +}); + +const Message = mongoose.model('Message', messageSchema); + +module.exports = Message; diff --git a/routes/message.js b/routes/message.js new file mode 100644 index 0000000..d1c06fb --- /dev/null +++ b/routes/message.js @@ -0,0 +1,8 @@ +const express = require('express'); +const router = express.Router(); + +const { contactUs } = require('../controllers/message'); + +router.post('/', contactUs); + +module.exports = router; diff --git a/server.js b/server.js index 0ee4b20..81df1ff 100644 --- a/server.js +++ b/server.js @@ -23,6 +23,7 @@ const adminRouter = require('./routes/admin'); const usersRouter = require('./routes/users'); const reportRouter = require('./routes/report'); const xjobRouter = require('./routes/xjobs'); +const messageRouter = require('./routes/message'); const himalayas = require('./jobsfeed/himalayas'); const empllo = require('./jobsfeed/empllo'); @@ -61,6 +62,7 @@ app.use('/api/v1/admins', adminRouter); app.use('/api/v1/users', usersRouter); app.use('/api/v1/reports', reportRouter); app.use('/api/v1/xjobs', xjobRouter); +app.use('/api/v1/contact-us', messageRouter); // server Swagger documentation swaggerDocs(app, PORT); diff --git a/swagger/doc.message.js b/swagger/doc.message.js new file mode 100644 index 0000000..07c4806 --- /dev/null +++ b/swagger/doc.message.js @@ -0,0 +1,79 @@ +/** + * @openapi + * /contact-us: + * post: + * tags: + * - Message + * summary: Contact us + * description: Contact us + * requestBody: + * description: Contact us + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * first_name: + * type: string + * required: true + * last_name: + * type: string + * required: true + * email: + * type: string + * format: email + * required: true + * message: + * type: string + * required: true + * additional_details: + * type: string + * required: false + * responses: + * 200: + * description: Message sent successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * success: + * type: boolean + * example: true + * message: + * type: string + * example: Message sent successfully + * 400: + * description: Bad request + * content: + * application/json: + * schema: + * type: object + * properties: + * success: + * type: boolean + * example: false + * message: + * type: string + * example: Please enter a valid Email address + * error: + * type: object + * example: { details: [{ message: "Please enter a valid Email address", path: ["email"], type: "string.email" }] } + * 500: + * description: Internal Server Error + * content: + * application/json: + * schema: + * type: object + * properties: + * success: + * type: boolean + * example: false + * message: + * type: string + * example: Unable to send message + * error: + * type: object + * example: { message: "Unable to send message" } + */