@tbs-fitness/contract 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +21 -0
  2. package/dist/cjs/app-settings/app-settings.dto.d.ts +124 -0
  3. package/dist/cjs/app-settings/app-settings.dto.js +94 -0
  4. package/dist/cjs/app-settings/index.d.ts +1 -0
  5. package/dist/cjs/app-settings/index.js +17 -0
  6. package/dist/cjs/audit/audit-log.dto.js +2 -1
  7. package/dist/cjs/auth/auth.dto.d.ts +36 -0
  8. package/dist/cjs/auth/auth.dto.js +28 -8
  9. package/dist/cjs/coach/coach-auth.dto.d.ts +12 -0
  10. package/dist/cjs/coach/coach-auth.dto.js +18 -6
  11. package/dist/cjs/common/api-response.schema.js +2 -1
  12. package/dist/cjs/common/date-time.schema.d.ts +39 -0
  13. package/dist/cjs/common/date-time.schema.js +112 -0
  14. package/dist/cjs/common/index.d.ts +1 -0
  15. package/dist/cjs/common/index.js +1 -0
  16. package/dist/cjs/communication/index.d.ts +2 -0
  17. package/dist/cjs/communication/index.js +18 -0
  18. package/dist/cjs/communication/message-catalogue.d.ts +26 -0
  19. package/dist/cjs/communication/message-catalogue.js +53 -0
  20. package/dist/cjs/communication/template.dto.d.ts +240 -0
  21. package/dist/cjs/communication/template.dto.js +206 -0
  22. package/dist/cjs/enums/index.d.ts +26 -0
  23. package/dist/cjs/enums/index.js +32 -1
  24. package/dist/cjs/feature-flags/feature-flag.dto.js +10 -9
  25. package/dist/esm/app-settings/app-settings.dto.d.ts +124 -0
  26. package/dist/esm/app-settings/app-settings.dto.js +90 -0
  27. package/dist/esm/app-settings/index.d.ts +1 -0
  28. package/dist/esm/app-settings/index.js +1 -0
  29. package/dist/esm/audit/audit-log.dto.js +2 -1
  30. package/dist/esm/auth/auth.dto.d.ts +36 -0
  31. package/dist/esm/auth/auth.dto.js +28 -8
  32. package/dist/esm/coach/coach-auth.dto.d.ts +12 -0
  33. package/dist/esm/coach/coach-auth.dto.js +19 -7
  34. package/dist/esm/common/api-response.schema.js +2 -1
  35. package/dist/esm/common/date-time.schema.d.ts +39 -0
  36. package/dist/esm/common/date-time.schema.js +107 -0
  37. package/dist/esm/common/index.d.ts +1 -0
  38. package/dist/esm/common/index.js +1 -0
  39. package/dist/esm/communication/index.d.ts +2 -0
  40. package/dist/esm/communication/index.js +2 -0
  41. package/dist/esm/communication/message-catalogue.d.ts +26 -0
  42. package/dist/esm/communication/message-catalogue.js +50 -0
  43. package/dist/esm/communication/template.dto.d.ts +240 -0
  44. package/dist/esm/communication/template.dto.js +200 -0
  45. package/dist/esm/enums/index.d.ts +26 -0
  46. package/dist/esm/enums/index.js +31 -0
  47. package/dist/esm/feature-flags/feature-flag.dto.js +10 -9
  48. package/package.json +21 -1
@@ -18,6 +18,12 @@ export const ACCOUNT_STATUSES = [
18
18
  ];
19
19
  /** The statuses an administrator may set. Verification is never set by hand. */
20
20
  export const ADMIN_SETTABLE_ACCOUNT_STATUSES = ['active', 'disabled'];
21
+ /**
22
+ * Where a user's time zone came from. `AUTO` was detected from their browser
23
+ * and may be updated when they sign in elsewhere. `MANUAL` was chosen by the
24
+ * user, and only the user changes it.
25
+ */
26
+ export const TIMEZONE_SOURCES = ['AUTO', 'MANUAL'];
21
27
  export const TOKEN_TRANSPORTS = ['body', 'cookie'];
22
28
  export const AUDIT_OUTCOMES = ['success', 'failure'];
23
29
  export const FEATURE_FLAG_RULE_TYPES = [
@@ -26,3 +32,28 @@ export const FEATURE_FLAG_RULE_TYPES = [
26
32
  'trainer',
27
33
  'role',
28
34
  ];
35
+ /**
36
+ * The ways a message can reach someone. WhatsApp and push are added here when
37
+ * their channel modules are built.
38
+ */
39
+ export const COMMUNICATION_CHANNELS = ['EMAIL', 'SMS'];
40
+ /**
41
+ * Every message the platform sends. Each has a catalogue entry in
42
+ * `@tbs-fitness/contract/communication` saying which channels may carry it and
43
+ * which variables its sender supplies.
44
+ */
45
+ export const MESSAGE_TYPES = [
46
+ 'auth.otp.signup_verification',
47
+ 'auth.otp.password_reset',
48
+ 'auth.password_reset_link',
49
+ ];
50
+ /** What happened to one message on one channel. */
51
+ export const DELIVERY_STATUSES = [
52
+ 'sent',
53
+ 'skipped_disabled',
54
+ 'skipped_unreachable',
55
+ 'failed',
56
+ 'failed_missing_variables',
57
+ ];
58
+ /** Only one version of a template per message type and channel is active. */
59
+ export const TEMPLATE_STATUSES = ['draft', 'active', 'archived'];
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { instantInputSchema, utcTimestampSchema, } from '../common/date-time.schema.js';
2
3
  import { paginationQuerySchema } from '../common/pagination.schema.js';
3
4
  import { safeTextSchema } from '../common/safe-text.schema.js';
4
5
  import { APP_ENVIRONMENTS, FEATURE_FLAG_RULE_TYPES, ROLES, } from '../enums/index.js';
@@ -14,7 +15,7 @@ const keySchema = z
14
15
  const nameSchema = safeTextSchema(120);
15
16
  const descriptionSchema = safeTextSchema(500);
16
17
  const percentageSchema = z.number().int().min(0).max(100);
17
- const timestampSchema = z.iso.datetime({ offset: true });
18
+ const timestampSchema = instantInputSchema;
18
19
  /** Lower-cased, so that it matches IDs as they come from the database. */
19
20
  const accountIdSchema = z.string().toLowerCase().pipe(z.uuid());
20
21
  const scheduleIsOrdered = ({ activationAt, expiresAt, }) => !activationAt || !expiresAt || new Date(activationAt) < new Date(expiresAt);
@@ -92,8 +93,8 @@ export const ruleResponseSchema = z.object({
92
93
  ruleType: z.enum(FEATURE_FLAG_RULE_TYPES),
93
94
  ruleValue: z.string(),
94
95
  enabled: z.boolean(),
95
- createdAt: z.iso.datetime(),
96
- updatedAt: z.iso.datetime(),
96
+ createdAt: utcTimestampSchema,
97
+ updatedAt: utcTimestampSchema,
97
98
  });
98
99
  export const flagResponseSchema = z.object({
99
100
  id: z.uuid(),
@@ -103,13 +104,13 @@ export const flagResponseSchema = z.object({
103
104
  environment: z.enum(APP_ENVIRONMENTS),
104
105
  enabled: z.boolean(),
105
106
  rolloutPercentage: z.number().int(),
106
- activationAt: z.iso.datetime().nullable(),
107
- expiresAt: z.iso.datetime().nullable(),
107
+ activationAt: utcTimestampSchema.nullable(),
108
+ expiresAt: utcTimestampSchema.nullable(),
108
109
  version: z.number().int(),
109
110
  createdBy: z.uuid(),
110
111
  updatedBy: z.uuid(),
111
- createdAt: z.iso.datetime(),
112
- updatedAt: z.iso.datetime(),
112
+ createdAt: utcTimestampSchema,
113
+ updatedAt: utcTimestampSchema,
113
114
  rules: z.array(ruleResponseSchema),
114
115
  });
115
116
  export const auditLogResponseSchema = z.object({
@@ -121,12 +122,12 @@ export const auditLogResponseSchema = z.object({
121
122
  action: z.string(),
122
123
  previousValue: z.record(z.string(), z.unknown()).nullable(),
123
124
  newValue: z.record(z.string(), z.unknown()).nullable(),
124
- createdAt: z.iso.datetime(),
125
+ createdAt: utcTimestampSchema,
125
126
  });
126
127
  export const killSwitchResponseSchema = z.object({
127
128
  environment: z.enum(APP_ENVIRONMENTS),
128
129
  engaged: z.boolean(),
129
130
  reason: z.string().nullable(),
130
131
  updatedBy: z.uuid().nullable(),
131
- updatedAt: z.iso.datetime().nullable(),
132
+ updatedAt: utcTimestampSchema.nullable(),
132
133
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tbs-fitness/contract",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "TBS API contract: Zod schemas, DTO types and enums shared by the backend, web and mobile apps",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -13,6 +13,16 @@
13
13
  "dist"
14
14
  ],
15
15
  "exports": {
16
+ "./app-settings": {
17
+ "import": {
18
+ "types": "./dist/esm/app-settings/index.d.ts",
19
+ "default": "./dist/esm/app-settings/index.js"
20
+ },
21
+ "require": {
22
+ "types": "./dist/cjs/app-settings/index.d.ts",
23
+ "default": "./dist/cjs/app-settings/index.js"
24
+ }
25
+ },
16
26
  "./audit": {
17
27
  "import": {
18
28
  "types": "./dist/esm/audit/index.d.ts",
@@ -53,6 +63,16 @@
53
63
  "default": "./dist/cjs/common/index.js"
54
64
  }
55
65
  },
66
+ "./communication": {
67
+ "import": {
68
+ "types": "./dist/esm/communication/index.d.ts",
69
+ "default": "./dist/esm/communication/index.js"
70
+ },
71
+ "require": {
72
+ "types": "./dist/cjs/communication/index.d.ts",
73
+ "default": "./dist/cjs/communication/index.js"
74
+ }
75
+ },
56
76
  "./enums": {
57
77
  "import": {
58
78
  "types": "./dist/esm/enums/index.d.ts",