@openora/core 0.4.1-canary.19 → 0.4.1-canary.21

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 (99) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/audit/plugin.d.ts.map +1 -1
  3. package/dist/audit/plugin.js +37 -0
  4. package/dist/audit/plugin.js.map +1 -1
  5. package/dist/contracts/adapters/error-tracking.d.ts +12 -0
  6. package/dist/contracts/adapters/error-tracking.d.ts.map +1 -0
  7. package/dist/contracts/adapters/error-tracking.js +3 -0
  8. package/dist/contracts/adapters/error-tracking.js.map +1 -0
  9. package/dist/contracts/adapters/index.d.ts +4 -0
  10. package/dist/contracts/adapters/index.d.ts.map +1 -1
  11. package/dist/contracts/adapters/index.js +2 -0
  12. package/dist/contracts/adapters/index.js.map +1 -1
  13. package/dist/contracts/adapters/sms.d.ts +9 -0
  14. package/dist/contracts/adapters/sms.d.ts.map +1 -0
  15. package/dist/contracts/adapters/sms.js +7 -0
  16. package/dist/contracts/adapters/sms.js.map +1 -0
  17. package/dist/contracts/schemas/events.d.ts +17 -0
  18. package/dist/contracts/schemas/events.d.ts.map +1 -1
  19. package/dist/contracts/schemas/events.js +10 -0
  20. package/dist/contracts/schemas/events.js.map +1 -1
  21. package/dist/contracts/schemas/identity.d.ts +19 -0
  22. package/dist/contracts/schemas/identity.d.ts.map +1 -1
  23. package/dist/contracts/schemas/identity.js +13 -0
  24. package/dist/contracts/schemas/identity.js.map +1 -1
  25. package/dist/iam/service/iam.service.d.ts +3 -3
  26. package/dist/pam/identity/__tests__/phone-login.service.test.d.ts +2 -0
  27. package/dist/pam/identity/__tests__/phone-login.service.test.d.ts.map +1 -0
  28. package/dist/pam/identity/__tests__/phone-login.service.test.js +198 -0
  29. package/dist/pam/identity/__tests__/phone-login.service.test.js.map +1 -0
  30. package/dist/pam/identity/adapters/mock/mock-sms-adapter.d.ts +8 -0
  31. package/dist/pam/identity/adapters/mock/mock-sms-adapter.d.ts.map +1 -0
  32. package/dist/pam/identity/adapters/mock/mock-sms-adapter.js +7 -0
  33. package/dist/pam/identity/adapters/mock/mock-sms-adapter.js.map +1 -0
  34. package/dist/pam/identity/contract/index.d.ts +45 -0
  35. package/dist/pam/identity/contract/index.d.ts.map +1 -1
  36. package/dist/pam/identity/contract/index.js +10 -2
  37. package/dist/pam/identity/contract/index.js.map +1 -1
  38. package/dist/pam/identity/drizzle/migrations/0001_rainy_peter_quill.sql +18 -0
  39. package/dist/pam/identity/drizzle/migrations/0002_outstanding_patriot.sql +1 -0
  40. package/dist/pam/identity/drizzle/migrations/0003_open_shotgun.sql +1 -0
  41. package/dist/pam/identity/drizzle/migrations/0004_round_giant_girl.sql +1 -0
  42. package/dist/pam/identity/drizzle/migrations/meta/0001_snapshot.json +684 -0
  43. package/dist/pam/identity/drizzle/migrations/meta/0002_snapshot.json +690 -0
  44. package/dist/pam/identity/drizzle/migrations/meta/0003_snapshot.json +695 -0
  45. package/dist/pam/identity/drizzle/migrations/meta/0004_snapshot.json +680 -0
  46. package/dist/pam/identity/drizzle/migrations/meta/_journal.json +28 -0
  47. package/dist/pam/identity/plugin.d.ts.map +1 -1
  48. package/dist/pam/identity/plugin.js +12 -2
  49. package/dist/pam/identity/plugin.js.map +1 -1
  50. package/dist/pam/identity/react/account.d.ts +2 -0
  51. package/dist/pam/identity/react/account.d.ts.map +1 -1
  52. package/dist/pam/identity/react/auth.d.ts +6 -0
  53. package/dist/pam/identity/react/auth.d.ts.map +1 -1
  54. package/dist/pam/identity/router/index.d.ts +43 -1
  55. package/dist/pam/identity/router/index.d.ts.map +1 -1
  56. package/dist/pam/identity/router/index.js +27 -1
  57. package/dist/pam/identity/router/index.js.map +1 -1
  58. package/dist/pam/identity/schema/index.d.ts +212 -0
  59. package/dist/pam/identity/schema/index.d.ts.map +1 -1
  60. package/dist/pam/identity/schema/index.js +23 -0
  61. package/dist/pam/identity/schema/index.js.map +1 -1
  62. package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
  63. package/dist/pam/identity/service/identity.service.js +37 -11
  64. package/dist/pam/identity/service/identity.service.js.map +1 -1
  65. package/dist/pam/identity/service/phone-login.service.d.ts +53 -0
  66. package/dist/pam/identity/service/phone-login.service.d.ts.map +1 -0
  67. package/dist/pam/identity/service/phone-login.service.js +235 -0
  68. package/dist/pam/identity/service/phone-login.service.js.map +1 -0
  69. package/dist/pam/identity/service/rg-guard.service.d.ts +5 -0
  70. package/dist/pam/identity/service/rg-guard.service.d.ts.map +1 -0
  71. package/dist/pam/identity/service/rg-guard.service.js +4 -0
  72. package/dist/pam/identity/service/rg-guard.service.js.map +1 -0
  73. package/dist/server/db/drizzle.service.d.ts.map +1 -1
  74. package/dist/server/db/drizzle.service.js +8 -0
  75. package/dist/server/db/drizzle.service.js.map +1 -1
  76. package/dist/server/kernel/__tests__/logger.test.d.ts +2 -0
  77. package/dist/server/kernel/__tests__/logger.test.d.ts.map +1 -0
  78. package/dist/server/kernel/__tests__/logger.test.js +44 -0
  79. package/dist/server/kernel/__tests__/logger.test.js.map +1 -0
  80. package/dist/server/kernel/bullmq-job-queue.js +2 -2
  81. package/dist/server/kernel/bullmq-job-queue.js.map +1 -1
  82. package/dist/server/kernel/error-reporter.d.ts +5 -0
  83. package/dist/server/kernel/error-reporter.d.ts.map +1 -0
  84. package/dist/server/kernel/error-reporter.js +20 -0
  85. package/dist/server/kernel/error-reporter.js.map +1 -0
  86. package/dist/server/kernel/index.d.ts +2 -0
  87. package/dist/server/kernel/index.d.ts.map +1 -1
  88. package/dist/server/kernel/index.js +1 -0
  89. package/dist/server/kernel/index.js.map +1 -1
  90. package/dist/server/kernel/job-queue.js +2 -2
  91. package/dist/server/kernel/job-queue.js.map +1 -1
  92. package/dist/server/kernel/logger.d.ts +7 -0
  93. package/dist/server/kernel/logger.d.ts.map +1 -1
  94. package/dist/server/kernel/logger.js +36 -2
  95. package/dist/server/kernel/logger.js.map +1 -1
  96. package/dist/server/runtime/create-app.d.ts.map +1 -1
  97. package/dist/server/runtime/create-app.js +30 -4
  98. package/dist/server/runtime/create-app.js.map +1 -1
  99. package/package.json +1 -1
@@ -0,0 +1,198 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { describe, it, expect, vi } from 'vitest';
3
+ import { ORPCError } from '@orpc/server';
4
+ import { PhoneLoginService } from '../service/phone-login.service.js';
5
+ import { makeDrizzle, makeEvents, mock } from '../../../testing/mock.js';
6
+ const PHONE = '+14155550100';
7
+ // A verified-phone user row as `verifyOtp`'s `select().from(user)` returns it.
8
+ const userRow = {
9
+ id: 'u1',
10
+ email: 'a@b.dev',
11
+ name: 'A',
12
+ emailVerified: true,
13
+ image: null,
14
+ theme: 'system',
15
+ language: 'en',
16
+ phoneNumber: PHONE,
17
+ phoneVerified: true,
18
+ rgBlocked: false,
19
+ rgBlockedUntil: null,
20
+ createdAt: new Date('2020-01-01T00:00:00.000Z'),
21
+ updatedAt: new Date('2020-01-01T00:00:00.000Z'),
22
+ };
23
+ const allowLimiter = () => ({
24
+ consume: vi.fn().mockResolvedValue({ allowed: true, retryAfterMs: 0 }),
25
+ reset: vi.fn(),
26
+ });
27
+ function build({ select = [], returning = [], sms = { sendOtp: vi.fn().mockResolvedValue(undefined) }, } = {}) {
28
+ const drizzle = makeDrizzle({
29
+ select: select,
30
+ returning: returning,
31
+ });
32
+ const events = makeEvents();
33
+ const svc = new PhoneLoginService({
34
+ drizzle: drizzle,
35
+ events: mock(events),
36
+ sms,
37
+ limiter: allowLimiter(),
38
+ });
39
+ return { svc, events, sms };
40
+ }
41
+ const otpRow = (over = {}) => ({
42
+ id: 'otp1',
43
+ userId: 'u1',
44
+ codeHash: '', // set per-test
45
+ expiresAt: new Date(Date.now() + 5 * 60 * 1000),
46
+ failedAttempts: 0,
47
+ ...over,
48
+ });
49
+ // SHA-256 of a code, mirroring the service's hashCode.
50
+ const hash = (code) => createHash('sha256').update(code).digest('hex');
51
+ describe('PhoneLoginService.requestOtp', () => {
52
+ it('sends an OTP for a verified phone and emits requested', async () => {
53
+ // select order: (1) user lookup, (2) existing-otp lookup (none),
54
+ // (3) delete (awaited), (4) insert (awaited).
55
+ const { svc, events, sms } = build({
56
+ select: [[{ id: 'u1', phoneVerified: true }], [], [], []],
57
+ });
58
+ const out = await svc.requestOtp({ phone: PHONE });
59
+ expect(typeof out.expiresAt).toBe('string');
60
+ expect(typeof out.resendAfter).toBe('string');
61
+ expect(sms.sendOtp).toHaveBeenCalledWith(expect.objectContaining({ to: PHONE, code: expect.stringMatching(/^\d{6}$/) }));
62
+ expect(events.emit).toHaveBeenCalledWith('identity.phone_otp.requested', { userId: 'u1' });
63
+ });
64
+ it('anti-enumeration: unknown phone returns success shape without sending SMS', async () => {
65
+ const { svc, events, sms } = build({ select: [[]] });
66
+ const out = await svc.requestOtp({ phone: PHONE });
67
+ expect(out).toEqual({ expiresAt: expect.any(String), resendAfter: expect.any(String) });
68
+ expect(sms.sendOtp).not.toHaveBeenCalled();
69
+ expect(events.emit).not.toHaveBeenCalled();
70
+ });
71
+ it('anti-enumeration: unverified phone returns success shape without sending SMS', async () => {
72
+ const { svc, sms } = build({ select: [[{ id: 'u1', phoneVerified: false }]] });
73
+ const out = await svc.requestOtp({ phone: PHONE });
74
+ expect(out).toEqual({ expiresAt: expect.any(String), resendAfter: expect.any(String) });
75
+ expect(sms.sendOtp).not.toHaveBeenCalled();
76
+ });
77
+ it('throws OtpCooldownError when a code was sent under 60s ago', async () => {
78
+ const { svc, sms } = build({
79
+ // (1) user found, (2) existing OTP created 10s ago.
80
+ select: [[{ id: 'u1', phoneVerified: true }], [{ createdAt: new Date(Date.now() - 10_000) }]],
81
+ });
82
+ await expect(svc.requestOtp({ phone: PHONE })).rejects.toMatchObject({
83
+ code: 'TOO_MANY_REQUESTS',
84
+ });
85
+ expect(sms.sendOtp).not.toHaveBeenCalled();
86
+ });
87
+ it('supersedes an expired-cooldown prior OTP and emits cancelled(new_otp_requested)', async () => {
88
+ const { svc, events, sms } = build({
89
+ // (1) user, (2) prior OTP older than cooldown, (3) delete, (4) insert.
90
+ select: [
91
+ [{ id: 'u1', phoneVerified: true }],
92
+ [{ createdAt: new Date(Date.now() - 120_000) }],
93
+ [],
94
+ [],
95
+ ],
96
+ });
97
+ await svc.requestOtp({ phone: PHONE });
98
+ expect(events.emit).toHaveBeenCalledWith('identity.phone_otp.cancelled', {
99
+ userId: 'u1',
100
+ reason: 'new_otp_requested',
101
+ });
102
+ expect(sms.sendOtp).toHaveBeenCalled();
103
+ });
104
+ });
105
+ describe('PhoneLoginService.verifyOtp', () => {
106
+ it('happy path: correct code mints a session and emits phone_login', async () => {
107
+ const code = '123456';
108
+ const { svc, events } = build({
109
+ // (1) otp lookup, (2) user lookup, (3) delete otp in tx, (4) session insert in tx.
110
+ select: [[otpRow({ codeHash: hash(code) })], [userRow], [], []],
111
+ });
112
+ const out = await svc.verifyOtp({ phone: PHONE, code });
113
+ expect(out.user.id).toBe('u1');
114
+ expect(out.session.token).toEqual(expect.any(String));
115
+ expect(out.session.expiresAt).toEqual(expect.any(String));
116
+ expect(events.emit).toHaveBeenCalledWith('identity.user.phone_login', expect.objectContaining({ userId: 'u1', method: 'phone' }));
117
+ });
118
+ it('rememberMe extends the session TTL to ~30 days', async () => {
119
+ const code = '123456';
120
+ const { svc } = build({
121
+ select: [[otpRow({ codeHash: hash(code) })], [userRow], [], []],
122
+ });
123
+ const out = await svc.verifyOtp({ phone: PHONE, code, rememberMe: true });
124
+ const ttlMs = new Date(out.session.expiresAt).getTime() - Date.now();
125
+ expect(ttlMs).toBeGreaterThan(29 * 24 * 60 * 60 * 1000);
126
+ });
127
+ it('wrong code increments failedAttempts and throws OtpInvalidError with attemptsRemaining', async () => {
128
+ const { svc, events } = build({
129
+ // (1) otp lookup only (update uses returning, not the select queue).
130
+ select: [[otpRow({ codeHash: hash('000000') })]],
131
+ // update...returning -> 2 attempts used.
132
+ returning: [[{ failedAttempts: 2 }]],
133
+ });
134
+ const promise = svc.verifyOtp({ phone: PHONE, code: '111111' });
135
+ await expect(promise).rejects.toBeInstanceOf(ORPCError);
136
+ await expect(promise).rejects.toMatchObject({
137
+ code: 'UNPROCESSABLE_CONTENT',
138
+ data: { attemptsRemaining: 3 },
139
+ });
140
+ expect(events.emit).not.toHaveBeenCalledWith('identity.phone_otp.cancelled', expect.anything());
141
+ });
142
+ it('5th wrong code cancels the session, deletes it, and emits cancelled(max_attempts)', async () => {
143
+ const { svc, events } = build({
144
+ // (1) otp lookup, (2) delete (awaited).
145
+ select: [[otpRow({ codeHash: hash('000000') })], []],
146
+ returning: [[{ failedAttempts: 5 }]],
147
+ });
148
+ await expect(svc.verifyOtp({ phone: PHONE, code: '111111' })).rejects.toMatchObject({
149
+ code: 'FORBIDDEN',
150
+ });
151
+ expect(events.emit).toHaveBeenCalledWith('identity.phone_otp.cancelled', {
152
+ userId: 'u1',
153
+ reason: 'max_attempts',
154
+ });
155
+ });
156
+ it('expired OTP returns attemptsRemaining derived from failedAttempts on the dead session', async () => {
157
+ const code = '123456';
158
+ const { svc } = build({
159
+ // 2 failed attempts before the code expired -> 3 remaining
160
+ select: [
161
+ [
162
+ otpRow({
163
+ codeHash: hash(code),
164
+ expiresAt: new Date(Date.now() - 1000),
165
+ failedAttempts: 2,
166
+ }),
167
+ ],
168
+ ],
169
+ });
170
+ await expect(svc.verifyOtp({ phone: PHONE, code })).rejects.toMatchObject({
171
+ code: 'UNPROCESSABLE_CONTENT',
172
+ data: { attemptsRemaining: 3 },
173
+ });
174
+ });
175
+ it('missing OTP session throws OtpInvalidError with 0 attemptsRemaining', async () => {
176
+ const { svc } = build({ select: [[]] });
177
+ await expect(svc.verifyOtp({ phone: PHONE, code: '123456' })).rejects.toMatchObject({
178
+ code: 'UNPROCESSABLE_CONTENT',
179
+ data: { attemptsRemaining: 0 },
180
+ });
181
+ });
182
+ it('RG-blocked user is forbidden after the OTP passes and no session is minted', async () => {
183
+ const code = '123456';
184
+ const { svc, events } = build({
185
+ // (1) otp lookup, (2) blocked user lookup - RG check before tx so OTP is not consumed.
186
+ select: [
187
+ [otpRow({ codeHash: hash(code) })],
188
+ [{ ...userRow, rgBlocked: true, rgBlockedUntil: null }],
189
+ ],
190
+ });
191
+ await expect(svc.verifyOtp({ phone: PHONE, code })).rejects.toMatchObject({
192
+ code: 'FORBIDDEN',
193
+ });
194
+ expect(events.emit).toHaveBeenCalledWith('rg.exclusion.login_blocked', expect.objectContaining({ userId: 'u1' }));
195
+ expect(events.emit).not.toHaveBeenCalledWith('identity.user.phone_login', expect.anything());
196
+ });
197
+ });
198
+ //# sourceMappingURL=phone-login.service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-login.service.test.js","sourceRoot":"","sources":["../../../../src/pam/identity/__tests__/phone-login.service.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAIzE,MAAM,KAAK,GAAG,cAAc,CAAC;AAE7B,+EAA+E;AAC/E,MAAM,OAAO,GAAG;IACd,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,GAAG;IACT,aAAa,EAAE,IAAI;IACnB,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,QAAQ;IACf,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,IAAI;IACnB,SAAS,EAAE,KAAK;IAChB,cAAc,EAAE,IAAI;IACpB,SAAS,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;IAC/C,SAAS,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;CAChD,CAAC;AAEF,MAAM,YAAY,GAAG,GAAuB,EAAE,CAAC,CAAC;IAC9C,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACtE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;CACf,CAAC,CAAC;AAEH,SAAS,KAAK,CAAC,EACb,MAAM,GAAG,EAAE,EACX,SAAS,GAAG,EAAE,EACd,GAAG,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAKrD,EAAE;IACJ,MAAM,OAAO,GAAG,WAAW,CAAC;QAC1B,MAAM,EAAE,MAAe;QACvB,SAAS,EAAE,SAAkB;KAC9B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC;QAChC,OAAO,EAAE,OAAoC;QAC7C,MAAM,EAAE,IAAI,CAAW,MAAM,CAAC;QAC9B,GAAG;QACH,OAAO,EAAE,YAAY,EAAE;KACxB,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,OAAgC,EAAE,EAAE,EAAE,CAAC,CAAC;IACtD,EAAE,EAAE,MAAM;IACV,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,EAAE,EAAE,eAAe;IAC7B,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC/C,cAAc,EAAE,CAAC;IACjB,GAAG,IAAI;CACR,CAAC,CAAC;AAEH,uDAAuD;AACvD,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE/E,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,iEAAiE;QACjE,8CAA8C;QAC9C,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;YACjC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;SAC1D,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnD,MAAM,CAAC,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACtC,MAAM,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,CAC/E,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAErD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnD,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxF,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAE/E,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxF,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;YACzB,oDAAoD;YACpD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;SAC9F,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YACnE,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;YACjC,uEAAuE;YACvE,MAAM,EAAE;gBACN,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;gBACnC,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;gBAC/C,EAAE;gBACF,EAAE;aACH;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAEvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,8BAA8B,EAAE;YACvE,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,mBAAmB;SAC5B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YAC5B,mFAAmF;YACnF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;SAChE,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAExD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACtC,2BAA2B,EAC3B,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAC3D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;SAChE,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACtG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YAC5B,qEAAqE;YACrE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,yCAAyC;YACzC,SAAS,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;SACrC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChE,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YAC1C,IAAI,EAAE,uBAAuB;YAC7B,IAAI,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,8BAA8B,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YAC5B,wCAAwC;YACxC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YACpD,SAAS,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;SACrC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YAClF,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,8BAA8B,EAAE;YACvE,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,cAAc;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACrG,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;YACpB,2DAA2D;YAC3D,MAAM,EAAE;gBACN;oBACE,MAAM,CAAC;wBACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;wBACpB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;wBACtC,cAAc,EAAE,CAAC;qBAClB,CAAC;iBACH;aACF;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YACxE,IAAI,EAAE,uBAAuB;YAC7B,IAAI,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YAClF,IAAI,EAAE,uBAAuB;YAC7B,IAAI,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YAC5B,uFAAuF;YACvF,MAAM,EAAE;gBACN,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClC,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;aACxD;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YACxE,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACtC,4BAA4B,EAC5B,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAC1C,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,2BAA2B,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SmsAdapter } from '@openora/core/contracts';
2
+ export declare class MockSmsAdapter implements SmsAdapter {
3
+ sendOtp({ to, code }: {
4
+ to: string;
5
+ code: string;
6
+ }): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=mock-sms-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-sms-adapter.d.ts","sourceRoot":"","sources":["../../../../../src/pam/identity/adapters/mock/mock-sms-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,qBAAa,cAAe,YAAW,UAAU;IACzC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzE"}
@@ -0,0 +1,7 @@
1
+ export class MockSmsAdapter {
2
+ async sendOtp({ to, code }) {
3
+ // mock: log-to-stdout delivery until a real SMS vendor adapter is bound via overlay.
4
+ console.log(`[SMS OTP] ${to}: ${code}`); // oxlint-disable-line no-console
5
+ }
6
+ }
7
+ //# sourceMappingURL=mock-sms-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-sms-adapter.js","sourceRoot":"","sources":["../../../../../src/pam/identity/adapters/mock/mock-sms-adapter.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAgC;QACtD,qFAAqF;QACrF,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,iCAAiC;IAC5E,CAAC;CACF"}
@@ -1,4 +1,8 @@
1
1
  import * as z from 'zod';
2
+ export declare const SessionSchema: z.ZodObject<{
3
+ token: z.ZodString;
4
+ expiresAt: z.ZodISODateTime;
5
+ }, z.core.$strip>;
2
6
  export declare const SessionItemSchema: z.ZodObject<{
3
7
  id: z.ZodUUID;
4
8
  expiresAt: z.ZodISODateTime;
@@ -25,6 +29,8 @@ export declare const identityContract: {
25
29
  system: "system";
26
30
  }>;
27
31
  language: z.ZodString;
32
+ phoneNumber: z.ZodOptional<z.ZodNullable<z.ZodString>>;
33
+ phoneVerified: z.ZodOptional<z.ZodBoolean>;
28
34
  createdAt: z.ZodISODateTime;
29
35
  updatedAt: z.ZodISODateTime;
30
36
  }, z.core.$strip>;
@@ -46,6 +52,8 @@ export declare const identityContract: {
46
52
  system: "system";
47
53
  }>;
48
54
  language: z.ZodString;
55
+ phoneNumber: z.ZodOptional<z.ZodNullable<z.ZodString>>;
56
+ phoneVerified: z.ZodOptional<z.ZodBoolean>;
49
57
  createdAt: z.ZodISODateTime;
50
58
  updatedAt: z.ZodISODateTime;
51
59
  }, z.core.$strip>>;
@@ -55,6 +63,39 @@ export declare const identityContract: {
55
63
  }, z.core.$strip>>;
56
64
  twoFactorRedirect: z.ZodOptional<z.ZodBoolean>;
57
65
  }, z.core.$strip>, Record<never, never>, Record<never, never>>;
66
+ phoneLoginRequest: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
67
+ phone: z.ZodString;
68
+ }, z.core.$strip>, z.ZodObject<{
69
+ expiresAt: z.ZodISODateTime;
70
+ resendAfter: z.ZodISODateTime;
71
+ }, z.core.$strip>, Record<never, never>, Record<never, never>>;
72
+ phoneLoginVerify: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
73
+ phone: z.ZodString;
74
+ code: z.ZodString;
75
+ rememberMe: z.ZodOptional<z.ZodBoolean>;
76
+ }, z.core.$strip>, z.ZodObject<{
77
+ user: z.ZodObject<{
78
+ id: z.ZodUUID;
79
+ email: z.ZodEmail;
80
+ name: z.ZodString;
81
+ emailVerified: z.ZodBoolean;
82
+ image: z.ZodOptional<z.ZodNullable<z.ZodURL>>;
83
+ theme: z.ZodEnum<{
84
+ light: "light";
85
+ dark: "dark";
86
+ system: "system";
87
+ }>;
88
+ language: z.ZodString;
89
+ phoneNumber: z.ZodOptional<z.ZodNullable<z.ZodString>>;
90
+ phoneVerified: z.ZodOptional<z.ZodBoolean>;
91
+ createdAt: z.ZodISODateTime;
92
+ updatedAt: z.ZodISODateTime;
93
+ }, z.core.$strip>;
94
+ session: z.ZodObject<{
95
+ token: z.ZodString;
96
+ expiresAt: z.ZodISODateTime;
97
+ }, z.core.$strip>;
98
+ }, z.core.$strip>, Record<never, never>, Record<never, never>>;
58
99
  logout: import("@orpc/contract").ContractProcedureBuilderWithOutput<import("@orpc/contract").Schema<unknown, unknown>, z.ZodObject<{
59
100
  success: z.ZodLiteral<true>;
60
101
  }, z.core.$strip>, Record<never, never>, Record<never, never>>;
@@ -70,6 +111,8 @@ export declare const identityContract: {
70
111
  system: "system";
71
112
  }>;
72
113
  language: z.ZodString;
114
+ phoneNumber: z.ZodOptional<z.ZodNullable<z.ZodString>>;
115
+ phoneVerified: z.ZodOptional<z.ZodBoolean>;
73
116
  createdAt: z.ZodISODateTime;
74
117
  updatedAt: z.ZodISODateTime;
75
118
  }, z.core.$strip>>, Record<never, never>, Record<never, never>>;
@@ -158,6 +201,8 @@ export declare const identityContract: {
158
201
  system: "system";
159
202
  }>;
160
203
  language: z.ZodString;
204
+ phoneNumber: z.ZodOptional<z.ZodNullable<z.ZodString>>;
205
+ phoneVerified: z.ZodOptional<z.ZodBoolean>;
161
206
  createdAt: z.ZodISODateTime;
162
207
  updatedAt: z.ZodISODateTime;
163
208
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pam/identity/contract/index.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAOzB,eAAO,MAAM,iBAAiB;;;;;;iBAM5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4G5B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pam/identity/contract/index.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,eAAO,MAAM,aAAa;;;iBAGxB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;iBAM5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsH5B,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { oc, eventIterator } from '@orpc/contract';
2
- import { UserSchema, UuidSchema, LoginInputSchema, RegisterInputSchema, Enable2faInputSchema, Enable2faResultSchema, Verify2faInputSchema, Disable2faInputSchema, RequestPasswordResetInputSchema, VerifyPasswordResetOtpInputSchema, ResetPasswordInputSchema, VerifyEmailInputSchema, UpdateProfileInputSchema, ChangePasswordInputSchema, ChangeEmailInputSchema, IdentitySuccessSchema, TimestampSchema, } from '@openora/core/contracts';
2
+ import { UserSchema, UuidSchema, LoginInputSchema, RegisterInputSchema, Enable2faInputSchema, Enable2faResultSchema, Verify2faInputSchema, Disable2faInputSchema, RequestPasswordResetInputSchema, VerifyPasswordResetOtpInputSchema, ResetPasswordInputSchema, VerifyEmailInputSchema, UpdateProfileInputSchema, ChangePasswordInputSchema, ChangeEmailInputSchema, IdentitySuccessSchema, TimestampSchema, PhoneLoginRequestInputSchema, PhoneLoginRequestOutputSchema, PhoneLoginVerifyInputSchema, } from '@openora/core/contracts';
3
3
  import { PageQuerySchema, paginated } from '@openora/core/contracts/kit';
4
4
  import * as z from 'zod';
5
- const SessionSchema = z.object({
5
+ export const SessionSchema = z.object({
6
6
  token: z.string(),
7
7
  expiresAt: TimestampSchema,
8
8
  });
@@ -27,6 +27,14 @@ export const identityContract = {
27
27
  session: SessionSchema.optional(),
28
28
  twoFactorRedirect: z.boolean().optional(),
29
29
  })),
30
+ phoneLoginRequest: oc
31
+ .route({ method: 'POST', path: '/identity/phone-login/request' })
32
+ .input(PhoneLoginRequestInputSchema)
33
+ .output(PhoneLoginRequestOutputSchema),
34
+ phoneLoginVerify: oc
35
+ .route({ method: 'POST', path: '/identity/phone-login/verify' })
36
+ .input(PhoneLoginVerifyInputSchema)
37
+ .output(z.object({ user: UserSchema, session: SessionSchema })),
30
38
  logout: oc.route({ method: 'POST', path: '/identity/logout' }).output(IdentitySuccessSchema),
31
39
  me: oc.route({ method: 'GET', path: '/identity/me' }).output(UserSchema.nullable()),
32
40
  streamSession: oc
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/pam/identity/contract/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,+BAA+B,EAC/B,iCAAiC,EACjC,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,GAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,SAAS,EAAE,eAAe;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,UAAU;IACd,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,EAAE;SACT,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;SACrD,KAAK,CAAC,mBAAmB,CAAC;SAC1B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAEzC,2HAA2H;IAC3H,KAAK,EAAE,EAAE;SACN,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;SAClD,KAAK,CAAC,gBAAgB,CAAC;SACvB,MAAM,CACL,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;QAC3B,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE;QACjC,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KAC1C,CAAC,CACH;IAEH,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC;IAE5F,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IAEnF,aAAa,EAAE,EAAE;SACd,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;SAC1D,MAAM,CACL,aAAa,CACX,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;QAC3B,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;KAC1C,CAAC,CACH,CACF;IAEH,SAAS,EAAE,EAAE;SACV,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;SACvD,KAAK,CAAC,oBAAoB,CAAC;SAC3B,MAAM,CAAC,qBAAqB,CAAC;IAEhC,SAAS,EAAE,EAAE;SACV,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;SACvD,KAAK,CAAC,oBAAoB,CAAC;SAC3B,MAAM,CAAC,qBAAqB,CAAC;IAEhC,UAAU,EAAE,EAAE;SACX,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;SACxD,KAAK,CAAC,qBAAqB,CAAC;SAC5B,MAAM,CAAC,qBAAqB,CAAC;IAEhC,oBAAoB,EAAE,EAAE;SACrB,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;SAC5D,KAAK,CAAC,+BAA+B,CAAC;SACtC,MAAM,CAAC,qBAAqB,CAAC;IAEhC,sBAAsB,EAAE,EAAE;SACvB,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAAC;SAChE,KAAK,CAAC,iCAAiC,CAAC;SACxC,MAAM,CAAC,qBAAqB,CAAC;IAEhC,aAAa,EAAE,EAAE;SACd,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;SAC3D,KAAK,CAAC,wBAAwB,CAAC;SAC/B,MAAM,CAAC,qBAAqB,CAAC;IAEhC,cAAc,EAAE,EAAE;SACf,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;SAC5D,KAAK,CAAC,yBAAyB,CAAC;SAChC,MAAM,CAAC,qBAAqB,CAAC;IAEhC,qBAAqB,EAAE,EAAE;SACtB,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC;SAC9D,MAAM,CAAC,qBAAqB,CAAC;IAEhC,WAAW,EAAE,EAAE;SACZ,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;SACzD,KAAK,CAAC,sBAAsB,CAAC;SAC7B,MAAM,CAAC,qBAAqB,CAAC;IAEhC,WAAW,EAAE,EAAE;SACZ,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;SACzD,KAAK,CAAC,sBAAsB,CAAC;SAC7B,MAAM,CAAC,qBAAqB,CAAC;IAEhC,aAAa,EAAE,EAAE;SACd,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;SACrD,KAAK,CAAC,wBAAwB,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAEzC,UAAU,EAAE,EAAE;SACX,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;SACnD,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;SACvC,MAAM,CAAC,qBAAqB,CAAC;IAEhC,QAAQ,EAAE;QACR,IAAI,EAAE,EAAE;aACL,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;aACpD,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;aACrD,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAEvC,MAAM,EAAE,EAAE;aACP,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;aAC5D,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;aACvD,MAAM,CAAC,qBAAqB,CAAC;QAEhC,SAAS,EAAE,EAAE;aACV,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAAC;aAChE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;aACvC,MAAM,CAAC,qBAAqB,CAAC;KACjC;CACF,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/pam/identity/contract/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ CREATE TABLE "sms_otp_session" (
2
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
3
+ "user_id" uuid NOT NULL,
4
+ "phone" text NOT NULL,
5
+ "code_hash" text NOT NULL,
6
+ "expires_at" timestamp with time zone NOT NULL,
7
+ "failed_attempts" integer DEFAULT 0 NOT NULL,
8
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
9
+ );
10
+ --> statement-breakpoint
11
+ ALTER TABLE "user" ADD COLUMN "phone_number" text;--> statement-breakpoint
12
+ ALTER TABLE "user" ADD COLUMN "phone_verified" boolean DEFAULT false NOT NULL;--> statement-breakpoint
13
+ ALTER TABLE "user" ADD COLUMN "phone_verified_at" timestamp with time zone;--> statement-breakpoint
14
+ ALTER TABLE "user" ADD COLUMN "lockout_count" integer DEFAULT 0 NOT NULL;--> statement-breakpoint
15
+ ALTER TABLE "user" ADD COLUMN "last_lockout_at" timestamp with time zone;--> statement-breakpoint
16
+ ALTER TABLE "sms_otp_session" ADD CONSTRAINT "sms_otp_session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
17
+ CREATE INDEX "sms_otp_session_user_id_idx" ON "sms_otp_session" USING btree ("user_id");--> statement-breakpoint
18
+ CREATE INDEX "sms_otp_session_phone_idx" ON "sms_otp_session" USING btree ("phone");
@@ -0,0 +1 @@
1
+ ALTER TABLE "sms_otp_session" ADD CONSTRAINT "sms_otp_session_userId_unique" UNIQUE("user_id");
@@ -0,0 +1 @@
1
+ ALTER TABLE "user" ADD CONSTRAINT "user_phoneNumber_unique" UNIQUE("phone_number");
@@ -0,0 +1 @@
1
+ DROP INDEX "sms_otp_session_user_id_idx";