Adds medusa subcribers
This commit is contained in:
1 parent
30c101a8be
commit
c84215fde7
11 files changed
+143
-21
No files matched your search
@@ -12,7 +12,10 @@ export default async (req, res) => {
|
|||||||
const cartId = klarnaOrder.merchant_data
|
const cartId = klarnaOrder.merchant_data
|
||||||
const order = await orderService.list({ cart_id: cartId })[0]
|
const order = await orderService.list({ cart_id: cartId })[0]
|
||||||
|
|
||||||
await klarnaProviderService.acknowledgeOrder(klarnaOrder.id, order._id)
|
await klarnaProviderService.acknowledgeOrder(
|
||||||
|
klarnaOrder.order_id,
|
||||||
|
order._id
|
||||||
|
)
|
||||||
res.sendStatus(200)
|
res.sendStatus(200)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw error
|
throw error
|
||||||
|
|||||||
@@ -181,8 +181,10 @@ class KlarnaProviderService extends PaymentService {
|
|||||||
*/
|
*/
|
||||||
async getStatus(paymentData) {
|
async getStatus(paymentData) {
|
||||||
try {
|
try {
|
||||||
const { id } = paymentData
|
const { order_id } = paymentData
|
||||||
const order = await this.klarna_.get(`${this.klarnaOrderUrl_}/${id}`)
|
const order = await this.klarna_.get(
|
||||||
|
`${this.klarnaOrderUrl_}/${order_id}`
|
||||||
|
)
|
||||||
// TODO: Klarna docs does not provide a list of statues, so we need to
|
// TODO: Klarna docs does not provide a list of statues, so we need to
|
||||||
// play around our selves to figure it out
|
// play around our selves to figure it out
|
||||||
let status = "initial"
|
let status = "initial"
|
||||||
@@ -215,7 +217,7 @@ class KlarnaProviderService extends PaymentService {
|
|||||||
async retrievePayment(cart) {
|
async retrievePayment(cart) {
|
||||||
try {
|
try {
|
||||||
const { data } = cart.payment_method
|
const { data } = cart.payment_method
|
||||||
return this.klarna_.get(`${this.klarnaOrderUrl_}/${data.id}`)
|
return this.klarna_.get(`${this.klarnaOrderUrl_}/${data.order_id}`)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
@@ -283,7 +285,10 @@ class KlarnaProviderService extends PaymentService {
|
|||||||
async updatePayment(order, update) {
|
async updatePayment(order, update) {
|
||||||
try {
|
try {
|
||||||
const { data } = order.payment_method
|
const { data } = order.payment_method
|
||||||
return this.klarna_.post(`${this.klarnaOrderUrl_}/${data.id}`, update)
|
return this.klarna_.post(
|
||||||
|
`${this.klarnaOrderUrl_}/${data.order_id}`,
|
||||||
|
update
|
||||||
|
)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
@@ -296,17 +301,19 @@ class KlarnaProviderService extends PaymentService {
|
|||||||
*/
|
*/
|
||||||
async capturePayment(paymentData) {
|
async capturePayment(paymentData) {
|
||||||
try {
|
try {
|
||||||
const { id } = paymentData
|
const { order_id } = paymentData
|
||||||
const orderData = await this.klarna_.get(`${this.klarnaOrderUrl_}/${id}`)
|
const orderData = await this.klarna_.get(
|
||||||
|
`${this.klarnaOrderUrl_}/${order_id}`
|
||||||
|
)
|
||||||
const { order_amount } = orderData.order
|
const { order_amount } = orderData.order
|
||||||
|
|
||||||
await this.klarna_.post(
|
await this.klarna_.post(
|
||||||
`${this.klarnaOrderManagementUrl_}/${id}/captures`,
|
`${this.klarnaOrderManagementUrl_}/${order_id}/captures`,
|
||||||
{
|
{
|
||||||
captured_amount: order_amount,
|
captured_amount: order_amount,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return id
|
return order_id
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
@@ -319,14 +326,14 @@ class KlarnaProviderService extends PaymentService {
|
|||||||
*/
|
*/
|
||||||
async refundPayment(paymentData, amount) {
|
async refundPayment(paymentData, amount) {
|
||||||
try {
|
try {
|
||||||
const { id } = paymentData
|
const { order_id } = paymentData
|
||||||
await this.klarna_.post(
|
await this.klarna_.post(
|
||||||
`${this.klarnaOrderManagementUrl_}/${id}/refunds`,
|
`${this.klarnaOrderManagementUrl_}/${order_id}/refunds`,
|
||||||
{
|
{
|
||||||
refunded_amount: amount,
|
refunded_amount: amount,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return id
|
return order_id
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
@@ -339,9 +346,9 @@ class KlarnaProviderService extends PaymentService {
|
|||||||
*/
|
*/
|
||||||
async cancelPayment(paymentData) {
|
async cancelPayment(paymentData) {
|
||||||
try {
|
try {
|
||||||
const { id } = paymentData
|
const { order_id } = paymentData
|
||||||
await this.klarna_.post(`${this.klarnaOrderUrl_}/${id}/cancel`)
|
await this.klarna_.post(`${this.klarnaOrderUrl_}/${order_id}/cancel`)
|
||||||
return id
|
return order_id
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class SendGridService extends BaseService {
|
|||||||
* from: Medusa <hello@medusa.example>,
|
* from: Medusa <hello@medusa.example>,
|
||||||
* order_placed_template: 01234,
|
* order_placed_template: 01234,
|
||||||
* order_updated_template: 56789,
|
* order_updated_template: 56789,
|
||||||
* order_updated_cancelled_template: 4242,
|
* order_cancelled_template: 4242,
|
||||||
* user_password_reset_template: 0000,
|
* user_password_reset_template: 0000,
|
||||||
* customer_password_reset_template: 1111,
|
* customer_password_reset_template: 1111,
|
||||||
* }
|
* }
|
||||||
@@ -42,6 +42,9 @@ class SendGridService extends BaseService {
|
|||||||
case "order.cancelled":
|
case "order.cancelled":
|
||||||
templateId = this.options_.order_cancelled_template
|
templateId = this.options_.order_cancelled_template
|
||||||
break
|
break
|
||||||
|
case "order.completed":
|
||||||
|
templateId = this.options_.order_completed_template
|
||||||
|
break
|
||||||
case "user.password_reset":
|
case "user.password_reset":
|
||||||
templateId = this.options_.user_password_reset_template
|
templateId = this.options_.user_password_reset_template
|
||||||
break
|
break
|
||||||
@@ -55,7 +58,7 @@ class SendGridService extends BaseService {
|
|||||||
try {
|
try {
|
||||||
return SendGrid.send({
|
return SendGrid.send({
|
||||||
template_id: templateId,
|
template_id: templateId,
|
||||||
from: options.from,
|
from: this.options_.from,
|
||||||
to: order.email,
|
to: order.email,
|
||||||
dynamic_template_data: order,
|
dynamic_template_data: order,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ class OrderSubscriber {
|
|||||||
await this.sendgridService_.transactionalEmail("order.cancelled", order)
|
await this.sendgridService_.transactionalEmail("order.cancelled", order)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
this.eventBus_.subscribe("order.completed", async (order) => {
|
||||||
|
await this.sendgridService_.transactionalEmail("order.completed", order)
|
||||||
|
})
|
||||||
|
|
||||||
this.eventBus_.subscribe("order.updated", async (order) => {
|
this.eventBus_.subscribe("order.updated", async (order) => {
|
||||||
await this.sendgridService_.transactionalEmail("order.updated", order)
|
await this.sendgridService_.transactionalEmail("order.updated", order)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
export default async (req, res) => {
|
||||||
|
const { id } = req.params
|
||||||
|
|
||||||
|
try {
|
||||||
|
const orderService = req.scope.resolve("orderService")
|
||||||
|
const order = await orderService.completeOrder(id)
|
||||||
|
res.json({ order })
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error)
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,9 @@ export default async (req, res) => {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const orderService = req.scope.resolve("orderService")
|
const orderService = req.scope.resolve("orderService")
|
||||||
const order = await orderService.retrieve(id)
|
|
||||||
|
let order = await orderService.retrieve(id)
|
||||||
|
order = await orderService.decorate(order, [], ["region"])
|
||||||
|
|
||||||
res.json({ order })
|
res.json({ order })
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -11,6 +11,10 @@ export default app => {
|
|||||||
|
|
||||||
route.post("/", middlewares.wrap(require("./create-order").default))
|
route.post("/", middlewares.wrap(require("./create-order").default))
|
||||||
route.post("/:id", middlewares.wrap(require("./update-order").default))
|
route.post("/:id", middlewares.wrap(require("./update-order").default))
|
||||||
|
route.post(
|
||||||
|
"/:id/complete",
|
||||||
|
middlewares.wrap(require("./complete-order").default)
|
||||||
|
)
|
||||||
|
|
||||||
route.post(
|
route.post(
|
||||||
"/:id/capture",
|
"/:id/capture",
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import mongooseLoader from "./mongoose"
|
|||||||
import apiLoader from "./api"
|
import apiLoader from "./api"
|
||||||
import modelsLoader from "./models"
|
import modelsLoader from "./models"
|
||||||
import servicesLoader from "./services"
|
import servicesLoader from "./services"
|
||||||
|
import subscribersLoader from "./subscribers"
|
||||||
import passportLoader from "./passport"
|
import passportLoader from "./passport"
|
||||||
import pluginsLoader from "./plugins"
|
import pluginsLoader from "./plugins"
|
||||||
import defaultsLoader from "./defaults"
|
import defaultsLoader from "./defaults"
|
||||||
@@ -37,6 +38,9 @@ export default async ({ directory: rootDirectory, expressApp }) => {
|
|||||||
await servicesLoader({ container })
|
await servicesLoader({ container })
|
||||||
Logger.info("Services initialized")
|
Logger.info("Services initialized")
|
||||||
|
|
||||||
|
await subscribersLoader({ container })
|
||||||
|
Logger.info("Subscribers initialized")
|
||||||
|
|
||||||
const dbConnection = await mongooseLoader({ container })
|
const dbConnection = await mongooseLoader({ container })
|
||||||
Logger.info("MongoDB Intialized")
|
Logger.info("MongoDB Intialized")
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import glob from "glob"
|
||||||
|
import path from "path"
|
||||||
|
import { asFunction } from "awilix"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers all subscribers in the subscribers directory
|
||||||
|
*/
|
||||||
|
export default ({ container }) => {
|
||||||
|
const isTest = process.env.NODE_ENV === "test"
|
||||||
|
|
||||||
|
const corePath = isTest
|
||||||
|
? "../subscribers/__mocks__/*.js"
|
||||||
|
: "../subscribers/*.js"
|
||||||
|
const coreFull = path.join(__dirname, corePath)
|
||||||
|
|
||||||
|
const core = glob.sync(coreFull, { cwd: __dirname })
|
||||||
|
core.forEach(fn => {
|
||||||
|
const loaded = require(fn).default
|
||||||
|
|
||||||
|
container.build(asFunction(cradle => new loaded(cradle)).singleton())
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ class OrderService extends BaseService {
|
|||||||
PLACED: "order.placed",
|
PLACED: "order.placed",
|
||||||
UPDATED: "order.updated",
|
UPDATED: "order.updated",
|
||||||
CANCELLED: "order.cancelled",
|
CANCELLED: "order.cancelled",
|
||||||
|
COMPLETED: "order.completed",
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor({
|
constructor({
|
||||||
@@ -16,6 +17,7 @@ class OrderService extends BaseService {
|
|||||||
fulfillmentProviderService,
|
fulfillmentProviderService,
|
||||||
lineItemService,
|
lineItemService,
|
||||||
totalsService,
|
totalsService,
|
||||||
|
regionService,
|
||||||
eventBusService,
|
eventBusService,
|
||||||
}) {
|
}) {
|
||||||
super()
|
super()
|
||||||
@@ -38,6 +40,9 @@ class OrderService extends BaseService {
|
|||||||
/** @private @const {TotalsService} */
|
/** @private @const {TotalsService} */
|
||||||
this.totalsService_ = totalsService
|
this.totalsService_ = totalsService
|
||||||
|
|
||||||
|
/** @private @const {RegionService} */
|
||||||
|
this.regionService_ = regionService
|
||||||
|
|
||||||
/** @private @const {EventBus} */
|
/** @private @const {EventBus} */
|
||||||
this.eventBus_ = eventBusService
|
this.eventBus_ = eventBusService
|
||||||
}
|
}
|
||||||
@@ -200,6 +205,37 @@ class OrderService extends BaseService {
|
|||||||
return this.orderModel_.find(selector)
|
return this.orderModel_.find(selector)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} orderId - id of the order to complete
|
||||||
|
* @return {Promise} the result of the find operation
|
||||||
|
*/
|
||||||
|
async completeOrder(orderId) {
|
||||||
|
const order = await this.retrieve(orderId)
|
||||||
|
this.orderModel_
|
||||||
|
.updateOne(
|
||||||
|
{ _id: order._id },
|
||||||
|
{
|
||||||
|
$set: { status: "completed" },
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.then(async result => {
|
||||||
|
const completeOrderJob = await this.eventBus_.emit(
|
||||||
|
OrderService.Events.COMPLETED,
|
||||||
|
result
|
||||||
|
)
|
||||||
|
|
||||||
|
return completeOrderJob
|
||||||
|
.finished()
|
||||||
|
.then(async () => {
|
||||||
|
return this.retrieve(order._id)
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.log(error)
|
||||||
|
throw error
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an order from a cart
|
* Creates an order from a cart
|
||||||
* @param {object} order - the order to create
|
* @param {object} order - the order to create
|
||||||
@@ -603,9 +639,17 @@ class OrderService extends BaseService {
|
|||||||
* @return {Order} return the decorated order.
|
* @return {Order} return the decorated order.
|
||||||
*/
|
*/
|
||||||
async decorate(order, fields, expandFields = []) {
|
async decorate(order, fields, expandFields = []) {
|
||||||
const requiredFields = ["_id", "metadata"]
|
const o = order.toObject()
|
||||||
const decorated = _.pick(order, fields.concat(requiredFields))
|
o.shipping_total = await this.totalsService_.getShippingTotal(order)
|
||||||
return decorated
|
o.discount_total = await this.totalsService_.getDiscountTotal(order)
|
||||||
|
o.tax_total = await this.totalsService_.getTaxTotal(order)
|
||||||
|
o.subtotal = await this.totalsService_.getSubtotal(order)
|
||||||
|
o.total = await this.totalsService_.getTotal(order)
|
||||||
|
o.created = order._id.getTimestamp()
|
||||||
|
if (expandFields.includes("region")) {
|
||||||
|
o.region = await this.regionService_.retrieve(order.region_id)
|
||||||
|
}
|
||||||
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
class OrderSubscriber {
|
||||||
|
constructor({ paymentProviderService, eventBusService }) {
|
||||||
|
this.paymentProviderService_ = paymentProviderService
|
||||||
|
|
||||||
|
this.eventBus_ = eventBusService
|
||||||
|
|
||||||
|
this.eventBus_.subscribe("order.completed", async order => {
|
||||||
|
const paymentProvider = this.paymentProviderService_.retrieveProvider(
|
||||||
|
order.payment_method.provider_id
|
||||||
|
)
|
||||||
|
|
||||||
|
await paymentProvider.capturePayment(order._id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default OrderSubscriber
|
||||||
Reference in new issue
Block a user