@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/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: { username: string; password: string }) {
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: { username: string; password: string }) {
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
- const tilmeld = this.$nymph.tilmeld as Tilmeld;
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
- await tnymph.commit(transaction);
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
- const tilmeld = this.$nymph.tilmeld as Tilmeld;
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
@@ -1,4 +1,5 @@
1
1
  import { EmailOptions } from 'email-templates';
2
+
2
3
  import type Tilmeld from '../Tilmeld';
3
4
  import Group, { GroupData } from '../Group';
4
5
  import User, { UserData } from '../User';
@@ -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
- guid: Joi.alternatives()
161
- .try(
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
- guid: Joi.alternatives()
232
- .try(
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).min(1),
354
- password: Joi.string().trim(false).min(1).required(),
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
@@ -14,6 +14,9 @@ export { Tilmeld };
14
14
 
15
15
  export * from './Tilmeld.types';
16
16
 
17
+ import tilmeldJoiProps from './tilmeldJoiProps';
18
+ export { tilmeldJoiProps };
19
+
17
20
  export * from './User';
18
21
  import User from './User';
19
22
  export { User };
@@ -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
+ };