@nymphjs/tilmeld 1.0.0-alpha.4 → 1.0.0-alpha.40
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/CHANGELOG.md +174 -0
- package/dist/Group.js +13 -7
- package/dist/Group.js.map +1 -1
- package/dist/Group.test.js +6 -0
- package/dist/Group.test.js.map +1 -1
- package/dist/Tilmeld.js +115 -49
- package/dist/Tilmeld.js.map +1 -1
- package/dist/User.d.ts +40 -2
- package/dist/User.js +125 -15
- package/dist/User.js.map +1 -1
- package/dist/User.test.js +6 -0
- package/dist/User.test.js.map +1 -1
- package/dist/conf/defaults.js +22 -101
- package/dist/conf/defaults.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/tilmeldJoiProps.d.ts +12 -0
- package/dist/tilmeldJoiProps.js +20 -0
- package/dist/tilmeldJoiProps.js.map +1 -0
- package/package.json +16 -16
- package/src/Group.test.ts +8 -0
- package/src/Group.ts +13 -7
- package/src/Tilmeld.ts +162 -57
- package/src/User.test.ts +8 -0
- package/src/User.ts +242 -19
- package/src/conf/d.ts +1 -0
- package/src/conf/defaults.ts +7 -57
- package/src/index.ts +3 -0
- package/src/tilmeldJoiProps.ts +46 -0
package/src/User.ts
CHANGED
|
@@ -24,6 +24,44 @@ import {
|
|
|
24
24
|
EmailChangeRateLimitExceededError,
|
|
25
25
|
} from './errors';
|
|
26
26
|
|
|
27
|
+
export type EventType =
|
|
28
|
+
| 'beforeRegister'
|
|
29
|
+
| 'afterRegister'
|
|
30
|
+
| 'beforeLogin'
|
|
31
|
+
| 'afterLogin'
|
|
32
|
+
| 'beforeLogout'
|
|
33
|
+
| 'afterLogout';
|
|
34
|
+
/**
|
|
35
|
+
* Theses are run before the user data checks, so the only checks before are
|
|
36
|
+
* whether registration is allowed and whether the user is already registered.
|
|
37
|
+
*/
|
|
38
|
+
export type TilmeldBeforeRegisterCallback = (
|
|
39
|
+
user: User & UserData,
|
|
40
|
+
data: { password: string; additionalData?: { [k: string]: any } }
|
|
41
|
+
) => Promise<void> | void;
|
|
42
|
+
export type TilmeldAfterRegisterCallback = (
|
|
43
|
+
user: User & UserData,
|
|
44
|
+
result: { loggedin: boolean; message: string }
|
|
45
|
+
) => Promise<void> | void;
|
|
46
|
+
/**
|
|
47
|
+
* These are run after the authentication checks, but before the login action.
|
|
48
|
+
*/
|
|
49
|
+
export type TilmeldBeforeLoginCallback = (
|
|
50
|
+
user: User & UserData,
|
|
51
|
+
data: {
|
|
52
|
+
username: string;
|
|
53
|
+
password: string;
|
|
54
|
+
additionalData?: { [k: string]: any };
|
|
55
|
+
}
|
|
56
|
+
) => void;
|
|
57
|
+
/**
|
|
58
|
+
* This is run before the transaction is committed, and you can perform
|
|
59
|
+
* additional functions on the transaction, which is available in `user.$nymph`.
|
|
60
|
+
*/
|
|
61
|
+
export type TilmeldAfterLoginCallback = (user: User & UserData) => void;
|
|
62
|
+
export type TilmeldBeforeLogoutCallback = (user: User & UserData) => void;
|
|
63
|
+
export type TilmeldAfterLogoutCallback = (user: User & UserData) => void;
|
|
64
|
+
|
|
27
65
|
export type UserData = {
|
|
28
66
|
/**
|
|
29
67
|
* The abilities granted to the user.
|
|
@@ -142,6 +180,12 @@ export default class User extends AbleObject<UserData> {
|
|
|
142
180
|
static tilmeld: Tilmeld;
|
|
143
181
|
static ETYPE = 'tilmeld_user';
|
|
144
182
|
static class = 'User';
|
|
183
|
+
private static beforeRegisterCallbacks: TilmeldBeforeRegisterCallback[] = [];
|
|
184
|
+
private static afterRegisterCallbacks: TilmeldAfterRegisterCallback[] = [];
|
|
185
|
+
private static beforeLoginCallbacks: TilmeldBeforeLoginCallback[] = [];
|
|
186
|
+
private static afterLoginCallbacks: TilmeldAfterLoginCallback[] = [];
|
|
187
|
+
private static beforeLogoutCallbacks: TilmeldBeforeLogoutCallback[] = [];
|
|
188
|
+
private static afterLogoutCallbacks: TilmeldAfterLogoutCallback[] = [];
|
|
145
189
|
|
|
146
190
|
private static DEFAULT_CLIENT_ENABLED_METHODS = [
|
|
147
191
|
'$checkUsername',
|
|
@@ -171,7 +215,7 @@ export default class User extends AbleObject<UserData> {
|
|
|
171
215
|
];
|
|
172
216
|
private static DEFAULT_ALLOWLIST_DATA: string[] = [];
|
|
173
217
|
|
|
174
|
-
protected $clientEnabledMethods = User.DEFAULT_CLIENT_ENABLED_METHODS;
|
|
218
|
+
protected $clientEnabledMethods = [...User.DEFAULT_CLIENT_ENABLED_METHODS];
|
|
175
219
|
public static clientEnabledStaticMethods = [
|
|
176
220
|
'current',
|
|
177
221
|
'loginUser',
|
|
@@ -179,9 +223,9 @@ export default class User extends AbleObject<UserData> {
|
|
|
179
223
|
'recover',
|
|
180
224
|
'getClientConfig',
|
|
181
225
|
];
|
|
182
|
-
protected $privateData = User.DEFAULT_PRIVATE_DATA;
|
|
183
|
-
public static searchRestrictedData = User.DEFAULT_PRIVATE_DATA;
|
|
184
|
-
protected $allowlistData? = User.DEFAULT_ALLOWLIST_DATA;
|
|
226
|
+
protected $privateData = [...User.DEFAULT_PRIVATE_DATA];
|
|
227
|
+
public static searchRestrictedData = [...User.DEFAULT_PRIVATE_DATA];
|
|
228
|
+
protected $allowlistData? = [...User.DEFAULT_ALLOWLIST_DATA];
|
|
185
229
|
protected $allowlistTags?: string[] = [];
|
|
186
230
|
|
|
187
231
|
/**
|
|
@@ -429,7 +473,11 @@ export default class User extends AbleObject<UserData> {
|
|
|
429
473
|
};
|
|
430
474
|
}
|
|
431
475
|
|
|
432
|
-
public static async loginUser(data: {
|
|
476
|
+
public static async loginUser(data: {
|
|
477
|
+
username: string;
|
|
478
|
+
password: string;
|
|
479
|
+
additionalData?: { [k: string]: any };
|
|
480
|
+
}) {
|
|
433
481
|
if (!('username' in data) || !data.username.length) {
|
|
434
482
|
return { result: false, message: 'Incorrect login/password.' };
|
|
435
483
|
}
|
|
@@ -443,7 +491,11 @@ export default class User extends AbleObject<UserData> {
|
|
|
443
491
|
return result;
|
|
444
492
|
}
|
|
445
493
|
|
|
446
|
-
public $login(data: {
|
|
494
|
+
public $login(data: {
|
|
495
|
+
username: string;
|
|
496
|
+
password: string;
|
|
497
|
+
additionalData?: { [k: string]: any };
|
|
498
|
+
}) {
|
|
447
499
|
const tilmeld = this.$nymph.tilmeld as Tilmeld;
|
|
448
500
|
if (this.guid == null) {
|
|
449
501
|
return { result: false, message: 'Incorrect login/password.' };
|
|
@@ -458,11 +510,32 @@ export default class User extends AbleObject<UserData> {
|
|
|
458
510
|
return { result: false, message: 'Incorrect login/password.' };
|
|
459
511
|
}
|
|
460
512
|
|
|
513
|
+
try {
|
|
514
|
+
for (let callback of (this.constructor as typeof User)
|
|
515
|
+
.beforeLoginCallbacks) {
|
|
516
|
+
if (callback) {
|
|
517
|
+
callback(this, data);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
} catch (e: any) {
|
|
521
|
+
return {
|
|
522
|
+
result: false,
|
|
523
|
+
message: e.message,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
|
|
461
527
|
// Authentication was successful, attempt to login.
|
|
462
528
|
if (!tilmeld.login(this, true)) {
|
|
463
529
|
return { result: false, message: 'Incorrect login/password.' };
|
|
464
530
|
}
|
|
465
531
|
|
|
532
|
+
for (let callback of (this.constructor as typeof User)
|
|
533
|
+
.afterLoginCallbacks) {
|
|
534
|
+
if (callback) {
|
|
535
|
+
callback(this);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
466
539
|
// Login was successful.
|
|
467
540
|
return { result: true, message: 'You are logged in.' };
|
|
468
541
|
}
|
|
@@ -473,7 +546,30 @@ export default class User extends AbleObject<UserData> {
|
|
|
473
546
|
*/
|
|
474
547
|
public $logout() {
|
|
475
548
|
const tilmeld = this.$nymph.tilmeld as Tilmeld;
|
|
549
|
+
|
|
550
|
+
try {
|
|
551
|
+
for (let callback of (this.constructor as typeof User)
|
|
552
|
+
.beforeLogoutCallbacks) {
|
|
553
|
+
if (callback) {
|
|
554
|
+
callback(this);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
} catch (e: any) {
|
|
558
|
+
return {
|
|
559
|
+
result: false,
|
|
560
|
+
message: e.message,
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
|
|
476
564
|
tilmeld.logout();
|
|
565
|
+
|
|
566
|
+
for (let callback of (this.constructor as typeof User)
|
|
567
|
+
.afterLogoutCallbacks) {
|
|
568
|
+
if (callback) {
|
|
569
|
+
callback(this);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
|
|
477
573
|
return { result: true, message: 'You have been logged out.' };
|
|
478
574
|
}
|
|
479
575
|
|
|
@@ -579,9 +675,9 @@ export default class User extends AbleObject<UserData> {
|
|
|
579
675
|
const tilmeld = this.$nymph.tilmeld as Tilmeld;
|
|
580
676
|
let user = givenUser ?? tilmeld.User.current();
|
|
581
677
|
|
|
582
|
-
this.$clientEnabledMethods = User.DEFAULT_CLIENT_ENABLED_METHODS;
|
|
583
|
-
this.$privateData = User.DEFAULT_PRIVATE_DATA;
|
|
584
|
-
this.$allowlistData = User.DEFAULT_ALLOWLIST_DATA;
|
|
678
|
+
this.$clientEnabledMethods = [...User.DEFAULT_CLIENT_ENABLED_METHODS];
|
|
679
|
+
this.$privateData = [...User.DEFAULT_PRIVATE_DATA];
|
|
680
|
+
this.$allowlistData = [...User.DEFAULT_ALLOWLIST_DATA];
|
|
585
681
|
|
|
586
682
|
if (tilmeld.config.emailUsernames) {
|
|
587
683
|
this.$privateData.push('username');
|
|
@@ -1123,8 +1219,9 @@ export default class User extends AbleObject<UserData> {
|
|
|
1123
1219
|
|
|
1124
1220
|
public async $register(data: {
|
|
1125
1221
|
password: string;
|
|
1222
|
+
additionalData?: { [k: string]: any };
|
|
1126
1223
|
}): Promise<{ result: boolean; loggedin: boolean; message: string }> {
|
|
1127
|
-
|
|
1224
|
+
let tilmeld = this.$nymph.tilmeld as Tilmeld;
|
|
1128
1225
|
if (!tilmeld.config.allowRegistration) {
|
|
1129
1226
|
return {
|
|
1130
1227
|
result: false,
|
|
@@ -1139,6 +1236,22 @@ export default class User extends AbleObject<UserData> {
|
|
|
1139
1236
|
message: 'This is already a registered user.',
|
|
1140
1237
|
};
|
|
1141
1238
|
}
|
|
1239
|
+
|
|
1240
|
+
try {
|
|
1241
|
+
for (let callback of (this.constructor as typeof User)
|
|
1242
|
+
.beforeRegisterCallbacks) {
|
|
1243
|
+
if (callback) {
|
|
1244
|
+
await callback(this, data);
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
} catch (e: any) {
|
|
1248
|
+
return {
|
|
1249
|
+
result: false,
|
|
1250
|
+
loggedin: false,
|
|
1251
|
+
message: e.message,
|
|
1252
|
+
};
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1142
1255
|
if (!('password' in data) || !data.password.length) {
|
|
1143
1256
|
return {
|
|
1144
1257
|
result: false,
|
|
@@ -1167,7 +1280,10 @@ export default class User extends AbleObject<UserData> {
|
|
|
1167
1280
|
|
|
1168
1281
|
// Start transaction.
|
|
1169
1282
|
const transaction = 'tilmeld-register-' + nanoid();
|
|
1283
|
+
const nymph = this.$nymph;
|
|
1170
1284
|
const tnymph = await this.$nymph.startTransaction(transaction);
|
|
1285
|
+
this.$nymph = tnymph;
|
|
1286
|
+
tilmeld = this.$nymph.tilmeld as Tilmeld;
|
|
1171
1287
|
|
|
1172
1288
|
try {
|
|
1173
1289
|
// Add primary group.
|
|
@@ -1191,6 +1307,7 @@ export default class User extends AbleObject<UserData> {
|
|
|
1191
1307
|
}
|
|
1192
1308
|
if (!(await generatedPrimaryGroup.$saveSkipAC())) {
|
|
1193
1309
|
await tnymph.rollback(transaction);
|
|
1310
|
+
this.$nymph = nymph;
|
|
1194
1311
|
return {
|
|
1195
1312
|
result: false,
|
|
1196
1313
|
loggedin: false,
|
|
@@ -1291,6 +1408,7 @@ export default class User extends AbleObject<UserData> {
|
|
|
1291
1408
|
generatedPrimaryGroup.user = this;
|
|
1292
1409
|
if (!(await generatedPrimaryGroup.$saveSkipAC())) {
|
|
1293
1410
|
await tnymph.rollback(transaction);
|
|
1411
|
+
this.$nymph = nymph;
|
|
1294
1412
|
return {
|
|
1295
1413
|
result: false,
|
|
1296
1414
|
loggedin: false,
|
|
@@ -1314,18 +1432,36 @@ export default class User extends AbleObject<UserData> {
|
|
|
1314
1432
|
tilmeld.config.unverifiedAccess &&
|
|
1315
1433
|
!madeAdmin
|
|
1316
1434
|
) {
|
|
1317
|
-
tilmeld.login(this, true);
|
|
1435
|
+
(nymph.tilmeld as Tilmeld).login(this, true);
|
|
1318
1436
|
message +=
|
|
1319
1437
|
"You're now logged in! An email has been sent to " +
|
|
1320
1438
|
`${this.$data.email} with a verification link for you to finish ` +
|
|
1321
1439
|
'registration.';
|
|
1322
1440
|
loggedin = true;
|
|
1323
1441
|
} else {
|
|
1324
|
-
tilmeld.login(this, true);
|
|
1442
|
+
(nymph.tilmeld as Tilmeld).login(this, true);
|
|
1325
1443
|
message += "You're now registered and logged in!";
|
|
1326
1444
|
loggedin = true;
|
|
1327
1445
|
}
|
|
1328
|
-
|
|
1446
|
+
|
|
1447
|
+
try {
|
|
1448
|
+
await tnymph.commit(transaction);
|
|
1449
|
+
this.$nymph = nymph;
|
|
1450
|
+
} catch (e: any) {
|
|
1451
|
+
(nymph.tilmeld as Tilmeld).logout();
|
|
1452
|
+
throw e;
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
for (let callback of (this.constructor as typeof User)
|
|
1456
|
+
.afterRegisterCallbacks) {
|
|
1457
|
+
if (callback) {
|
|
1458
|
+
await callback(this, {
|
|
1459
|
+
loggedin,
|
|
1460
|
+
message,
|
|
1461
|
+
});
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
|
|
1329
1465
|
return {
|
|
1330
1466
|
result: true,
|
|
1331
1467
|
loggedin,
|
|
@@ -1333,6 +1469,7 @@ export default class User extends AbleObject<UserData> {
|
|
|
1333
1469
|
};
|
|
1334
1470
|
} else {
|
|
1335
1471
|
await tnymph.rollback(transaction);
|
|
1472
|
+
this.$nymph = nymph;
|
|
1336
1473
|
return {
|
|
1337
1474
|
result: false,
|
|
1338
1475
|
loggedin: false,
|
|
@@ -1341,12 +1478,13 @@ export default class User extends AbleObject<UserData> {
|
|
|
1341
1478
|
}
|
|
1342
1479
|
} catch (e: any) {
|
|
1343
1480
|
await tnymph.rollback(transaction);
|
|
1481
|
+
this.$nymph = nymph;
|
|
1344
1482
|
throw e;
|
|
1345
1483
|
}
|
|
1346
1484
|
}
|
|
1347
1485
|
|
|
1348
1486
|
public async $save() {
|
|
1349
|
-
|
|
1487
|
+
let tilmeld = this.$nymph.tilmeld as Tilmeld;
|
|
1350
1488
|
if (this.$data.username == null || !this.$data.username.trim().length) {
|
|
1351
1489
|
return false;
|
|
1352
1490
|
}
|
|
@@ -1541,7 +1679,10 @@ export default class User extends AbleObject<UserData> {
|
|
|
1541
1679
|
|
|
1542
1680
|
// Start transaction.
|
|
1543
1681
|
const transaction = 'tilmeld-save-' + nanoid();
|
|
1682
|
+
const nymph = this.$nymph;
|
|
1544
1683
|
const tnymph = await this.$nymph.startTransaction(transaction);
|
|
1684
|
+
this.$nymph = tnymph;
|
|
1685
|
+
tilmeld = this.$nymph.tilmeld as Tilmeld;
|
|
1545
1686
|
|
|
1546
1687
|
if (
|
|
1547
1688
|
this.$data.group != null &&
|
|
@@ -1558,6 +1699,7 @@ export default class User extends AbleObject<UserData> {
|
|
|
1558
1699
|
await this.$data.group.$saveSkipAC();
|
|
1559
1700
|
} catch (e: any) {
|
|
1560
1701
|
await tnymph.rollback(transaction);
|
|
1702
|
+
this.$nymph = nymph;
|
|
1561
1703
|
throw e;
|
|
1562
1704
|
}
|
|
1563
1705
|
}
|
|
@@ -1571,6 +1713,7 @@ export default class User extends AbleObject<UserData> {
|
|
|
1571
1713
|
ret = await super.$save();
|
|
1572
1714
|
} catch (e: any) {
|
|
1573
1715
|
await tnymph.rollback(transaction);
|
|
1716
|
+
this.$nymph = nymph;
|
|
1574
1717
|
throw e;
|
|
1575
1718
|
}
|
|
1576
1719
|
if (ret) {
|
|
@@ -1581,21 +1724,23 @@ export default class User extends AbleObject<UserData> {
|
|
|
1581
1724
|
this.guid = preGuid;
|
|
1582
1725
|
this.cdate = preCdate;
|
|
1583
1726
|
this.mdate = preMdate;
|
|
1727
|
+
this.$nymph = nymph;
|
|
1584
1728
|
throw new Error("Couldn't send verification email.");
|
|
1585
1729
|
}
|
|
1586
1730
|
}
|
|
1587
1731
|
|
|
1588
|
-
if (tilmeld.User.current(true).$is(this)) {
|
|
1589
|
-
// Update the user in the session cache.
|
|
1590
|
-
tilmeld.fillSession(this);
|
|
1591
|
-
}
|
|
1592
|
-
|
|
1593
1732
|
this.$descendantGroups = undefined;
|
|
1594
1733
|
this.$gatekeeperCache = undefined;
|
|
1595
1734
|
await tnymph.commit(transaction);
|
|
1735
|
+
|
|
1736
|
+
if ((nymph.tilmeld as Tilmeld).User.current(true).$is(this)) {
|
|
1737
|
+
// Update the user in the session cache.
|
|
1738
|
+
(nymph.tilmeld as Tilmeld).fillSession(this);
|
|
1739
|
+
}
|
|
1596
1740
|
} else {
|
|
1597
1741
|
await tnymph.rollback(transaction);
|
|
1598
1742
|
}
|
|
1743
|
+
this.$nymph = nymph;
|
|
1599
1744
|
return ret;
|
|
1600
1745
|
}
|
|
1601
1746
|
|
|
@@ -1633,4 +1778,82 @@ export default class User extends AbleObject<UserData> {
|
|
|
1633
1778
|
}
|
|
1634
1779
|
return await super.$delete();
|
|
1635
1780
|
}
|
|
1781
|
+
|
|
1782
|
+
public static on<T extends EventType>(
|
|
1783
|
+
event: T,
|
|
1784
|
+
callback: T extends 'beforeRegister'
|
|
1785
|
+
? TilmeldBeforeRegisterCallback
|
|
1786
|
+
: T extends 'afterRegister'
|
|
1787
|
+
? TilmeldAfterRegisterCallback
|
|
1788
|
+
: T extends 'beforeLogin'
|
|
1789
|
+
? TilmeldBeforeLoginCallback
|
|
1790
|
+
: T extends 'afterLogin'
|
|
1791
|
+
? TilmeldAfterLoginCallback
|
|
1792
|
+
: T extends 'beforeLogout'
|
|
1793
|
+
? TilmeldBeforeLogoutCallback
|
|
1794
|
+
: T extends 'afterLogout'
|
|
1795
|
+
? TilmeldAfterLogoutCallback
|
|
1796
|
+
: never
|
|
1797
|
+
) {
|
|
1798
|
+
const prop = (event + 'Callbacks') as T extends 'beforeRegister'
|
|
1799
|
+
? 'beforeRegisterCallbacks'
|
|
1800
|
+
: T extends 'afterRegister'
|
|
1801
|
+
? 'afterRegisterCallbacks'
|
|
1802
|
+
: T extends 'beforeLogin'
|
|
1803
|
+
? 'beforeLoginCallbacks'
|
|
1804
|
+
: T extends 'afterLogin'
|
|
1805
|
+
? 'afterLoginCallbacks'
|
|
1806
|
+
: T extends 'beforeLogout'
|
|
1807
|
+
? 'beforeLogoutCallbacks'
|
|
1808
|
+
: T extends 'afterLogout'
|
|
1809
|
+
? 'afterLogoutCallbacks'
|
|
1810
|
+
: never;
|
|
1811
|
+
if (!(prop in this)) {
|
|
1812
|
+
throw new Error('Invalid event type.');
|
|
1813
|
+
}
|
|
1814
|
+
// @ts-ignore: The callback should always be the right type here.
|
|
1815
|
+
this[prop].push(callback);
|
|
1816
|
+
return () => this.off(event, callback);
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
public static off<T extends EventType>(
|
|
1820
|
+
event: T,
|
|
1821
|
+
callback: T extends 'beforeRegister'
|
|
1822
|
+
? TilmeldBeforeRegisterCallback
|
|
1823
|
+
: T extends 'afterRegister'
|
|
1824
|
+
? TilmeldAfterRegisterCallback
|
|
1825
|
+
: T extends 'beforeLogin'
|
|
1826
|
+
? TilmeldBeforeLoginCallback
|
|
1827
|
+
: T extends 'afterLogin'
|
|
1828
|
+
? TilmeldAfterLoginCallback
|
|
1829
|
+
: T extends 'beforeLogout'
|
|
1830
|
+
? TilmeldBeforeLogoutCallback
|
|
1831
|
+
: T extends 'afterLogout'
|
|
1832
|
+
? TilmeldAfterLogoutCallback
|
|
1833
|
+
: never
|
|
1834
|
+
) {
|
|
1835
|
+
const prop = (event + 'Callbacks') as T extends 'beforeRegister'
|
|
1836
|
+
? 'beforeRegisterCallbacks'
|
|
1837
|
+
: T extends 'afterRegister'
|
|
1838
|
+
? 'afterRegisterCallbacks'
|
|
1839
|
+
: T extends 'beforeLogin'
|
|
1840
|
+
? 'beforeLoginCallbacks'
|
|
1841
|
+
: T extends 'afterLogin'
|
|
1842
|
+
? 'afterLoginCallbacks'
|
|
1843
|
+
: T extends 'beforeLogout'
|
|
1844
|
+
? 'beforeLogoutCallbacks'
|
|
1845
|
+
: T extends 'afterLogout'
|
|
1846
|
+
? 'afterLogoutCallbacks'
|
|
1847
|
+
: never;
|
|
1848
|
+
if (!(prop in this)) {
|
|
1849
|
+
return false;
|
|
1850
|
+
}
|
|
1851
|
+
// @ts-ignore: The callback should always be the right type here.
|
|
1852
|
+
const i = this[prop].indexOf(callback);
|
|
1853
|
+
if (i > -1) {
|
|
1854
|
+
// @ts-ignore: The callback should always be the right type here.
|
|
1855
|
+
this[prop].splice(i, 1);
|
|
1856
|
+
}
|
|
1857
|
+
return true;
|
|
1858
|
+
}
|
|
1636
1859
|
}
|
package/src/conf/d.ts
CHANGED
package/src/conf/defaults.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { nymphJoiProps } from '@nymphjs/nymph';
|
|
1
2
|
import path from 'path';
|
|
2
3
|
import jwt from 'jsonwebtoken';
|
|
3
4
|
import { nanoid } from 'nanoid';
|
|
@@ -157,29 +158,8 @@ export default {
|
|
|
157
158
|
Joi.attempt(
|
|
158
159
|
group.$getValidatable(),
|
|
159
160
|
Joi.object().keys({
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
Joi.any().only().allow(null),
|
|
163
|
-
Joi.string().trim(false).length(24).hex()
|
|
164
|
-
)
|
|
165
|
-
.required(),
|
|
166
|
-
cdate: Joi.alternatives()
|
|
167
|
-
.try(Joi.any().only().allow(null), Joi.number())
|
|
168
|
-
.required(),
|
|
169
|
-
mdate: Joi.alternatives()
|
|
170
|
-
.try(Joi.any().only().allow(null), Joi.number())
|
|
171
|
-
.required(),
|
|
172
|
-
tags: Joi.array()
|
|
173
|
-
.items(
|
|
174
|
-
Joi.string()
|
|
175
|
-
.pattern(/[\x01-\x1F\x7F]/, {
|
|
176
|
-
name: 'control characters',
|
|
177
|
-
invert: true,
|
|
178
|
-
})
|
|
179
|
-
.min(1)
|
|
180
|
-
)
|
|
181
|
-
.required(),
|
|
182
|
-
groupname: Joi.string().trim(false).min(1).required(),
|
|
161
|
+
...nymphJoiProps,
|
|
162
|
+
groupname: Joi.string().trim(false).required(),
|
|
183
163
|
enabled: Joi.boolean().required(),
|
|
184
164
|
email: Joi.string()
|
|
185
165
|
.trim(false)
|
|
@@ -191,7 +171,6 @@ export default {
|
|
|
191
171
|
name: 'control characters',
|
|
192
172
|
invert: true,
|
|
193
173
|
})
|
|
194
|
-
.min(1)
|
|
195
174
|
.max(512)
|
|
196
175
|
.required(),
|
|
197
176
|
avatar: Joi.string()
|
|
@@ -201,7 +180,6 @@ export default {
|
|
|
201
180
|
name: 'control characters',
|
|
202
181
|
invert: true,
|
|
203
182
|
})
|
|
204
|
-
.min(1)
|
|
205
183
|
.max(1024),
|
|
206
184
|
phone: Joi.string()
|
|
207
185
|
.trim(false)
|
|
@@ -214,7 +192,6 @@ export default {
|
|
|
214
192
|
name: 'control characters',
|
|
215
193
|
invert: true,
|
|
216
194
|
})
|
|
217
|
-
.min(1)
|
|
218
195
|
.max(256)
|
|
219
196
|
),
|
|
220
197
|
defaultPrimary: Joi.boolean(),
|
|
@@ -228,29 +205,8 @@ export default {
|
|
|
228
205
|
Joi.attempt(
|
|
229
206
|
user.$getValidatable(),
|
|
230
207
|
Joi.object().keys({
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
Joi.any().only().allow(null),
|
|
234
|
-
Joi.string().trim(false).length(24).hex()
|
|
235
|
-
)
|
|
236
|
-
.required(),
|
|
237
|
-
cdate: Joi.alternatives()
|
|
238
|
-
.try(Joi.any().only().allow(null), Joi.number())
|
|
239
|
-
.required(),
|
|
240
|
-
mdate: Joi.alternatives()
|
|
241
|
-
.try(Joi.any().only().allow(null), Joi.number())
|
|
242
|
-
.required(),
|
|
243
|
-
tags: Joi.array()
|
|
244
|
-
.items(
|
|
245
|
-
Joi.string()
|
|
246
|
-
.pattern(/[\x01-\x1F\x7F]/, {
|
|
247
|
-
name: 'control characters',
|
|
248
|
-
invert: true,
|
|
249
|
-
})
|
|
250
|
-
.min(1)
|
|
251
|
-
)
|
|
252
|
-
.required(),
|
|
253
|
-
username: Joi.string().trim(false).min(1).required(),
|
|
208
|
+
...nymphJoiProps,
|
|
209
|
+
username: Joi.string().trim(false).required(),
|
|
254
210
|
enabled: Joi.boolean().required(),
|
|
255
211
|
email: Joi.string()
|
|
256
212
|
.trim(false)
|
|
@@ -262,7 +218,6 @@ export default {
|
|
|
262
218
|
name: 'control characters',
|
|
263
219
|
invert: true,
|
|
264
220
|
})
|
|
265
|
-
.min(1)
|
|
266
221
|
.max(512)
|
|
267
222
|
.required(),
|
|
268
223
|
nameMiddle: Joi.string()
|
|
@@ -271,7 +226,6 @@ export default {
|
|
|
271
226
|
name: 'control characters',
|
|
272
227
|
invert: true,
|
|
273
228
|
})
|
|
274
|
-
.min(1)
|
|
275
229
|
.max(512),
|
|
276
230
|
nameLast: Joi.string()
|
|
277
231
|
.trim(false)
|
|
@@ -279,7 +233,6 @@ export default {
|
|
|
279
233
|
name: 'control characters',
|
|
280
234
|
invert: true,
|
|
281
235
|
})
|
|
282
|
-
.min(1)
|
|
283
236
|
.max(512),
|
|
284
237
|
name: Joi.string()
|
|
285
238
|
.trim(false)
|
|
@@ -287,7 +240,6 @@ export default {
|
|
|
287
240
|
name: 'control characters',
|
|
288
241
|
invert: true,
|
|
289
242
|
})
|
|
290
|
-
.min(1)
|
|
291
243
|
.max(512)
|
|
292
244
|
.required(),
|
|
293
245
|
avatar: Joi.string()
|
|
@@ -297,7 +249,6 @@ export default {
|
|
|
297
249
|
name: 'control characters',
|
|
298
250
|
invert: true,
|
|
299
251
|
})
|
|
300
|
-
.min(1)
|
|
301
252
|
.max(1024),
|
|
302
253
|
phone: Joi.string()
|
|
303
254
|
.trim(false)
|
|
@@ -310,7 +261,6 @@ export default {
|
|
|
310
261
|
name: 'control characters',
|
|
311
262
|
invert: true,
|
|
312
263
|
})
|
|
313
|
-
.min(1)
|
|
314
264
|
.max(256)
|
|
315
265
|
),
|
|
316
266
|
inheritAbilities: Joi.boolean(),
|
|
@@ -350,8 +300,8 @@ export default {
|
|
|
350
300
|
})
|
|
351
301
|
.length(10),
|
|
352
302
|
recoverSecretDate: Joi.number(),
|
|
353
|
-
salt: Joi.string().trim(false)
|
|
354
|
-
password: Joi.string().trim(false).
|
|
303
|
+
salt: Joi.string().trim(false),
|
|
304
|
+
password: Joi.string().trim(false).required(),
|
|
355
305
|
}),
|
|
356
306
|
'Invalid User: '
|
|
357
307
|
);
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { TilmeldAccessLevels } from '@nymphjs/nymph';
|
|
2
|
+
import Joi from 'joi';
|
|
3
|
+
|
|
4
|
+
import User from './User';
|
|
5
|
+
import Group from './Group';
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
user: Joi.object().instance(User),
|
|
9
|
+
group: Joi.object().instance(Group),
|
|
10
|
+
acUser: Joi.number().valid(
|
|
11
|
+
TilmeldAccessLevels.NO_ACCESS,
|
|
12
|
+
TilmeldAccessLevels.READ_ACCESS,
|
|
13
|
+
TilmeldAccessLevels.WRITE_ACCESS,
|
|
14
|
+
TilmeldAccessLevels.FULL_ACCESS
|
|
15
|
+
),
|
|
16
|
+
acGroup: Joi.number().valid(
|
|
17
|
+
TilmeldAccessLevels.NO_ACCESS,
|
|
18
|
+
TilmeldAccessLevels.READ_ACCESS,
|
|
19
|
+
TilmeldAccessLevels.WRITE_ACCESS,
|
|
20
|
+
TilmeldAccessLevels.FULL_ACCESS
|
|
21
|
+
),
|
|
22
|
+
acOther: Joi.number().valid(
|
|
23
|
+
TilmeldAccessLevels.NO_ACCESS,
|
|
24
|
+
TilmeldAccessLevels.READ_ACCESS,
|
|
25
|
+
TilmeldAccessLevels.WRITE_ACCESS,
|
|
26
|
+
TilmeldAccessLevels.FULL_ACCESS
|
|
27
|
+
),
|
|
28
|
+
acRead: Joi.array().items(
|
|
29
|
+
Joi.alternatives().try(
|
|
30
|
+
Joi.object().instance(User),
|
|
31
|
+
Joi.object().instance(Group)
|
|
32
|
+
)
|
|
33
|
+
),
|
|
34
|
+
acWrite: Joi.array().items(
|
|
35
|
+
Joi.alternatives().try(
|
|
36
|
+
Joi.object().instance(User),
|
|
37
|
+
Joi.object().instance(Group)
|
|
38
|
+
)
|
|
39
|
+
),
|
|
40
|
+
acFull: Joi.array().items(
|
|
41
|
+
Joi.alternatives().try(
|
|
42
|
+
Joi.object().instance(User),
|
|
43
|
+
Joi.object().instance(Group)
|
|
44
|
+
)
|
|
45
|
+
),
|
|
46
|
+
};
|