@winible/winible-typed 2.0.0 → 2.1.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/dist/migrations/20230412190423-migrate_purchased_contents.js +10 -0
- package/dist/migrations/20230412190423-migrate_purchased_contents.js.map +1 -0
- package/dist/migrations/20230412202031-migrate_other_fields.js +27 -0
- package/dist/migrations/20230412202031-migrate_other_fields.js.map +1 -0
- package/dist/migrations/20230412213952-deprecate_phone_users_and_phone_owners.js +27 -0
- package/dist/migrations/20230412213952-deprecate_phone_users_and_phone_owners.js.map +1 -0
- package/dist/scripts/deleteMalformedImages.js +2 -2
- package/dist/scripts/deleteMalformedImages.js.map +1 -1
- package/dist/typed-model/content-like.js +27 -15
- package/dist/typed-model/content-like.js.map +1 -1
- package/dist/typed-model/credit-payment.js +35 -371
- package/dist/typed-model/credit-payment.js.map +1 -1
- package/dist/typed-model/index.js +13 -15
- package/dist/typed-model/index.js.map +1 -1
- package/dist/typed-model/league-user.js +3 -3
- package/dist/typed-model/league-user.js.map +1 -1
- package/dist/typed-model/media.js +2 -6
- package/dist/typed-model/media.js.map +1 -1
- package/dist/typed-model/pb-sequelize.js +3 -1
- package/dist/typed-model/pb-sequelize.js.map +1 -1
- package/dist/typed-model/phone-owner.js +3 -3
- package/dist/typed-model/phone-owner.js.map +1 -1
- package/dist/typed-model/post.js +126 -0
- package/dist/typed-model/post.js.map +1 -0
- package/dist/typed-model/posts-on-users.js +92 -0
- package/dist/typed-model/posts-on-users.js.map +1 -0
- package/dist/typed-model/premium-content.js +9 -4
- package/dist/typed-model/premium-content.js.map +1 -1
- package/dist/typed-model/purchased-content.js +13 -13
- package/dist/typed-model/purchased-content.js.map +1 -1
- package/dist/typed-model/recurly-account.js.map +1 -1
- package/dist/typed-model/subscription-plan-on-post.js +55 -0
- package/dist/typed-model/subscription-plan-on-post.js.map +1 -0
- package/dist/typed-model/subscription-plan-on-users.js +111 -0
- package/dist/typed-model/subscription-plan-on-users.js.map +1 -0
- package/dist/typed-model/subscription-plan.js +22 -32
- package/dist/typed-model/subscription-plan.js.map +1 -1
- package/dist/typed-model/subscription.js +32 -40
- package/dist/typed-model/subscription.js.map +1 -1
- package/dist/typed-model/transaction.js +108 -0
- package/dist/typed-model/transaction.js.map +1 -0
- package/dist/typed-model/withdrawal.js +33 -0
- package/dist/typed-model/withdrawal.js.map +1 -0
- package/dist/webhooks/index.js.map +1 -1
- package/dist/webhooks/payment/refund.js +11 -11
- package/dist/webhooks/payment/refund.js.map +1 -1
- package/package.json +1 -1
- package/typed-model/content-like.ts +33 -17
- package/typed-model/index.ts +6 -7
- package/typed-model/league-user.ts +5 -3
- package/typed-model/media.ts +3 -9
- package/typed-model/pb-sequelize.ts +5 -1
- package/typed-model/{premium-content.ts → post.ts} +44 -42
- package/typed-model/{purchased-content.ts → posts-on-users.ts} +46 -25
- package/typed-model/recurly-account.ts +0 -1
- package/typed-model/subscription-plan-on-post.ts +77 -0
- package/typed-model/{subscription.ts → subscription-plan-on-users.ts} +43 -59
- package/typed-model/subscription-plan.ts +29 -46
- package/typed-model/transaction.ts +154 -0
- package/typed-model/user.ts +2 -2
- package/typed-model/{credit-payout.ts → withdrawal.ts} +9 -21
- package/typed-model/credit-payment.ts +0 -681
- package/typed-model/phone-owner.ts +0 -341
- package/typed-model/phone-user.ts +0 -146
@@ -1,341 +0,0 @@
|
|
1
|
-
import {
|
2
|
-
Model,
|
3
|
-
InferAttributes,
|
4
|
-
InferCreationAttributes,
|
5
|
-
CreationOptional,
|
6
|
-
DataTypes,
|
7
|
-
fn,
|
8
|
-
NonAttribute,
|
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 PhoneOwner extends Model<
|
17
|
-
InferAttributes<PhoneOwner>,
|
18
|
-
InferCreationAttributes<PhoneOwner>
|
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 phone?: string;
|
24
|
-
declare name?: string;
|
25
|
-
declare email?: string;
|
26
|
-
declare welcomeText?: string;
|
27
|
-
declare welcomeMediaUrl?: string;
|
28
|
-
declare videoUrl?: string;
|
29
|
-
declare twilioPhoneId?: string;
|
30
|
-
declare defaultChatRateInCents?: number;
|
31
|
-
declare defaultVideoRateInCents?: number;
|
32
|
-
declare defaultVideoLengthInSeconds?: number;
|
33
|
-
declare defaultAudioRateInCents?: number;
|
34
|
-
declare audioEnabled?: boolean;
|
35
|
-
declare videoEnabled?: boolean;
|
36
|
-
declare linePurchasePriceInCents?: number;
|
37
|
-
declare serviceFeePercentage?: number;
|
38
|
-
declare isSubscription?: boolean;
|
39
|
-
declare isAdult?: boolean;
|
40
|
-
declare chatMessage?: string;
|
41
|
-
declare chatImageUrl?: string;
|
42
|
-
declare status?: string;
|
43
|
-
declare type?: string;
|
44
|
-
declare referringOwnerId?: string;
|
45
|
-
declare socialLinks?: string;
|
46
|
-
declare agencyId?: string;
|
47
|
-
declare referralPercentage?: number;
|
48
|
-
declare videoPreviewUrl?: string;
|
49
|
-
declare bannerImageUrl?: string;
|
50
|
-
declare verificationImageKey?: string;
|
51
|
-
declare passbaseId?: string;
|
52
|
-
declare isApproved?: boolean;
|
53
|
-
declare isOnline?: boolean;
|
54
|
-
declare lastOnline?: Date;
|
55
|
-
declare numPosts?: number;
|
56
|
-
declare numFollowers?: number;
|
57
|
-
declare numSubscribers?: number;
|
58
|
-
declare numLikes?: number;
|
59
|
-
declare numPhotos?: number;
|
60
|
-
declare numVideos?: number;
|
61
|
-
declare deleted?: boolean;
|
62
|
-
declare subOnlyFeed?: boolean;
|
63
|
-
declare disableFollowing?: boolean;
|
64
|
-
declare requireVerifiedSpender: CreationOptional<boolean>;
|
65
|
-
|
66
|
-
static getByPhone: (phone: string) => Promise<PhoneOwner | null>;
|
67
|
-
static getById: (ownerId: string) => Promise<PhoneOwner | null>;
|
68
|
-
static getByTwilioPhoneId: (
|
69
|
-
twilioPhoneId: string
|
70
|
-
) => Promise<PhoneOwner | null>;
|
71
|
-
static getOrCreateByPhone: (phone: string) => Promise<PhoneOwner>;
|
72
|
-
|
73
|
-
declare subscription_plans?: NonAttribute<any[]>;
|
74
|
-
declare premium_contents?: NonAttribute<any[]>;
|
75
|
-
}
|
76
|
-
|
77
|
-
PhoneOwner.init(
|
78
|
-
{
|
79
|
-
id: {
|
80
|
-
type: DataTypes.BIGINT,
|
81
|
-
primaryKey: true,
|
82
|
-
allowNull: false,
|
83
|
-
defaultValue: fn("next_id"),
|
84
|
-
},
|
85
|
-
phone: {
|
86
|
-
type: DataTypes.STRING,
|
87
|
-
field: "phone",
|
88
|
-
},
|
89
|
-
email: {
|
90
|
-
type: DataTypes.STRING,
|
91
|
-
field: "name",
|
92
|
-
},
|
93
|
-
name: {
|
94
|
-
type: DataTypes.STRING,
|
95
|
-
field: "name",
|
96
|
-
},
|
97
|
-
welcomeText: {
|
98
|
-
type: DataTypes.STRING(1000),
|
99
|
-
field: "welcome_text",
|
100
|
-
},
|
101
|
-
welcomeMediaUrl: {
|
102
|
-
type: DataTypes.STRING,
|
103
|
-
field: "welcome_media_url",
|
104
|
-
},
|
105
|
-
videoUrl: {
|
106
|
-
type: DataTypes.STRING,
|
107
|
-
field: "video_url",
|
108
|
-
},
|
109
|
-
twilioPhoneId: {
|
110
|
-
type: DataTypes.BIGINT,
|
111
|
-
field: "twilio_phone_id",
|
112
|
-
unique: true,
|
113
|
-
},
|
114
|
-
defaultChatRateInCents: {
|
115
|
-
type: DataTypes.INTEGER,
|
116
|
-
field: "default_chat_rate_in_cents",
|
117
|
-
defaultValue: 100,
|
118
|
-
},
|
119
|
-
defaultVideoRateInCents: {
|
120
|
-
type: DataTypes.INTEGER,
|
121
|
-
field: "default_video_rate_in_cents",
|
122
|
-
defaultValue: 400,
|
123
|
-
},
|
124
|
-
defaultVideoLengthInSeconds: {
|
125
|
-
type: DataTypes.INTEGER,
|
126
|
-
field: "default_video_length_in_seconds",
|
127
|
-
defaultValue: 400,
|
128
|
-
},
|
129
|
-
defaultAudioRateInCents: {
|
130
|
-
type: DataTypes.INTEGER,
|
131
|
-
field: "default_audio_rate_in_cents",
|
132
|
-
defaultValue: 200,
|
133
|
-
},
|
134
|
-
audioEnabled: {
|
135
|
-
type: DataTypes.BOOLEAN,
|
136
|
-
field: "audio_enabled",
|
137
|
-
defaultValue: true,
|
138
|
-
},
|
139
|
-
videoEnabled: {
|
140
|
-
type: DataTypes.BOOLEAN,
|
141
|
-
field: "video_enabled",
|
142
|
-
defaultValue: true,
|
143
|
-
},
|
144
|
-
linePurchasePriceInCents: {
|
145
|
-
type: DataTypes.INTEGER,
|
146
|
-
field: "line_purchase_price_in_cents",
|
147
|
-
defaultValue: 199,
|
148
|
-
},
|
149
|
-
serviceFeePercentage: {
|
150
|
-
type: DataTypes.FLOAT,
|
151
|
-
field: "service_fee_percentage",
|
152
|
-
defaultValue: 0.2,
|
153
|
-
},
|
154
|
-
isSubscription: {
|
155
|
-
type: DataTypes.BOOLEAN,
|
156
|
-
field: "is_subscription",
|
157
|
-
defaultValue: true,
|
158
|
-
},
|
159
|
-
isAdult: {
|
160
|
-
type: DataTypes.BOOLEAN,
|
161
|
-
field: "is_adult",
|
162
|
-
defaultValue: true,
|
163
|
-
},
|
164
|
-
chatMessage: {
|
165
|
-
type: DataTypes.STRING(500),
|
166
|
-
field: "chat_message",
|
167
|
-
},
|
168
|
-
chatImageUrl: {
|
169
|
-
type: DataTypes.STRING,
|
170
|
-
field: "chat_image_url",
|
171
|
-
},
|
172
|
-
status: {
|
173
|
-
type: DataTypes.STRING,
|
174
|
-
field: "status",
|
175
|
-
},
|
176
|
-
type: {
|
177
|
-
type: DataTypes.STRING,
|
178
|
-
field: "type",
|
179
|
-
},
|
180
|
-
referringOwnerId: {
|
181
|
-
type: DataTypes.BIGINT,
|
182
|
-
field: "referring_owner_id",
|
183
|
-
},
|
184
|
-
socialLinks: {
|
185
|
-
type: DataTypes.ARRAY(DataTypes.STRING),
|
186
|
-
field: "social_links",
|
187
|
-
},
|
188
|
-
agencyId: {
|
189
|
-
type: DataTypes.BIGINT,
|
190
|
-
field: "agency_id",
|
191
|
-
},
|
192
|
-
referralPercentage: {
|
193
|
-
type: DataTypes.FLOAT,
|
194
|
-
field: "referral_percentage",
|
195
|
-
defaultValue: 0.03,
|
196
|
-
},
|
197
|
-
videoPreviewUrl: {
|
198
|
-
type: DataTypes.STRING,
|
199
|
-
field: "video_preview_url",
|
200
|
-
},
|
201
|
-
bannerImageUrl: {
|
202
|
-
type: DataTypes.STRING,
|
203
|
-
field: "banner_image_url",
|
204
|
-
},
|
205
|
-
verificationImageKey: {
|
206
|
-
type: DataTypes.STRING,
|
207
|
-
field: "verification_image_key",
|
208
|
-
},
|
209
|
-
passbaseId: {
|
210
|
-
type: DataTypes.STRING,
|
211
|
-
field: "passbase_id",
|
212
|
-
},
|
213
|
-
isApproved: {
|
214
|
-
type: DataTypes.BOOLEAN,
|
215
|
-
field: "is_approved",
|
216
|
-
defaultValue: false,
|
217
|
-
},
|
218
|
-
isOnline: {
|
219
|
-
type: DataTypes.BOOLEAN,
|
220
|
-
field: "is_online",
|
221
|
-
defaultValue: false,
|
222
|
-
},
|
223
|
-
lastOnline: {
|
224
|
-
type: DataTypes.DATE,
|
225
|
-
field: "last_online",
|
226
|
-
defaultValue: new Date(),
|
227
|
-
},
|
228
|
-
numFollowers: {
|
229
|
-
type: DataTypes.INTEGER,
|
230
|
-
field: "num_followers",
|
231
|
-
defaultValue: 0,
|
232
|
-
},
|
233
|
-
numSubscribers: {
|
234
|
-
type: DataTypes.INTEGER,
|
235
|
-
field: "num_subscribers",
|
236
|
-
defaultValue: 0,
|
237
|
-
},
|
238
|
-
numLikes: {
|
239
|
-
type: DataTypes.INTEGER,
|
240
|
-
field: "num_likes",
|
241
|
-
defaultValue: 0,
|
242
|
-
},
|
243
|
-
numPosts: {
|
244
|
-
type: DataTypes.INTEGER,
|
245
|
-
field: "num_posts",
|
246
|
-
defaultValue: 0,
|
247
|
-
},
|
248
|
-
numPhotos: {
|
249
|
-
type: DataTypes.INTEGER,
|
250
|
-
field: "num_photos",
|
251
|
-
defaultValue: 0,
|
252
|
-
},
|
253
|
-
numVideos: {
|
254
|
-
type: DataTypes.INTEGER,
|
255
|
-
field: "num_videos",
|
256
|
-
defaultValue: 0,
|
257
|
-
},
|
258
|
-
deleted: {
|
259
|
-
type: DataTypes.BOOLEAN,
|
260
|
-
field: "deleted",
|
261
|
-
defaultValue: false,
|
262
|
-
},
|
263
|
-
subOnlyFeed: {
|
264
|
-
type: DataTypes.BOOLEAN,
|
265
|
-
field: "sub_only_feed",
|
266
|
-
defaultValue: false,
|
267
|
-
},
|
268
|
-
disableFollowing: {
|
269
|
-
type: DataTypes.BOOLEAN,
|
270
|
-
field: "disable_following",
|
271
|
-
defaultValue: false,
|
272
|
-
},
|
273
|
-
requireVerifiedSpender: {
|
274
|
-
type: DataTypes.BOOLEAN,
|
275
|
-
field: "require_verified_spender",
|
276
|
-
defaultValue: false,
|
277
|
-
},
|
278
|
-
},
|
279
|
-
{
|
280
|
-
tableName: "phone_owners",
|
281
|
-
sequelize,
|
282
|
-
defaultScope: {
|
283
|
-
attributes: {
|
284
|
-
exclude: ["verification_image_key", "passbase_id", "is_approved"],
|
285
|
-
},
|
286
|
-
},
|
287
|
-
}
|
288
|
-
);
|
289
|
-
|
290
|
-
/*
|
291
|
-
====================================================================
|
292
|
-
Class functions
|
293
|
-
====================================================================
|
294
|
-
*/
|
295
|
-
|
296
|
-
PhoneOwner.getByPhone = async (phone: string) => {
|
297
|
-
return await PhoneOwner.findOne({
|
298
|
-
where: {
|
299
|
-
phone,
|
300
|
-
},
|
301
|
-
});
|
302
|
-
};
|
303
|
-
|
304
|
-
PhoneOwner.getById = async (ownerId: string) => {
|
305
|
-
return await PhoneOwner.findOne({
|
306
|
-
where: {
|
307
|
-
id: ownerId,
|
308
|
-
},
|
309
|
-
});
|
310
|
-
};
|
311
|
-
|
312
|
-
PhoneOwner.getByTwilioPhoneId = async (twilioPhoneId: string) => {
|
313
|
-
return await PhoneOwner.findOne({
|
314
|
-
where: {
|
315
|
-
twilioPhoneId,
|
316
|
-
},
|
317
|
-
});
|
318
|
-
};
|
319
|
-
|
320
|
-
PhoneOwner.getOrCreateByPhone = async (phone: string) => {
|
321
|
-
let owner = await PhoneOwner.getByPhone(phone);
|
322
|
-
if (!owner) {
|
323
|
-
owner = await PhoneOwner.create({ phone });
|
324
|
-
}
|
325
|
-
return owner;
|
326
|
-
};
|
327
|
-
|
328
|
-
PhoneOwner.hasMany(PremiumContent, {
|
329
|
-
foreignKey: "owner_id",
|
330
|
-
});
|
331
|
-
|
332
|
-
PremiumContent.belongsTo(PhoneOwner, {
|
333
|
-
foreignKey: "owner_id",
|
334
|
-
onDelete: "NO ACTION",
|
335
|
-
constraints: false,
|
336
|
-
});
|
337
|
-
|
338
|
-
PhoneOwner.hasMany(Notification, { foreignKey: "owner_id" });
|
339
|
-
Notification.hasOne(PhoneOwner, { foreignKey: "id", sourceKey: "owner_id" });
|
340
|
-
|
341
|
-
export default PhoneOwner;
|
@@ -1,146 +0,0 @@
|
|
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 PhoneUser extends Model<
|
14
|
-
InferAttributes<PhoneUser>,
|
15
|
-
InferCreationAttributes<PhoneUser>
|
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 phone?: string;
|
21
|
-
declare name?: string;
|
22
|
-
declare email?: string;
|
23
|
-
declare password?: string;
|
24
|
-
declare creditsInCents?: number;
|
25
|
-
declare lastLoginDate?: Date;
|
26
|
-
declare referringOwnerId?: string;
|
27
|
-
declare deleted?: boolean;
|
28
|
-
declare verifiedSpender: CreationOptional<boolean>;
|
29
|
-
declare passbaseIdentityKey: CreationOptional<String>;
|
30
|
-
declare createdAt: CreationOptional<Date>;
|
31
|
-
declare updatedAt: CreationOptional<Date>;
|
32
|
-
static getOrCreateByPhone: (phone: string) => Promise<any>;
|
33
|
-
static getById: (userId: string) => Promise<PhoneUser | null>;
|
34
|
-
static getByEmail: (email: string) => Promise<PhoneUser | null>;
|
35
|
-
static getByPhone: (phone: string) => Promise<PhoneUser | null>;
|
36
|
-
}
|
37
|
-
|
38
|
-
PhoneUser.init(
|
39
|
-
{
|
40
|
-
id: {
|
41
|
-
type: DataTypes.BIGINT,
|
42
|
-
primaryKey: true,
|
43
|
-
allowNull: false,
|
44
|
-
defaultValue: fn("next_id"),
|
45
|
-
},
|
46
|
-
phone: {
|
47
|
-
type: DataTypes.STRING,
|
48
|
-
allowNull: true,
|
49
|
-
field: "phone",
|
50
|
-
unique: true,
|
51
|
-
},
|
52
|
-
name: {
|
53
|
-
type: DataTypes.STRING,
|
54
|
-
field: "name",
|
55
|
-
},
|
56
|
-
email: {
|
57
|
-
type: DataTypes.STRING,
|
58
|
-
field: "email",
|
59
|
-
unique: true,
|
60
|
-
},
|
61
|
-
password: {
|
62
|
-
type: DataTypes.STRING,
|
63
|
-
field: "password",
|
64
|
-
},
|
65
|
-
creditsInCents: {
|
66
|
-
type: DataTypes.INTEGER,
|
67
|
-
field: "credits_in_cents",
|
68
|
-
defaultValue: 0,
|
69
|
-
},
|
70
|
-
lastLoginDate: {
|
71
|
-
type: DataTypes.DATE,
|
72
|
-
field: "last_login_date",
|
73
|
-
},
|
74
|
-
referringOwnerId: {
|
75
|
-
type: DataTypes.BIGINT,
|
76
|
-
field: "referring_owner_id",
|
77
|
-
},
|
78
|
-
deleted: {
|
79
|
-
type: DataTypes.BOOLEAN,
|
80
|
-
field: "deleted",
|
81
|
-
defaultValue: false,
|
82
|
-
},
|
83
|
-
verifiedSpender: {
|
84
|
-
type: DataTypes.BOOLEAN,
|
85
|
-
field: "verified_spender",
|
86
|
-
defaultValue: false,
|
87
|
-
},
|
88
|
-
passbaseIdentityKey: {
|
89
|
-
type: DataTypes.STRING,
|
90
|
-
field: "passbase_identity_key",
|
91
|
-
},
|
92
|
-
createdAt: DataTypes.DATE,
|
93
|
-
updatedAt: DataTypes.DATE,
|
94
|
-
},
|
95
|
-
{
|
96
|
-
tableName: "phone_users",
|
97
|
-
sequelize,
|
98
|
-
defaultScope: {
|
99
|
-
attributes: { exclude: ["password"] },
|
100
|
-
},
|
101
|
-
}
|
102
|
-
);
|
103
|
-
|
104
|
-
/*
|
105
|
-
====================================================================
|
106
|
-
Class functions
|
107
|
-
====================================================================
|
108
|
-
*/
|
109
|
-
|
110
|
-
PhoneUser.getByPhone = async (phone: string) => {
|
111
|
-
return await PhoneUser.findOne({
|
112
|
-
where: {
|
113
|
-
phone,
|
114
|
-
},
|
115
|
-
});
|
116
|
-
};
|
117
|
-
|
118
|
-
PhoneUser.getByEmail = async (email: string) => {
|
119
|
-
return await PhoneUser.findOne({
|
120
|
-
where: {
|
121
|
-
email,
|
122
|
-
},
|
123
|
-
});
|
124
|
-
};
|
125
|
-
|
126
|
-
PhoneUser.getById = async (userId: string) => {
|
127
|
-
return await PhoneUser.findOne({
|
128
|
-
where: {
|
129
|
-
id: userId,
|
130
|
-
},
|
131
|
-
});
|
132
|
-
};
|
133
|
-
|
134
|
-
PhoneUser.getOrCreateByPhone = async (phone: string) => {
|
135
|
-
let user = await PhoneUser.getByPhone(phone);
|
136
|
-
|
137
|
-
if (user) {
|
138
|
-
return user;
|
139
|
-
}
|
140
|
-
|
141
|
-
return await PhoneUser.create({
|
142
|
-
phone,
|
143
|
-
});
|
144
|
-
};
|
145
|
-
|
146
|
-
export default PhoneUser;
|