Skip to content

Commit 5e29b8e

Browse files
committed
Added Razorpay payment gateway in this application, user can buy premium membership after sucessfull login and when user will buy the membership user have access to the Premium features of the application eg. Leaderboard page and daily and monthly reports page. so, inshort I added Rajorpay make pages for leaderboard and reports page and make a model of razorpay transection
1 parent 41c21f5 commit 5e29b8e

File tree

16 files changed

+1448
-90
lines changed

16 files changed

+1448
-90
lines changed

app.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ app.use(cookieParser());
1818
const sequelize = require('./util/database');
1919
const User = require('./models/user'); // ? What is use of this
2020
const Expense = require('./models/expense'); // ? What is use of this
21+
const Premium = require('./models/premium');
2122

2223
// set the static folder in my express (by the we can use css and js file)
2324
app.use(express.static('./public'));
@@ -31,6 +32,9 @@ app.use('/expense', require('./router/expense'));
3132
User.hasMany(Expense);
3233
Expense.belongsTo(User);
3334

35+
User.hasMany(Premium);
36+
Premium.belongsTo(User);
37+
3438
//{ force: true } - it is writen in sync(), when we want to crate the fresh tabel or update the table or table schema
3539
sequelize.sync().then((result) => { // ? How this .sync find the all module for creating table
3640
app.listen(port, function (err) {

controllers/expense_controller.js

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,35 @@
11
const Expense = require("../models/expense");
2-
// const User = require("../models/user");
2+
const User = require("../models/user");
33
const sequelize = require("../util/database");
44

55
module.exports.addExpense = async (req, res) => {
6-
// const t = await sequelize.transaction();
6+
const t = await sequelize.transaction();
77
try {
88
const date = req.body.date;
99
const category = req.body.category;
1010
const description = req.body.description;
1111
const amount = req.body.amount;
1212

13-
// await User.update({ totalExpenses: req.user.totalExpenses + Number(amount), },
14-
// { where: { id: req.user.id } },
15-
// { transaction: t }
16-
// );
17-
18-
// await
19-
20-
// console.log(amount);
21-
// console.log(req.body);
13+
await User.update({ totalExpenses: req.user.totalExpenses + Number(amount) },
14+
{ where: { id: req.user.id } }, { transaction: t }
15+
);
2216

23-
Expense.create({
17+
await Expense.create({
2418
date: date,
2519
category: category,
2620
description: description,
2721
amount: amount,
2822
userId: req.user.id
29-
}
30-
// ,{ transaction: t }
23+
}, { transaction: t }
3124
).then((data) => {
3225
res.status(200).redirect("/user_dashboard"); // Pending -: Doubt why use .redirect here, bcz when we give home route ('/) its not work
3326
}).catch((err) => {
3427
console.log(err);
3528
});
36-
// await t.commit();
29+
await t.commit();
3730
} catch {
3831
async (err) => {
39-
// await t.rollback();
32+
await t.rollback();
4033
console.log(err);
4134
};
4235
}
@@ -54,13 +47,12 @@ exports.getAllExpenses = async (req, res) => {
5447
exports.deleteExpense = async (req, res) => {
5548
const id = req.params.id;
5649
try {
57-
// const expense = await Expense.findByPk(id);
58-
// await User.update(
59-
// {
60-
// totalExpenses: req.user.totalExpenses - expense.amount,
61-
// },
62-
// { where: { id: req.user.id } }
63-
// );
50+
const expense = await Expense.findByPk(id);
51+
await User.update(
52+
{
53+
totalExpenses: req.user.totalExpenses - expense.amount,
54+
}, { where: { id: req.user.id } }
55+
);
6456
await Expense.destroy({ where: { id: id } });
6557
res.redirect("/user_dashboard");
6658
} catch (err) {
@@ -75,14 +67,14 @@ exports.updateExpense = async (req, res) => {
7567
const description = req.body.description;
7668
const amount = req.body.amount;
7769

78-
// const expense = await Expense.findByPk(id);
70+
const expense = await Expense.findByPk(id);
7971

80-
// await User.update(
81-
// {
82-
// totalExpenses: req.user.totalExpenses - expense.amount + Number(amount),
83-
// },
84-
// { where: { id: req.user.id } }
85-
// );
72+
await User.update(
73+
{
74+
totalExpenses: req.user.totalExpenses - expense.amount + Number(amount),
75+
},
76+
{ where: { id: req.user.id } }
77+
);
8678

8779
await Expense.update({
8880
category: category,

controllers/user_controller.js

Lines changed: 165 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
const sequelize = require('sequelize');
22
const User = require('../models/user');
3+
const Expense = require("../models/expense");
4+
const Premium = require('../models/premium');
35
const path = require('path');
46
const jwt = require("jsonwebtoken");
7+
const Razorpay = require("razorpay");
58

69
module.exports.signUp = async (req, res) => {
710
try {
@@ -50,7 +53,7 @@ module.exports.signIn = async function (req, res) {
5053

5154
else if (user && user.password == password) {
5255
const token = generateAccessToken(user.id, user.email);
53-
res.cookie("jwt_token", token);
56+
res.cookie("jwt_token", token); // , { maxAge: 1000, httpOnly: true } = for set the cookie expire time
5457
res.status(200).send(`<script> window.location.href='/user_dashboard'; </script>`);
5558

5659
}
@@ -67,4 +70,165 @@ module.exports.userDashboard = function (req, res) {
6770
res.sendFile(path.join(__dirname, '../public/views/user_dashboard.html'));
6871
};
6972

73+
module.exports.buyPremium = async (req, res) => {
74+
try {
75+
var rzp = new Razorpay({
76+
key_id: process.env.RAZORPAY_KEY_ID,
77+
key_secret: process.env.RAZORPAY_KEY_SECRET
78+
});
79+
80+
//amount should be written in paise
81+
rzp.orders.create({ amount: 49900, currency: "INR" }, (err, order) => {
82+
if (err) {
83+
throw new Error(JSON.stringify(err));
84+
}
85+
Premium.create({
86+
orderid: order.id,
87+
status: "PENDING",
88+
userId: req.user.id
89+
}).then(() => {
90+
return res.status(201).json({ order, key_id: rzp.key_id });
91+
}).catch((err) => {
92+
throw new Error(err);
93+
});
94+
95+
// this code is same as upper for create in order table here req.user belong to a row create is a function of sequlize and premium is a table.
96+
// this below code is the easier way to write the same code as above
97+
98+
// req.user
99+
// .createPremium({ orderid: order.id, status: "PENDING" })
100+
// .then(() => {
101+
// return res.status(201).json({ order, key_id: rzp.key_id });
102+
// })
103+
// .catch((err) => {
104+
// throw new Error(err);
105+
// });
106+
});
107+
} catch (err) {
108+
res.status(403).json({ message: "Something went wrong", error: err });
109+
}
110+
};
111+
112+
module.exports.updateTransactionStatus = async (req, res) => {
113+
try {
114+
const { payment_id, order_id } = req.body;
115+
const premium = await Premium.findOne({ where: { orderid: order_id } });
116+
premium.update({
117+
paymentid: payment_id,
118+
status: "SUCCESSFUL",
119+
}).then(() => {
120+
return res.status(202).json({
121+
sucess: true,
122+
message: "Transaction Successful",
123+
});
124+
}).catch((error) => {
125+
throw new Error(error);
126+
});
127+
128+
req.user.update({ isPremiumUser: true });
129+
130+
// Promise.all([promise1, promise2])
131+
// .then(() => {
132+
// return res.status(202).json({
133+
// sucess: true,
134+
// message: "Transaction Successful",
135+
// // token: userController.generateAccessToken(userId, undefined, true),
136+
// });
137+
// })
138+
// .catch((error) => {
139+
// throw new Error(error);
140+
// });
141+
} catch (err) {
142+
console.log(err);
143+
res.status(403).json({ error: err, message: "Sometghing went wrong" });
144+
}
145+
};
146+
147+
module.exports.isPremiumUser = async (req, res) => {
148+
try {
149+
if (req.user.isPremiumUser) {
150+
return res.json({ isPremiumUser: true });
151+
}
152+
} catch (err) {
153+
console.log(err);
154+
}
155+
};
156+
157+
module.exports.getLeaderboardPage = async (req, res) => {
158+
try {
159+
res.sendFile(path.join(__dirname, '../public/views/leaderboard.html'));
160+
} catch {
161+
(err) => console.log(err);
162+
}
163+
};
164+
165+
module.exports.getLeaderboardUser = async (req, res) => {
166+
try {
167+
const users = await User.findAll();
168+
res.json(users); // send the date where api call (This is is API or controller for get expense data)
169+
} catch (err) {
170+
console.log(err);
171+
}
172+
};
173+
174+
//send sorted data from backend - pending wqtch sir video
175+
176+
// exports.getLeaderboardUser = (req, res, next) => {
177+
// Expense.findAll({
178+
// attributes: [
179+
// [sequelize.fn("sum", sequelize.col("amount")), "totalExpense"],
180+
// [sequelize.col("user.name"), "name"],
181+
// ],
182+
// group: ["userId"],
183+
// include: [
184+
// {
185+
// model: User,
186+
// attributes: [],
187+
// },
188+
// ],
189+
// order: [[sequelize.fn("sum", sequelize.col("amount")), "DESC"]],
190+
// })
191+
// .then((expenses) => {
192+
// const result = expenses.map((expense) => ({
193+
// name: expense.getDataValue("name"),
194+
// amount: expense.getDataValue("totalExpense"),
195+
// }));
196+
// res.send(JSON.stringify(result));
197+
// })
198+
// .catch((err) => console.log(err));
199+
// };
200+
201+
module.exports.getReportsPage = (req, res) => {
202+
res.sendFile(path.join(__dirname, '../public/views/reports.html'));
203+
};
70204

205+
module.exports.dailyReports = async (req, res) => {
206+
try {
207+
const date = req.body.date;
208+
const expenses = await Expense.findAll({
209+
where: { date: date, userId: req.user.id },
210+
});
211+
return res.send(expenses);
212+
} catch (error) {
213+
console.log(error);
214+
}
215+
};
216+
217+
module.exports.monthlyReports = async (req, res) => {
218+
try {
219+
const month = req.body.month;
220+
const expenses = await Expense.findAll({
221+
where: {
222+
date: {
223+
[sequelize.like]: `%-${month}-%`,
224+
},
225+
userId: req.user.id,
226+
},
227+
raw: true,
228+
});
229+
230+
return res.send(expenses);
231+
} catch (error) {
232+
console.log(error);
233+
}
234+
};

models/premium.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const Sequelize = require("sequelize");
2+
const sequelize = require("../util/database");
3+
4+
const Premium = sequelize.define("premiums", {
5+
id: {
6+
type: Sequelize.INTEGER,
7+
autoIncrement: true,
8+
allowNull: false,
9+
primaryKey: true,
10+
},
11+
paymentid: Sequelize.STRING,
12+
orderid: Sequelize.STRING,
13+
status: Sequelize.STRING,
14+
});
15+
16+
module.exports = Premium;

models/user.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ const User = sequelize.define("users", {
2121
type: Sequelize.STRING,
2222
allowNull: false
2323
},
24-
// isPremiumUser: Sequelize.BOOLEAN,
25-
// totalExpenses: {
26-
// type: Sequelize.INTEGER,
27-
// defaultValue: 0,
28-
// },
24+
isPremiumUser: Sequelize.BOOLEAN,
25+
26+
totalExpenses: {
27+
type: Sequelize.INTEGER,
28+
defaultValue: 0,
29+
},
2930
});
3031

3132
module.exports = User;

0 commit comments

Comments
 (0)