@prosopo/client-example-server 2.7.122 → 2.7.124
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/.turbo/turbo-build$colon$cjs.log +15 -31
- package/.turbo/turbo-build$colon$tsc.log +21 -21
- package/.turbo/turbo-build.log +16 -31
- package/CHANGELOG.md +35 -0
- package/dist/_virtual/_rolldown/runtime.js +3 -0
- package/dist/app.d.ts +15 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +122 -93
- package/dist/app.js.map +1 -1
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/app.cjs +148 -106
- package/dist/cjs/controllers/auth.cjs +180 -244
- package/dist/cjs/models/user.cjs +21 -22
- package/dist/cjs/routes/routes.cjs +21 -24
- package/dist/cjs/utils/connection.cjs +20 -23
- package/dist/cjs/utils/database.cjs +3 -28
- package/dist/controllers/auth.d.ts +1 -1
- package/dist/controllers/auth.d.ts.map +1 -1
- package/dist/controllers/auth.js +173 -241
- package/dist/controllers/auth.js.map +1 -1
- package/dist/models/user.d.ts +2 -2
- package/dist/models/user.js +18 -22
- package/dist/routes/routes.d.ts.map +1 -1
- package/dist/routes/routes.js +18 -24
- package/dist/routes/routes.js.map +1 -1
- package/dist/tests/app.unit.test.d.ts +2 -0
- package/dist/tests/app.unit.test.d.ts.map +1 -0
- package/dist/tests/app.unit.test.js +318 -0
- package/dist/tests/app.unit.test.js.map +1 -0
- package/dist/tests/appEntrypoint.unit.test.d.ts +2 -0
- package/dist/tests/appEntrypoint.unit.test.d.ts.map +1 -0
- package/dist/tests/appEntrypoint.unit.test.js +100 -0
- package/dist/tests/appEntrypoint.unit.test.js.map +1 -0
- package/dist/tests/auth.unit.test.d.ts +2 -0
- package/dist/tests/auth.unit.test.d.ts.map +1 -0
- package/dist/tests/auth.unit.test.js +426 -0
- package/dist/tests/auth.unit.test.js.map +1 -0
- package/dist/tests/authHarness.d.ts +40 -0
- package/dist/tests/authHarness.d.ts.map +1 -0
- package/dist/tests/authHarness.js +57 -0
- package/dist/tests/authHarness.js.map +1 -0
- package/dist/tests/clientExampleServer.test-d.d.ts +2 -0
- package/dist/tests/clientExampleServer.test-d.d.ts.map +1 -0
- package/dist/tests/clientExampleServer.test-d.js +84 -0
- package/dist/tests/clientExampleServer.test-d.js.map +1 -0
- package/dist/tests/routes.unit.test.d.ts +2 -0
- package/dist/tests/routes.unit.test.d.ts.map +1 -0
- package/dist/tests/routes.unit.test.js +123 -0
- package/dist/tests/routes.unit.test.js.map +1 -0
- package/dist/tests/utils.unit.test.d.ts +2 -0
- package/dist/tests/utils.unit.test.d.ts.map +1 -0
- package/dist/tests/utils.unit.test.js +125 -0
- package/dist/tests/utils.unit.test.js.map +1 -0
- package/dist/utils/connection.js +14 -19
- package/dist/utils/database.js +4 -8
- package/package.json +17 -14
- package/src/app.ts +114 -73
- package/src/controllers/auth.ts +40 -31
- package/src/routes/routes.ts +5 -2
- package/src/tests/app.unit.test.ts +428 -0
- package/src/tests/appEntrypoint.unit.test.ts +154 -0
- package/src/tests/auth.unit.test.ts +859 -0
- package/src/tests/authHarness.ts +131 -0
- package/src/tests/clientExampleServer.test-d.ts +146 -0
- package/src/tests/routes.unit.test.ts +166 -0
- package/src/tests/utils.unit.test.ts +169 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/vite.test.config.ts +18 -0
|
@@ -1,255 +1,191 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
);
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let _prosopo_common = require("@prosopo/common");
|
|
3
|
+
let _prosopo_logger = require("@prosopo/logger");
|
|
4
|
+
let _prosopo_server = require("@prosopo/server");
|
|
5
|
+
let _prosopo_util = require("@prosopo/util");
|
|
6
|
+
let _noble_hashes_blake2b = require("@noble/hashes/blake2b");
|
|
7
|
+
let _polkadot_util = require("@polkadot/util");
|
|
8
|
+
let _polkadot_util_crypto = require("@polkadot/util-crypto");
|
|
9
|
+
let _prosopo_keyring = require("@prosopo/keyring");
|
|
10
|
+
let _prosopo_types = require("@prosopo/types");
|
|
11
|
+
let jsonwebtoken = require("jsonwebtoken");
|
|
12
|
+
jsonwebtoken = require_runtime.__toESM(jsonwebtoken, 1);
|
|
13
|
+
let zod = require("zod");
|
|
14
|
+
//#region src/controllers/auth.ts
|
|
15
|
+
var logger = (0, _prosopo_logger.getLogger)("info", "client-example-server:auth");
|
|
16
|
+
var SubscribeBodySpec = _prosopo_types.ProcaptchaResponse.merge(zod.z.object({
|
|
17
|
+
email: zod.z.string().email(),
|
|
18
|
+
password: zod.z.string(),
|
|
19
|
+
siteKey: zod.z.string()
|
|
20
|
+
}));
|
|
22
21
|
function hashPassword(password) {
|
|
23
|
-
|
|
22
|
+
return (0, _polkadot_util.u8aToHex)((0, _noble_hashes_blake2b.blake2b)(password));
|
|
24
23
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
24
|
+
var NO_IP = "NO_IP";
|
|
25
|
+
/**
|
|
26
|
+
* Derives the correct KeyringPair and secret for a given site key by trying different captcha types.
|
|
27
|
+
* @param baseSecret - The base secret from config
|
|
28
|
+
* @param siteKey - The site key to match against
|
|
29
|
+
* @returns Object containing the matched pair and its corresponding secret
|
|
30
|
+
* @throws Error if no matching pair is found
|
|
31
|
+
*/
|
|
32
|
+
var getPairAndSecretForSiteKey = (baseSecret, siteKey) => {
|
|
33
|
+
let pair;
|
|
34
|
+
let secret = baseSecret;
|
|
35
|
+
pair = (0, _prosopo_keyring.getPair)(secret);
|
|
36
|
+
if (pair.address === siteKey) {
|
|
37
|
+
logger.info(() => ({
|
|
38
|
+
msg: "Site key matches the server configuration without captcha type suffix",
|
|
39
|
+
data: {
|
|
40
|
+
siteKeyDerived: pair?.address,
|
|
41
|
+
siteKey
|
|
42
|
+
}
|
|
43
|
+
}));
|
|
44
|
+
return {
|
|
45
|
+
pair,
|
|
46
|
+
secret
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
for (const captchaType of [
|
|
50
|
+
_prosopo_types.CaptchaType.pow,
|
|
51
|
+
_prosopo_types.CaptchaType.image,
|
|
52
|
+
_prosopo_types.CaptchaType.frictionless,
|
|
53
|
+
_prosopo_types.CaptchaType.puzzle
|
|
54
|
+
]) {
|
|
55
|
+
const newSecret = `${baseSecret}//${captchaType}`;
|
|
56
|
+
pair = (0, _prosopo_keyring.getPair)(newSecret);
|
|
57
|
+
logger.info(() => ({
|
|
58
|
+
msg: "Checking pair",
|
|
59
|
+
data: {
|
|
60
|
+
captchaType,
|
|
61
|
+
siteKeyDerived: pair?.address,
|
|
62
|
+
siteKey
|
|
63
|
+
}
|
|
64
|
+
}));
|
|
65
|
+
if (pair.address === siteKey) {
|
|
66
|
+
secret = newSecret;
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (!pair || pair.address !== siteKey) throw new Error(`Site key does not match the server configuration: Provided ${siteKey} vs Server ${pair?.address}`);
|
|
71
|
+
return {
|
|
72
|
+
pair,
|
|
73
|
+
secret
|
|
74
|
+
};
|
|
71
75
|
};
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
}));
|
|
86
|
-
const response = await fetch(verifyEndpoint, {
|
|
87
|
-
method: "POST",
|
|
88
|
-
body: JSON.stringify(body)
|
|
89
|
-
});
|
|
90
|
-
return response.json();
|
|
76
|
+
var getResponse = async (ip, token, secret, verifyEndpoint, email) => {
|
|
77
|
+
const body = {
|
|
78
|
+
[_prosopo_types.ApiParams.token]: token,
|
|
79
|
+
[_prosopo_types.ApiParams.secret]: secret,
|
|
80
|
+
...email ? { [_prosopo_types.ApiParams.email]: email } : {}
|
|
81
|
+
};
|
|
82
|
+
if (process.env.NODE_ENV !== "development") body[_prosopo_types.ApiParams.ip] = ip;
|
|
83
|
+
logger.info(() => ({ data: { body } }));
|
|
84
|
+
return (await fetch(verifyEndpoint, {
|
|
85
|
+
method: "POST",
|
|
86
|
+
body: JSON.stringify(body)
|
|
87
|
+
})).json();
|
|
91
88
|
};
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
email
|
|
106
|
-
);
|
|
107
|
-
logger.info(() => ({
|
|
108
|
-
data: {
|
|
109
|
-
response
|
|
110
|
-
}
|
|
111
|
-
}));
|
|
112
|
-
return response.verified;
|
|
113
|
-
}
|
|
114
|
-
const verified = await prosopoServer.isVerified(token, ip, email);
|
|
115
|
-
logger.info(() => ({
|
|
116
|
-
data: {
|
|
117
|
-
verified
|
|
118
|
-
}
|
|
119
|
-
}));
|
|
120
|
-
return verified[types.ApiParams.verified];
|
|
89
|
+
var verify = async (prosopoServer, verifyType, verifyEndpoint, token, secret, ip, email) => {
|
|
90
|
+
if (verifyType === "api") {
|
|
91
|
+
logger.info(() => ({
|
|
92
|
+
msg: "Verifying using the API endpoint",
|
|
93
|
+
data: { verifyEndpoint }
|
|
94
|
+
}));
|
|
95
|
+
const response = await getResponse(ip, token, secret, verifyEndpoint, email);
|
|
96
|
+
logger.info(() => ({ data: { response } }));
|
|
97
|
+
return response.verified;
|
|
98
|
+
}
|
|
99
|
+
const verified = await prosopoServer.isVerified(token, ip, email);
|
|
100
|
+
logger.info(() => ({ data: { verified } }));
|
|
101
|
+
return verified[_prosopo_types.ApiParams.verified];
|
|
121
102
|
};
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
password: passwordHash,
|
|
162
|
-
salt
|
|
163
|
-
}).then(() => {
|
|
164
|
-
res.status(200).json({ message: "user created" });
|
|
165
|
-
}).catch((err) => {
|
|
166
|
-
logger.error(() => ({
|
|
167
|
-
err,
|
|
168
|
-
msg: "Error creating user in database"
|
|
169
|
-
}));
|
|
170
|
-
res.status(502).json({ message: "error while creating the user" });
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
} else {
|
|
174
|
-
res.status(401).json({ message: "user has not completed a captcha", verified });
|
|
175
|
-
}
|
|
176
|
-
} catch (err) {
|
|
177
|
-
console.error("error", err);
|
|
178
|
-
res.status(500).json({ message: err.message || "internal server error" });
|
|
179
|
-
}
|
|
103
|
+
var signup = async (mongoose, config, verifyEndpoint, verifyType, req, res, next) => {
|
|
104
|
+
try {
|
|
105
|
+
if (!config.account.secret) throw new _prosopo_common.ProsopoEnvError("GENERAL.MNEMONIC_UNDEFINED", { context: { missingParams: ["PROSOPO_SITE_PRIVATE_KEY"] } });
|
|
106
|
+
const User = mongoose.model("User");
|
|
107
|
+
const dbUser = await User.findOne({ email: { $eq: req.body.email } });
|
|
108
|
+
const payload = SubscribeBodySpec.parse(req.body);
|
|
109
|
+
const token = payload[_prosopo_types.ApiParams.procaptchaResponse];
|
|
110
|
+
const siteKey = payload[_prosopo_types.ApiParams.siteKey];
|
|
111
|
+
const { pair, secret } = getPairAndSecretForSiteKey(config.account.secret, siteKey);
|
|
112
|
+
const prosopoServer = new _prosopo_server.ProsopoServer(config, pair);
|
|
113
|
+
if (dbUser) return res.status(409).json({ message: "email already exists" });
|
|
114
|
+
const email = req.body.email;
|
|
115
|
+
const verified = await verify(prosopoServer, verifyType, verifyEndpoint, token, secret, req.headers["x-client-ip"]?.toString() || "127.0.0.1", email);
|
|
116
|
+
if (verified === true) {
|
|
117
|
+
const salt = (0, _polkadot_util_crypto.randomAsHex)(32);
|
|
118
|
+
const passwordHash = hashPassword(`${req.body.password}${salt}`);
|
|
119
|
+
return User.create({
|
|
120
|
+
email,
|
|
121
|
+
name: req.body.name,
|
|
122
|
+
password: passwordHash,
|
|
123
|
+
salt
|
|
124
|
+
}).then(() => {
|
|
125
|
+
res.status(200).json({ message: "user created" });
|
|
126
|
+
}).catch((err) => {
|
|
127
|
+
logger.error(() => ({
|
|
128
|
+
err,
|
|
129
|
+
msg: "Error creating user in database"
|
|
130
|
+
}));
|
|
131
|
+
res.status(502).json({ message: "error while creating the user" });
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
res.status(401).json({
|
|
135
|
+
message: "user has not completed a captcha",
|
|
136
|
+
verified
|
|
137
|
+
});
|
|
138
|
+
} catch (err) {
|
|
139
|
+
console.error("error", err);
|
|
140
|
+
res.status(500).json({ message: err.message || "internal server error" });
|
|
141
|
+
}
|
|
180
142
|
};
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
data: {
|
|
210
|
-
verified
|
|
211
|
-
}
|
|
212
|
-
}));
|
|
213
|
-
if (verified) {
|
|
214
|
-
const passwordHash = hashPassword(
|
|
215
|
-
`${req.body.password}${dbUser.salt}`
|
|
216
|
-
);
|
|
217
|
-
if (passwordHash !== dbUser.password) {
|
|
218
|
-
return res.status(401).json({ message: "invalid credentials" });
|
|
219
|
-
}
|
|
220
|
-
const token2 = jwt.sign({ email: req.body.email }, "secret", {
|
|
221
|
-
expiresIn: "1h"
|
|
222
|
-
});
|
|
223
|
-
return res.status(200).json({ message: "user logged in", token: token2 });
|
|
224
|
-
}
|
|
225
|
-
return res.status(401).json({ message: "user has not completed a captcha", verified });
|
|
226
|
-
}
|
|
227
|
-
return res.status(404).json({ message: "user not found" });
|
|
228
|
-
}).catch((err) => {
|
|
229
|
-
console.error("error", err);
|
|
230
|
-
res.status(500).json({ message: err.message || "internal server error" });
|
|
231
|
-
});
|
|
143
|
+
var login = async (mongoose, config, verifyEndpoint, verifyType, req, res) => {
|
|
144
|
+
await mongoose.model("User").findOne({ email: { $eq: req.body.email } }).then(async (dbUser) => {
|
|
145
|
+
if (dbUser) {
|
|
146
|
+
const payload = SubscribeBodySpec.parse(req.body);
|
|
147
|
+
const token = payload[_prosopo_types.ApiParams.procaptchaResponse];
|
|
148
|
+
const siteKey = payload[_prosopo_types.ApiParams.siteKey];
|
|
149
|
+
if (!config.account.secret) throw new _prosopo_common.ProsopoEnvError("GENERAL.SECRET_MISSING", { context: { missingParams: ["PROSOPO_SITE_PRIVATE_KEY"] } });
|
|
150
|
+
const { pair, secret } = getPairAndSecretForSiteKey(config.account.secret, siteKey);
|
|
151
|
+
const verified = await verify(new _prosopo_server.ProsopoServer(config, pair), verifyType, verifyEndpoint, token, secret, req.headers["x-client-ip"]?.toString() || NO_IP);
|
|
152
|
+
logger.info(() => ({ data: { verified } }));
|
|
153
|
+
if (verified) {
|
|
154
|
+
if (hashPassword(`${req.body.password}${dbUser.salt}`) !== dbUser.password) return res.status(401).json({ message: "invalid credentials" });
|
|
155
|
+
const token = jsonwebtoken.default.sign({ email: req.body.email }, "secret", { expiresIn: "1h" });
|
|
156
|
+
return res.status(200).json({
|
|
157
|
+
message: "user logged in",
|
|
158
|
+
token
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return res.status(401).json({
|
|
162
|
+
message: "user has not completed a captcha",
|
|
163
|
+
verified
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return res.status(404).json({ message: "user not found" });
|
|
167
|
+
}).catch((err) => {
|
|
168
|
+
console.error("error", err);
|
|
169
|
+
res.status(500).json({ message: err.message || "internal server error" });
|
|
170
|
+
});
|
|
232
171
|
};
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
res.status(401).json({ message: "unauthorized" });
|
|
249
|
-
} else {
|
|
250
|
-
res.status(200).json({ message: "here is your resource" });
|
|
251
|
-
}
|
|
172
|
+
var isAuth = (req, res) => {
|
|
173
|
+
const authHeader = req.get("Authorization") || "";
|
|
174
|
+
if (!authHeader) return res.status(401).json({ message: "not authenticated" });
|
|
175
|
+
const headerParts = authHeader.split(" ");
|
|
176
|
+
if (headerParts.length < 2) return res.status(401).json({ message: "not authenticated" });
|
|
177
|
+
const token = (0, _prosopo_util.at)(headerParts, 1);
|
|
178
|
+
if (!token) return res.status(401).json({ message: "not authenticated" });
|
|
179
|
+
let decodedToken = "";
|
|
180
|
+
try {
|
|
181
|
+
decodedToken = jsonwebtoken.default.verify(token, "secret");
|
|
182
|
+
} catch (err) {
|
|
183
|
+
return res.status(500).json({ message: err.message || "could not decode the token" });
|
|
184
|
+
}
|
|
185
|
+
if (!decodedToken) return res.status(401).json({ message: "unauthorized" });
|
|
186
|
+
return res.status(200).json({ message: "here is your resource" });
|
|
252
187
|
};
|
|
188
|
+
//#endregion
|
|
253
189
|
exports.isAuth = isAuth;
|
|
254
190
|
exports.login = login;
|
|
255
191
|
exports.signup = signup;
|
package/dist/cjs/models/user.cjs
CHANGED
|
@@ -1,23 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
required: true
|
|
21
|
-
}
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
let mongoose = require("mongoose");
|
|
3
|
+
mongoose = require_runtime.__toESM(mongoose, 1);
|
|
4
|
+
//#region src/models/user.ts
|
|
5
|
+
var UserSchema = new mongoose.Schema({
|
|
6
|
+
email: {
|
|
7
|
+
type: mongoose.default.SchemaTypes.String,
|
|
8
|
+
required: true
|
|
9
|
+
},
|
|
10
|
+
name: { type: mongoose.default.SchemaTypes.String },
|
|
11
|
+
password: {
|
|
12
|
+
type: mongoose.default.SchemaTypes.String,
|
|
13
|
+
required: true
|
|
14
|
+
},
|
|
15
|
+
id: { type: mongoose.default.SchemaTypes.Number },
|
|
16
|
+
salt: {
|
|
17
|
+
type: mongoose.default.SchemaTypes.String,
|
|
18
|
+
required: true
|
|
19
|
+
}
|
|
22
20
|
});
|
|
23
|
-
|
|
21
|
+
//#endregion
|
|
22
|
+
exports.default = UserSchema;
|
|
@@ -1,26 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_auth = require("../controllers/auth.cjs");
|
|
3
|
+
let express = require("express");
|
|
4
|
+
express = require_runtime.__toESM(express, 1);
|
|
5
|
+
//#region src/routes/routes.ts
|
|
5
6
|
function getRoutes(mongoose, config, verifyEndpoint, verifyType) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
});
|
|
21
|
-
router.use("/", (req, res) => {
|
|
22
|
-
res.status(404).json({ error: "page not found" });
|
|
23
|
-
});
|
|
24
|
-
return router;
|
|
7
|
+
const router = express.default.Router();
|
|
8
|
+
router.post("/login", require_auth.login.bind(null, mongoose, config, verifyEndpoint, verifyType));
|
|
9
|
+
router.post("/signup", require_auth.signup.bind(null, mongoose, config, verifyEndpoint, verifyType));
|
|
10
|
+
router.get("/private", require_auth.isAuth);
|
|
11
|
+
router.get("/public", (req, res) => {
|
|
12
|
+
res.status(200).json({ message: "here is your public resource" });
|
|
13
|
+
});
|
|
14
|
+
router.get("/health", (req, res) => {
|
|
15
|
+
res.status(200).json({ status: "ok" });
|
|
16
|
+
});
|
|
17
|
+
router.use("/", (req, res) => {
|
|
18
|
+
res.status(404).json({ error: "page not found" });
|
|
19
|
+
});
|
|
20
|
+
return router;
|
|
25
21
|
}
|
|
26
|
-
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.default = getRoutes;
|
|
@@ -1,25 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_user = require("../models/user.cjs");
|
|
3
|
+
let node_url = require("node:url");
|
|
4
|
+
let _prosopo_database = require("@prosopo/database");
|
|
5
|
+
let _typegoose_auto_increment = require("@typegoose/auto-increment");
|
|
6
|
+
let mongoose = require("mongoose");
|
|
7
|
+
mongoose = require_runtime.__toESM(mongoose, 1);
|
|
8
|
+
//#region src/utils/connection.ts
|
|
8
9
|
function connectionFactory(uri) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
field: "id"
|
|
20
|
-
});
|
|
21
|
-
conn.model("User", user);
|
|
22
|
-
}
|
|
23
|
-
return conn;
|
|
10
|
+
const appName = (0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href);
|
|
11
|
+
const conn = mongoose.default.createConnection(uri, (0, _prosopo_database.getMongoConnectionOptions)({
|
|
12
|
+
url: uri,
|
|
13
|
+
appName
|
|
14
|
+
}));
|
|
15
|
+
if (!conn.models.user) {
|
|
16
|
+
require_user.default.plugin(_typegoose_auto_increment.AutoIncrementID, { field: "id" });
|
|
17
|
+
conn.model("User", require_user.default);
|
|
18
|
+
}
|
|
19
|
+
return conn;
|
|
24
20
|
}
|
|
25
|
-
|
|
21
|
+
//#endregion
|
|
22
|
+
exports.default = connectionFactory;
|
|
@@ -1,32 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __copyProps = (to, from, except, desc) => {
|
|
9
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
-
for (let key of __getOwnPropNames(from))
|
|
11
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
-
}
|
|
14
|
-
return to;
|
|
15
|
-
};
|
|
16
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
-
mod
|
|
23
|
-
));
|
|
24
|
-
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
1
|
+
//#region src/utils/database.ts
|
|
25
2
|
async function memoryServerSetup() {
|
|
26
|
-
|
|
27
|
-
const mongod = MongoMemoryServer.create();
|
|
28
|
-
const memoryServer = await mongod;
|
|
29
|
-
return memoryServer.getUri();
|
|
3
|
+
return (await (await import("mongodb-memory-server")).MongoMemoryServer.create()).getUri();
|
|
30
4
|
}
|
|
5
|
+
//#endregion
|
|
31
6
|
exports.default = memoryServerSetup;
|
|
32
7
|
exports.memoryServerSetup = memoryServerSetup;
|
|
@@ -3,6 +3,6 @@ import type { NextFunction, Request, Response } from "express";
|
|
|
3
3
|
import type { Connection } from "mongoose";
|
|
4
4
|
declare const signup: (mongoose: Connection, config: ProsopoServerConfigOutput, verifyEndpoint: string, verifyType: string, req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
|
|
5
5
|
declare const login: (mongoose: Connection, config: ProsopoServerConfigOutput, verifyEndpoint: string, verifyType: string, req: Request, res: Response) => Promise<void>;
|
|
6
|
-
declare const isAuth: (req: Request, res: Response) =>
|
|
6
|
+
declare const isAuth: (req: Request, res: Response) => Response<any, Record<string, any>>;
|
|
7
7
|
export { signup, login, isAuth };
|
|
8
8
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/controllers/auth.ts"],"names":[],"mappings":"AAqBA,OAAO,EAMN,KAAK,yBAAyB,EAC9B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/controllers/auth.ts"],"names":[],"mappings":"AAqBA,OAAO,EAMN,KAAK,yBAAyB,EAC9B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAuJ3C,QAAA,MAAM,MAAM,aACD,UAAU,UACZ,yBAAyB,kBACjB,MAAM,cACV,MAAM,OACb,OAAO,OACP,QAAQ,QACP,YAAY,uDAyElB,CAAC;AAEF,QAAA,MAAM,KAAK,aACA,UAAU,UACZ,yBAAyB,kBACjB,MAAM,cACV,MAAM,OACb,OAAO,OACP,QAAQ,kBAsEb,CAAC;AAEF,QAAA,MAAM,MAAM,QAAS,OAAO,OAAO,QAAQ,uCAkC1C,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC"}
|