Adds medusa subcribers
This commit is contained in:
1 parent
30c101a8be
commit
c84215fde7
11 files changed
+143
-21
No files matched your search
@@ -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 {
|
||||
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 })
|
||||
} catch (error) {
|
||||
|
||||
@@ -11,6 +11,10 @@ export default app => {
|
||||
|
||||
route.post("/", middlewares.wrap(require("./create-order").default))
|
||||
route.post("/:id", middlewares.wrap(require("./update-order").default))
|
||||
route.post(
|
||||
"/:id/complete",
|
||||
middlewares.wrap(require("./complete-order").default)
|
||||
)
|
||||
|
||||
route.post(
|
||||
"/:id/capture",
|
||||
|
||||
@@ -4,6 +4,7 @@ import mongooseLoader from "./mongoose"
|
||||
import apiLoader from "./api"
|
||||
import modelsLoader from "./models"
|
||||
import servicesLoader from "./services"
|
||||
import subscribersLoader from "./subscribers"
|
||||
import passportLoader from "./passport"
|
||||
import pluginsLoader from "./plugins"
|
||||
import defaultsLoader from "./defaults"
|
||||
@@ -37,6 +38,9 @@ export default async ({ directory: rootDirectory, expressApp }) => {
|
||||
await servicesLoader({ container })
|
||||
Logger.info("Services initialized")
|
||||
|
||||
await subscribersLoader({ container })
|
||||
Logger.info("Subscribers initialized")
|
||||
|
||||
const dbConnection = await mongooseLoader({ container })
|
||||
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",
|
||||
UPDATED: "order.updated",
|
||||
CANCELLED: "order.cancelled",
|
||||
COMPLETED: "order.completed",
|
||||
}
|
||||
|
||||
constructor({
|
||||
@@ -16,6 +17,7 @@ class OrderService extends BaseService {
|
||||
fulfillmentProviderService,
|
||||
lineItemService,
|
||||
totalsService,
|
||||
regionService,
|
||||
eventBusService,
|
||||
}) {
|
||||
super()
|
||||
@@ -38,6 +40,9 @@ class OrderService extends BaseService {
|
||||
/** @private @const {TotalsService} */
|
||||
this.totalsService_ = totalsService
|
||||
|
||||
/** @private @const {RegionService} */
|
||||
this.regionService_ = regionService
|
||||
|
||||
/** @private @const {EventBus} */
|
||||
this.eventBus_ = eventBusService
|
||||
}
|
||||
@@ -200,6 +205,37 @@ class OrderService extends BaseService {
|
||||
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
|
||||
* @param {object} order - the order to create
|
||||
@@ -603,9 +639,17 @@ class OrderService extends BaseService {
|
||||
* @return {Order} return the decorated order.
|
||||
*/
|
||||
async decorate(order, fields, expandFields = []) {
|
||||
const requiredFields = ["_id", "metadata"]
|
||||
const decorated = _.pick(order, fields.concat(requiredFields))
|
||||
return decorated
|
||||
const o = order.toObject()
|
||||
o.shipping_total = await this.totalsService_.getShippingTotal(order)
|
||||
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