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.use(middleware);
|
||||||
|
|
||||||
router.get('/home', async (req, res) => {
|
router.get('/home', async (req, res) => {
|
||||||
res.render('home', { user: req.user });
|
res.render('home', { user: req.session.user });
|
||||||
return res.status(status.Ok);
|
return res.status(status.Ok);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get('/assets', (req, res) => {
|
router.get('/assets', async (req, res) => {
|
||||||
let assets = [
|
let userAssets = await assets.find({ "ownerId": req.session.user._id }).toArray();
|
||||||
{
|
res.render('assets', { user: req.session.user, assets: userAssets });
|
||||||
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 });
|
|
||||||
return res.status(status.Ok);
|
return res.status(status.Ok);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get('/plans', (req, res) => {
|
router.get('/plans', (req, res) => {
|
||||||
res.render('plans', { user: req.user });
|
res.render('plans', { user: req.session.user });
|
||||||
return res.status(status.Ok);
|
return res.status(status.Ok);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get('/more', (req, res) => {
|
router.get('/more', (req, res) => {
|
||||||
res.render('more', { user: req.user });
|
res.render('more', { user: req.session.user });
|
||||||
return res.status(status.Ok);
|
return res.status(status.Ok);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get('/profile', (req, res) => {
|
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);
|
return res.status(status.Ok);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get('/settings', (req, res) => {
|
router.get('/settings', (req, res) => {
|
||||||
res.render('settings', { user: req.user });
|
res.render('settings', { user: req.session.user });
|
||||||
return res.status(status.Ok);
|
return res.status(status.Ok);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get('/questionnaire', (req, res) => {
|
router.get('/questionnaire', (req, res) => {
|
||||||
const errMessage = req.session.errMessage;
|
const errMessage = req.session.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) => {
|
router.post('/questionnaire', (req, res) => {
|
||||||
@@ -145,7 +132,6 @@ module.exports = (middleware, users, assets) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let update = {
|
let update = {
|
||||||
// email: req.body.email,
|
|
||||||
name: req.body.name,
|
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;
|
return router;
|
||||||
};
|
};
|
||||||
@@ -33,12 +33,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Create other asset form -->
|
<!-- 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="<%= user._id %>" name="ownerId" type="text">
|
||||||
<input style="display: none;" value="other" name="assetType" 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>
|
<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>
|
<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">
|
<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>
|
</form>
|
||||||
|
|
||||||
<!-- Create savings asset 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="<%= 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>
|
<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>
|
<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">
|
<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>
|
</form>
|
||||||
|
|
||||||
<!-- Create stock asset 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="<%= user._id %>" name="ownerId" type="text">
|
||||||
<input style="display: none;" value="stock" name="assetType" type="text">
|
<input style="display: none;" value="stock" name="assetType" type="text">
|
||||||
|
|
||||||
|
<label for="ticker" class="block text-sm font-medium text-gray-700 mt-2">Stock Ticker</label>
|
||||||
<label for="stockTicker" 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">
|
||||||
<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="price" class="block text-sm font-medium text-gray-700 mt-2">Price per Share</label>
|
<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">
|
<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