update/save asset to database
This commit is contained in:
2 files changed
+91
-32
No files matched your search
+83
-23
@@ -15,53 +15,40 @@ module.exports = (middleware, users, assets) => {
|
||||
router.use(middleware);
|
||||
|
||||
router.get('/home', async (req, res) => {
|
||||
res.render('home', { user: req.user });
|
||||
res.render('home', { user: req.session.user });
|
||||
return res.status(status.Ok);
|
||||
});
|
||||
|
||||
router.get('/assets', (req, res) => {
|
||||
let assets = [
|
||||
{
|
||||
name: "hello my name is braeden! abc!",
|
||||
value: 1123.50,
|
||||
},
|
||||
{
|
||||
name: "asset 2",
|
||||
value: 321.05,
|
||||
},
|
||||
{
|
||||
name: "asset 3",
|
||||
value: 666,
|
||||
},
|
||||
];
|
||||
res.render('assets', { user: req.user, assets: assets });
|
||||
router.get('/assets', async (req, res) => {
|
||||
let userAssets = await assets.find({ "ownerId": req.session.user._id }).toArray();
|
||||
res.render('assets', { user: req.session.user, assets: userAssets });
|
||||
return res.status(status.Ok);
|
||||
});
|
||||
|
||||
router.get('/plans', (req, res) => {
|
||||
res.render('plans', { user: req.user });
|
||||
res.render('plans', { user: req.session.user });
|
||||
return res.status(status.Ok);
|
||||
});
|
||||
|
||||
router.get('/more', (req, res) => {
|
||||
res.render('more', { user: req.user });
|
||||
res.render('more', { user: req.session.user });
|
||||
return res.status(status.Ok);
|
||||
});
|
||||
|
||||
router.get('/profile', (req, res) => {
|
||||
res.render('profile', { user: req.user, errMessage: req.session.errMessage });
|
||||
res.render('profile', { user: req.session.user, errMessage: req.session.errMessage });
|
||||
return res.status(status.Ok);
|
||||
});
|
||||
|
||||
router.get('/settings', (req, res) => {
|
||||
res.render('settings', { user: req.user });
|
||||
res.render('settings', { user: req.session.user });
|
||||
return res.status(status.Ok);
|
||||
});
|
||||
|
||||
router.get('/questionnaire', (req, res) => {
|
||||
const errMessage = req.session.errMessage;
|
||||
req.session.errMessage = "";
|
||||
res.render('questionnaire', { user: req.user, errMessage: errMessage });
|
||||
res.render('questionnaire', { user: req.session.user, errMessage: errMessage });
|
||||
});
|
||||
|
||||
router.post('/questionnaire', (req, res) => {
|
||||
@@ -145,7 +132,6 @@ module.exports = (middleware, users, assets) => {
|
||||
}
|
||||
|
||||
let update = {
|
||||
// email: req.body.email,
|
||||
name: req.body.name,
|
||||
};
|
||||
|
||||
@@ -181,5 +167,79 @@ module.exports = (middleware, users, assets) => {
|
||||
});
|
||||
});
|
||||
|
||||
router.post("/createAsset", async (req, res) => {
|
||||
// Create asset, each asset has different data structure based on type
|
||||
const type = req.body.assetType;
|
||||
let assetSchema;
|
||||
|
||||
switch (type) {
|
||||
case "other":
|
||||
assetSchema = joi.object({
|
||||
ownerId: joi.string().alphanum().required(),
|
||||
type: joi.string().valid("other", "stock", "saving").required(),
|
||||
name: joi.string().alphanum().min(3).max(30).required(),
|
||||
value: joi.number().min(0).required(),
|
||||
purchaseDate: joi.date().required(),
|
||||
description: joi.string().alphanum().max(240),
|
||||
});
|
||||
break;
|
||||
case "saving":
|
||||
assetSchema = joi.object({
|
||||
ownerId: joi.string().alphanum().required(),
|
||||
type: joi.string().valid("other", "stock", "saving").required(),
|
||||
name: joi.string().alphanum().min(3).max(30).required(),
|
||||
value: joi.number().min(0).required(),
|
||||
});
|
||||
break;
|
||||
case "stock":
|
||||
assetSchema = joi.object({
|
||||
ownerId: joi.string().alphanum().required(),
|
||||
type: joi.string().valid("other", "stock", "saving").required(),
|
||||
ticker: joi.string().alphanum().min(3).max(5).required(),
|
||||
price: joi.number().min(0).required(),
|
||||
quantity: joi.number().min(1).required(),
|
||||
purchaseDate: joi.date().required(),
|
||||
});
|
||||
break;
|
||||
default:
|
||||
console.error("Modified asset type, rejected");
|
||||
req.session.errMessage = "Invalid input";
|
||||
return res.status(status.BadRequest).redirect("/assets");
|
||||
};
|
||||
|
||||
const valid = assetSchema.validate(req.body);
|
||||
|
||||
if (valid.err) {
|
||||
req.session.errMessage = "Invalid input",
|
||||
res.status(status.BadRequest);
|
||||
return res.redirect("/assets");
|
||||
}
|
||||
|
||||
let newAsset = {
|
||||
...req.body,
|
||||
updatedAt: new Date(),
|
||||
};
|
||||
|
||||
if (type == "stock") {
|
||||
newAsset.quantity = parseInt(newAsset.quantity);
|
||||
newAsset.price = parseFloat(newAsset.price)
|
||||
newAsset.value = newAsset.quantity * newAsset.price;
|
||||
newAsset.name = `${newAsset.ticker} Stock`;
|
||||
}
|
||||
newAsset.value = parseFloat(newAsset.value);
|
||||
newAsset.type = type;
|
||||
|
||||
assets.insertOne(newAsset, (err, result) => {
|
||||
if (err) {
|
||||
console.error("Error creating asset: ", err);
|
||||
req.session.errMessage = "Internal server error";
|
||||
return res.status(status.InternalServerError).redirect("/assets");
|
||||
}
|
||||
});
|
||||
|
||||
req.session.errMessage = "";
|
||||
return res.status(status.Ok).redirect("/assets");
|
||||
});
|
||||
|
||||
return router;
|
||||
};
|
||||
@@ -33,12 +33,12 @@
|
||||
</div>
|
||||
|
||||
<!-- Create other asset form -->
|
||||
<form method="POST" action="createAsset" id="create-other-asset-form">
|
||||
<form method="POST" action="/createAsset" id="create-other-asset-form">
|
||||
<input style="display: none;" value="<%= user._id %>" name="ownerId" type="text">
|
||||
<input style="display: none;" value="other" name="assetType" type="text">
|
||||
|
||||
<label for="name" class="block text-sm font-medium text-gray-700 mt-2">Asset Name</label>
|
||||
<input required id="name" type="text" name="name" maxlength="30" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
|
||||
<input required id="name" type="text" name="name" minlength="3" maxlength="30" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
|
||||
|
||||
<label for="value" class="block text-sm font-medium text-gray-700 mt-2">Asset Value</label>
|
||||
<input required placeholder="CAD" min="0" id="value" type="number" name="value" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
|
||||
@@ -63,12 +63,12 @@
|
||||
</form>
|
||||
|
||||
<!-- Create savings asset form -->
|
||||
<form style="display: none;" method="POST" action="createAsset" id="create-saving-asset-form">
|
||||
<form style="display: none;" method="POST" action="/createAsset" id="create-saving-asset-form">
|
||||
<input style="display: none;" value="<%= user._id %>" name="ownerId" type="text">
|
||||
<input style="display: none;" value="savings" name="assetType" type="text">
|
||||
<input style="display: none;" value="saving" name="assetType" type="text">
|
||||
|
||||
<label for="name" class="block text-sm font-medium text-gray-700 mt-2">Savings Name</label>
|
||||
<input required id="name" type="text" name="name" maxlength="30" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
|
||||
<input required id="name" type="text" name="name" minlength="3" maxlength="30" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
|
||||
|
||||
<label for="value" class="block text-sm font-medium text-gray-700 mt-2">Savings Value</label>
|
||||
<input required placeholder="CAD" min="0" id="value" type="number" name="value" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
|
||||
@@ -87,13 +87,12 @@
|
||||
</form>
|
||||
|
||||
<!-- Create stock asset form -->
|
||||
<form style="display: none;" method="POST" action="createAsset" id="create-stock-asset-form">
|
||||
<form style="display: none;" method="POST" action="/createAsset" id="create-stock-asset-form">
|
||||
<input style="display: none;" value="<%= user._id %>" name="ownerId" type="text">
|
||||
<input style="display: none;" value="stock" name="assetType" type="text">
|
||||
|
||||
|
||||
<label for="stockTicker" class="block text-sm font-medium text-gray-700 mt-2">Stock Ticker</label>
|
||||
<input required id="stockTicker" type="text" name="stockTicker" maxlength="5" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
|
||||
<label for="ticker" class="block text-sm font-medium text-gray-700 mt-2">Stock Ticker</label>
|
||||
<input required id="ticker" type="text" name="ticker" minlength="3" maxlength="5" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
|
||||
|
||||
<label for="price" class="block text-sm font-medium text-gray-700 mt-2">Price per Share</label>
|
||||
<input required placeholder="CAD" min="0" id="price" type="number" name="price" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
|
||||
|
||||
Reference in new issue
Block a user