Skip to content

Commit

Permalink
Order status and action now sync with nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
reazuliqbal committed May 3, 2018
1 parent 569d986 commit 651d466
Show file tree
Hide file tree
Showing 4 changed files with 164 additions and 23 deletions.
128 changes: 117 additions & 11 deletions controllers/OrderController.js
@@ -1,3 +1,4 @@
const { forEach } = require('p-iteration');
const steem = require('../modules/steem');
const steemconnect = require('../modules/steemconnect');
const Order = require('../models/Order');
Expand Down Expand Up @@ -41,7 +42,7 @@ module.exports = {

await order.save((err) => {
if (!err) {
const returnURL = `${config.order.redirect_uri}?escrowId=${escrowId}&buyer=${buyer}`;
const returnURL = `${config.order.redirect_uri}?escrowId=${escrowId}`;

const hotSignLink = steemconnect.sign('escrow_transfer', {
from: buyer,
Expand Down Expand Up @@ -69,20 +70,125 @@ module.exports = {
});
},
getOrderCompleted: (req, res) => {
const { escrowId } = req.query;
let { escrowId } = req.query;

if (escrowId) {
steem.api.getEscrow(req.session.user.name, parseInt(escrowId, 10), async (err, result) => {
if (!err && result !== null) {
await Service.updateOne({ _id: req.body.service }, { $inc: { orders: 1 } });
res.render('thankyou', { title: 'Thank you.' });
} else {
req.flash('error', 'We could not find any transaction associated with these details.', false);
res.redirect('/dashboard');
}
});
escrowId = parseInt(escrowId, 10);

Order.findOne({ escrow_id: escrowId, buyer: req.session.user._id, completed: false })
.populate('buyer', 'username')
.populate('seller', 'username')
.exec((err, order) => {
if (err) {
res.redirect('/dashboard');
} else {
steem.api.getEscrow(order.buyer.username, escrowId, async (err, result) => {
if (!err && result !== null) {
steem.api.getAccountHistory(order.buyer.username, -1, 50, (err, result) => {
if (!err && result.length > 0) {
result.reverse();
result.forEach(async (history) => {
if (history[1].op[0] === 'escrow_transfer') {
const escrowData = history[1].op[1];

if (escrowData.escrow_id === escrowId
&& escrowData.from === order.buyer.username
&& escrowData.to === order.seller.username) {
await Service.updateOne({ escrow_id: escrowId }, { $inc: { orders: 1 } });
}
}
});
res.render('thankyou', { title: 'Thank you.' });
} else {
req.flash('error', 'We could not find any transaction in your account history.', false);
res.redirect('/dashboard');
}
});
}
});
}
});
} else {
res.redirect('/dashboard');
}
},

getOrderStatus: async (req, res) => {
let { escrowId } = req.query;
const { action } = req.query;

escrowId = parseInt(escrowId, 10);

const order = await Order.findOne({
$or: [
{ $or: [{ escrow_id: escrowId, seller: req.session.user._id }] },
{ $or: [{ escrow_id: escrowId, buyer: req.session.user._id }] },
],
})
.populate('buyer', 'username')
.populate('seller', 'username');

steem.api.getAccountHistory(req.session.user.name, -1, 10, (err, result) => {
if (!err && result.length > 0) {
result.reverse();

switch (action) {
case 'escrow_approve':
forEach(result, (history) => {
if (history[1].op[0] === 'escrow_approve') {
const escrowData = history[1].op[1];

if (escrowData.escrow_id === escrowId && escrowData.who === req.session.user.name) {
order.escrow_active = escrowData.approve;
order.seller_approved = escrowData.approve;
order.save();
}
}
});

res.redirect('/dashboard');

break;

case 'escrow_dispute':
forEach(result, (history) => {
if (history[1].op[0] === 'escrow_dispute') {
const escrowData = history[1].op[1];

if (escrowData.escrow_id === escrowId && escrowData.who === req.session.user.name) {
order.disputed = true;
order.save();
}
}
});

res.redirect('/dashboard');

break;

case 'escrow_release':
forEach(result, (history) => {
if (history[1].op[0] === 'escrow_release') {
const escrowData = history[1].op[1];
console.log(escrowData);
if (escrowData.escrow_id === escrowId && escrowData.who === req.session.user.name) {
order.completed = true;
order.save();
}
}
});

res.redirect('/dashboard');

break;

default:

break;
}
} else {
console.log(err);
}
});
},
};
35 changes: 35 additions & 0 deletions models/Order.js
Expand Up @@ -40,6 +40,40 @@ const OrderSchema = new Schema({
}, { timestamps: true });

OrderSchema.statics = {
ordersCompleted(seller) {
return this.find({ seller, completed: true }).count();
},

getOrders(user, type) {
let query = { seller: user };
if (type === 'placed') {
query = { buyer: user };
}
return this.find(query)
.where('completed', false)
.where('escrow_active', true)
.sort({ createdAt: -1 })
.populate('seller', 'username')
.populate('buyer', 'username')
.populate('service', 'title price currency slug');
},

updateOrder(orderId, data) {
return this.updateOne(
{ _id: orderId },
{
$set: {
escrow_active: data.escrow_active,
seller_approved: data.to_approved,
agent_approved: data.agent_approved,
disputed: data.disputed,
ratification_deadline: data.ratification_deadline,
escrow_expiration: data.escrow_expiration,
},
},
).exec();
},

totalEarned(seller) {
return this.aggregate([
{ $match: { seller, completed: true } },
Expand All @@ -52,6 +86,7 @@ OrderSchema.statics = {
{ $group: { _id: '$service.currency', total: { $sum: '$service.price' } } },
]);
},

pendingEarnings(seller) {
return this.aggregate([
{
Expand Down
2 changes: 2 additions & 0 deletions routes/order.js
Expand Up @@ -10,4 +10,6 @@ router.route('/')

router.get('/completed', util.isAuthenticated, OrderController.getOrderCompleted);

router.get('/order-status', util.isAuthenticated, OrderController.getOrderStatus);

module.exports = router;
22 changes: 10 additions & 12 deletions views/dashboard/orders.ejs
Expand Up @@ -49,19 +49,21 @@
<tr>
<td><%= order.escrow_id %></td>
<td><a href="/@<%= order.seller.username %>/<%= order.service.slug %>"><%= order.service.title %></a></td>
<td><%= order.service.price %></td>
<td><%= order.service.price %> <%= order.service.currency %></td>
<td><%= order.buyer.username %></td>
<td><%= order.createdAt.toDateString() %></td>
<td><%= status %></td>
<td>
<% if (!order.completed) { %>
<% if(!order.seller_approved) {%>
<% if(order.buyer.username !== session.user.name && !order.seller_approved) {%>
<a href="#orderManagement" class="btn modal-trigger waves-effect waves-light green" data-action="accept" data-id="<%= order._id %>">Accept</a>
<a href="#orderManagement" class="btn modal-trigger waves-effect waves-light red" data-action="decline" data-id="<%= order._id %>">Decline</a>
<% } else if (order.agent_approved && !order.delivered || order.modification_requested) { %>
<% } else if (order.seller.username === session.user.name && order.agent_approved && (!order.delivered || order.modification_requested)) { %>
<a href="#orderManagement" class="btn modal-trigger waves-effect waves-light green" data-action="deliver" data-id="<%= order._id %>">Deliver</a>
<a href="#orderManagement" class="btn modal-trigger waves-effect waves-light red" data-action="dispute" data-id="<%= order._id %>">Dispute</a>
<% } else if (order.delivered && order.modification_requested) { %>
<% } else if (order.buyer.username === session.user.name && order.delivered && !order.completed) { %>
<a href="#orderManagement" class="btn modal-trigger waves-effect waves-light green" data-action="release" data-id="<%= order._id %>">Accept Delivery</a>
<a href="#orderManagement" class="btn modal-trigger waves-effect waves-light black-text amber" data-action="request_modification" data-id="<%= order._id %>">Request Mod</a>
<a href="#orderManagement" class="btn modal-trigger waves-effect waves-light red" data-action="dispute" data-id="<%= order._id %>">Dispute</a>
<% } %>
<% } %>
Expand Down Expand Up @@ -109,27 +111,23 @@
<input type="hidden" name="id">
<div class="modal-content">
<h4>Are you sure?</h4>
<p id="warning"></p>
<p id="warning" class="flow-text"></p>
</div>
<div class="modal-footer">
<a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat">Close</a>
<button id="actionBtn" type="submit" class="modal-action btn">Delete</button>
</div>
</form>
</div>

<div id="orderManagement" class="modal">
<form action="/dashboard/manage-order" method="post">
<input type="hidden" name="_csrf" value="<%= csrfToken %>" />
<input type="hidden" name="action">
<input type="hidden" name="orderId">
<div class="modal-content">
<h4>Are you sure?</h4>
<p id="warningOm"></p>
<div class="input-field">
<input type="text" name="wif" required>
<label for="wif">Active Private Key</label>
</div>
<p id="warningOm" class="flow-text"></p>
</div>
<div class="modal-footer">
<a href="#!" class="modal-action modal-close waves-effect waves-green btn-flat">Close</a>
Expand All @@ -138,4 +136,4 @@
</form>
</div>

<%- include('../partials/footer') %>
<%- include('../partials/footer') %>

0 comments on commit 651d466

Please sign in to comment.