diff --git a/src/controllers/mapLocationsController.js b/src/controllers/mapLocationsController.js new file mode 100644 index 000000000..29af9e3d6 --- /dev/null +++ b/src/controllers/mapLocationsController.js @@ -0,0 +1,140 @@ +const UserProfile = require('../models/userProfile'); +const cache = require('../utilities/nodeCache')(); + + +const mapLocationsController = function (MapLocation) { + const getAllLocations = async function (req, res) { + + try { + const users = []; + const results = await UserProfile.find({}, + '_id firstName lastName isActive location jobTitle totalTangibleHrs hoursByCategory' + ); + + results.forEach((item) => { + if ( + (item.location?.coords.lat && item.location?.coords.lng && item.totalTangibleHrs >= 10) || + (item.location?.coords.lat && item.location?.coords.lng && calculateTotalHours(item.hoursByCategory) >= 10) + ) { + users.push(item); + } + }); + const modifiedUsers = users.map(item => ({ + location: item.location, + isActive: item.isActive, + jobTitle: item.jobTitle[0], + _id: item._id, + firstName: item.firstName, + lastName: item.lastName + })); + + const mUsers = await MapLocation.find({}); + res.status(200).send({ users: modifiedUsers, mUsers }); + } catch (err) { + res.status(404).send(err); + } + + }; + const deleteLocation = async function (req, res) { + + if (!req.body.requestor.role === 'Administrator' || !req.body.requestor.role === 'Owner') { + res.status(403).send('You are not authorized to make changes in the teams.'); + return; + } + const locationId = req.params.locationId + + MapLocation.findOneAndDelete({ _id: locationId }) + .then(() => res.status(200).send({ message: "The location was successfully removed!" })) + .catch(error => res.status(500).send({ message: error || "Couldn't remove the location" })); + }; + const putUserLocation = async function (req, res) { + + if (!req.body.requestor.role === 'Owner') { + res.status(403).send('You are not authorized to make changes in the teams.'); + return; + } + const locationData = { + firstName: req.body.firstName, + lastName: req.body.lastName, + jobTitle: req.body.jobTitle, + location: req.body.location, + } + const location = new MapLocation(locationData); + + try { + const response = await location.save() + if (!response) { + throw new Error('Something went wrong during saving the location...') + } + res.status(200).send(response); + } catch (err) { + console.log(err.message) + res.status(500).json({ message: err.message || 'Something went wrong...' }); + } + }; + const updateUserLocation = async function (req, res) { + if (!req.body.requestor.role === 'Owner') { + res.status(403).send('You are not authorized to make changes in the teams.'); + return; + } + const userType = req.body.type; + const userId = req.body._id; + const updateData = { + firstName: req.body.firstName, + lastName: req.body.lastName, + jobTitle: req.body.jobTitle, + location: req.body.location, + } + + if (req.body.timeZone) { + updateData.timeZone = req.body.timeZone + } + + try { + let response; + if (userType === 'user') { + response = await UserProfile.findOneAndUpdate({ _id: userId }, { $set: { ...updateData, jobTitle: [updateData.jobTitle] } }, { new: true }); + cache.removeCache('allusers') + cache.removeCache(`user-${userId}`); + + cache.setCache(`user-${userId}`, JSON.stringify(response)); + } else { + response = await MapLocation.findOneAndUpdate({ _id: userId }, { $set: updateData }, { new: true }) + } + + if (!response) { + throw new Error('Something went wrong during saving the location...') + } + const newData = { + firstName: response.firstName, + lastName: response.lastName, + jobTitle: response.jobTitle, + location: response.location, + _id: response._id, + type: userType + } + + res.status(200).send(newData); + } catch (err) { + console.log(err.message) + res.status(500).json({ message: err.message || 'Something went wrong...' }); + } + }; + + function calculateTotalHours(hoursByCategory) { + let hours = 0; + Object.keys(hoursByCategory).forEach((x) => { + hours += hoursByCategory[x]; + }); + return hours; + } + + return { + getAllLocations, + deleteLocation, + putUserLocation, + updateUserLocation + }; +}; + +module.exports = mapLocationsController; diff --git a/src/controllers/profileInitialSetupController.js b/src/controllers/profileInitialSetupController.js index 3e51e5578..2e64b5e98 100644 --- a/src/controllers/profileInitialSetupController.js +++ b/src/controllers/profileInitialSetupController.js @@ -67,7 +67,7 @@ function informManagerMessage(user) { Location: - ${user.location} + ${user.location.userProvided}, ${user.location.country}
diff --git a/src/models/mapLocation.js b/src/models/mapLocation.js new file mode 100644 index 000000000..851587dc3 --- /dev/null +++ b/src/models/mapLocation.js @@ -0,0 +1,43 @@ +const mongoose = require('mongoose'); + +const { Schema } = mongoose; + +const mapLocation = new Schema({ + title: { + type: String, + default: 'Prior to HGN Data Collection' + }, + firstName: String, + lastName: String, + jobTitle: String, + isActive: { + type: Boolean, + default: false, + }, + location: { + userProvided: { + type: String, + required: true, + }, + coords: { + lat: { + type: String, + required: true, + }, + lng: { + type: String, + required: true, + } + }, + country: { + type: String, + required: true, + }, + city: { + type: String, + default: '', + }, + }, +}); + +module.exports = mongoose.model('MapLocation', mapLocation, 'maplocations'); diff --git a/src/models/userProfile.js b/src/models/userProfile.js index 3219fec18..e3f8d4a48 100644 --- a/src/models/userProfile.js +++ b/src/models/userProfile.js @@ -81,7 +81,16 @@ const userProfileSchema = new Schema({ infringements: [ { date: { type: String, required: true }, description: { type: String, required: true } }, ], - location: { type: String, default: '' }, + location: { + userProvided: { type: String, default: '' }, + coords: { + lat: { type: Number, default: '' }, + lng: { type: Number, default: '' }, + }, + country: { type: String, default: '' }, + city: { type: String, default: '' } + + }, oldInfringements: [ { date: { type: String, required: true }, description: { type: String, required: true } }, ], @@ -168,9 +177,9 @@ const userProfileSchema = new Schema({ }, infoCollections: [ { - areaName: { type: String }, + areaName: { type: String }, areaContent: { type: String }, - }], + }], }); userProfileSchema.pre('save', function (next) { diff --git a/src/routes/mapLocationsRouter.js b/src/routes/mapLocationsRouter.js new file mode 100644 index 000000000..db004ff18 --- /dev/null +++ b/src/routes/mapLocationsRouter.js @@ -0,0 +1,19 @@ +const express = require('express'); + +const router = function (mapLocations) { + const controller = require('../controllers/mapLocationsController')(mapLocations); + + const mapRouter = express.Router(); + + mapRouter.route('/mapLocations') + .get(controller.getAllLocations) + .put(controller.putUserLocation) + .patch(controller.updateUserLocation); + + mapRouter.route('/mapLocations/:locationId') + .delete(controller.deleteLocation) + + return mapRouter; +}; + +module.exports = router; diff --git a/src/startup/routes.js b/src/startup/routes.js index 799b854fe..c7a7393c9 100644 --- a/src/startup/routes.js +++ b/src/startup/routes.js @@ -21,6 +21,7 @@ const profileInitialSetuptoken = require('../models/profileInitialSetupToken'); const reason = require('../models/reason'); const mouseoverText = require('../models/mouseoverText'); const inventoryItemMaterial = require('../models/inventoryItemMaterial'); +const mapLocations = require('../models/mapLocation'); const buildingProject = require('../models/bmdashboard/buildingProject'); @@ -58,6 +59,8 @@ const ownerStandardMessageRouter = require('../routes/ownerStandardMessageRouter const reasonRouter = require('../routes/reasonRouter')(reason, userProfile); const mouseoverTextRouter = require('../routes/mouseoverTextRouter')(mouseoverText); +const mapLocationRouter = require('../routes/mapLocationsRouter')(mapLocations); + // bm dashboard const bmLoginRouter = require('../routes/bmdashboard/bmLoginRouter')(); const bmMaterialsRouter = require('../routes/bmdashboard/bmMaterialsRouter')(inventoryItemMaterial); @@ -93,6 +96,7 @@ module.exports = function (app) { app.use('/api', informationRouter); app.use('/api', mouseoverTextRouter); app.use('/api', isEmailExistsRouter); + app.use('/api', mapLocationRouter); // bm dashboard app.use('/api/bm', bmLoginRouter); app.use('/api/bm', bmMaterialsRouter);