Files
medusa-store/packages/medusa-plugin-segment/src/services/segment.js
2020-07-17 14:06:55 +02:00

111 lines
3.2 KiB
JavaScript

import Analytics from "analytics-node"
import axios from "axios"
import { BaseService } from "medusa-interfaces"
class SegmentService extends BaseService {
/**
* @param {Object} options - options defined in `medusa-config.js`
* e.g.
* {
* write_key: Segment write key given in Segment dashboard
* }
*/
constructor({totalsService}, options) {
super()
this.options_ = options
this.totalsService_ = totalsService
this.analytics_ = new Analytics(options.write_key)
}
/**
* Wrapper around segment's identify call
*/
identify(data) {
return this.analytics_.identify(data)
}
track(data) {
return this.analytics_.track(data)
}
async getReportingValue(fromCurrency, value) {
const date = "latest"
const toCurrency =
(this.options_.reporting_currency &&
this.options_.reporting_currency.toUpperCase()) ||
"EUR"
if (fromCurrency === toCurrency) return value.toFixed(2)
const exchangeRate = await axios
.get(`https://api.exchangeratesapi.io/${date}?symbols=${fromCurrency}&base=${toCurrency}`)
.then(({ data }) => {
return data.rates[fromCurrency]
})
return (value / exchangeRate).toFixed(2)
}
async buildOrder(order) {
console.log("build", order)
const subtotal = await this.totalsService_.getSubtotal(order)
const total = await this.totalsService_.getTotal(order)
const tax = await this.totalsService_.getTaxTotal(order)
const discount = await this.totalsService_.getDiscountTotal(order)
const shipping = await this.totalsService_.getShippingTotal(order)
const revenue = total - tax
let coupon
if (order.discounts && order.discounts.length) {
coupon = order.discounts[0].code
}
const orderData = {
checkout_id: order.cart_id,
order_id: order._id,
email: order.email,
reporting_total: await this.getReportingValue(order.currency_code, total),
reporting_subtotal: await this.getReportingValue(order.currency_code, subtotal),
reporting_revenue: await this.getReportingValue(order.currency_code, revenue),
reporting_shipping: await this.getReportingValue(order.currency_code, shipping),
reporting_tax: await this.getReportingValue(order.currency_code, tax),
reporting_discount: await this.getReportingValue(order.currency_code, discount),
total,
subtotal,
revenue,
shipping,
tax,
discount,
coupon,
currency: order.currency_code,
products: await Promise.all(
order.items.map(async item => {
let name = item.title
let variant = item.description
const unit_price = item.content.unit_price
const line_total = unit_price * item.content.quantity * item.quantity
const revenue = await this.getReportingValue(order.currency_code, line_total)
return {
name,
variant,
price: unit_price,
reporting_revenue: revenue,
product_id: `${item.content.product._id}`,
sku: item.content.variant.sku,
quantity: item.quantity,
}
})
),
}
return orderData
}
}
export default SegmentService