@winible/winible-typed 1.0.0
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/README.md +32 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/20220601151258-custom_name_describing_your_migration.js +19 -0
- package/dist/migrations/20220601151258-custom_name_describing_your_migration.js.map +1 -0
- package/dist/migrations/20220605225655-create-dashboard-user-permissions.js +27 -0
- package/dist/migrations/20220605225655-create-dashboard-user-permissions.js.map +1 -0
- package/dist/migrations/20220606001300-update-dashboard-user-permissions.js +14 -0
- package/dist/migrations/20220606001300-update-dashboard-user-permissions.js.map +1 -0
- package/dist/migrations/20220607091109-add-read-date-for-message.js +19 -0
- package/dist/migrations/20220607091109-add-read-date-for-message.js.map +1 -0
- package/dist/migrations/20220616225456-add-delete-columns.js +21 -0
- package/dist/migrations/20220616225456-add-delete-columns.js.map +1 -0
- package/dist/migrations/20220709202211-disable-feed.js +24 -0
- package/dist/migrations/20220709202211-disable-feed.js.map +1 -0
- package/dist/migrations/20220723215213-limit-promotion-claims.js +18 -0
- package/dist/migrations/20220723215213-limit-promotion-claims.js.map +1 -0
- package/dist/migrations/20220723220233-num_claims.js +12 -0
- package/dist/migrations/20220723220233-num_claims.js.map +1 -0
- package/dist/migrations/20220723221907-default_false_promos.js +17 -0
- package/dist/migrations/20220723221907-default_false_promos.js.map +1 -0
- package/dist/migrations/20220724172559-default_zero_claims.js +13 -0
- package/dist/migrations/20220724172559-default_zero_claims.js.map +1 -0
- package/dist/migrations/20220724201419-pinned_post.js +13 -0
- package/dist/migrations/20220724201419-pinned_post.js.map +1 -0
- package/dist/migrations/20220729164625-unsend_mass.js +12 -0
- package/dist/migrations/20220729164625-unsend_mass.js.map +1 -0
- package/dist/migrations/20220823033002-interval-unit.js +14 -0
- package/dist/migrations/20220823033002-interval-unit.js.map +1 -0
- package/dist/migrations/20220830193530-processorId.js +15 -0
- package/dist/migrations/20220830193530-processorId.js.map +1 -0
- package/dist/migrations/20220907121932-add-processor-to-sub.js +15 -0
- package/dist/migrations/20220907121932-add-processor-to-sub.js.map +1 -0
- package/dist/migrations/20220907212232-add-trans-id.js +12 -0
- package/dist/migrations/20220907212232-add-trans-id.js.map +1 -0
- package/dist/migrations/20220907220423-big-int-trans.js +12 -0
- package/dist/migrations/20220907220423-big-int-trans.js.map +1 -0
- package/dist/migrations/20220909161902-add-stale.js +13 -0
- package/dist/migrations/20220909161902-add-stale.js.map +1 -0
- package/dist/migrations/20220922000225-verified-spender.js +13 -0
- package/dist/migrations/20220922000225-verified-spender.js.map +1 -0
- package/dist/migrations/20220922212108-verified-spender-2.js +16 -0
- package/dist/migrations/20220922212108-verified-spender-2.js.map +1 -0
- package/dist/migrations/20221013223648-product-subscription-list.js +12 -0
- package/dist/migrations/20221013223648-product-subscription-list.js.map +1 -0
- package/dist/migrations/20221014001037-product-subscription-list.js +75 -0
- package/dist/migrations/20221014001037-product-subscription-list.js.map +1 -0
- package/dist/migrations/20221026055245-update-type.js +15 -0
- package/dist/migrations/20221026055245-update-type.js.map +1 -0
- package/dist/scripts/authorizeTransfer.js +188 -0
- package/dist/scripts/authorizeTransfer.js.map +1 -0
- package/dist/scripts/createDashboardLink.js +30 -0
- package/dist/scripts/createDashboardLink.js.map +1 -0
- package/dist/scripts/deleteMalformedImages.js +84 -0
- package/dist/scripts/deleteMalformedImages.js.map +1 -0
- package/dist/scripts/importMixpanelEvents.js +44 -0
- package/dist/scripts/importMixpanelEvents.js.map +1 -0
- package/dist/scripts/payoutSubscriptions.js +185 -0
- package/dist/scripts/payoutSubscriptions.js.map +1 -0
- package/dist/scripts/removeUnreferenceSubs.js +39 -0
- package/dist/scripts/removeUnreferenceSubs.js.map +1 -0
- package/dist/scripts/test.js +33 -0
- package/dist/scripts/test.js.map +1 -0
- package/dist/server/index.js +30 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middlewares/slack-auth.js +40 -0
- package/dist/server/middlewares/slack-auth.js.map +1 -0
- package/dist/server/v1/bypassCreator.js +81 -0
- package/dist/server/v1/bypassCreator.js.map +1 -0
- package/dist/server/v1/cancelSubscription.js +35 -0
- package/dist/server/v1/cancelSubscription.js.map +1 -0
- package/dist/server/v1/changeName.js +41 -0
- package/dist/server/v1/changeName.js.map +1 -0
- package/dist/server/v1/checkAuthSub.js +58 -0
- package/dist/server/v1/checkAuthSub.js.map +1 -0
- package/dist/server/v1/dashboardLink.js +30 -0
- package/dist/server/v1/dashboardLink.js.map +1 -0
- package/dist/server/v1/getSuspendedSubs.js +76 -0
- package/dist/server/v1/getSuspendedSubs.js.map +1 -0
- package/dist/server/v1/index.js +28 -0
- package/dist/server/v1/index.js.map +1 -0
- package/dist/server/v1/manualCreateSub.js +159 -0
- package/dist/server/v1/manualCreateSub.js.map +1 -0
- package/dist/server/v1/refund.js +78 -0
- package/dist/server/v1/refund.js.map +1 -0
- package/dist/server/v1/retrySubscription.js +81 -0
- package/dist/server/v1/retrySubscription.js.map +1 -0
- package/dist/server/v1/searchUser.js +169 -0
- package/dist/server/v1/searchUser.js.map +1 -0
- package/dist/server/v1/slack.js +14 -0
- package/dist/server/v1/slack.js.map +1 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/pk-client.js +1103 -0
- package/dist/src/pk-client.js.map +1 -0
- package/dist/src/pk-sub.js +310 -0
- package/dist/src/pk-sub.js.map +1 -0
- package/dist/src/slack-client.js +48 -0
- package/dist/src/slack-client.js.map +1 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/dist/support/index.js +19 -0
- package/dist/support/index.js.map +1 -0
- package/dist/support/metrics.js +21 -0
- package/dist/support/metrics.js.map +1 -0
- package/dist/support/mixpanel.js +7 -0
- package/dist/support/mixpanel.js.map +1 -0
- package/dist/support/slack-client.js +51 -0
- package/dist/support/slack-client.js.map +1 -0
- package/dist/support/uploadcare.js +140 -0
- package/dist/support/uploadcare.js.map +1 -0
- package/dist/support/utils.js +69 -0
- package/dist/support/utils.js.map +1 -0
- package/dist/typed-model/asset-category.js +38 -0
- package/dist/typed-model/asset-category.js.map +1 -0
- package/dist/typed-model/asset-constent-person.js +56 -0
- package/dist/typed-model/asset-constent-person.js.map +1 -0
- package/dist/typed-model/blocked-ip.js +34 -0
- package/dist/typed-model/blocked-ip.js.map +1 -0
- package/dist/typed-model/category-tag.js +46 -0
- package/dist/typed-model/category-tag.js.map +1 -0
- package/dist/typed-model/consent-person.js +55 -0
- package/dist/typed-model/consent-person.js.map +1 -0
- package/dist/typed-model/content-category-tag.js +58 -0
- package/dist/typed-model/content-category-tag.js.map +1 -0
- package/dist/typed-model/content-like.js +58 -0
- package/dist/typed-model/content-like.js.map +1 -0
- package/dist/typed-model/credit-payment.js +389 -0
- package/dist/typed-model/credit-payment.js.map +1 -0
- package/dist/typed-model/credit-payout.js +42 -0
- package/dist/typed-model/credit-payout.js.map +1 -0
- package/dist/typed-model/credit-purchase.js +46 -0
- package/dist/typed-model/credit-purchase.js.map +1 -0
- package/dist/typed-model/customer-profile.js +51 -0
- package/dist/typed-model/customer-profile.js.map +1 -0
- package/dist/typed-model/dashboard-user-permissions.js +34 -0
- package/dist/typed-model/dashboard-user-permissions.js.map +1 -0
- package/dist/typed-model/dashboard-user.js +109 -0
- package/dist/typed-model/dashboard-user.js.map +1 -0
- package/dist/typed-model/fan-list.js +46 -0
- package/dist/typed-model/fan-list.js.map +1 -0
- package/dist/typed-model/fraud.js +41 -0
- package/dist/typed-model/fraud.js.map +1 -0
- package/dist/typed-model/index.js +101 -0
- package/dist/typed-model/index.js.map +1 -0
- package/dist/typed-model/list-member.js +47 -0
- package/dist/typed-model/list-member.js.map +1 -0
- package/dist/typed-model/mass-message.js +43 -0
- package/dist/typed-model/mass-message.js.map +1 -0
- package/dist/typed-model/media-asset.js +73 -0
- package/dist/typed-model/media-asset.js.map +1 -0
- package/dist/typed-model/media-category.js +49 -0
- package/dist/typed-model/media-category.js.map +1 -0
- package/dist/typed-model/media.js +59 -0
- package/dist/typed-model/media.js.map +1 -0
- package/dist/typed-model/message-media.js +53 -0
- package/dist/typed-model/message-media.js.map +1 -0
- package/dist/typed-model/message.js +191 -0
- package/dist/typed-model/message.js.map +1 -0
- package/dist/typed-model/notification.js +84 -0
- package/dist/typed-model/notification.js.map +1 -0
- package/dist/typed-model/pb-sequelize.js +25 -0
- package/dist/typed-model/pb-sequelize.js.map +1 -0
- package/dist/typed-model/phone-chat-participation.js +127 -0
- package/dist/typed-model/phone-chat-participation.js.map +1 -0
- package/dist/typed-model/phone-chat.js +118 -0
- package/dist/typed-model/phone-chat.js.map +1 -0
- package/dist/typed-model/phone-owner.js +266 -0
- package/dist/typed-model/phone-owner.js.map +1 -0
- package/dist/typed-model/phone-user.js +109 -0
- package/dist/typed-model/phone-user.js.map +1 -0
- package/dist/typed-model/premium-content.js +123 -0
- package/dist/typed-model/premium-content.js.map +1 -0
- package/dist/typed-model/purchased-content.js +69 -0
- package/dist/typed-model/purchased-content.js.map +1 -0
- package/dist/typed-model/short-url.js +88 -0
- package/dist/typed-model/short-url.js.map +1 -0
- package/dist/typed-model/subscription-bundle.js +53 -0
- package/dist/typed-model/subscription-bundle.js.map +1 -0
- package/dist/typed-model/subscription-category-tags.js +58 -0
- package/dist/typed-model/subscription-category-tags.js.map +1 -0
- package/dist/typed-model/subscription-plan.js +126 -0
- package/dist/typed-model/subscription-plan.js.map +1 -0
- package/dist/typed-model/subscription-promotion.js +93 -0
- package/dist/typed-model/subscription-promotion.js.map +1 -0
- package/dist/typed-model/subscription.js +123 -0
- package/dist/typed-model/subscription.js.map +1 -0
- package/dist/typed-model/twilio-phone.js +92 -0
- package/dist/typed-model/twilio-phone.js.map +1 -0
- package/dist/typed-model/user-follow.js +103 -0
- package/dist/typed-model/user-follow.js.map +1 -0
- package/dist/typed-model/verification-code.js +52 -0
- package/dist/typed-model/verification-code.js.map +1 -0
- package/index.ts +3 -0
- package/package.json +72 -0
- package/src/index.ts +2 -0
- package/src/pk-client.ts +1650 -0
- package/src/pk-sub.ts +455 -0
- package/src/types.ts +40 -0
- package/support/index.ts +2 -0
- package/support/slack-client.ts +43 -0
- package/support/uploadcare.ts +191 -0
- package/support/utils.ts +72 -0
- package/typed-model/asset-category.ts +57 -0
- package/typed-model/asset-constent-person.ts +82 -0
- package/typed-model/blocked-ip.ts +52 -0
- package/typed-model/category-tag.ts +66 -0
- package/typed-model/consent-person.ts +78 -0
- package/typed-model/content-category-tag.ts +79 -0
- package/typed-model/content-like.ts +79 -0
- package/typed-model/credit-payment.ts +678 -0
- package/typed-model/credit-payout.ts +62 -0
- package/typed-model/credit-purchase.ts +67 -0
- package/typed-model/customer-profile.ts +70 -0
- package/typed-model/dashboard-user-permissions.ts +51 -0
- package/typed-model/dashboard-user.ts +146 -0
- package/typed-model/fan-list.ts +68 -0
- package/typed-model/fraud.ts +62 -0
- package/typed-model/index.ts +58 -0
- package/typed-model/list-member.ts +67 -0
- package/typed-model/mass-message.ts +64 -0
- package/typed-model/media-asset.ts +99 -0
- package/typed-model/media-category.ts +70 -0
- package/typed-model/media.ts +85 -0
- package/typed-model/message-media.ts +74 -0
- package/typed-model/message.ts +258 -0
- package/typed-model/notification.ts +130 -0
- package/typed-model/pb-sequelize.ts +25 -0
- package/typed-model/phone-chat-participation.ts +166 -0
- package/typed-model/phone-chat.ts +185 -0
- package/typed-model/phone-owner.ts +341 -0
- package/typed-model/phone-user.ts +146 -0
- package/typed-model/premium-content.ts +164 -0
- package/typed-model/purchased-content.ts +100 -0
- package/typed-model/short-url.ts +120 -0
- package/typed-model/subscription-bundle.ts +75 -0
- package/typed-model/subscription-category-tags.ts +79 -0
- package/typed-model/subscription-plan.ts +171 -0
- package/typed-model/subscription-promotion.ts +125 -0
- package/typed-model/subscription.ts +170 -0
- package/typed-model/twilio-phone.ts +149 -0
- package/typed-model/user-follow.ts +141 -0
- package/typed-model/verification-code.ts +74 -0
@@ -0,0 +1,100 @@
|
|
1
|
+
import {
|
2
|
+
Model,
|
3
|
+
InferAttributes,
|
4
|
+
InferCreationAttributes,
|
5
|
+
CreationOptional,
|
6
|
+
DataTypes,
|
7
|
+
fn,
|
8
|
+
NOW,
|
9
|
+
} from "sequelize";
|
10
|
+
|
11
|
+
import sequelize from "./pb-sequelize";
|
12
|
+
import PremiumContent from "./premium-content";
|
13
|
+
import Notification from "./notification";
|
14
|
+
|
15
|
+
// order of InferAttributes & InferCreationAttributes is important.
|
16
|
+
class PurchasedContent extends Model<
|
17
|
+
InferAttributes<PurchasedContent>,
|
18
|
+
InferCreationAttributes<PurchasedContent>
|
19
|
+
> {
|
20
|
+
// 'CreationOptional' is a special type that marks the field as optional
|
21
|
+
// when creating an instance of the model (such as using Model.create()).
|
22
|
+
declare id: CreationOptional<string>;
|
23
|
+
declare userId: string;
|
24
|
+
declare contentId: string;
|
25
|
+
declare createdAt: CreationOptional<Date>;
|
26
|
+
declare updatedAt: CreationOptional<Date>;
|
27
|
+
static getById: (id: string) => Promise<PurchasedContent | null>;
|
28
|
+
static getPurchasedContentByUserFromOwner: (
|
29
|
+
userId: string,
|
30
|
+
ownerId: string
|
31
|
+
) => Promise<PurchasedContent>;
|
32
|
+
}
|
33
|
+
|
34
|
+
PurchasedContent.init(
|
35
|
+
{
|
36
|
+
id: {
|
37
|
+
type: DataTypes.BIGINT,
|
38
|
+
primaryKey: true,
|
39
|
+
allowNull: false,
|
40
|
+
defaultValue: sequelize.fn("next_id"),
|
41
|
+
},
|
42
|
+
userId: {
|
43
|
+
type: DataTypes.BIGINT,
|
44
|
+
allowNull: false,
|
45
|
+
field: "user_id",
|
46
|
+
},
|
47
|
+
contentId: {
|
48
|
+
type: DataTypes.BIGINT,
|
49
|
+
allowNull: false,
|
50
|
+
field: "content_id",
|
51
|
+
},
|
52
|
+
createdAt: DataTypes.DATE,
|
53
|
+
updatedAt: DataTypes.DATE,
|
54
|
+
},
|
55
|
+
{
|
56
|
+
tableName: "purchased_contents",
|
57
|
+
sequelize,
|
58
|
+
}
|
59
|
+
);
|
60
|
+
|
61
|
+
/*
|
62
|
+
====================================================================
|
63
|
+
Class functions
|
64
|
+
====================================================================
|
65
|
+
*/
|
66
|
+
|
67
|
+
PurchasedContent.getById = async (id: string) => {
|
68
|
+
return await PurchasedContent.findOne({
|
69
|
+
where: {
|
70
|
+
id,
|
71
|
+
},
|
72
|
+
});
|
73
|
+
};
|
74
|
+
|
75
|
+
PurchasedContent.getPurchasedContentByUserFromOwner = async (
|
76
|
+
userId: string,
|
77
|
+
ownerId: string
|
78
|
+
) => {
|
79
|
+
let response = await PurchasedContent.findAll({
|
80
|
+
where: {
|
81
|
+
userId,
|
82
|
+
},
|
83
|
+
include: [
|
84
|
+
{
|
85
|
+
model: PremiumContent,
|
86
|
+
required: true,
|
87
|
+
where: { ownerId },
|
88
|
+
},
|
89
|
+
],
|
90
|
+
});
|
91
|
+
return response && response[0];
|
92
|
+
};
|
93
|
+
|
94
|
+
Notification.hasOne(PurchasedContent, {
|
95
|
+
foreignKey: "id",
|
96
|
+
sourceKey: "purchasedContentId",
|
97
|
+
constraints: false,
|
98
|
+
});
|
99
|
+
|
100
|
+
export default PurchasedContent;
|
@@ -0,0 +1,120 @@
|
|
1
|
+
import {
|
2
|
+
Model,
|
3
|
+
InferAttributes,
|
4
|
+
InferCreationAttributes,
|
5
|
+
CreationOptional,
|
6
|
+
DataTypes,
|
7
|
+
fn,
|
8
|
+
} from "sequelize";
|
9
|
+
|
10
|
+
import sequelize from "./pb-sequelize";
|
11
|
+
|
12
|
+
// order of InferAttributes & InferCreationAttributes is important.
|
13
|
+
class ShortUrl extends Model<
|
14
|
+
InferAttributes<ShortUrl>,
|
15
|
+
InferCreationAttributes<ShortUrl>
|
16
|
+
> {
|
17
|
+
// 'CreationOptional' is a special type that marks the field as optional
|
18
|
+
// when creating an instance of the model (such as using Model.create()).
|
19
|
+
declare id: CreationOptional<string>;
|
20
|
+
declare shortCode: string;
|
21
|
+
declare longUrl: string;
|
22
|
+
declare createdAt: CreationOptional<Date>;
|
23
|
+
declare updatedAt: CreationOptional<Date>;
|
24
|
+
static createShortUrl: (longUrl: string) => Promise<string>;
|
25
|
+
static customShortUrl: (
|
26
|
+
longUrl: string,
|
27
|
+
shortCode: string
|
28
|
+
) => Promise<string>;
|
29
|
+
static getByShortCode: (shortCode: string) => Promise<ShortUrl | null>;
|
30
|
+
}
|
31
|
+
|
32
|
+
ShortUrl.init(
|
33
|
+
{
|
34
|
+
id: {
|
35
|
+
type: DataTypes.BIGINT,
|
36
|
+
primaryKey: true,
|
37
|
+
allowNull: false,
|
38
|
+
defaultValue: sequelize.fn("next_id"),
|
39
|
+
},
|
40
|
+
shortCode: {
|
41
|
+
type: DataTypes.STRING,
|
42
|
+
allowNull: false,
|
43
|
+
field: "short_code",
|
44
|
+
unique: true,
|
45
|
+
},
|
46
|
+
longUrl: {
|
47
|
+
type: DataTypes.STRING(500),
|
48
|
+
allowNull: false,
|
49
|
+
field: "long_url",
|
50
|
+
},
|
51
|
+
createdAt: DataTypes.DATE,
|
52
|
+
updatedAt: DataTypes.DATE,
|
53
|
+
},
|
54
|
+
{
|
55
|
+
// Other model options go here
|
56
|
+
tableName: "short_urls",
|
57
|
+
sequelize,
|
58
|
+
}
|
59
|
+
);
|
60
|
+
|
61
|
+
/*
|
62
|
+
====================================================================
|
63
|
+
Class functions
|
64
|
+
====================================================================
|
65
|
+
*/
|
66
|
+
|
67
|
+
function randomString(length: number, chars: string) {
|
68
|
+
var result = "";
|
69
|
+
for (var i = length; i > 0; --i)
|
70
|
+
result += chars[Math.floor(Math.random() * chars.length)];
|
71
|
+
return result;
|
72
|
+
}
|
73
|
+
|
74
|
+
ShortUrl.createShortUrl = async (longUrl: string) => {
|
75
|
+
const shortCode = randomString(
|
76
|
+
7,
|
77
|
+
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
78
|
+
);
|
79
|
+
|
80
|
+
if (!process.env.SHORT_URL) {
|
81
|
+
return longUrl;
|
82
|
+
}
|
83
|
+
|
84
|
+
try {
|
85
|
+
await ShortUrl.create({
|
86
|
+
shortCode,
|
87
|
+
longUrl,
|
88
|
+
});
|
89
|
+
return process.env.SHORT_URL + shortCode;
|
90
|
+
} catch (err) {
|
91
|
+
console.log(err);
|
92
|
+
return longUrl;
|
93
|
+
}
|
94
|
+
};
|
95
|
+
|
96
|
+
ShortUrl.customShortUrl = async (longUrl: string, shortCode: string) => {
|
97
|
+
if (!process.env.SHORT_URL) {
|
98
|
+
return longUrl;
|
99
|
+
}
|
100
|
+
|
101
|
+
try {
|
102
|
+
await ShortUrl.create({
|
103
|
+
shortCode,
|
104
|
+
longUrl,
|
105
|
+
});
|
106
|
+
return process.env.SHORT_URL + shortCode;
|
107
|
+
} catch (err) {
|
108
|
+
console.log(err);
|
109
|
+
return longUrl;
|
110
|
+
}
|
111
|
+
};
|
112
|
+
|
113
|
+
ShortUrl.getByShortCode = async (shortCode: string) => {
|
114
|
+
return await ShortUrl.findOne({
|
115
|
+
where: {
|
116
|
+
shortCode,
|
117
|
+
},
|
118
|
+
});
|
119
|
+
};
|
120
|
+
export default ShortUrl;
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import {
|
2
|
+
Model,
|
3
|
+
InferAttributes,
|
4
|
+
InferCreationAttributes,
|
5
|
+
CreationOptional,
|
6
|
+
DataTypes,
|
7
|
+
fn,
|
8
|
+
NOW,
|
9
|
+
} from "sequelize";
|
10
|
+
|
11
|
+
import sequelize from "./pb-sequelize";
|
12
|
+
import SubscriptionPlan from "./subscription-plan";
|
13
|
+
|
14
|
+
// order of InferAttributes & InferCreationAttributes is important.
|
15
|
+
class SubscriptionBundle extends Model<
|
16
|
+
InferAttributes<SubscriptionBundle>,
|
17
|
+
InferCreationAttributes<SubscriptionBundle>
|
18
|
+
> {
|
19
|
+
// 'CreationOptional' is a special type that marks the field as optional
|
20
|
+
// when creating an instance of the model (such as using Model.create()).
|
21
|
+
declare id: CreationOptional<string>;
|
22
|
+
declare subscriptionPlanId: string;
|
23
|
+
declare bundleIntervalCount?: number;
|
24
|
+
declare bundleDiscountPercentage?: number;
|
25
|
+
declare isActive?: boolean;
|
26
|
+
declare createdAt: CreationOptional<Date>;
|
27
|
+
declare updatedAt: CreationOptional<Date>;
|
28
|
+
}
|
29
|
+
|
30
|
+
SubscriptionBundle.init(
|
31
|
+
{
|
32
|
+
id: {
|
33
|
+
type: DataTypes.BIGINT,
|
34
|
+
primaryKey: true,
|
35
|
+
allowNull: false,
|
36
|
+
defaultValue: sequelize.fn("next_id"),
|
37
|
+
},
|
38
|
+
subscriptionPlanId: {
|
39
|
+
type: DataTypes.BIGINT,
|
40
|
+
allowNull: false,
|
41
|
+
field: "subscription_plan_id",
|
42
|
+
},
|
43
|
+
bundleIntervalCount: {
|
44
|
+
type: DataTypes.INTEGER,
|
45
|
+
field: "bundle_interval_count",
|
46
|
+
defaultValue: 0,
|
47
|
+
},
|
48
|
+
bundleDiscountPercentage: {
|
49
|
+
type: DataTypes.FLOAT,
|
50
|
+
field: "bundle_discount_percentage",
|
51
|
+
},
|
52
|
+
isActive: {
|
53
|
+
type: DataTypes.BOOLEAN,
|
54
|
+
field: "is_active",
|
55
|
+
defaultValue: true,
|
56
|
+
},
|
57
|
+
createdAt: DataTypes.DATE,
|
58
|
+
updatedAt: DataTypes.DATE,
|
59
|
+
},
|
60
|
+
{
|
61
|
+
tableName: "subscription_bundles",
|
62
|
+
sequelize,
|
63
|
+
}
|
64
|
+
);
|
65
|
+
|
66
|
+
SubscriptionBundle.hasOne(SubscriptionPlan, {
|
67
|
+
foreignKey: "id",
|
68
|
+
sourceKey: "subscriptionPlanId",
|
69
|
+
});
|
70
|
+
SubscriptionPlan.hasMany(SubscriptionBundle, {
|
71
|
+
foreignKey: "subscription_plan_id",
|
72
|
+
sourceKey: "id",
|
73
|
+
});
|
74
|
+
|
75
|
+
export default SubscriptionBundle;
|
@@ -0,0 +1,79 @@
|
|
1
|
+
import {
|
2
|
+
Model,
|
3
|
+
InferAttributes,
|
4
|
+
InferCreationAttributes,
|
5
|
+
CreationOptional,
|
6
|
+
DataTypes,
|
7
|
+
fn,
|
8
|
+
} from "sequelize";
|
9
|
+
import { SubscriptionPlan } from ".";
|
10
|
+
import CategoryTag from "./category-tag";
|
11
|
+
|
12
|
+
import sequelize from "./pb-sequelize";
|
13
|
+
|
14
|
+
// order of InferAttributes & InferCreationAttributes is important.
|
15
|
+
class SubscriptionCategoryTag extends Model<
|
16
|
+
InferAttributes<SubscriptionCategoryTag>,
|
17
|
+
InferCreationAttributes<SubscriptionCategoryTag>
|
18
|
+
> {
|
19
|
+
// 'CreationOptional' is a special type that marks the field as optional
|
20
|
+
// when creating an instance of the model (such as using Model.create()).
|
21
|
+
declare id: CreationOptional<string>;
|
22
|
+
declare subscriptionPlanId: string;
|
23
|
+
declare tagId: string;
|
24
|
+
|
25
|
+
declare createdAt: CreationOptional<Date>;
|
26
|
+
declare updatedAt: CreationOptional<Date>;
|
27
|
+
}
|
28
|
+
|
29
|
+
SubscriptionCategoryTag.init(
|
30
|
+
{
|
31
|
+
id: {
|
32
|
+
type: DataTypes.BIGINT,
|
33
|
+
primaryKey: true,
|
34
|
+
allowNull: false,
|
35
|
+
defaultValue: sequelize.fn("next_id"),
|
36
|
+
},
|
37
|
+
subscriptionPlanId: {
|
38
|
+
type: DataTypes.BIGINT,
|
39
|
+
field: "subscription_plan_id",
|
40
|
+
},
|
41
|
+
tagId: {
|
42
|
+
type: DataTypes.BIGINT,
|
43
|
+
field: "tag_id",
|
44
|
+
},
|
45
|
+
createdAt: DataTypes.DATE,
|
46
|
+
updatedAt: DataTypes.DATE,
|
47
|
+
},
|
48
|
+
{
|
49
|
+
sequelize,
|
50
|
+
tableName: "subscription_category_tags",
|
51
|
+
// Other model options go here
|
52
|
+
}
|
53
|
+
);
|
54
|
+
|
55
|
+
CategoryTag.hasMany(SubscriptionCategoryTag, {
|
56
|
+
foreignKey: "tag_id",
|
57
|
+
onDelete: "NO ACTION",
|
58
|
+
constraints: false,
|
59
|
+
});
|
60
|
+
SubscriptionCategoryTag.hasOne(CategoryTag, {
|
61
|
+
foreignKey: "id",
|
62
|
+
sourceKey: "tag_id",
|
63
|
+
onDelete: "NO ACTION",
|
64
|
+
constraints: false,
|
65
|
+
});
|
66
|
+
|
67
|
+
SubscriptionPlan.hasMany(SubscriptionCategoryTag, {
|
68
|
+
foreignKey: "subscription_plan_id",
|
69
|
+
onDelete: "NO ACTION",
|
70
|
+
constraints: false,
|
71
|
+
});
|
72
|
+
SubscriptionCategoryTag.hasOne(SubscriptionPlan, {
|
73
|
+
foreignKey: "id",
|
74
|
+
sourceKey: "subscription_plan_id",
|
75
|
+
onDelete: "NO ACTION",
|
76
|
+
constraints: false,
|
77
|
+
});
|
78
|
+
|
79
|
+
export default SubscriptionCategoryTag;
|
@@ -0,0 +1,171 @@
|
|
1
|
+
import {
|
2
|
+
Model,
|
3
|
+
InferAttributes,
|
4
|
+
InferCreationAttributes,
|
5
|
+
CreationOptional,
|
6
|
+
DataTypes,
|
7
|
+
fn,
|
8
|
+
NOW,
|
9
|
+
NonAttribute,
|
10
|
+
} from "sequelize";
|
11
|
+
|
12
|
+
import sequelize from "./pb-sequelize";
|
13
|
+
import PhoneOwner from "./phone-owner";
|
14
|
+
import Subscription from "./subscription";
|
15
|
+
import SubscriptionPromotion from "./subscription-promotion";
|
16
|
+
|
17
|
+
// order of InferAttributes & InferCreationAttributes is important.
|
18
|
+
class SubscriptionPlan extends Model<
|
19
|
+
InferAttributes<SubscriptionPlan>,
|
20
|
+
InferCreationAttributes<SubscriptionPlan>
|
21
|
+
> {
|
22
|
+
// 'CreationOptional' is a special type that marks the field as optional
|
23
|
+
// when creating an instance of the model (such as using Model.create()).
|
24
|
+
declare id: CreationOptional<string>;
|
25
|
+
declare ownerId: string;
|
26
|
+
declare planName?: string;
|
27
|
+
declare amountInCents?: number;
|
28
|
+
declare intervalCount?: number;
|
29
|
+
declare intervalUnit: CreationOptional<"months" | "days">;
|
30
|
+
declare paypalPlanId: string;
|
31
|
+
declare paypalProductId: string;
|
32
|
+
declare isArchived?: boolean;
|
33
|
+
declare productDescriptionList?: string[];
|
34
|
+
declare oneTimePurchase?: boolean;
|
35
|
+
declare accessEndDate?: Date;
|
36
|
+
declare createdAt: CreationOptional<Date>;
|
37
|
+
declare updatedAt: CreationOptional<Date>;
|
38
|
+
static getById: (id: string) => Promise<SubscriptionPlan | null>;
|
39
|
+
static getByOwnerId: (ownerId: string) => Promise<SubscriptionPlan | null>;
|
40
|
+
static getByPaypalPlanId: (
|
41
|
+
paypalPlanId: string
|
42
|
+
) => Promise<SubscriptionPlan | null>;
|
43
|
+
|
44
|
+
declare subscriptions?: NonAttribute<Subscription[]>;
|
45
|
+
declare SubscriptionPromotions?: NonAttribute<any[]>;
|
46
|
+
declare SubscriptionBundles?: NonAttribute<any[]>;
|
47
|
+
}
|
48
|
+
|
49
|
+
SubscriptionPlan.init(
|
50
|
+
{
|
51
|
+
id: {
|
52
|
+
type: DataTypes.BIGINT,
|
53
|
+
primaryKey: true,
|
54
|
+
allowNull: false,
|
55
|
+
defaultValue: sequelize.fn("next_id"),
|
56
|
+
},
|
57
|
+
ownerId: {
|
58
|
+
type: DataTypes.BIGINT,
|
59
|
+
allowNull: false,
|
60
|
+
field: "owner_id",
|
61
|
+
},
|
62
|
+
planName: {
|
63
|
+
type: DataTypes.STRING,
|
64
|
+
field: "plan_name",
|
65
|
+
},
|
66
|
+
amountInCents: {
|
67
|
+
type: DataTypes.INTEGER,
|
68
|
+
field: "amount_in_cents",
|
69
|
+
},
|
70
|
+
intervalCount: {
|
71
|
+
type: DataTypes.INTEGER,
|
72
|
+
field: "interval_count",
|
73
|
+
defaultValue: 1,
|
74
|
+
},
|
75
|
+
intervalUnit: {
|
76
|
+
type: DataTypes.STRING,
|
77
|
+
field: "interval_unit",
|
78
|
+
defaultValue: "months",
|
79
|
+
},
|
80
|
+
paypalPlanId: {
|
81
|
+
type: DataTypes.STRING,
|
82
|
+
field: "paypal_plan_id",
|
83
|
+
},
|
84
|
+
paypalProductId: {
|
85
|
+
type: DataTypes.STRING,
|
86
|
+
field: "paypal_product_id",
|
87
|
+
},
|
88
|
+
isArchived: {
|
89
|
+
type: DataTypes.BOOLEAN,
|
90
|
+
field: "is_archived",
|
91
|
+
defaultValue: false,
|
92
|
+
},
|
93
|
+
productDescriptionList: {
|
94
|
+
type: DataTypes.ARRAY(DataTypes.STRING),
|
95
|
+
field: "product_description_list",
|
96
|
+
},
|
97
|
+
oneTimePurchase: {
|
98
|
+
type: DataTypes.BOOLEAN,
|
99
|
+
field: "one_time_purchase",
|
100
|
+
defaultValue: false,
|
101
|
+
},
|
102
|
+
accessEndDate: {
|
103
|
+
type: DataTypes.DATE,
|
104
|
+
field: "access_end_date",
|
105
|
+
},
|
106
|
+
createdAt: DataTypes.DATE,
|
107
|
+
updatedAt: DataTypes.DATE,
|
108
|
+
},
|
109
|
+
{
|
110
|
+
tableName: "subscription_plans",
|
111
|
+
sequelize,
|
112
|
+
}
|
113
|
+
);
|
114
|
+
|
115
|
+
/*
|
116
|
+
====================================================================
|
117
|
+
Class functions
|
118
|
+
====================================================================
|
119
|
+
*/
|
120
|
+
|
121
|
+
SubscriptionPlan.getById = async (id: string) => {
|
122
|
+
return await SubscriptionPlan.findOne({
|
123
|
+
where: {
|
124
|
+
id,
|
125
|
+
},
|
126
|
+
});
|
127
|
+
};
|
128
|
+
|
129
|
+
SubscriptionPlan.getByOwnerId = async (ownerId: string) => {
|
130
|
+
return await SubscriptionPlan.findOne({
|
131
|
+
where: {
|
132
|
+
ownerId,
|
133
|
+
},
|
134
|
+
});
|
135
|
+
};
|
136
|
+
|
137
|
+
SubscriptionPlan.getByPaypalPlanId = async (paypalPlanId: string) => {
|
138
|
+
return await SubscriptionPlan.findOne({
|
139
|
+
where: {
|
140
|
+
paypalPlanId,
|
141
|
+
},
|
142
|
+
});
|
143
|
+
};
|
144
|
+
|
145
|
+
SubscriptionPlan.hasMany(Subscription, { foreignKey: "subscription_plan_id" });
|
146
|
+
Subscription.hasOne(SubscriptionPlan, {
|
147
|
+
foreignKey: "id",
|
148
|
+
sourceKey: "subscription_plan_id",
|
149
|
+
});
|
150
|
+
|
151
|
+
SubscriptionPlan.hasOne(PhoneOwner, {
|
152
|
+
foreignKey: "id",
|
153
|
+
sourceKey: "ownerId",
|
154
|
+
});
|
155
|
+
PhoneOwner.hasMany(SubscriptionPlan, {
|
156
|
+
foreignKey: "owner_id",
|
157
|
+
sourceKey: "id",
|
158
|
+
onDelete: "NO ACTION",
|
159
|
+
constraints: false,
|
160
|
+
});
|
161
|
+
|
162
|
+
SubscriptionPromotion.hasOne(SubscriptionPlan, {
|
163
|
+
foreignKey: "id",
|
164
|
+
sourceKey: "subscriptionPlanId",
|
165
|
+
});
|
166
|
+
SubscriptionPlan.hasMany(SubscriptionPromotion, {
|
167
|
+
foreignKey: "subscription_plan_id",
|
168
|
+
sourceKey: "id",
|
169
|
+
});
|
170
|
+
|
171
|
+
export default SubscriptionPlan;
|
@@ -0,0 +1,125 @@
|
|
1
|
+
import {
|
2
|
+
Model,
|
3
|
+
InferAttributes,
|
4
|
+
InferCreationAttributes,
|
5
|
+
CreationOptional,
|
6
|
+
DataTypes,
|
7
|
+
fn,
|
8
|
+
NOW,
|
9
|
+
Op,
|
10
|
+
col,
|
11
|
+
WhereOptions,
|
12
|
+
} from "sequelize";
|
13
|
+
|
14
|
+
import sequelize from "./pb-sequelize";
|
15
|
+
|
16
|
+
// order of InferAttributes & InferCreationAttributes is important.
|
17
|
+
class SubscriptionPromotion extends Model<
|
18
|
+
InferAttributes<SubscriptionPromotion>,
|
19
|
+
InferCreationAttributes<SubscriptionPromotion>
|
20
|
+
> {
|
21
|
+
// 'CreationOptional' is a special type that marks the field as optional
|
22
|
+
// when creating an instance of the model (such as using Model.create()).
|
23
|
+
declare id: CreationOptional<string>;
|
24
|
+
declare subscriptionPlanId: string;
|
25
|
+
declare title?: string;
|
26
|
+
declare trialIntervalCount?: number;
|
27
|
+
declare trialDiscountPercentage?: number;
|
28
|
+
declare trialLength?: number;
|
29
|
+
declare saleEndDate?: Date;
|
30
|
+
declare neverExpire?: boolean;
|
31
|
+
declare hasClaimLimit?: boolean;
|
32
|
+
declare claimLimit?: number;
|
33
|
+
declare numClaims?: number;
|
34
|
+
declare createdAt: CreationOptional<Date>;
|
35
|
+
declare updatedAt: CreationOptional<Date>;
|
36
|
+
static activeWhereClause: () => WhereOptions<any>;
|
37
|
+
}
|
38
|
+
|
39
|
+
SubscriptionPromotion.init(
|
40
|
+
{
|
41
|
+
id: {
|
42
|
+
type: DataTypes.BIGINT,
|
43
|
+
primaryKey: true,
|
44
|
+
allowNull: false,
|
45
|
+
defaultValue: sequelize.fn("next_id"),
|
46
|
+
},
|
47
|
+
subscriptionPlanId: {
|
48
|
+
type: DataTypes.BIGINT,
|
49
|
+
allowNull: false,
|
50
|
+
field: "subscription_plan_id",
|
51
|
+
},
|
52
|
+
title: {
|
53
|
+
type: DataTypes.STRING,
|
54
|
+
field: "title",
|
55
|
+
},
|
56
|
+
trialIntervalCount: {
|
57
|
+
type: DataTypes.INTEGER,
|
58
|
+
field: "trial_interval_count",
|
59
|
+
defaultValue: 0,
|
60
|
+
},
|
61
|
+
trialDiscountPercentage: {
|
62
|
+
type: DataTypes.FLOAT,
|
63
|
+
field: "trial_discount_percentage",
|
64
|
+
},
|
65
|
+
trialLength: {
|
66
|
+
type: DataTypes.INTEGER,
|
67
|
+
field: "trial_length",
|
68
|
+
defaultValue: 0,
|
69
|
+
},
|
70
|
+
saleEndDate: {
|
71
|
+
type: DataTypes.DATE,
|
72
|
+
field: "sale_end_date",
|
73
|
+
},
|
74
|
+
neverExpire: {
|
75
|
+
type: DataTypes.BOOLEAN,
|
76
|
+
field: "never_expire",
|
77
|
+
defaultValue: false,
|
78
|
+
},
|
79
|
+
hasClaimLimit: {
|
80
|
+
type: DataTypes.BOOLEAN,
|
81
|
+
field: "has_claim_limit",
|
82
|
+
defaultValue: false,
|
83
|
+
},
|
84
|
+
claimLimit: {
|
85
|
+
type: DataTypes.INTEGER,
|
86
|
+
field: "claim_limit",
|
87
|
+
},
|
88
|
+
numClaims: {
|
89
|
+
type: DataTypes.INTEGER,
|
90
|
+
field: "num_claims",
|
91
|
+
defaultValue: 0,
|
92
|
+
},
|
93
|
+
createdAt: DataTypes.DATE,
|
94
|
+
updatedAt: DataTypes.DATE,
|
95
|
+
},
|
96
|
+
{
|
97
|
+
tableName: "subscription_promotions",
|
98
|
+
sequelize,
|
99
|
+
}
|
100
|
+
);
|
101
|
+
|
102
|
+
SubscriptionPromotion.activeWhereClause = () => {
|
103
|
+
return {
|
104
|
+
[Op.and]: [
|
105
|
+
{
|
106
|
+
[Op.or]: {
|
107
|
+
neverExpire: true,
|
108
|
+
saleEndDate: {
|
109
|
+
[Op.gte]: new Date(),
|
110
|
+
},
|
111
|
+
},
|
112
|
+
},
|
113
|
+
{
|
114
|
+
[Op.or]: {
|
115
|
+
hasClaimLimit: false,
|
116
|
+
numClaims: {
|
117
|
+
[Op.lt]: col("claim_limit"),
|
118
|
+
},
|
119
|
+
},
|
120
|
+
},
|
121
|
+
],
|
122
|
+
};
|
123
|
+
};
|
124
|
+
|
125
|
+
export default SubscriptionPromotion;
|