@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.
Files changed (243) hide show
  1. package/README.md +32 -0
  2. package/dist/index.js +20 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/migrations/20220601151258-custom_name_describing_your_migration.js +19 -0
  5. package/dist/migrations/20220601151258-custom_name_describing_your_migration.js.map +1 -0
  6. package/dist/migrations/20220605225655-create-dashboard-user-permissions.js +27 -0
  7. package/dist/migrations/20220605225655-create-dashboard-user-permissions.js.map +1 -0
  8. package/dist/migrations/20220606001300-update-dashboard-user-permissions.js +14 -0
  9. package/dist/migrations/20220606001300-update-dashboard-user-permissions.js.map +1 -0
  10. package/dist/migrations/20220607091109-add-read-date-for-message.js +19 -0
  11. package/dist/migrations/20220607091109-add-read-date-for-message.js.map +1 -0
  12. package/dist/migrations/20220616225456-add-delete-columns.js +21 -0
  13. package/dist/migrations/20220616225456-add-delete-columns.js.map +1 -0
  14. package/dist/migrations/20220709202211-disable-feed.js +24 -0
  15. package/dist/migrations/20220709202211-disable-feed.js.map +1 -0
  16. package/dist/migrations/20220723215213-limit-promotion-claims.js +18 -0
  17. package/dist/migrations/20220723215213-limit-promotion-claims.js.map +1 -0
  18. package/dist/migrations/20220723220233-num_claims.js +12 -0
  19. package/dist/migrations/20220723220233-num_claims.js.map +1 -0
  20. package/dist/migrations/20220723221907-default_false_promos.js +17 -0
  21. package/dist/migrations/20220723221907-default_false_promos.js.map +1 -0
  22. package/dist/migrations/20220724172559-default_zero_claims.js +13 -0
  23. package/dist/migrations/20220724172559-default_zero_claims.js.map +1 -0
  24. package/dist/migrations/20220724201419-pinned_post.js +13 -0
  25. package/dist/migrations/20220724201419-pinned_post.js.map +1 -0
  26. package/dist/migrations/20220729164625-unsend_mass.js +12 -0
  27. package/dist/migrations/20220729164625-unsend_mass.js.map +1 -0
  28. package/dist/migrations/20220823033002-interval-unit.js +14 -0
  29. package/dist/migrations/20220823033002-interval-unit.js.map +1 -0
  30. package/dist/migrations/20220830193530-processorId.js +15 -0
  31. package/dist/migrations/20220830193530-processorId.js.map +1 -0
  32. package/dist/migrations/20220907121932-add-processor-to-sub.js +15 -0
  33. package/dist/migrations/20220907121932-add-processor-to-sub.js.map +1 -0
  34. package/dist/migrations/20220907212232-add-trans-id.js +12 -0
  35. package/dist/migrations/20220907212232-add-trans-id.js.map +1 -0
  36. package/dist/migrations/20220907220423-big-int-trans.js +12 -0
  37. package/dist/migrations/20220907220423-big-int-trans.js.map +1 -0
  38. package/dist/migrations/20220909161902-add-stale.js +13 -0
  39. package/dist/migrations/20220909161902-add-stale.js.map +1 -0
  40. package/dist/migrations/20220922000225-verified-spender.js +13 -0
  41. package/dist/migrations/20220922000225-verified-spender.js.map +1 -0
  42. package/dist/migrations/20220922212108-verified-spender-2.js +16 -0
  43. package/dist/migrations/20220922212108-verified-spender-2.js.map +1 -0
  44. package/dist/migrations/20221013223648-product-subscription-list.js +12 -0
  45. package/dist/migrations/20221013223648-product-subscription-list.js.map +1 -0
  46. package/dist/migrations/20221014001037-product-subscription-list.js +75 -0
  47. package/dist/migrations/20221014001037-product-subscription-list.js.map +1 -0
  48. package/dist/migrations/20221026055245-update-type.js +15 -0
  49. package/dist/migrations/20221026055245-update-type.js.map +1 -0
  50. package/dist/scripts/authorizeTransfer.js +188 -0
  51. package/dist/scripts/authorizeTransfer.js.map +1 -0
  52. package/dist/scripts/createDashboardLink.js +30 -0
  53. package/dist/scripts/createDashboardLink.js.map +1 -0
  54. package/dist/scripts/deleteMalformedImages.js +84 -0
  55. package/dist/scripts/deleteMalformedImages.js.map +1 -0
  56. package/dist/scripts/importMixpanelEvents.js +44 -0
  57. package/dist/scripts/importMixpanelEvents.js.map +1 -0
  58. package/dist/scripts/payoutSubscriptions.js +185 -0
  59. package/dist/scripts/payoutSubscriptions.js.map +1 -0
  60. package/dist/scripts/removeUnreferenceSubs.js +39 -0
  61. package/dist/scripts/removeUnreferenceSubs.js.map +1 -0
  62. package/dist/scripts/test.js +33 -0
  63. package/dist/scripts/test.js.map +1 -0
  64. package/dist/server/index.js +30 -0
  65. package/dist/server/index.js.map +1 -0
  66. package/dist/server/middlewares/slack-auth.js +40 -0
  67. package/dist/server/middlewares/slack-auth.js.map +1 -0
  68. package/dist/server/v1/bypassCreator.js +81 -0
  69. package/dist/server/v1/bypassCreator.js.map +1 -0
  70. package/dist/server/v1/cancelSubscription.js +35 -0
  71. package/dist/server/v1/cancelSubscription.js.map +1 -0
  72. package/dist/server/v1/changeName.js +41 -0
  73. package/dist/server/v1/changeName.js.map +1 -0
  74. package/dist/server/v1/checkAuthSub.js +58 -0
  75. package/dist/server/v1/checkAuthSub.js.map +1 -0
  76. package/dist/server/v1/dashboardLink.js +30 -0
  77. package/dist/server/v1/dashboardLink.js.map +1 -0
  78. package/dist/server/v1/getSuspendedSubs.js +76 -0
  79. package/dist/server/v1/getSuspendedSubs.js.map +1 -0
  80. package/dist/server/v1/index.js +28 -0
  81. package/dist/server/v1/index.js.map +1 -0
  82. package/dist/server/v1/manualCreateSub.js +159 -0
  83. package/dist/server/v1/manualCreateSub.js.map +1 -0
  84. package/dist/server/v1/refund.js +78 -0
  85. package/dist/server/v1/refund.js.map +1 -0
  86. package/dist/server/v1/retrySubscription.js +81 -0
  87. package/dist/server/v1/retrySubscription.js.map +1 -0
  88. package/dist/server/v1/searchUser.js +169 -0
  89. package/dist/server/v1/searchUser.js.map +1 -0
  90. package/dist/server/v1/slack.js +14 -0
  91. package/dist/server/v1/slack.js.map +1 -0
  92. package/dist/src/index.js +24 -0
  93. package/dist/src/index.js.map +1 -0
  94. package/dist/src/pk-client.js +1103 -0
  95. package/dist/src/pk-client.js.map +1 -0
  96. package/dist/src/pk-sub.js +310 -0
  97. package/dist/src/pk-sub.js.map +1 -0
  98. package/dist/src/slack-client.js +48 -0
  99. package/dist/src/slack-client.js.map +1 -0
  100. package/dist/src/types.js +3 -0
  101. package/dist/src/types.js.map +1 -0
  102. package/dist/support/index.js +19 -0
  103. package/dist/support/index.js.map +1 -0
  104. package/dist/support/metrics.js +21 -0
  105. package/dist/support/metrics.js.map +1 -0
  106. package/dist/support/mixpanel.js +7 -0
  107. package/dist/support/mixpanel.js.map +1 -0
  108. package/dist/support/slack-client.js +51 -0
  109. package/dist/support/slack-client.js.map +1 -0
  110. package/dist/support/uploadcare.js +140 -0
  111. package/dist/support/uploadcare.js.map +1 -0
  112. package/dist/support/utils.js +69 -0
  113. package/dist/support/utils.js.map +1 -0
  114. package/dist/typed-model/asset-category.js +38 -0
  115. package/dist/typed-model/asset-category.js.map +1 -0
  116. package/dist/typed-model/asset-constent-person.js +56 -0
  117. package/dist/typed-model/asset-constent-person.js.map +1 -0
  118. package/dist/typed-model/blocked-ip.js +34 -0
  119. package/dist/typed-model/blocked-ip.js.map +1 -0
  120. package/dist/typed-model/category-tag.js +46 -0
  121. package/dist/typed-model/category-tag.js.map +1 -0
  122. package/dist/typed-model/consent-person.js +55 -0
  123. package/dist/typed-model/consent-person.js.map +1 -0
  124. package/dist/typed-model/content-category-tag.js +58 -0
  125. package/dist/typed-model/content-category-tag.js.map +1 -0
  126. package/dist/typed-model/content-like.js +58 -0
  127. package/dist/typed-model/content-like.js.map +1 -0
  128. package/dist/typed-model/credit-payment.js +389 -0
  129. package/dist/typed-model/credit-payment.js.map +1 -0
  130. package/dist/typed-model/credit-payout.js +42 -0
  131. package/dist/typed-model/credit-payout.js.map +1 -0
  132. package/dist/typed-model/credit-purchase.js +46 -0
  133. package/dist/typed-model/credit-purchase.js.map +1 -0
  134. package/dist/typed-model/customer-profile.js +51 -0
  135. package/dist/typed-model/customer-profile.js.map +1 -0
  136. package/dist/typed-model/dashboard-user-permissions.js +34 -0
  137. package/dist/typed-model/dashboard-user-permissions.js.map +1 -0
  138. package/dist/typed-model/dashboard-user.js +109 -0
  139. package/dist/typed-model/dashboard-user.js.map +1 -0
  140. package/dist/typed-model/fan-list.js +46 -0
  141. package/dist/typed-model/fan-list.js.map +1 -0
  142. package/dist/typed-model/fraud.js +41 -0
  143. package/dist/typed-model/fraud.js.map +1 -0
  144. package/dist/typed-model/index.js +101 -0
  145. package/dist/typed-model/index.js.map +1 -0
  146. package/dist/typed-model/list-member.js +47 -0
  147. package/dist/typed-model/list-member.js.map +1 -0
  148. package/dist/typed-model/mass-message.js +43 -0
  149. package/dist/typed-model/mass-message.js.map +1 -0
  150. package/dist/typed-model/media-asset.js +73 -0
  151. package/dist/typed-model/media-asset.js.map +1 -0
  152. package/dist/typed-model/media-category.js +49 -0
  153. package/dist/typed-model/media-category.js.map +1 -0
  154. package/dist/typed-model/media.js +59 -0
  155. package/dist/typed-model/media.js.map +1 -0
  156. package/dist/typed-model/message-media.js +53 -0
  157. package/dist/typed-model/message-media.js.map +1 -0
  158. package/dist/typed-model/message.js +191 -0
  159. package/dist/typed-model/message.js.map +1 -0
  160. package/dist/typed-model/notification.js +84 -0
  161. package/dist/typed-model/notification.js.map +1 -0
  162. package/dist/typed-model/pb-sequelize.js +25 -0
  163. package/dist/typed-model/pb-sequelize.js.map +1 -0
  164. package/dist/typed-model/phone-chat-participation.js +127 -0
  165. package/dist/typed-model/phone-chat-participation.js.map +1 -0
  166. package/dist/typed-model/phone-chat.js +118 -0
  167. package/dist/typed-model/phone-chat.js.map +1 -0
  168. package/dist/typed-model/phone-owner.js +266 -0
  169. package/dist/typed-model/phone-owner.js.map +1 -0
  170. package/dist/typed-model/phone-user.js +109 -0
  171. package/dist/typed-model/phone-user.js.map +1 -0
  172. package/dist/typed-model/premium-content.js +123 -0
  173. package/dist/typed-model/premium-content.js.map +1 -0
  174. package/dist/typed-model/purchased-content.js +69 -0
  175. package/dist/typed-model/purchased-content.js.map +1 -0
  176. package/dist/typed-model/short-url.js +88 -0
  177. package/dist/typed-model/short-url.js.map +1 -0
  178. package/dist/typed-model/subscription-bundle.js +53 -0
  179. package/dist/typed-model/subscription-bundle.js.map +1 -0
  180. package/dist/typed-model/subscription-category-tags.js +58 -0
  181. package/dist/typed-model/subscription-category-tags.js.map +1 -0
  182. package/dist/typed-model/subscription-plan.js +126 -0
  183. package/dist/typed-model/subscription-plan.js.map +1 -0
  184. package/dist/typed-model/subscription-promotion.js +93 -0
  185. package/dist/typed-model/subscription-promotion.js.map +1 -0
  186. package/dist/typed-model/subscription.js +123 -0
  187. package/dist/typed-model/subscription.js.map +1 -0
  188. package/dist/typed-model/twilio-phone.js +92 -0
  189. package/dist/typed-model/twilio-phone.js.map +1 -0
  190. package/dist/typed-model/user-follow.js +103 -0
  191. package/dist/typed-model/user-follow.js.map +1 -0
  192. package/dist/typed-model/verification-code.js +52 -0
  193. package/dist/typed-model/verification-code.js.map +1 -0
  194. package/index.ts +3 -0
  195. package/package.json +72 -0
  196. package/src/index.ts +2 -0
  197. package/src/pk-client.ts +1650 -0
  198. package/src/pk-sub.ts +455 -0
  199. package/src/types.ts +40 -0
  200. package/support/index.ts +2 -0
  201. package/support/slack-client.ts +43 -0
  202. package/support/uploadcare.ts +191 -0
  203. package/support/utils.ts +72 -0
  204. package/typed-model/asset-category.ts +57 -0
  205. package/typed-model/asset-constent-person.ts +82 -0
  206. package/typed-model/blocked-ip.ts +52 -0
  207. package/typed-model/category-tag.ts +66 -0
  208. package/typed-model/consent-person.ts +78 -0
  209. package/typed-model/content-category-tag.ts +79 -0
  210. package/typed-model/content-like.ts +79 -0
  211. package/typed-model/credit-payment.ts +678 -0
  212. package/typed-model/credit-payout.ts +62 -0
  213. package/typed-model/credit-purchase.ts +67 -0
  214. package/typed-model/customer-profile.ts +70 -0
  215. package/typed-model/dashboard-user-permissions.ts +51 -0
  216. package/typed-model/dashboard-user.ts +146 -0
  217. package/typed-model/fan-list.ts +68 -0
  218. package/typed-model/fraud.ts +62 -0
  219. package/typed-model/index.ts +58 -0
  220. package/typed-model/list-member.ts +67 -0
  221. package/typed-model/mass-message.ts +64 -0
  222. package/typed-model/media-asset.ts +99 -0
  223. package/typed-model/media-category.ts +70 -0
  224. package/typed-model/media.ts +85 -0
  225. package/typed-model/message-media.ts +74 -0
  226. package/typed-model/message.ts +258 -0
  227. package/typed-model/notification.ts +130 -0
  228. package/typed-model/pb-sequelize.ts +25 -0
  229. package/typed-model/phone-chat-participation.ts +166 -0
  230. package/typed-model/phone-chat.ts +185 -0
  231. package/typed-model/phone-owner.ts +341 -0
  232. package/typed-model/phone-user.ts +146 -0
  233. package/typed-model/premium-content.ts +164 -0
  234. package/typed-model/purchased-content.ts +100 -0
  235. package/typed-model/short-url.ts +120 -0
  236. package/typed-model/subscription-bundle.ts +75 -0
  237. package/typed-model/subscription-category-tags.ts +79 -0
  238. package/typed-model/subscription-plan.ts +171 -0
  239. package/typed-model/subscription-promotion.ts +125 -0
  240. package/typed-model/subscription.ts +170 -0
  241. package/typed-model/twilio-phone.ts +149 -0
  242. package/typed-model/user-follow.ts +141 -0
  243. package/typed-model/verification-code.ts +74 -0
@@ -0,0 +1,64 @@
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 MassMessage extends Model<
14
+ InferAttributes<MassMessage>,
15
+ InferCreationAttributes<MassMessage>
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 ownerId: string;
21
+ declare filterOptions?: any;
22
+ declare copiedMessageId?: string;
23
+ declare unsendDate?: Date;
24
+ declare createdAt: CreationOptional<Date>;
25
+ declare updatedAt: CreationOptional<Date>;
26
+ }
27
+
28
+ MassMessage.init(
29
+ {
30
+ id: {
31
+ type: DataTypes.BIGINT,
32
+ primaryKey: true,
33
+ allowNull: false,
34
+ defaultValue: sequelize.fn("next_id"),
35
+ },
36
+ ownerId: {
37
+ type: DataTypes.BIGINT,
38
+ field: "owner_id",
39
+ },
40
+ filterOptions: {
41
+ type: DataTypes.JSON,
42
+ field: "filter_options",
43
+ },
44
+ copiedMessageId: {
45
+ type: DataTypes.BIGINT,
46
+ field: "copied_message_id",
47
+ },
48
+ unsendDate: {
49
+ type: DataTypes.DATE,
50
+ field: "unsend_date",
51
+ },
52
+ createdAt: DataTypes.DATE,
53
+ updatedAt: DataTypes.DATE,
54
+ },
55
+ { tableName: "mass_messages", sequelize }
56
+ );
57
+
58
+ /*
59
+ ====================================================================
60
+ Class functions
61
+ ====================================================================
62
+ */
63
+
64
+ export default MassMessage;
@@ -0,0 +1,99 @@
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
+ import AssetCategory from "./asset-category";
12
+
13
+ // order of InferAttributes & InferCreationAttributes is important.
14
+ class MediaAsset extends Model<
15
+ InferAttributes<MediaAsset>,
16
+ InferCreationAttributes<MediaAsset>
17
+ > {
18
+ // 'CreationOptional' is a special type that marks the field as optional
19
+ // when creating an instance of the model (such as using Model.create()).
20
+ declare id: CreationOptional<string>;
21
+ declare ownerId?: string;
22
+ declare userId?: string;
23
+ declare url: string;
24
+ declare previewImageUrl?: string;
25
+ declare type: "photo" | "video";
26
+ declare videoDurationInSeconds: number;
27
+ declare reviewStatus: "pending" | "approved";
28
+ declare isDeleted?: boolean;
29
+ declare createdAt: CreationOptional<Date>;
30
+ declare updatedAt: CreationOptional<Date>;
31
+ }
32
+
33
+ MediaAsset.init(
34
+ {
35
+ id: {
36
+ type: DataTypes.BIGINT,
37
+ primaryKey: true,
38
+ allowNull: false,
39
+ defaultValue: sequelize.fn("next_id"),
40
+ },
41
+ ownerId: {
42
+ type: DataTypes.BIGINT,
43
+ field: "owner_id",
44
+ },
45
+ userId: {
46
+ type: DataTypes.BIGINT,
47
+ field: "user_id",
48
+ },
49
+ url: {
50
+ type: DataTypes.STRING,
51
+ field: "url",
52
+ },
53
+ previewImageUrl: {
54
+ type: DataTypes.STRING,
55
+ field: "preview_image_url",
56
+ },
57
+ type: {
58
+ type: DataTypes.STRING,
59
+ field: "type",
60
+ },
61
+ videoDurationInSeconds: {
62
+ type: DataTypes.INTEGER,
63
+ field: "video_duration_in_seconds",
64
+ },
65
+ reviewStatus: {
66
+ type: DataTypes.STRING,
67
+ field: "review_status",
68
+ defaultValue: "pending",
69
+ },
70
+ isDeleted: {
71
+ type: DataTypes.BOOLEAN,
72
+ field: "is_deleted",
73
+ defaultValue: false,
74
+ },
75
+ createdAt: DataTypes.DATE,
76
+ updatedAt: DataTypes.DATE,
77
+ },
78
+ {
79
+ sequelize,
80
+ tableName: "media_assets",
81
+ }
82
+ );
83
+
84
+ /*
85
+ ====================================================================
86
+ Class functions
87
+ ====================================================================
88
+ */
89
+
90
+ AssetCategory.hasOne(MediaAsset, {
91
+ foreignKey: "id",
92
+ sourceKey: "mediaAssetId",
93
+ });
94
+ MediaAsset.hasMany(AssetCategory, {
95
+ foreignKey: "media_asset_id",
96
+ sourceKey: "id",
97
+ });
98
+
99
+ export default MediaAsset;
@@ -0,0 +1,70 @@
1
+ import {
2
+ Model,
3
+ InferAttributes,
4
+ InferCreationAttributes,
5
+ CreationOptional,
6
+ DataTypes,
7
+ fn,
8
+ } from "sequelize";
9
+ import AssetCategory from "./asset-category";
10
+
11
+ import sequelize from "./pb-sequelize";
12
+
13
+ // order of InferAttributes & InferCreationAttributes is important.
14
+ class MediaCategory extends Model<
15
+ InferAttributes<MediaCategory>,
16
+ InferCreationAttributes<MediaCategory>
17
+ > {
18
+ // 'CreationOptional' is a special type that marks the field as optional
19
+ // when creating an instance of the model (such as using Model.create()).
20
+ declare id: CreationOptional<string>;
21
+ declare ownerId: string;
22
+ declare name: string;
23
+ declare isArchived?: boolean;
24
+ declare createdAt: CreationOptional<Date>;
25
+ declare updatedAt: CreationOptional<Date>;
26
+ }
27
+
28
+ MediaCategory.init(
29
+ {
30
+ id: {
31
+ type: DataTypes.BIGINT,
32
+ primaryKey: true,
33
+ allowNull: false,
34
+ defaultValue: sequelize.fn("next_id"),
35
+ },
36
+ ownerId: {
37
+ type: DataTypes.BIGINT,
38
+ field: "owner_id",
39
+ },
40
+ name: {
41
+ type: DataTypes.STRING,
42
+ field: "name",
43
+ },
44
+ isArchived: {
45
+ type: DataTypes.BOOLEAN,
46
+ field: "is_archived",
47
+ defaultValue: false,
48
+ },
49
+ createdAt: DataTypes.DATE,
50
+ updatedAt: DataTypes.DATE,
51
+ },
52
+ { tableName: "media_categories", sequelize }
53
+ );
54
+
55
+ /*
56
+ ====================================================================
57
+ Class functions
58
+ ====================================================================
59
+ */
60
+
61
+ AssetCategory.hasOne(MediaCategory, {
62
+ foreignKey: "id",
63
+ sourceKey: "mediaCategoryId",
64
+ });
65
+ MediaCategory.hasMany(AssetCategory, {
66
+ foreignKey: "media_category_id",
67
+ sourceKey: "id",
68
+ });
69
+
70
+ export default MediaCategory;
@@ -0,0 +1,85 @@
1
+ import {
2
+ Model,
3
+ InferAttributes,
4
+ InferCreationAttributes,
5
+ CreationOptional,
6
+ DataTypes,
7
+ fn,
8
+ NonAttribute,
9
+ } from "sequelize";
10
+ import MediaAsset from "./media-asset";
11
+
12
+ import sequelize from "./pb-sequelize";
13
+
14
+ // order of InferAttributes & InferCreationAttributes is important.
15
+ class Media extends Model<
16
+ InferAttributes<Media>,
17
+ InferCreationAttributes<Media>
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 mediaAssetId: string;
23
+ declare premiumContentId?: string;
24
+ declare messageMediaId?: string;
25
+ declare order?: number;
26
+ declare isPreview?: boolean;
27
+ declare createdAt: CreationOptional<Date>;
28
+ declare updatedAt: CreationOptional<Date>;
29
+
30
+ declare media_asset?: NonAttribute<MediaAsset>;
31
+ }
32
+
33
+ Media.init(
34
+ {
35
+ id: {
36
+ type: DataTypes.BIGINT,
37
+ primaryKey: true,
38
+ allowNull: false,
39
+ defaultValue: sequelize.fn("next_id"),
40
+ },
41
+ mediaAssetId: {
42
+ type: DataTypes.BIGINT,
43
+ field: "media_asset_id",
44
+ },
45
+ premiumContentId: {
46
+ type: DataTypes.BIGINT,
47
+ field: "premium_content_id",
48
+ },
49
+ messageMediaId: {
50
+ type: DataTypes.BIGINT,
51
+ field: "message_media_id",
52
+ },
53
+ order: {
54
+ type: DataTypes.INTEGER,
55
+ field: "order",
56
+ },
57
+ isPreview: {
58
+ type: DataTypes.BOOLEAN,
59
+ field: "is_preview",
60
+ },
61
+ createdAt: DataTypes.DATE,
62
+ updatedAt: DataTypes.DATE,
63
+ },
64
+ {
65
+ tableName: "media",
66
+ sequelize,
67
+ }
68
+ );
69
+
70
+ /*
71
+ ====================================================================
72
+ Class functions
73
+ ====================================================================
74
+ */
75
+
76
+ Media.hasOne(MediaAsset, {
77
+ foreignKey: "id",
78
+ sourceKey: "mediaAssetId",
79
+ });
80
+ MediaAsset.hasMany(Media, {
81
+ foreignKey: "media_asset_id",
82
+ sourceKey: "id",
83
+ });
84
+
85
+ export default Media;
@@ -0,0 +1,74 @@
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
+ import Media from "./media";
12
+ import Message from "./message";
13
+
14
+ // order of InferAttributes & InferCreationAttributes is important.
15
+ class MessageMedia extends Model<
16
+ InferAttributes<MessageMedia>,
17
+ InferCreationAttributes<MessageMedia>
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 ownerId?: string;
23
+ declare userId?: string;
24
+ declare createdAt: CreationOptional<Date>;
25
+ declare updatedAt: CreationOptional<Date>;
26
+ }
27
+
28
+ MessageMedia.init(
29
+ {
30
+ id: {
31
+ type: DataTypes.BIGINT,
32
+ primaryKey: true,
33
+ allowNull: false,
34
+ defaultValue: sequelize.fn("next_id"),
35
+ },
36
+ ownerId: {
37
+ type: DataTypes.BIGINT,
38
+ field: "owner_id",
39
+ },
40
+ userId: {
41
+ type: DataTypes.BIGINT,
42
+ field: "user_id",
43
+ },
44
+ createdAt: DataTypes.DATE,
45
+ updatedAt: DataTypes.DATE,
46
+ },
47
+ { tableName: "message_media", sequelize }
48
+ );
49
+
50
+ /*
51
+ ====================================================================
52
+ Class functions
53
+ ====================================================================
54
+ */
55
+
56
+ Media.hasOne(MessageMedia, {
57
+ foreignKey: "id",
58
+ sourceKey: "messageMediaId",
59
+ });
60
+ MessageMedia.hasMany(Media, {
61
+ foreignKey: "message_media_id",
62
+ sourceKey: "id",
63
+ });
64
+
65
+ Message.hasOne(MessageMedia, {
66
+ foreignKey: "id",
67
+ sourceKey: "messageMediaId",
68
+ });
69
+ MessageMedia.hasMany(Message, {
70
+ foreignKey: "message_media_id",
71
+ sourceKey: "id",
72
+ });
73
+
74
+ export default MessageMedia;
@@ -0,0 +1,258 @@
1
+ import {
2
+ Model,
3
+ InferAttributes,
4
+ InferCreationAttributes,
5
+ CreationOptional,
6
+ DataTypes,
7
+ fn,
8
+ NOW,
9
+ Op,
10
+ literal,
11
+ } from "sequelize";
12
+ import CreditPayments from "./credit-payment";
13
+ import MediaAsset from "./media-asset";
14
+
15
+ import sequelize from "./pb-sequelize";
16
+ import PhoneOwner from "./phone-owner";
17
+ import PhoneUser from "./phone-user";
18
+ import Notification from "./notification";
19
+ import Media from "./media";
20
+ import MessageMedia from "./message-media";
21
+ import MassMessage from "./mass-message";
22
+
23
+ // order of InferAttributes & InferCreationAttributes is important.
24
+ class Message extends Model<
25
+ InferAttributes<Message>,
26
+ InferCreationAttributes<Message>
27
+ > {
28
+ // 'CreationOptional' is a special type that marks the field as optional
29
+ // when creating an instance of the model (such as using Model.create()).
30
+ declare id: CreationOptional<string>;
31
+ declare fromOwner: boolean;
32
+ declare userId: string;
33
+ declare ownerId: string;
34
+ declare message: string;
35
+ declare isTip: boolean;
36
+ declare amountInCents?: number;
37
+ declare creditPaymentId?: string;
38
+ declare isRead: boolean;
39
+ declare massMessageId?: string;
40
+ declare messageMediaId?: string;
41
+ declare isFollowTemplate?: boolean;
42
+ declare isSubscriberTemplate?: boolean;
43
+ declare sendDate: Date;
44
+ declare readDate: Date;
45
+ declare unsendDate: Date;
46
+ declare createdAt: CreationOptional<Date>;
47
+ declare updatedAt: CreationOptional<Date>;
48
+ static sendMessage: (
49
+ message: Message,
50
+ mediaAssets?: MediaAsset[]
51
+ ) => Promise<Message | null>;
52
+ static getPurchasedMessages: (
53
+ ownerId: string,
54
+ userId: string,
55
+ earliestId: string
56
+ ) => Promise<Message[]>;
57
+ static readMessages: (ownerId: string, userId: string) => Promise<void>;
58
+ static getConversationsForOwner: (ownerId: string) => Promise<Message[]>;
59
+ }
60
+
61
+ Message.init(
62
+ {
63
+ id: {
64
+ type: DataTypes.BIGINT,
65
+ defaultValue: fn("next_id"),
66
+ allowNull: false,
67
+ primaryKey: true,
68
+ },
69
+ fromOwner: {
70
+ field: "from_owner",
71
+ type: DataTypes.BOOLEAN,
72
+ defaultValue: false,
73
+ },
74
+ userId: {
75
+ type: DataTypes.BIGINT,
76
+ field: "user_id",
77
+ },
78
+ ownerId: {
79
+ type: DataTypes.BIGINT,
80
+ field: "owner_id",
81
+ },
82
+ message: {
83
+ type: DataTypes.STRING(500),
84
+ field: "message",
85
+ },
86
+ isTip: {
87
+ field: "is_tip",
88
+ type: DataTypes.BOOLEAN,
89
+ defaultValue: false,
90
+ },
91
+ amountInCents: {
92
+ field: "amount_in_cents",
93
+ type: DataTypes.INTEGER,
94
+ },
95
+ creditPaymentId: {
96
+ type: DataTypes.BIGINT,
97
+ field: "credit_payment_id",
98
+ },
99
+ isRead: {
100
+ field: "is_read",
101
+ type: DataTypes.BOOLEAN,
102
+ defaultValue: false,
103
+ },
104
+ massMessageId: {
105
+ type: DataTypes.BIGINT,
106
+ field: "mass_message_id",
107
+ },
108
+ messageMediaId: {
109
+ type: DataTypes.BIGINT,
110
+ field: "message_media_id",
111
+ },
112
+ isFollowTemplate: {
113
+ type: DataTypes.BOOLEAN,
114
+ field: "is_follow_template",
115
+ },
116
+ isSubscriberTemplate: {
117
+ type: DataTypes.BOOLEAN,
118
+ field: "is_sub_template",
119
+ },
120
+ sendDate: {
121
+ type: DataTypes.DATE,
122
+ field: "send_date",
123
+ defaultValue: NOW,
124
+ allowNull: false,
125
+ },
126
+ readDate: {
127
+ type: DataTypes.DATE,
128
+ field: "read_date",
129
+ defaultValue: null,
130
+ },
131
+ unsendDate: {
132
+ type: DataTypes.DATE,
133
+ field: "unsend_date",
134
+ defaultValue: null,
135
+ },
136
+ createdAt: DataTypes.DATE,
137
+ updatedAt: DataTypes.DATE,
138
+ },
139
+ {
140
+ tableName: "messages",
141
+ sequelize,
142
+ }
143
+ );
144
+
145
+ /*
146
+ ====================================================================
147
+ Class functions
148
+ ====================================================================
149
+ */
150
+
151
+ Message.sendMessage = async (message: Message, mediaAssets?: MediaAsset[]) => {
152
+ if (message.isTip) {
153
+ const user = await PhoneUser.getById(message.userId);
154
+ const owner = await PhoneOwner.getById(message.ownerId);
155
+ const cp = await CreditPayments.logTip(
156
+ user!,
157
+ owner!,
158
+ message.amountInCents!
159
+ );
160
+ message.creditPaymentId = cp.id;
161
+ }
162
+
163
+ const createdMessage = await Message.create(message);
164
+
165
+ if (mediaAssets && mediaAssets.length > 0) {
166
+ mediaAssets.map((ma, index) => {
167
+ return { ...ma, index };
168
+ });
169
+
170
+ let alreadyCreatedAssets = mediaAssets.filter((ma) => !!ma.id) || [];
171
+ let needsCreationAssets = mediaAssets.filter((ma) => !ma.id) || [];
172
+
173
+ let newlyCreatedAssets = await MediaAsset.bulkCreate(needsCreationAssets, {
174
+ returning: true,
175
+ });
176
+
177
+ let mediaObjects = alreadyCreatedAssets
178
+ .concat(newlyCreatedAssets)
179
+ .map((ma) => {
180
+ let order = mediaAssets.findIndex(
181
+ (a) => a.id === ma.id || a.url === ma.url
182
+ );
183
+ return {
184
+ order,
185
+ messageId: createdMessage.id,
186
+ mediaAssetId: ma.id,
187
+ };
188
+ });
189
+
190
+ await Media.bulkCreate(mediaObjects);
191
+ return await Message.findOne({
192
+ where: { id: createdMessage.id },
193
+ include: {
194
+ model: Media,
195
+ required: true,
196
+ include: [
197
+ {
198
+ model: MediaAsset,
199
+ required: true,
200
+ },
201
+ ],
202
+ },
203
+ });
204
+ }
205
+ return createdMessage;
206
+ };
207
+
208
+ Message.getPurchasedMessages = async (
209
+ ownerId: string,
210
+ userId: string,
211
+ earliestId: string
212
+ ) => {
213
+ const messages = await Message.findAll({
214
+ where: {
215
+ ownerId,
216
+ userId,
217
+ creditPaymentId: {
218
+ [Op.gt]: earliestId,
219
+ },
220
+ isTip: false,
221
+ },
222
+ order: [["updatedAt", "DESC"]],
223
+ });
224
+ return messages;
225
+ };
226
+
227
+ PhoneOwner.hasMany(Message, {
228
+ foreignKey: "owner_id",
229
+ onDelete: "NO ACTION",
230
+ constraints: false,
231
+ });
232
+ PhoneUser.hasMany(Message, {
233
+ foreignKey: "user_id",
234
+ onDelete: "NO ACTION",
235
+ constraints: false,
236
+ });
237
+ MassMessage.hasMany(Message, { foreignKey: "massMessageId" });
238
+ Message.hasOne(PhoneOwner, {
239
+ foreignKey: "id",
240
+ sourceKey: "owner_id",
241
+ onDelete: "NO ACTION",
242
+ constraints: false,
243
+ });
244
+ Message.hasOne(PhoneUser, {
245
+ foreignKey: "id",
246
+ sourceKey: "user_id",
247
+ onDelete: "NO ACTION",
248
+ constraints: false,
249
+ });
250
+ Message.hasOne(MassMessage, { foreignKey: "id", sourceKey: "massMessageId" });
251
+
252
+ Notification.hasOne(Message, {
253
+ foreignKey: "id",
254
+ sourceKey: "messageId",
255
+ constraints: false,
256
+ });
257
+
258
+ export default Message;