@nymphjs/tilmeld 1.0.0-alpha.4 → 1.0.0-alpha.42
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 +186 -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 +130 -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 +246 -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,40 @@ export default class User extends AbleObject<UserData> {
|
|
|
1314
1432
|
tilmeld.config.unverifiedAccess &&
|
|
1315
1433
|
!madeAdmin
|
|
1316
1434
|
) {
|
|
1317
|
-
tilmeld.login(this, true)
|
|
1435
|
+
if (!tilmeld.login(this, true)) {
|
|
1436
|
+
throw new Error('An error occurred trying to log you in.');
|
|
1437
|
+
}
|
|
1318
1438
|
message +=
|
|
1319
1439
|
"You're now logged in! An email has been sent to " +
|
|
1320
1440
|
`${this.$data.email} with a verification link for you to finish ` +
|
|
1321
1441
|
'registration.';
|
|
1322
1442
|
loggedin = true;
|
|
1323
1443
|
} else {
|
|
1324
|
-
tilmeld.login(this, true)
|
|
1444
|
+
if (!tilmeld.login(this, true)) {
|
|
1445
|
+
throw new Error('An error occurred trying to log you in.');
|
|
1446
|
+
}
|
|
1325
1447
|
message += "You're now registered and logged in!";
|
|
1326
1448
|
loggedin = true;
|
|
1327
1449
|
}
|
|
1328
|
-
|
|
1450
|
+
|
|
1451
|
+
for (let callback of (this.constructor as typeof User)
|
|
1452
|
+
.afterRegisterCallbacks) {
|
|
1453
|
+
if (callback) {
|
|
1454
|
+
await callback(this, {
|
|
1455
|
+
loggedin,
|
|
1456
|
+
message,
|
|
1457
|
+
});
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1461
|
+
try {
|
|
1462
|
+
await tnymph.commit(transaction);
|
|
1463
|
+
this.$nymph = nymph;
|
|
1464
|
+
this.$nymph.tilmeld?.fillSession(this);
|
|
1465
|
+
} catch (e: any) {
|
|
1466
|
+
throw e;
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1329
1469
|
return {
|
|
1330
1470
|
result: true,
|
|
1331
1471
|
loggedin,
|
|
@@ -1333,6 +1473,7 @@ export default class User extends AbleObject<UserData> {
|
|
|
1333
1473
|
};
|
|
1334
1474
|
} else {
|
|
1335
1475
|
await tnymph.rollback(transaction);
|
|
1476
|
+
this.$nymph = nymph;
|
|
1336
1477
|
return {
|
|
1337
1478
|
result: false,
|
|
1338
1479
|
loggedin: false,
|
|
@@ -1341,12 +1482,13 @@ export default class User extends AbleObject<UserData> {
|
|
|
1341
1482
|
}
|
|
1342
1483
|
} catch (e: any) {
|
|
1343
1484
|
await tnymph.rollback(transaction);
|
|
1485
|
+
this.$nymph = nymph;
|
|
1344
1486
|
throw e;
|
|
1345
1487
|
}
|
|
1346
1488
|
}
|
|
1347
1489
|
|
|
1348
1490
|
public async $save() {
|
|
1349
|
-
|
|
1491
|
+
let tilmeld = this.$nymph.tilmeld as Tilmeld;
|
|
1350
1492
|
if (this.$data.username == null || !this.$data.username.trim().length) {
|
|
1351
1493
|
return false;
|
|
1352
1494
|
}
|
|
@@ -1541,7 +1683,10 @@ export default class User extends AbleObject<UserData> {
|
|
|
1541
1683
|
|
|
1542
1684
|
// Start transaction.
|
|
1543
1685
|
const transaction = 'tilmeld-save-' + nanoid();
|
|
1686
|
+
const nymph = this.$nymph;
|
|
1544
1687
|
const tnymph = await this.$nymph.startTransaction(transaction);
|
|
1688
|
+
this.$nymph = tnymph;
|
|
1689
|
+
tilmeld = this.$nymph.tilmeld as Tilmeld;
|
|
1545
1690
|
|
|
1546
1691
|
if (
|
|
1547
1692
|
this.$data.group != null &&
|
|
@@ -1558,6 +1703,7 @@ export default class User extends AbleObject<UserData> {
|
|
|
1558
1703
|
await this.$data.group.$saveSkipAC();
|
|
1559
1704
|
} catch (e: any) {
|
|
1560
1705
|
await tnymph.rollback(transaction);
|
|
1706
|
+
this.$nymph = nymph;
|
|
1561
1707
|
throw e;
|
|
1562
1708
|
}
|
|
1563
1709
|
}
|
|
@@ -1571,6 +1717,7 @@ export default class User extends AbleObject<UserData> {
|
|
|
1571
1717
|
ret = await super.$save();
|
|
1572
1718
|
} catch (e: any) {
|
|
1573
1719
|
await tnymph.rollback(transaction);
|
|
1720
|
+
this.$nymph = nymph;
|
|
1574
1721
|
throw e;
|
|
1575
1722
|
}
|
|
1576
1723
|
if (ret) {
|
|
@@ -1581,21 +1728,23 @@ export default class User extends AbleObject<UserData> {
|
|
|
1581
1728
|
this.guid = preGuid;
|
|
1582
1729
|
this.cdate = preCdate;
|
|
1583
1730
|
this.mdate = preMdate;
|
|
1731
|
+
this.$nymph = nymph;
|
|
1584
1732
|
throw new Error("Couldn't send verification email.");
|
|
1585
1733
|
}
|
|
1586
1734
|
}
|
|
1587
1735
|
|
|
1588
|
-
if (tilmeld.User.current(true).$is(this)) {
|
|
1589
|
-
// Update the user in the session cache.
|
|
1590
|
-
tilmeld.fillSession(this);
|
|
1591
|
-
}
|
|
1592
|
-
|
|
1593
1736
|
this.$descendantGroups = undefined;
|
|
1594
1737
|
this.$gatekeeperCache = undefined;
|
|
1595
1738
|
await tnymph.commit(transaction);
|
|
1739
|
+
|
|
1740
|
+
if ((nymph.tilmeld as Tilmeld).User.current(true).$is(this)) {
|
|
1741
|
+
// Update the user in the session cache.
|
|
1742
|
+
(nymph.tilmeld as Tilmeld).fillSession(this);
|
|
1743
|
+
}
|
|
1596
1744
|
} else {
|
|
1597
1745
|
await tnymph.rollback(transaction);
|
|
1598
1746
|
}
|
|
1747
|
+
this.$nymph = nymph;
|
|
1599
1748
|
return ret;
|
|
1600
1749
|
}
|
|
1601
1750
|
|
|
@@ -1633,4 +1782,82 @@ export default class User extends AbleObject<UserData> {
|
|
|
1633
1782
|
}
|
|
1634
1783
|
return await super.$delete();
|
|
1635
1784
|
}
|
|
1785
|
+
|
|
1786
|
+
public static on<T extends EventType>(
|
|
1787
|
+
event: T,
|
|
1788
|
+
callback: T extends 'beforeRegister'
|
|
1789
|
+
? TilmeldBeforeRegisterCallback
|
|
1790
|
+
: T extends 'afterRegister'
|
|
1791
|
+
? TilmeldAfterRegisterCallback
|
|
1792
|
+
: T extends 'beforeLogin'
|
|
1793
|
+
? TilmeldBeforeLoginCallback
|
|
1794
|
+
: T extends 'afterLogin'
|
|
1795
|
+
? TilmeldAfterLoginCallback
|
|
1796
|
+
: T extends 'beforeLogout'
|
|
1797
|
+
? TilmeldBeforeLogoutCallback
|
|
1798
|
+
: T extends 'afterLogout'
|
|
1799
|
+
? TilmeldAfterLogoutCallback
|
|
1800
|
+
: never
|
|
1801
|
+
) {
|
|
1802
|
+
const prop = (event + 'Callbacks') as T extends 'beforeRegister'
|
|
1803
|
+
? 'beforeRegisterCallbacks'
|
|
1804
|
+
: T extends 'afterRegister'
|
|
1805
|
+
? 'afterRegisterCallbacks'
|
|
1806
|
+
: T extends 'beforeLogin'
|
|
1807
|
+
? 'beforeLoginCallbacks'
|
|
1808
|
+
: T extends 'afterLogin'
|
|
1809
|
+
? 'afterLoginCallbacks'
|
|
1810
|
+
: T extends 'beforeLogout'
|
|
1811
|
+
? 'beforeLogoutCallbacks'
|
|
1812
|
+
: T extends 'afterLogout'
|
|
1813
|
+
? 'afterLogoutCallbacks'
|
|
1814
|
+
: never;
|
|
1815
|
+
if (!(prop in this)) {
|
|
1816
|
+
throw new Error('Invalid event type.');
|
|
1817
|
+
}
|
|
1818
|
+
// @ts-ignore: The callback should always be the right type here.
|
|
1819
|
+
this[prop].push(callback);
|
|
1820
|
+
return () => this.off(event, callback);
|
|
1821
|
+
}
|
|
1822
|
+
|
|
1823
|
+
public static off<T extends EventType>(
|
|
1824
|
+
event: T,
|
|
1825
|
+
callback: T extends 'beforeRegister'
|
|
1826
|
+
? TilmeldBeforeRegisterCallback
|
|
1827
|
+
: T extends 'afterRegister'
|
|
1828
|
+
? TilmeldAfterRegisterCallback
|
|
1829
|
+
: T extends 'beforeLogin'
|
|
1830
|
+
? TilmeldBeforeLoginCallback
|
|
1831
|
+
: T extends 'afterLogin'
|
|
1832
|
+
? TilmeldAfterLoginCallback
|
|
1833
|
+
: T extends 'beforeLogout'
|
|
1834
|
+
? TilmeldBeforeLogoutCallback
|
|
1835
|
+
: T extends 'afterLogout'
|
|
1836
|
+
? TilmeldAfterLogoutCallback
|
|
1837
|
+
: never
|
|
1838
|
+
) {
|
|
1839
|
+
const prop = (event + 'Callbacks') as T extends 'beforeRegister'
|
|
1840
|
+
? 'beforeRegisterCallbacks'
|
|
1841
|
+
: T extends 'afterRegister'
|
|
1842
|
+
? 'afterRegisterCallbacks'
|
|
1843
|
+
: T extends 'beforeLogin'
|
|
1844
|
+
? 'beforeLoginCallbacks'
|
|
1845
|
+
: T extends 'afterLogin'
|
|
1846
|
+
? 'afterLoginCallbacks'
|
|
1847
|
+
: T extends 'beforeLogout'
|
|
1848
|
+
? 'beforeLogoutCallbacks'
|
|
1849
|
+
: T extends 'afterLogout'
|
|
1850
|
+
? 'afterLogoutCallbacks'
|
|
1851
|
+
: never;
|
|
1852
|
+
if (!(prop in this)) {
|
|
1853
|
+
return false;
|
|
1854
|
+
}
|
|
1855
|
+
// @ts-ignore: The callback should always be the right type here.
|
|
1856
|
+
const i = this[prop].indexOf(callback);
|
|
1857
|
+
if (i > -1) {
|
|
1858
|
+
// @ts-ignore: The callback should always be the right type here.
|
|
1859
|
+
this[prop].splice(i, 1);
|
|
1860
|
+
}
|
|
1861
|
+
return true;
|
|
1862
|
+
}
|
|
1636
1863
|
}
|
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
|
+
};
|