Skip to content

Commit

Permalink
feat: return start/end date per sub plan id
Browse files Browse the repository at this point in the history
  • Loading branch information
stfsy committed Sep 11, 2022
1 parent 251576a commit 23538c6
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 7 deletions.
24 changes: 19 additions & 5 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -248,11 +248,25 @@ class Subscriptions {
* @returns {StartAndEndDate} containing the start and end date
*/
async getStartAndEndDates(subscription) {
const status = subscription.status
const statusByPlanId = this._getById(subscription.status, new Date(2099, 1).getTime())

return Object.entries(statusByPlanId).reduce((context, [subscriptionPlanId, status]) => {
context[subscriptionPlanId] = this._getStartAndEndDates(status)
return context
}, {})
}

/**
*
* @param {Object} subscription
* @returns {StartAndEndDate} containing the start and end date
*/
_getStartAndEndDates(status) {
const statusArray = status
.sort((a, b) => new Date(a.event_time).getTime() - new Date(b.event_time).getTime())

const first = status.find((s) => s.description !== PLACEHOLDER_DESCRIPTION)
let last = status.at(-1)
const first = statusArray.find((s) => s.description !== PLACEHOLDER_DESCRIPTION)
let last = statusArray.at(-1)

if (first.alert_id === last.alert_id) {
last == null
Expand All @@ -261,8 +275,8 @@ class Subscriptions {
const start = first.event_time
let end = null

if (last && !this._isSubscriptionStatusCurrentlyActive(status.at(-1))) {
end = status.at(-1).event_time
if (last && !this._isSubscriptionStatusCurrentlyActive(statusArray.at(-1))) {
end = statusArray.at(-1).event_time
}

return { start, end }
Expand Down
30 changes: 28 additions & 2 deletions test/spec/index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,31 @@ describe('PaddleIntegration', () => {
})

describe('.getStartAndEndDates', () => {
it('returns dates for each known subscription plan id', async () => {
const subscriptionId = uuid()
const startTimeString = new Date().toISOString()
const createPayload = Object.assign({}, subscriptionCreated,
{
subscription_id: subscriptionId,
passthrough: JSON.stringify({ ids }),
event_time: startTimeString
}
)
await paddleIntegration.addSubscriptionCreatedStatus(createPayload)
const createPayload2 = Object.assign({}, subscriptionCreated,
{
subscription_id: subscriptionId,
passthrough: JSON.stringify({ ids }),
event_time: startTimeString,
subscription_plan_id: '4'
}
)
await paddleIntegration.addSubscriptionCreatedStatus(createPayload2)

const { subscription: sub } = await storage.get(ids)
const dates = await paddleIntegration.getStartAndEndDates(sub)
expect(dates).to.have.keys(createPayload.subscription_plan_id, createPayload2.subscription_plan_id)
})
it('returns only start date if theres no end date', async () => {
const subscriptionId = uuid()
const startTimeString = new Date().toISOString()
Expand All @@ -412,7 +437,7 @@ describe('PaddleIntegration', () => {
await paddleIntegration.addSubscriptionCreatedStatus(createPayload)

const { subscription: sub } = await storage.get(ids)
const { start, end } = await paddleIntegration.getStartAndEndDates(sub)
const { [createPayload.subscription_plan_id]: { start, end } } = await paddleIntegration.getStartAndEndDates(sub)
expect(start).to.equal(startTimeString)
expect(end).to.be.null
})
Expand Down Expand Up @@ -440,7 +465,7 @@ describe('PaddleIntegration', () => {
await paddleIntegration.addSubscriptionCancelledStatus(payload)

const { subscription: sub } = await storage.get(ids)
const { start, end } = await paddleIntegration.getStartAndEndDates(sub)
const { [createPayload.subscription_plan_id]: { start, end } } = await paddleIntegration.getStartAndEndDates(sub)
expect(start).to.equal(startTimeString)
expect(end).to.equal(endTimeString)
})
Expand Down Expand Up @@ -557,6 +582,7 @@ describe('PaddleIntegration', () => {
)
await paddleIntegration.addSubscriptionCancelledStatus(cancelPayload)
})

it('returns a sorted listed of status per id', async () => {
const { subscription: sub } = await storage.get(ids)
const trail = await paddleIntegration.getStatusTrail(sub)
Expand Down

0 comments on commit 23538c6

Please sign in to comment.