Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions src/controllers/harvestingController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
const harvestingController = function (HarvestingEvent) {
const postEvent = async (req, res) => {
try {
const { name, related_to, type, expected_date, yield: yieldAmount } = req.body;

if (!name || !related_to || !type || !expected_date) {
return res.status(400).send({
error: 'Name, related_to, type, and expected_date are required.',
});
}

const validModules = ['Garden', 'Orchard', 'Animals'];
if (!validModules.includes(related_to)) {
return res.status(400).send({
error: `Invalid related_to value. Must be one of: ${validModules.join(', ')}`,
});
}

const validTypes = ['garden harvesting', 'orchard harvesting'];
if (!validTypes.includes(type)) {
return res.status(400).send({
error: `Invalid type value. Must be one of: ${validTypes.join(', ')}`,
});
}

const event = new HarvestingEvent({
name,
related_to,
type,
expected_date,
yield: yieldAmount,
});

await event.save();
return res.status(201).send(event);
} catch (err) {
// eslint-disable-next-line no-console
console.error('Error creating harvesting event:', err);
return res.status(500).send({ error: 'Internal Server Error' });
}
};

const getEvents = async (req, res) => {
try {
const { type } = req.query;

const filter = {};
if (type) {
const validTypes = ['garden harvesting', 'orchard harvesting'];
if (!validTypes.includes(type)) {
return res.status(400).send({
error: `Invalid type filter. Must be one of: ${validTypes.join(', ')}`,
});
}
filter.type = type;
}

const events = await HarvestingEvent.find(filter).sort({ expected_date: 1 });

Check failure on line 58 in src/controllers/harvestingController.js

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Change this code to not construct database queries directly from user-controlled data.

See more on https://sonarcloud.io/project/issues?id=OneCommunityGlobal_HGNRest&issues=AZze4cexs2yxA_6AOrOL&open=AZze4cexs2yxA_6AOrOL&pullRequest=2097
return res.status(200).send(events);
} catch (err) {
// eslint-disable-next-line no-console
console.error('Error fetching harvesting events:', err);
return res.status(500).send({ error: 'Internal Server Error' });
}
};

return {
postEvent,
getEvents,
};
};

module.exports = harvestingController;
53 changes: 53 additions & 0 deletions src/controllers/transplantingController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
const transplantingController = function (TransplantingEvent) {
const postEvent = async (req, res) => {
try {
const { name, related_to, date, position_from, position_to } = req.body;

if (!name || !related_to || !date || !position_from || !position_to) {
return res.status(400).send({
error: 'Name, related_to, date, position_from, and position_to are required.',
});
}

const validModules = ['Garden', 'Orchard', 'Animals'];
if (!validModules.includes(related_to)) {
return res.status(400).send({
error: `Invalid related_to value. Must be one of: ${validModules.join(', ')}`,
});
}

const event = new TransplantingEvent({
name,
related_to,
date,
position_from,
position_to,
});

await event.save();
return res.status(201).send(event);
} catch (err) {
// eslint-disable-next-line no-console
console.error('Error creating transplanting event:', err);
return res.status(500).send({ error: 'Internal Server Error' });
}
};

const getEvents = async (req, res) => {
try {
const events = await TransplantingEvent.find().sort({ date: 1 });
return res.status(200).send(events);
} catch (err) {
// eslint-disable-next-line no-console
console.error('Error fetching transplanting events:', err);
return res.status(500).send({ error: 'Internal Server Error' });
}
};

return {
postEvent,
getEvents,
};
};

module.exports = transplantingController;
23 changes: 23 additions & 0 deletions src/models/harvestingEvent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const mongoose = require('mongoose');

const { Schema } = mongoose;

const HarvestingEventSchema = new Schema({
name: { type: String, required: true },
related_to: {
type: String,
enum: ['Garden', 'Orchard', 'Animals'],
required: true,
},
type: {
type: String,
enum: ['garden harvesting', 'orchard harvesting'],
required: true,
},
expected_date: { type: Date, required: true },
yield: { type: Number },
created_at: { type: Date, default: Date.now },
updated_at: { type: Date, default: Date.now },
});

module.exports = mongoose.model('harvestingEvent', HarvestingEventSchema, 'harvestingEvents');
23 changes: 23 additions & 0 deletions src/models/transplantingEvent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const mongoose = require('mongoose');

const { Schema } = mongoose;

const TransplantingEventSchema = new Schema({
name: { type: String, required: true },
related_to: {
type: String,
enum: ['Garden', 'Orchard', 'Animals'],
required: true,
},
date: { type: Date, required: true },
position_from: { type: String, required: true },
position_to: { type: String, required: true },
created_at: { type: Date, default: Date.now },
updated_at: { type: Date, default: Date.now },
});

module.exports = mongoose.model(
'transplantingEvent',
TransplantingEventSchema,
'transplantingEvents',
);
12 changes: 12 additions & 0 deletions src/routes/harvestingRouter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const express = require('express');

const routes = function (HarvestingEvent) {
const controller = require('../controllers/harvestingController')(HarvestingEvent);
const harvestingRouter = express.Router();

harvestingRouter.route('/').get(controller.getEvents).post(controller.postEvent);

return harvestingRouter;
};

module.exports = routes;
12 changes: 12 additions & 0 deletions src/routes/transplantingRouter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const express = require('express');

const routes = function (TransplantingEvent) {
const controller = require('../controllers/transplantingController')(TransplantingEvent);
const transplantingRouter = express.Router();

transplantingRouter.route('/').get(controller.getEvents).post(controller.postEvent);

return transplantingRouter;
};

module.exports = routes;
6 changes: 6 additions & 0 deletions src/startup/routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ const taskNotification = require('../models/taskNotification');
const badge = require('../models/badge');
const inventoryItem = require('../models/inventoryItem');
const inventoryItemType = require('../models/inventoryItemType');
const transplantingEvent = require('../models/transplantingEvent');
const harvestingEvent = require('../models/harvestingEvent');
const role = require('../models/role');
const rolePreset = require('../models/rolePreset');
const ownerMessage = require('../models/ownerMessage');
Expand Down Expand Up @@ -145,6 +147,8 @@ const inventoryRouter = require('../routes/inventoryRouter')(
project,
);
const timeZoneAPIRouter = require('../routes/timeZoneAPIRoutes')();
const transplantingRouter = require('../routes/transplantingRouter')(transplantingEvent);
const harvestingRouter = require('../routes/harvestingRouter')(harvestingEvent);
const profileInitialSetupRouter = require('../routes/profileInitialSetupRouter')(
profileInitialSetuptoken,
userProfile,
Expand Down Expand Up @@ -380,6 +384,8 @@ module.exports = function (app) {
app.use('/api', taskNotificationRouter);
app.use('/api', badgeRouter);
app.use('/api', inventoryRouter);
app.use('/api/kitchenandinventory/transplanting', transplantingRouter);
app.use('/api/kitchenandinventory/harvesting', harvestingRouter);
app.use('/api', timeZoneAPIRouter);
app.use('/api', taskEditSuggestionRouter);
app.use('/api', roleRouter);
Expand Down
Loading