diff --git a/ln/subscribe_invoice.js b/ln/subscribe_invoice.js index 8464c975..d71627da 100644 --- a/ln/subscribe_invoice.js +++ b/ln/subscribe_invoice.js @@ -28,40 +28,59 @@ const subscribeInvoice = async (ctx, bot, id) => { if (invoice.is_confirmed) { const order = await Order.findOne({ hash: invoice.id }); order.status = 'PAID_HOLD_INVOICE'; - const payment = await pay({ lnd, request: order.buyer_invoice }); - if (payment.is_confirmed) { - order.status = 'SUCCESS'; - const orderUser = await User.findOne({ _id: order.creator_id }); - if (order.type === 'sell') { + await order.save(); + try { + const payment = await pay({ lnd, request: order.buyer_invoice }); + if (payment.is_confirmed) { + order.status = 'SUCCESS'; + await order.save(); + const orderUser = await User.findOne({ _id: order.creator_id }); + if (order.type === 'sell') { + const buyerUser = await User.findOne({ _id: order.buyer_id }); + await messages.doneTakeSellMessage(bot, orderUser, buyerUser); + buyerUser.trades_completed++; + await buyerUser.save(); + } else if (order.type === 'buy') { + const sellerUser = await User.findOne({ _id: order.seller_id }); + await messages.doneTakeBuyMessage(bot, orderUser, sellerUser); + sellerUser.trades_completed++; + sellerUser.save(); + } + orderUser.trades_completed++; + await orderUser.save(); + } else { + // TODO: cronjob que haga estos pagos cada cierto tiempo y con cada intento incremente 'attempts' + // si attemps > 3 el admin se debe comunicar directamente con el usuario para hacer el pago manualmente const buyerUser = await User.findOne({ _id: order.buyer_id }); - await messages.doneTakeSellMessage(bot, orderUser, buyerUser); - buyerUser.trades_completed++; - await buyerUser.save(); - } else if (order.type === 'buy') { - const sellerUser = await User.findOne({ _id: order.seller_id }); - await messages.doneTakeBuyMessage(bot, orderUser, sellerUser); - sellerUser.trades_completed++; - sellerUser.save(); + const message = 'No he podido pagar tu invoice, en unos minutos intentaré pagarla nuevamente, asegúrate que tu nodo/wallet esté online'; + await messages.customMessage(bot, buyerUser, message); + const pp = new PendingPayment({ + amount: order.amount, + payment_request: order.buyer_invoice, + user_id: buyerUser._id, + description: order.description, + hash: order.hash, + order_id: order._id, + }); + await pp.save(); } - orderUser.trades_completed++; - await orderUser.save(); - } else { - // TODO: cronjob que haga estos pagos cada cierto tiempo y con cada intento incremente 'attempts' - // si attemps > 3 el admin se debe comunicar directamente con el usuario para hacer el pago manualmente - const buyerUser = await User.findOne({ _id: order.buyer_id }); - const message = 'No he podido pagar tu invoice, en unos minutos intentaré pagarla nuevamente, asegúrate que tu nodo/wallet esté online'; - await messages.customMessage(bot, buyerUser, message); - const pp = new PendingPayment({ - amount: order.amount, - payment_request: order.buyer_invoice, - user_id: buyerUser._id, - description: order.description, - hash: order.hash, - order_id: order._id, - }); - await pp.save(); + } catch (error) { + if (order.status === 'PAID_HOLD_INVOICE') { + const buyerUser = await User.findOne({ _id: order.buyer_id }); + const message = 'El vendedor ha liberado los satoshis pero no he podido pagar tu invoice, en unos minutos intentaré pagarla nuevamente, asegúrate que tu nodo/wallet esté online'; + await messages.customMessage(bot, buyerUser, message); + const pp = new PendingPayment({ + amount: order.amount, + payment_request: order.buyer_invoice, + user_id: buyerUser._id, + description: order.description, + hash: order.hash, + order_id: order._id, + }); + await pp.save(); + } + console.log(error) } - await order.save(); } }); } catch (e) { diff --git a/models/order.js b/models/order.js index 527d4cc0..c7adbb7c 100644 --- a/models/order.js +++ b/models/order.js @@ -21,7 +21,7 @@ const OrderSchema = new mongoose.Schema({ canceled_by: { type: String }, status: { type: String, - enum: ['WAITING_PAYMENT', 'PENDING', 'ACTIVE', 'CLOSED', 'DISPUTE', 'CANCELED', 'SUCCESS', 'PAID_HODL_INVOICE'], + enum: ['WAITING_PAYMENT', 'PENDING', 'ACTIVE', 'CLOSED', 'DISPUTE', 'CANCELED', 'SUCCESS', 'PAID_HOLD_INVOICE'], default: 'WAITING_PAYMENT', }, type: { type: String }, diff --git a/models/pending_payment.js b/models/pending_payment.js index c5d5e364..52627542 100644 --- a/models/pending_payment.js +++ b/models/pending_payment.js @@ -10,7 +10,7 @@ const PendingPaymentSchema = new mongoose.Schema({ message : '{VALUE} is not an integer value' } }, - attempts: { type: Number, min: 1, default: 0 }, + attempts: { type: Number, min: 0, default: 0 }, paid: { type: Boolean, default: false }, payment_request: { type: String }, hash: { type: String },