@armi-wave/common 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/package.json +11 -0
- package/src/index.ts +3 -0
- package/src/models/User.ts +223 -0
- package/src/utils/password.ts +19 -0
package/package.json
ADDED
package/src/index.ts
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import mongoose, { ObjectId } from 'mongoose';
|
|
2
|
+
import Password from '../utils/password';
|
|
3
|
+
|
|
4
|
+
interface UserAttributes {
|
|
5
|
+
email: string;
|
|
6
|
+
username: string;
|
|
7
|
+
password: string;
|
|
8
|
+
name: string;
|
|
9
|
+
surname: string;
|
|
10
|
+
followers: number;
|
|
11
|
+
following: number;
|
|
12
|
+
phoneNumber: string;
|
|
13
|
+
verified: boolean;
|
|
14
|
+
paidPlan: string;
|
|
15
|
+
savedPosts: ObjectId[];
|
|
16
|
+
likedPosts: ObjectId[];
|
|
17
|
+
upVotedPosts: ObjectId[];
|
|
18
|
+
likedComments: ObjectId[];
|
|
19
|
+
bannedAccounts: ObjectId[];
|
|
20
|
+
reportedPosts: ObjectId[];
|
|
21
|
+
validReportedPosts: ObjectId[];
|
|
22
|
+
totalLikes: number;
|
|
23
|
+
totalUpVotes: number;
|
|
24
|
+
totalDownVotes: number;
|
|
25
|
+
location: string;
|
|
26
|
+
height: number;
|
|
27
|
+
weight: number;
|
|
28
|
+
profession: string;
|
|
29
|
+
grossIncome: number;
|
|
30
|
+
netIncome: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface UserModel extends mongoose.Model<UserDocument> {
|
|
34
|
+
build(attrs: UserAttributes): UserDocument;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface UserDocument extends mongoose.Document {
|
|
38
|
+
email: string;
|
|
39
|
+
username: string;
|
|
40
|
+
password: string;
|
|
41
|
+
name: string;
|
|
42
|
+
surname: string;
|
|
43
|
+
followers: number;
|
|
44
|
+
following: number;
|
|
45
|
+
phoneNumber: string;
|
|
46
|
+
verified: boolean;
|
|
47
|
+
paidPlan: string;
|
|
48
|
+
savedPosts: ObjectId[];
|
|
49
|
+
likedPosts: ObjectId[];
|
|
50
|
+
upVotedPosts: ObjectId[];
|
|
51
|
+
likedComments: ObjectId[];
|
|
52
|
+
bannedAccounts: ObjectId[];
|
|
53
|
+
reportedPosts: ObjectId[];
|
|
54
|
+
validReportedPosts: ObjectId[];
|
|
55
|
+
totalLikes: number;
|
|
56
|
+
totalUpVotes: number;
|
|
57
|
+
totalDownVotes: number;
|
|
58
|
+
location: string;
|
|
59
|
+
height: number;
|
|
60
|
+
weight: number;
|
|
61
|
+
profession: string;
|
|
62
|
+
grossIncome: number;
|
|
63
|
+
netIncome: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const userSchema = new mongoose.Schema(
|
|
67
|
+
{
|
|
68
|
+
email: {
|
|
69
|
+
type: String,
|
|
70
|
+
required: true,
|
|
71
|
+
unique: true,
|
|
72
|
+
},
|
|
73
|
+
username: {
|
|
74
|
+
type: String,
|
|
75
|
+
required: true,
|
|
76
|
+
unique: true,
|
|
77
|
+
},
|
|
78
|
+
password: {
|
|
79
|
+
type: String,
|
|
80
|
+
required: true,
|
|
81
|
+
},
|
|
82
|
+
name: {
|
|
83
|
+
type: String,
|
|
84
|
+
required: true,
|
|
85
|
+
},
|
|
86
|
+
surname: {
|
|
87
|
+
type: String,
|
|
88
|
+
required: true,
|
|
89
|
+
},
|
|
90
|
+
followers: {
|
|
91
|
+
type: Number,
|
|
92
|
+
required: true,
|
|
93
|
+
},
|
|
94
|
+
following: {
|
|
95
|
+
type: Number,
|
|
96
|
+
required: true,
|
|
97
|
+
},
|
|
98
|
+
phoneNumber: {
|
|
99
|
+
type: String,
|
|
100
|
+
required: true,
|
|
101
|
+
},
|
|
102
|
+
verified: {
|
|
103
|
+
type: Boolean,
|
|
104
|
+
required: true,
|
|
105
|
+
},
|
|
106
|
+
paidPlan: {
|
|
107
|
+
type: String,
|
|
108
|
+
required: true,
|
|
109
|
+
},
|
|
110
|
+
savedPosts: {
|
|
111
|
+
type: Array,
|
|
112
|
+
required: true,
|
|
113
|
+
},
|
|
114
|
+
likedPosts: {
|
|
115
|
+
type: Array,
|
|
116
|
+
required: true,
|
|
117
|
+
},
|
|
118
|
+
upVotedPosts: {
|
|
119
|
+
type: Array,
|
|
120
|
+
required: true,
|
|
121
|
+
},
|
|
122
|
+
likedComments: {
|
|
123
|
+
type: Array,
|
|
124
|
+
required: true,
|
|
125
|
+
},
|
|
126
|
+
bannedAccounts: {
|
|
127
|
+
type: Array,
|
|
128
|
+
required: true,
|
|
129
|
+
},
|
|
130
|
+
reportedPosts: {
|
|
131
|
+
type: Array,
|
|
132
|
+
required: true,
|
|
133
|
+
},
|
|
134
|
+
validReportedPosts: {
|
|
135
|
+
type: Array,
|
|
136
|
+
required: true,
|
|
137
|
+
},
|
|
138
|
+
totalLikes: {
|
|
139
|
+
type: Number,
|
|
140
|
+
required: true,
|
|
141
|
+
},
|
|
142
|
+
totalUpVotes: {
|
|
143
|
+
type: Number,
|
|
144
|
+
required: true,
|
|
145
|
+
},
|
|
146
|
+
totalDownVotes: {
|
|
147
|
+
type: Number,
|
|
148
|
+
required: true,
|
|
149
|
+
},
|
|
150
|
+
location: {
|
|
151
|
+
type: String,
|
|
152
|
+
required: true,
|
|
153
|
+
},
|
|
154
|
+
height: {
|
|
155
|
+
type: Number,
|
|
156
|
+
required: true,
|
|
157
|
+
},
|
|
158
|
+
weight: {
|
|
159
|
+
type: Number,
|
|
160
|
+
required: true,
|
|
161
|
+
},
|
|
162
|
+
profession: {
|
|
163
|
+
type: String,
|
|
164
|
+
required: true,
|
|
165
|
+
},
|
|
166
|
+
grossIncome: {
|
|
167
|
+
type: Number,
|
|
168
|
+
required: true,
|
|
169
|
+
},
|
|
170
|
+
netIncome: {
|
|
171
|
+
type: Number,
|
|
172
|
+
required: true,
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
toJSON: {
|
|
177
|
+
transform(doc, ret) {
|
|
178
|
+
ret.id = ret._id;
|
|
179
|
+
delete ret.password;
|
|
180
|
+
delete ret.__v;
|
|
181
|
+
delete ret._id;
|
|
182
|
+
delete ret.followers;
|
|
183
|
+
delete ret.following;
|
|
184
|
+
delete ret.phoneNumber;
|
|
185
|
+
delete ret.verified;
|
|
186
|
+
delete ret.paidPlan;
|
|
187
|
+
delete ret.savedPosts;
|
|
188
|
+
delete ret.likedPosts;
|
|
189
|
+
delete ret.upVotedPosts;
|
|
190
|
+
delete ret.likedComments;
|
|
191
|
+
delete ret.bannedAccounts;
|
|
192
|
+
delete ret.reportedPosts;
|
|
193
|
+
delete ret.validReportedPosts;
|
|
194
|
+
delete ret.totalLikes;
|
|
195
|
+
delete ret.totalUpVotes;
|
|
196
|
+
delete ret.totalDownVotes;
|
|
197
|
+
delete ret.location;
|
|
198
|
+
delete ret.height;
|
|
199
|
+
delete ret.weight;
|
|
200
|
+
delete ret.profession;
|
|
201
|
+
delete ret.grossIncome;
|
|
202
|
+
delete ret.netIncome;
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
userSchema.pre('save', async function (done) {
|
|
209
|
+
if (this.isModified('password')) {
|
|
210
|
+
const hashedPassword = await Password.toHash(this.get('password'));
|
|
211
|
+
this.set('password', hashedPassword);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
done();
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
userSchema.statics.build = (attrs: UserAttributes) => {
|
|
218
|
+
return new User(attrs);
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
const User = mongoose.model<UserDocument, UserModel>('User', userSchema);
|
|
222
|
+
|
|
223
|
+
export default User;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { scrypt, randomBytes } from 'crypto';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
|
|
4
|
+
const scryptAsync = promisify(scrypt);
|
|
5
|
+
|
|
6
|
+
export default class Password {
|
|
7
|
+
static async toHash(password: string) {
|
|
8
|
+
const salt = randomBytes(16).toString('hex');
|
|
9
|
+
const buffer = (await scryptAsync(password, salt, 64)) as Buffer;
|
|
10
|
+
|
|
11
|
+
return `${buffer.toString('hex')}.${salt}`;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
static async compare(storedPassword: string, suppliedPassword: string) {
|
|
15
|
+
const [hashedPassword, salt] = storedPassword.split('.');
|
|
16
|
+
const buffer = (await scryptAsync(suppliedPassword, salt, 64)) as Buffer;
|
|
17
|
+
return buffer.toString('hex') === hashedPassword;
|
|
18
|
+
}
|
|
19
|
+
}
|