@winible/winible-typed 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/migrations/20221111171432-is-deleted.js +13 -0
- package/dist/migrations/20221111171432-is-deleted.js.map +1 -0
- package/dist/scripts/cleanupRecurlyPlans.js +37 -0
- package/dist/scripts/cleanupRecurlyPlans.js.map +1 -0
- package/dist/scripts/createRecurlyPlans.js +4 -3
- package/dist/scripts/createRecurlyPlans.js.map +1 -1
- package/dist/scripts/payoutRecurlySubs.js +139 -0
- package/dist/scripts/payoutRecurlySubs.js.map +1 -0
- package/dist/src/index.js +0 -1
- package/dist/src/index.js.map +1 -1
- package/package.json +2 -3
- package/src/index.ts +0 -1
- package/src/recurly-sub.ts +0 -215
@@ -0,0 +1,13 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const sequelize_1 = require("sequelize");
|
4
|
+
exports.default = {
|
5
|
+
async up(queryInterface, sequelize) {
|
6
|
+
queryInterface.addColumn("media_assets", "is_deleted", {
|
7
|
+
type: sequelize_1.DataTypes.BOOLEAN,
|
8
|
+
defaultValue: false,
|
9
|
+
});
|
10
|
+
},
|
11
|
+
async down(queryInterface, sequelize) { },
|
12
|
+
};
|
13
|
+
//# sourceMappingURL=20221111171432-is-deleted.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"20221111171432-is-deleted.js","sourceRoot":"","sources":["../../migrations/20221111171432-is-deleted.ts"],"names":[],"mappings":";;AAAA,yCAAqE;AAErE,kBAAe;IACb,KAAK,CAAC,EAAE,CAAC,cAA8B,EAAE,SAAoB;QAC3D,cAAc,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,EAAE;YACrD,IAAI,EAAE,qBAAS,CAAC,OAAO;YACvB,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,cAA8B,EAAE,SAAoB,IAAG,CAAC;CACpE,CAAC"}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
3
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
4
|
+
var m = o[Symbol.asyncIterator], i;
|
5
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
6
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
7
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
8
|
+
};
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
10
|
+
const dotenv = require("dotenv");
|
11
|
+
dotenv.config();
|
12
|
+
const src_1 = require("../src");
|
13
|
+
const run = async () => {
|
14
|
+
var e_1, _a;
|
15
|
+
let listPager = src_1.recurlyInstance.listPlans({ params: { state: "active" } });
|
16
|
+
try {
|
17
|
+
for (var _b = __asyncValues(listPager.each()), _c; _c = await _b.next(), !_c.done;) {
|
18
|
+
const plan = _c.value;
|
19
|
+
await src_1.recurlyInstance.removePlan(plan.id);
|
20
|
+
}
|
21
|
+
}
|
22
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
23
|
+
finally {
|
24
|
+
try {
|
25
|
+
if (_c && !_c.done && (_a = _b.return)) await _a.call(_b);
|
26
|
+
}
|
27
|
+
finally { if (e_1) throw e_1.error; }
|
28
|
+
}
|
29
|
+
};
|
30
|
+
if (require.main === module) {
|
31
|
+
if (require.main === module) {
|
32
|
+
run().then(async () => {
|
33
|
+
console.log("Finished");
|
34
|
+
});
|
35
|
+
}
|
36
|
+
}
|
37
|
+
//# sourceMappingURL=cleanupRecurlyPlans.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"cleanupRecurlyPlans.js","sourceRoot":"","sources":["../../scripts/cleanupRecurlyPlans.ts"],"names":[],"mappings":";;;;;;;;;AAAA,iCAAkC;AAClC,MAAM,CAAC,MAAM,EAAE,CAAC;AAGhB,gCAAyC;AAEzC,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;;IACrB,IAAI,SAAS,GAAG,qBAAe,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;;QAE3E,KAAyB,IAAA,KAAA,cAAA,SAAS,CAAC,IAAI,EAAE,CAAA,IAAA;YAA9B,MAAM,IAAI,WAAA,CAAA;YACnB,MAAM,qBAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAG,CAAC,CAAC;SAC5C;;;;;;;;;AACH,CAAC,CAAC;AAEF,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;IAC3B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;QAC3B,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;KACJ;CACF"}
|
@@ -10,14 +10,15 @@ const run = async () => {
|
|
10
10
|
{
|
11
11
|
model: typed_model_1.PhoneOwner,
|
12
12
|
required: true,
|
13
|
-
where: {
|
14
|
-
|
15
|
-
},
|
13
|
+
// where: {
|
14
|
+
// id: "1090340740690629290",
|
15
|
+
// },
|
16
16
|
attributes: ["name", "id"],
|
17
17
|
},
|
18
18
|
{
|
19
19
|
model: typed_model_1.SubscriptionPromotion,
|
20
20
|
required: false,
|
21
|
+
where: typed_model_1.SubscriptionPromotion.activeWhereClause(),
|
21
22
|
},
|
22
23
|
{
|
23
24
|
model: typed_model_1.SubscriptionBundle,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createRecurlyPlans.js","sourceRoot":"","sources":["../../scripts/createRecurlyPlans.ts"],"names":[],"mappings":";;AAAA,iCAAkC;AAClC,MAAM,CAAC,MAAM,EAAE,CAAC;AAMhB,gCAAyC;AAEzC,gDAMwB;AAExB,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;IACrB,MAAM,iBAAiB,GAAG,MAAM,8BAAgB,CAAC,OAAO,CAAC;QACvD,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,wBAAU;gBACjB,QAAQ,EAAE,IAAI;gBACd,
|
1
|
+
{"version":3,"file":"createRecurlyPlans.js","sourceRoot":"","sources":["../../scripts/createRecurlyPlans.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,139 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const dotenv = require("dotenv");
|
4
|
+
const typed_model_1 = require("../typed-model");
|
5
|
+
const sequelize_1 = require("sequelize");
|
6
|
+
const moment = require("moment");
|
7
|
+
const src_1 = require("../src");
|
8
|
+
dotenv.config();
|
9
|
+
class ActiveSub {
|
10
|
+
constructor(subscription, subscriptionPlan, owner, numRecurlyPayments, latestRecurlyPayment, recurlySubscription) {
|
11
|
+
this._subscription = subscription;
|
12
|
+
this._owner = owner;
|
13
|
+
this._subscriptionPlan = subscriptionPlan;
|
14
|
+
this._numRecurlyPayments = numRecurlyPayments;
|
15
|
+
this._latestRecurlyPayment = latestRecurlyPayment;
|
16
|
+
this._recurlySub = recurlySubscription;
|
17
|
+
}
|
18
|
+
isCanceledOnWinible() {
|
19
|
+
return !!this._subscription.cancelDate;
|
20
|
+
}
|
21
|
+
isCanceledOnRecurly() {
|
22
|
+
return ["canceled", "expired", "failed", "paused"].includes(this._recurlySub.state);
|
23
|
+
}
|
24
|
+
async cancelRecurlySubscription() {
|
25
|
+
console.log("cancelRecurlySubscription");
|
26
|
+
await src_1.recurlyInstance.cancelSubscription(this._subscription.recurlySubscriptionId);
|
27
|
+
}
|
28
|
+
async cancelWinibleSubscription() {
|
29
|
+
console.log("cancelWinibleSubscription");
|
30
|
+
this._subscription.cancelDate = moment(this._latestRecurlyPayment.createdAt)
|
31
|
+
.add(this._subscriptionPlan.intervalCount, this._subscriptionPlan.intervalUnit)
|
32
|
+
.toDate();
|
33
|
+
await this._subscription.save();
|
34
|
+
}
|
35
|
+
async chargeLatestPayment() {
|
36
|
+
console.log("Charge latest payment");
|
37
|
+
await typed_model_1.CreditPayments.logSubscriptionPayment(this._subscription.userId, this._owner, this._latestRecurlyPayment.total * 100, this._subscription, undefined, undefined);
|
38
|
+
this._subscription.numberOfPayments =
|
39
|
+
(this._subscription.numberOfPayments || 0) + 1;
|
40
|
+
this._subscription.lastPaymentDate = this._latestRecurlyPayment.createdAt;
|
41
|
+
await this._subscription.save();
|
42
|
+
}
|
43
|
+
getNumberOfRecurlyPayments() {
|
44
|
+
return this._numRecurlyPayments;
|
45
|
+
}
|
46
|
+
static async build(subscription, subscriptionPlan) {
|
47
|
+
const owner = await typed_model_1.PhoneOwner.getById(subscriptionPlan.ownerId);
|
48
|
+
if (!owner) {
|
49
|
+
throw new Error("No owner was tied to this subscription");
|
50
|
+
}
|
51
|
+
if (!subscription.recurlySubscriptionId) {
|
52
|
+
throw new Error("No recurlySubscriptionId for this subscription");
|
53
|
+
}
|
54
|
+
let numPayments = await src_1.recurlyInstance
|
55
|
+
.listSubscriptionInvoices(subscription.recurlySubscriptionId, {
|
56
|
+
params: {
|
57
|
+
type: "charge",
|
58
|
+
},
|
59
|
+
})
|
60
|
+
.count();
|
61
|
+
console.log("Num payments: " + numPayments);
|
62
|
+
let latestRecurlyPayment = await src_1.recurlyInstance
|
63
|
+
.listSubscriptionInvoices(subscription.recurlySubscriptionId, {
|
64
|
+
params: {
|
65
|
+
limit: 1,
|
66
|
+
order: "desc",
|
67
|
+
sort: "created_at",
|
68
|
+
type: "charge",
|
69
|
+
},
|
70
|
+
})
|
71
|
+
.first();
|
72
|
+
console.log("latestRecurlyPayment: " + latestRecurlyPayment);
|
73
|
+
let recurlySub = await src_1.recurlyInstance.getSubscription(subscription.recurlySubscriptionId);
|
74
|
+
return new ActiveSub(subscription, subscriptionPlan, owner, numPayments, latestRecurlyPayment, recurlySub);
|
75
|
+
}
|
76
|
+
}
|
77
|
+
const run = async () => {
|
78
|
+
let subs = await typed_model_1.Subscription.findAll({
|
79
|
+
where: sequelize_1.Sequelize.literal(`recurly_subscription_id IS NOT NULL`),
|
80
|
+
include: [
|
81
|
+
{
|
82
|
+
model: typed_model_1.SubscriptionPlan,
|
83
|
+
required: true,
|
84
|
+
},
|
85
|
+
],
|
86
|
+
});
|
87
|
+
console.log(subs.length);
|
88
|
+
for (let sub of subs) {
|
89
|
+
console.log("Starting sub: ", sub.id);
|
90
|
+
const activeSub = await ActiveSub.build(sub, sub.SubscriptionPlan).catch((err) => {
|
91
|
+
console.log(err);
|
92
|
+
});
|
93
|
+
if (!activeSub)
|
94
|
+
continue;
|
95
|
+
if (activeSub.getNumberOfRecurlyPayments() == sub.numberOfPayments) {
|
96
|
+
console.log("activeSub.getNumberOfRecurlyPayments(): " +
|
97
|
+
activeSub.getNumberOfRecurlyPayments());
|
98
|
+
console.log("sub.numberOfPayments: " + sub.numberOfPayments);
|
99
|
+
}
|
100
|
+
if (activeSub.getNumberOfRecurlyPayments() > sub.numberOfPayments) {
|
101
|
+
console.log("Should create credit payment.");
|
102
|
+
// There are still trial payments left
|
103
|
+
try {
|
104
|
+
await activeSub.chargeLatestPayment();
|
105
|
+
}
|
106
|
+
catch (err) {
|
107
|
+
console.log("Failed to create credit payment charge");
|
108
|
+
console.log(err);
|
109
|
+
}
|
110
|
+
}
|
111
|
+
// Check if subscription is canceled
|
112
|
+
if (activeSub.isCanceledOnWinible() && activeSub.isCanceledOnRecurly()) {
|
113
|
+
sub.stale = true;
|
114
|
+
await sub.save();
|
115
|
+
console.log("Canceled on everything. Skipping...");
|
116
|
+
continue;
|
117
|
+
}
|
118
|
+
if (!activeSub.isCanceledOnRecurly() && activeSub.isCanceledOnWinible()) {
|
119
|
+
console.log("They canceled it on Cliq");
|
120
|
+
try {
|
121
|
+
await activeSub.cancelRecurlySubscription();
|
122
|
+
}
|
123
|
+
catch (err) {
|
124
|
+
console.log("Failed to cancel authorize sub: " + err);
|
125
|
+
}
|
126
|
+
}
|
127
|
+
if (!activeSub.isCanceledOnWinible() && activeSub.isCanceledOnRecurly()) {
|
128
|
+
console.log("They cancelled it on authorize");
|
129
|
+
await activeSub.cancelWinibleSubscription();
|
130
|
+
}
|
131
|
+
}
|
132
|
+
};
|
133
|
+
if (require.main === module) {
|
134
|
+
run().then(async () => {
|
135
|
+
console.log("Finished");
|
136
|
+
process.exit(0);
|
137
|
+
});
|
138
|
+
}
|
139
|
+
//# sourceMappingURL=payoutRecurlySubs.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"payoutRecurlySubs.js","sourceRoot":"","sources":["../../scripts/payoutRecurlySubs.ts"],"names":[],"mappings":";;AAAA,iCAAkC;AAElC,gDAKwB;AAExB,yCAAsC;AAEtC,iCAAkC;AAClC,gCAAyC;AAGzC,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,SAAS;IAQb,YACE,YAA0B,EAC1B,gBAAkC,EAClC,KAAiB,EACjB,kBAA0B,EAC1B,oBAA6B,EAC7B,mBAAiC;QAEjC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;QAC9C,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC;IACzC,CAAC;IAED,mBAAmB;QACjB,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;IACzC,CAAC;IAED,mBAAmB;QACjB,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CACzD,IAAI,CAAC,WAAW,CAAC,KAAM,CACxB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,qBAAe,CAAC,kBAAkB,CACtC,IAAI,CAAC,aAAa,CAAC,qBAAsB,CAC1C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,MAAM,CACpC,IAAI,CAAC,qBAAqB,CAAC,SAAU,CACtC;aACE,GAAG,CACF,IAAI,CAAC,iBAAiB,CAAC,aAAa,EACpC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CACpC;aACA,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,MAAM,4BAAc,CAAC,sBAAsB,CACzC,IAAI,CAAC,aAAa,CAAC,MAAM,EACzB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,qBAAqB,CAAC,KAAM,GAAG,GAAG,EACvC,IAAI,CAAC,aAAa,EAClB,SAAS,EACT,SAAS,CACV,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,gBAAgB;YACjC,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,CAAC,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAU,CAAC;QAC3E,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,0BAA0B;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAChB,YAA0B,EAC1B,gBAAkC;QAElC,MAAM,KAAK,GAAG,MAAM,wBAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;SAC3D;QACD,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;SACnE;QAED,IAAI,WAAW,GAAG,MAAM,qBAAe;aACpC,wBAAwB,CAAC,YAAY,CAAC,qBAAsB,EAAE;YAC7D,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;aACf;SACF,CAAC;aACD,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,WAAW,CAAC,CAAC;QAE5C,IAAI,oBAAoB,GAAG,MAAM,qBAAe;aAC7C,wBAAwB,CAAC,YAAY,CAAC,qBAAsB,EAAE;YAC7D,MAAM,EAAE;gBACN,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,QAAQ;aACf;SACF,CAAC;aACD,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,oBAAoB,CAAC,CAAC;QAE7D,IAAI,UAAU,GAAG,MAAM,qBAAe,CAAC,eAAe,CACpD,YAAY,CAAC,qBAAqB,CACnC,CAAC;QAEF,OAAO,IAAI,SAAS,CAClB,YAAY,EACZ,gBAAgB,EAChB,KAAK,EACL,WAAW,EACX,oBAAoB,EACpB,UAAU,CACX,CAAC;IACJ,CAAC;CACF;AAED,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;IACrB,IAAI,IAAI,GAAQ,MAAM,0BAAY,CAAC,OAAO,CAAC;QACzC,KAAK,EAAE,qBAAS,CAAC,OAAO,CAAC,qCAAqC,CAAC;QAC/D,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,8BAAgB;gBACvB,QAAQ,EAAE,IAAI;aACf;SACF;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEzB,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE;QACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,KAAK,CACtE,CAAC,GAAG,EAAE,EAAE;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC,CACF,CAAC;QACF,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,IAAI,SAAS,CAAC,0BAA0B,EAAE,IAAI,GAAG,CAAC,gBAAgB,EAAE;YAClE,OAAO,CAAC,GAAG,CACT,0CAA0C;gBACxC,SAAS,CAAC,0BAA0B,EAAE,CACzC,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;SAC9D;QAED,IAAI,SAAS,CAAC,0BAA0B,EAAE,GAAG,GAAG,CAAC,gBAAgB,EAAE;YACjE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAE7C,sCAAsC;YACtC,IAAI;gBACF,MAAM,SAAS,CAAC,mBAAmB,EAAE,CAAC;aACvC;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAClB;SACF;QAED,oCAAoC;QACpC,IAAI,SAAS,CAAC,mBAAmB,EAAE,IAAI,SAAS,CAAC,mBAAmB,EAAE,EAAE;YACtE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;YACjB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,SAAS;SACV;QACD,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,SAAS,CAAC,mBAAmB,EAAE,EAAE;YACvE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,IAAI;gBACF,MAAM,SAAS,CAAC,yBAAyB,EAAE,CAAC;aAC7C;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,CAAC,GAAG,CAAC,kCAAkC,GAAG,GAAG,CAAC,CAAC;aACvD;SACF;QACD,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,SAAS,CAAC,mBAAmB,EAAE,EAAE;YACvE,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,yBAAyB,EAAE,CAAC;SAC7C;KACF;AACH,CAAC,CAAC;AAEF,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;IAC3B,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;CACJ"}
|
package/dist/src/index.js
CHANGED
@@ -21,7 +21,6 @@ exports.recurlyInstance = exports.pkClient = void 0;
|
|
21
21
|
var pk_client_1 = require("./pk-client");
|
22
22
|
Object.defineProperty(exports, "pkClient", { enumerable: true, get: function () { return __importDefault(pk_client_1).default; } });
|
23
23
|
__exportStar(require("./pk-sub"), exports);
|
24
|
-
__exportStar(require("./recurly-sub"), exports);
|
25
24
|
var recurlyInstance_1 = require("./recurlyInstance");
|
26
25
|
Object.defineProperty(exports, "recurlyInstance", { enumerable: true, get: function () { return __importDefault(recurlyInstance_1).default; } });
|
27
26
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,yCAAkD;AAAzC,sHAAA,OAAO,OAAY;AAC5B,2CAAyB;AACzB,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,yCAAkD;AAAzC,sHAAA,OAAO,OAAY;AAC5B,2CAAyB;AACzB,qDAA+D;AAAtD,mIAAA,OAAO,OAAmB"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@winible/winible-typed",
|
3
|
-
"version": "1.0.
|
3
|
+
"version": "1.0.2",
|
4
4
|
"description": "",
|
5
5
|
"main": "./dist/index.js",
|
6
6
|
"types": "./dist/index.d.ts",
|
@@ -50,7 +50,6 @@
|
|
50
50
|
"throng": "^5.0.0",
|
51
51
|
"ts-import": "^2.0.39",
|
52
52
|
"ts-node": "^10.0.0",
|
53
|
-
"tsc": "^2.0.4",
|
54
53
|
"twilio": "^3.51.0",
|
55
54
|
"uploadcare": "^0.4.7",
|
56
55
|
"vcards-js": "^2.10.0"
|
@@ -62,7 +61,7 @@
|
|
62
61
|
"@types/mixpanel": "^2.14.4",
|
63
62
|
"@types/node": "^17.0.36",
|
64
63
|
"@types/sequelize": "^4.28.13",
|
65
|
-
"typescript": "^4.
|
64
|
+
"typescript": "^4.8.4"
|
66
65
|
},
|
67
66
|
"files": [
|
68
67
|
"typed-model/**/*",
|
package/src/index.ts
CHANGED
package/src/recurly-sub.ts
DELETED
@@ -1,215 +0,0 @@
|
|
1
|
-
import PhoneUser from "../typed-model/phone-user";
|
2
|
-
import PhoneOwner from "../typed-model/phone-owner";
|
3
|
-
import Subscription from "../typed-model/subscription";
|
4
|
-
import SubscriptionPlan from "../typed-model/subscription-plan";
|
5
|
-
import SubscriptionBundle from "../typed-model/subscription-bundle";
|
6
|
-
import { TransactionData } from "./types";
|
7
|
-
|
8
|
-
import sequelize from "../typed-model/pb-sequelize";
|
9
|
-
import CreditPayments from "../typed-model/credit-payment";
|
10
|
-
import { ProcessorId } from "../typed-model/customer-profile";
|
11
|
-
|
12
|
-
import {
|
13
|
-
Account,
|
14
|
-
CreditPayment,
|
15
|
-
errors,
|
16
|
-
InvoiceCollection,
|
17
|
-
PurchaseCreate,
|
18
|
-
Subscription as RecurlySubscription,
|
19
|
-
} from "recurly";
|
20
|
-
import recurlyClient from "./recurlyInstance";
|
21
|
-
import {
|
22
|
-
SubscriptionInitException,
|
23
|
-
InvalidSubscriptionRequestException,
|
24
|
-
CliqSubscriptionCreationException,
|
25
|
-
CliqPaymentCreationException,
|
26
|
-
} from "./pk-sub";
|
27
|
-
|
28
|
-
export class RecurlySub {
|
29
|
-
user: PhoneUser;
|
30
|
-
creator: PhoneOwner;
|
31
|
-
subscriptionPlan: SubscriptionPlan;
|
32
|
-
trialAmount: number;
|
33
|
-
trialLength: number;
|
34
|
-
amountInCents: number;
|
35
|
-
intervalCount: number;
|
36
|
-
intervalUnit: "months" | "days";
|
37
|
-
account?: Account;
|
38
|
-
accountCode?: string;
|
39
|
-
|
40
|
-
constructor(
|
41
|
-
user: PhoneUser,
|
42
|
-
creator: PhoneOwner,
|
43
|
-
subscriptionPlan: SubscriptionPlan,
|
44
|
-
subscriptionBundle?: SubscriptionBundle,
|
45
|
-
isPreviouslySubscribed?: boolean,
|
46
|
-
account?: Account,
|
47
|
-
accountCode?: string
|
48
|
-
) {
|
49
|
-
this.user = user;
|
50
|
-
this.creator = creator;
|
51
|
-
this.subscriptionPlan = subscriptionPlan;
|
52
|
-
this.account = account;
|
53
|
-
this.accountCode = accountCode;
|
54
|
-
|
55
|
-
if (!user) {
|
56
|
-
throw new SubscriptionInitException("User cannot be null");
|
57
|
-
}
|
58
|
-
|
59
|
-
if (!creator || !creator.id) {
|
60
|
-
console.log(creator);
|
61
|
-
throw new SubscriptionInitException("Creator cannot be null");
|
62
|
-
}
|
63
|
-
|
64
|
-
var promotion =
|
65
|
-
subscriptionPlan.SubscriptionPromotions &&
|
66
|
-
subscriptionPlan.SubscriptionPromotions[0];
|
67
|
-
|
68
|
-
this.trialAmount = 0;
|
69
|
-
this.trialLength = 0;
|
70
|
-
this.amountInCents = subscriptionPlan.amountInCents!;
|
71
|
-
this.intervalCount = subscriptionPlan.intervalCount || 1;
|
72
|
-
this.intervalUnit = subscriptionPlan.intervalUnit || "months";
|
73
|
-
|
74
|
-
if (subscriptionBundle) {
|
75
|
-
promotion = null;
|
76
|
-
}
|
77
|
-
|
78
|
-
if (!isPreviouslySubscribed && promotion) {
|
79
|
-
this.trialAmount = Math.round(
|
80
|
-
(1 - promotion.trialDiscountPercentage) *
|
81
|
-
subscriptionPlan.amountInCents!
|
82
|
-
);
|
83
|
-
this.trialLength = promotion.trialLength;
|
84
|
-
}
|
85
|
-
|
86
|
-
if (subscriptionBundle) {
|
87
|
-
this.amountInCents = Math.round(
|
88
|
-
(1 - subscriptionBundle.bundleDiscountPercentage!) *
|
89
|
-
this.amountInCents *
|
90
|
-
subscriptionBundle.bundleIntervalCount!
|
91
|
-
);
|
92
|
-
this.intervalCount = subscriptionBundle.bundleIntervalCount!;
|
93
|
-
this.trialAmount = 0;
|
94
|
-
this.trialLength = 0;
|
95
|
-
}
|
96
|
-
}
|
97
|
-
|
98
|
-
async _initializeSubscription(): Promise<InvoiceCollection> {
|
99
|
-
try {
|
100
|
-
let subscriptionReq: PurchaseCreate = {
|
101
|
-
subscriptions: [
|
102
|
-
{
|
103
|
-
planCode: this.subscriptionPlan.id,
|
104
|
-
planId: this.subscriptionPlan.recurlyPlanId,
|
105
|
-
},
|
106
|
-
],
|
107
|
-
currency: `USD`,
|
108
|
-
account: {
|
109
|
-
code: this.accountCode,
|
110
|
-
...this.account,
|
111
|
-
},
|
112
|
-
};
|
113
|
-
return await recurlyClient.createPurchase(subscriptionReq);
|
114
|
-
} catch (err: any) {
|
115
|
-
if (err instanceof errors.ValidationError) {
|
116
|
-
// If the request was not valid, you may want to tell your user
|
117
|
-
// why. You can find the invalid params and reasons in err.params
|
118
|
-
console.log("Failed validation", err.params);
|
119
|
-
} else {
|
120
|
-
// If we don't know what to do with the err, we should
|
121
|
-
// probably re-raise and let our web framework and logger handle it
|
122
|
-
throw new InvalidSubscriptionRequestException(err);
|
123
|
-
}
|
124
|
-
}
|
125
|
-
throw new InvalidSubscriptionRequestException(
|
126
|
-
"No payment method for subscription"
|
127
|
-
);
|
128
|
-
}
|
129
|
-
|
130
|
-
/*
|
131
|
-
1) Start SQL transaction
|
132
|
-
2) Create sequelize updates
|
133
|
-
- Create first payment
|
134
|
-
- Create subscription
|
135
|
-
3) Create first charge
|
136
|
-
- If charge fails, rollback transaction
|
137
|
-
4) Create subscription
|
138
|
-
- If subscription fails
|
139
|
-
- Refund transaction
|
140
|
-
- Rollback transaction
|
141
|
-
5) Commit transaction
|
142
|
-
*/
|
143
|
-
|
144
|
-
async buildSubscription(): Promise<{
|
145
|
-
subscription: Subscription;
|
146
|
-
creditPayment: CreditPayment;
|
147
|
-
recurlyInvoice: InvoiceCollection;
|
148
|
-
}> {
|
149
|
-
let recurlyInvoice = await this._initializeSubscription();
|
150
|
-
let recurlySubscriptionId =
|
151
|
-
recurlyInvoice &&
|
152
|
-
recurlyInvoice.chargeInvoice &&
|
153
|
-
recurlyInvoice.chargeInvoice.subscriptionIds &&
|
154
|
-
recurlyInvoice.chargeInvoice.subscriptionIds![0];
|
155
|
-
|
156
|
-
let recurlyTransaction = recurlyInvoice.chargeInvoice!.transactions![0];
|
157
|
-
|
158
|
-
if (!recurlySubscriptionId) {
|
159
|
-
throw new Error("Subscription failed to create");
|
160
|
-
}
|
161
|
-
|
162
|
-
let transaction = await sequelize.transaction();
|
163
|
-
let subscription;
|
164
|
-
try {
|
165
|
-
subscription = await Subscription.create(
|
166
|
-
{
|
167
|
-
userId: this.user.id,
|
168
|
-
subscriptionPlanId: this.subscriptionPlan.id,
|
169
|
-
lastPaymentDate: new Date(),
|
170
|
-
cancelDate: this.subscriptionPlan.accessEndDate || undefined,
|
171
|
-
processorId: ProcessorId.RECURLY,
|
172
|
-
recurlySubscriptionId: recurlySubscriptionId!,
|
173
|
-
},
|
174
|
-
{ transaction }
|
175
|
-
);
|
176
|
-
} catch (err) {
|
177
|
-
console.log(err);
|
178
|
-
await transaction.rollback();
|
179
|
-
await recurlyClient.voidInvoice(recurlyInvoice.chargeInvoice?.id!);
|
180
|
-
throw new CliqSubscriptionCreationException(
|
181
|
-
"Failed to create subscription in CLIQ"
|
182
|
-
);
|
183
|
-
}
|
184
|
-
|
185
|
-
let creditPayment;
|
186
|
-
try {
|
187
|
-
if (subscription) {
|
188
|
-
creditPayment = await CreditPayments.logSubscriptionPayment(
|
189
|
-
this.user.id,
|
190
|
-
this.creator,
|
191
|
-
recurlyTransaction.amount!,
|
192
|
-
subscription,
|
193
|
-
transaction
|
194
|
-
);
|
195
|
-
}
|
196
|
-
} catch (err) {
|
197
|
-
console.log(err);
|
198
|
-
await transaction.rollback();
|
199
|
-
// Void first transaction
|
200
|
-
await recurlyClient.voidInvoice(recurlyInvoice.chargeInvoice?.id!);
|
201
|
-
throw new CliqPaymentCreationException();
|
202
|
-
}
|
203
|
-
|
204
|
-
await transaction.commit();
|
205
|
-
if (subscription) {
|
206
|
-
subscription.recurlySubscriptionId = recurlySubscriptionId;
|
207
|
-
await subscription.save();
|
208
|
-
}
|
209
|
-
return {
|
210
|
-
subscription,
|
211
|
-
creditPayment,
|
212
|
-
recurlyInvoice,
|
213
|
-
};
|
214
|
-
}
|
215
|
-
}
|