@astram/frontend-core 0.1.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.
- package/LICENSE +21 -0
- package/dist/auth/accountService.d.ts +112 -0
- package/dist/auth/accountService.d.ts.map +1 -0
- package/dist/auth/accountService.js +210 -0
- package/dist/auth/accountService.js.map +1 -0
- package/dist/auth/auditService.d.ts +45 -0
- package/dist/auth/auditService.d.ts.map +1 -0
- package/dist/auth/auditService.js +58 -0
- package/dist/auth/auditService.js.map +1 -0
- package/dist/auth/authService.d.ts +96 -0
- package/dist/auth/authService.d.ts.map +1 -0
- package/dist/auth/authService.js +121 -0
- package/dist/auth/authService.js.map +1 -0
- package/dist/auth/identityService.d.ts +199 -0
- package/dist/auth/identityService.d.ts.map +1 -0
- package/dist/auth/identityService.js +374 -0
- package/dist/auth/identityService.js.map +1 -0
- package/dist/auth/index.d.ts +13 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +13 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/returnPath.d.ts +23 -0
- package/dist/auth/returnPath.d.ts.map +1 -0
- package/dist/auth/returnPath.js +95 -0
- package/dist/auth/returnPath.js.map +1 -0
- package/dist/auth/session.d.ts +38 -0
- package/dist/auth/session.d.ts.map +1 -0
- package/dist/auth/session.js +23 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/http/types.d.ts +33 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +10 -0
- package/dist/http/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
export function createIdentityService(http) {
|
|
2
|
+
/**
|
|
3
|
+
* Build a `?page&limit&search&sortBy&sortOrder` query string from a DataTable
|
|
4
|
+
* options bag, omitting anything absent/empty so the server applies its defaults.
|
|
5
|
+
* Values are URL-encoded. Returns '' (no leading '?') when nothing is set.
|
|
6
|
+
*
|
|
7
|
+
* Built with plain `encodeURIComponent` (not `URLSearchParams`) — this package has
|
|
8
|
+
* no `lib.dom`/Node ambient types (it must run unchanged on web AND React Native,
|
|
9
|
+
* where `URLSearchParams` isn't guaranteed to exist), and every key here is set at
|
|
10
|
+
* most once, so a manual `key=value` join is byte-identical to the source's
|
|
11
|
+
* `URLSearchParams#toString()` output.
|
|
12
|
+
*/
|
|
13
|
+
function listQueryString(opts) {
|
|
14
|
+
const o = opts ?? {};
|
|
15
|
+
const parts = [];
|
|
16
|
+
if (Number.isFinite(o.page) && o.page >= 1)
|
|
17
|
+
parts.push(`page=${encodeURIComponent(String(o.page))}`);
|
|
18
|
+
if (Number.isFinite(o.limit) && o.limit >= 1) {
|
|
19
|
+
parts.push(`limit=${encodeURIComponent(String(o.limit))}`);
|
|
20
|
+
}
|
|
21
|
+
const search = typeof o.search === 'string' ? o.search.trim() : '';
|
|
22
|
+
if (search.length > 0)
|
|
23
|
+
parts.push(`search=${encodeURIComponent(search)}`);
|
|
24
|
+
if (typeof o.sortBy === 'string' && o.sortBy.length > 0) {
|
|
25
|
+
parts.push(`sortBy=${encodeURIComponent(o.sortBy)}`);
|
|
26
|
+
parts.push(`sortOrder=${encodeURIComponent(o.sortOrder === 'desc' ? 'desc' : 'asc')}`);
|
|
27
|
+
}
|
|
28
|
+
return parts.length > 0 ? `?${parts.join('&')}` : '';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Shared translator for a failure response → a friendly result. Centralizes the
|
|
32
|
+
* 401/403/other mapping so every method reports consistently.
|
|
33
|
+
*/
|
|
34
|
+
function fail(r, generic) {
|
|
35
|
+
if (r.status === 401) {
|
|
36
|
+
return { ok: false, status: 401, error: 'Not authenticated (no/invalid token).' };
|
|
37
|
+
}
|
|
38
|
+
if (r.status === 403) {
|
|
39
|
+
return { ok: false, status: 403, error: 'You need platform-admin access to do this.' };
|
|
40
|
+
}
|
|
41
|
+
return { ok: false, status: r.status, error: generic };
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
// ── Companies ────────────────────────────────────────────────────────────
|
|
45
|
+
/**
|
|
46
|
+
* List companies visible to the authenticated caller (a @Classified route — the
|
|
47
|
+
* framework resolves the token → principal → decide() before the handler). Pass
|
|
48
|
+
* the access token; omit it to demonstrate the 401 wall.
|
|
49
|
+
*
|
|
50
|
+
* Server-side DataTable: pass `{ page, limit, search, sortBy, sortOrder }` — the
|
|
51
|
+
* server pages/searches (over name)/sorts (name, status) and returns the FILTERED
|
|
52
|
+
* total, so the client can page the true result count (no client-side 100-row cap).
|
|
53
|
+
*
|
|
54
|
+
* Resolves: { ok:true, total, rows, page, limit } | { ok:false, status, error }
|
|
55
|
+
*/
|
|
56
|
+
async listCompanies(accessToken, opts) {
|
|
57
|
+
const r = await http.get(`/identity/companies${listQueryString(opts)}`, {
|
|
58
|
+
bearerToken: accessToken,
|
|
59
|
+
});
|
|
60
|
+
if (r.ok) {
|
|
61
|
+
const data = r.data;
|
|
62
|
+
return {
|
|
63
|
+
ok: true,
|
|
64
|
+
total: data?.total ?? 0,
|
|
65
|
+
rows: data?.rows ?? [],
|
|
66
|
+
page: data?.page ?? 1,
|
|
67
|
+
limit: data?.limit ?? data?.rows?.length ?? 0,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return fail(r, 'Could not load companies.');
|
|
71
|
+
},
|
|
72
|
+
/** Read one company → { ok:true, record } | { ok:false, ... }. */
|
|
73
|
+
async getCompany(accessToken, uuid) {
|
|
74
|
+
const r = await http.get(`/identity/companies/${encodeURIComponent(uuid)}`, {
|
|
75
|
+
bearerToken: accessToken,
|
|
76
|
+
});
|
|
77
|
+
if (r.ok)
|
|
78
|
+
return { ok: true, record: r.data ?? null };
|
|
79
|
+
return fail(r, 'Could not load the company.');
|
|
80
|
+
},
|
|
81
|
+
/** Create a company → { ok:true, id } | { ok:false, ... }. */
|
|
82
|
+
async createCompany(accessToken, name) {
|
|
83
|
+
const r = await http.post('/identity/companies', { name }, { bearerToken: accessToken });
|
|
84
|
+
if (r.ok)
|
|
85
|
+
return { ok: true, id: r.data?.id };
|
|
86
|
+
return fail(r, 'Could not create the company.');
|
|
87
|
+
},
|
|
88
|
+
/** Update a company (partial: name and/or status) → { ok:true } | { ok:false, ... }. */
|
|
89
|
+
async updateCompany(accessToken, uuid, patch) {
|
|
90
|
+
const r = await http.put(`/identity/companies/${encodeURIComponent(uuid)}`, patch ?? {}, {
|
|
91
|
+
bearerToken: accessToken,
|
|
92
|
+
});
|
|
93
|
+
if (r.ok)
|
|
94
|
+
return { ok: true };
|
|
95
|
+
return fail(r, 'Could not update the company.');
|
|
96
|
+
},
|
|
97
|
+
/** Delete a company → { ok:true } | { ok:false, ... }. */
|
|
98
|
+
async deleteCompany(accessToken, uuid) {
|
|
99
|
+
const r = await http.delete(`/identity/companies/${encodeURIComponent(uuid)}`, {}, { bearerToken: accessToken });
|
|
100
|
+
if (r.ok)
|
|
101
|
+
return { ok: true };
|
|
102
|
+
return fail(r, 'Could not delete the company.');
|
|
103
|
+
},
|
|
104
|
+
// ── Roles ────────────────────────────────────────────────────────────────
|
|
105
|
+
/**
|
|
106
|
+
* List roles with server-side DataTable paging/search (name)/sort (name).
|
|
107
|
+
* Resolves: { ok:true, total, rows, page, limit } | { ok:false, ... }.
|
|
108
|
+
*/
|
|
109
|
+
async listRoles(accessToken, opts) {
|
|
110
|
+
const r = await http.get(`/identity/roles${listQueryString(opts)}`, {
|
|
111
|
+
bearerToken: accessToken,
|
|
112
|
+
});
|
|
113
|
+
if (r.ok) {
|
|
114
|
+
const data = r.data;
|
|
115
|
+
return {
|
|
116
|
+
ok: true,
|
|
117
|
+
total: data?.total ?? 0,
|
|
118
|
+
rows: data?.rows ?? [],
|
|
119
|
+
page: data?.page ?? 1,
|
|
120
|
+
limit: data?.limit ?? data?.rows?.length ?? 0,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return fail(r, 'Could not load roles.');
|
|
124
|
+
},
|
|
125
|
+
/** Read one role → { ok:true, record } | { ok:false, ... }. */
|
|
126
|
+
async getRole(accessToken, uuid) {
|
|
127
|
+
const r = await http.get(`/identity/roles/${encodeURIComponent(uuid)}`, {
|
|
128
|
+
bearerToken: accessToken,
|
|
129
|
+
});
|
|
130
|
+
if (r.ok)
|
|
131
|
+
return { ok: true, record: r.data ?? null };
|
|
132
|
+
return fail(r, 'Could not load the role.');
|
|
133
|
+
},
|
|
134
|
+
/** Create a role → { ok:true, id } | { ok:false, ... }. */
|
|
135
|
+
async createRole(accessToken, name) {
|
|
136
|
+
const r = await http.post('/identity/roles', { name }, { bearerToken: accessToken });
|
|
137
|
+
if (r.ok)
|
|
138
|
+
return { ok: true, id: r.data?.id };
|
|
139
|
+
return fail(r, 'Could not create the role.');
|
|
140
|
+
},
|
|
141
|
+
/** Update a role (name) → { ok:true } | { ok:false, ... }. */
|
|
142
|
+
async updateRole(accessToken, uuid, patch) {
|
|
143
|
+
const r = await http.put(`/identity/roles/${encodeURIComponent(uuid)}`, patch ?? {}, {
|
|
144
|
+
bearerToken: accessToken,
|
|
145
|
+
});
|
|
146
|
+
if (r.ok)
|
|
147
|
+
return { ok: true };
|
|
148
|
+
return fail(r, 'Could not update the role.');
|
|
149
|
+
},
|
|
150
|
+
/** Delete a role → { ok:true } | { ok:false, ... }. */
|
|
151
|
+
async deleteRole(accessToken, uuid) {
|
|
152
|
+
const r = await http.delete(`/identity/roles/${encodeURIComponent(uuid)}`, {}, { bearerToken: accessToken });
|
|
153
|
+
if (r.ok)
|
|
154
|
+
return { ok: true };
|
|
155
|
+
return fail(r, 'Could not delete the role.');
|
|
156
|
+
},
|
|
157
|
+
// ── Role permissions (grant admin) ────────────────────────────────────────
|
|
158
|
+
/** List grantable permission keys + wildcards → { ok:true, catalog, wildcards } | { ok:false, ... }. */
|
|
159
|
+
async listPermissionCatalog(accessToken) {
|
|
160
|
+
const r = await http.get('/identity/permission-catalog', { bearerToken: accessToken });
|
|
161
|
+
if (r.ok) {
|
|
162
|
+
const data = r.data;
|
|
163
|
+
return { ok: true, catalog: data?.catalog ?? [], wildcards: data?.wildcards ?? [] };
|
|
164
|
+
}
|
|
165
|
+
return fail(r, 'Could not load the permission catalog.');
|
|
166
|
+
},
|
|
167
|
+
/**
|
|
168
|
+
* Per-role access summary for the Access listing (server-paged/sorted/searched via
|
|
169
|
+
* `opts` = { page, limit, search, sortBy, sortOrder }) → { ok, rows, total, page,
|
|
170
|
+
* limit } | fail. Each row: { roleUuid, roleName, objectCount, permCount, chips[],
|
|
171
|
+
* preset, grantedAt, grantedByName } — grantor resolved to a NAME (never a uuid).
|
|
172
|
+
*/
|
|
173
|
+
async listGrantsSummary(accessToken, opts) {
|
|
174
|
+
const r = await http.get(`/identity/access/role-grants${listQueryString(opts)}`, {
|
|
175
|
+
bearerToken: accessToken,
|
|
176
|
+
});
|
|
177
|
+
if (r.ok) {
|
|
178
|
+
const data = r.data;
|
|
179
|
+
return {
|
|
180
|
+
ok: true,
|
|
181
|
+
rows: data?.rows ?? [],
|
|
182
|
+
total: data?.total ?? 0,
|
|
183
|
+
page: data?.page ?? 1,
|
|
184
|
+
limit: data?.limit ?? data?.rows?.length ?? 0,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return fail(r, 'Could not load the roles summary.');
|
|
188
|
+
},
|
|
189
|
+
/** List a role's current grants → { ok:true, grants } | { ok:false, ... }. */
|
|
190
|
+
async listRolePermissions(accessToken, uuid) {
|
|
191
|
+
const r = await http.get(`/identity/roles/${encodeURIComponent(uuid)}/permissions`, {
|
|
192
|
+
bearerToken: accessToken,
|
|
193
|
+
});
|
|
194
|
+
if (r.ok)
|
|
195
|
+
return { ok: true, grants: r.data?.grants ?? [] };
|
|
196
|
+
return fail(r, 'Could not load the role permissions.');
|
|
197
|
+
},
|
|
198
|
+
/** Grant one key to a role → { ok:true } | { ok:false, ... }. */
|
|
199
|
+
async grantPermission(accessToken, uuid, key) {
|
|
200
|
+
const r = await http.post(`/identity/roles/${encodeURIComponent(uuid)}/permissions`, { key }, { bearerToken: accessToken });
|
|
201
|
+
if (r.ok)
|
|
202
|
+
return { ok: true };
|
|
203
|
+
return fail(r, 'Could not grant the permission.');
|
|
204
|
+
},
|
|
205
|
+
/** Revoke one key from a role → { ok:true } | { ok:false, ... }. */
|
|
206
|
+
async revokePermission(accessToken, uuid, key) {
|
|
207
|
+
const r = await http.delete(`/identity/roles/${encodeURIComponent(uuid)}/permissions/${encodeURIComponent(key)}`, {}, { bearerToken: accessToken });
|
|
208
|
+
if (r.ok)
|
|
209
|
+
return { ok: true };
|
|
210
|
+
return fail(r, 'Could not revoke the permission.');
|
|
211
|
+
},
|
|
212
|
+
// ── Access bundles (named, grantable permission sets) ──────────────────────
|
|
213
|
+
/**
|
|
214
|
+
* List active access bundles → { ok:true, bundles } | { ok:false, ... }. Each
|
|
215
|
+
* bundle is `{ key, module, label, description?, permissionKeys[] }` — identified
|
|
216
|
+
* by `key`/`label`, never a uuid.
|
|
217
|
+
*/
|
|
218
|
+
async listAccessBundles(accessToken) {
|
|
219
|
+
const r = await http.get('/identity/access-bundles', { bearerToken: accessToken });
|
|
220
|
+
if (r.ok)
|
|
221
|
+
return { ok: true, bundles: r.data?.bundles ?? [] };
|
|
222
|
+
return fail(r, 'Could not load the access bundles.');
|
|
223
|
+
},
|
|
224
|
+
/** Grant a bundle to a role (server expands it to atomic keys) → { ok } | fail. */
|
|
225
|
+
async grantAccessBundle(accessToken, uuid, key) {
|
|
226
|
+
const r = await http.post(`/identity/roles/${encodeURIComponent(uuid)}/access-bundles`, { key }, { bearerToken: accessToken });
|
|
227
|
+
if (r.ok)
|
|
228
|
+
return { ok: true };
|
|
229
|
+
return fail(r, 'Could not grant the bundle.');
|
|
230
|
+
},
|
|
231
|
+
/** Revoke a bundle from a role (removes its atomic keys) → { ok } | fail. */
|
|
232
|
+
async revokeAccessBundle(accessToken, uuid, key) {
|
|
233
|
+
const r = await http.delete(`/identity/roles/${encodeURIComponent(uuid)}/access-bundles/${encodeURIComponent(key)}`, {}, { bearerToken: accessToken });
|
|
234
|
+
if (r.ok)
|
|
235
|
+
return { ok: true };
|
|
236
|
+
return fail(r, 'Could not revoke the bundle.');
|
|
237
|
+
},
|
|
238
|
+
// ── Users ────────────────────────────────────────────────────────────────
|
|
239
|
+
/**
|
|
240
|
+
* List users with server-side DataTable paging/search (username, email)/sort
|
|
241
|
+
* (username, email, status).
|
|
242
|
+
* Resolves: { ok:true, total, rows, page, limit } | { ok:false, ... }.
|
|
243
|
+
*/
|
|
244
|
+
async listUsers(accessToken, opts) {
|
|
245
|
+
const r = await http.get(`/identity/users${listQueryString(opts)}`, {
|
|
246
|
+
bearerToken: accessToken,
|
|
247
|
+
});
|
|
248
|
+
if (r.ok) {
|
|
249
|
+
const data = r.data;
|
|
250
|
+
return {
|
|
251
|
+
ok: true,
|
|
252
|
+
total: data?.total ?? 0,
|
|
253
|
+
rows: data?.rows ?? [],
|
|
254
|
+
page: data?.page ?? 1,
|
|
255
|
+
limit: data?.limit ?? data?.rows?.length ?? 0,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
return fail(r, 'Could not load users.');
|
|
259
|
+
},
|
|
260
|
+
/** Read one user → { ok:true, record } | { ok:false, ... }. */
|
|
261
|
+
async getUser(accessToken, uuid) {
|
|
262
|
+
const r = await http.get(`/identity/users/${encodeURIComponent(uuid)}`, {
|
|
263
|
+
bearerToken: accessToken,
|
|
264
|
+
});
|
|
265
|
+
if (r.ok)
|
|
266
|
+
return { ok: true, record: r.data ?? null };
|
|
267
|
+
return fail(r, 'Could not load the user.');
|
|
268
|
+
},
|
|
269
|
+
/**
|
|
270
|
+
* Create a user. The server currently accepts only `{ username }` (the global
|
|
271
|
+
* user record); an optional `email` is sent so a later server slice can pick it up
|
|
272
|
+
* without a client change. → { ok:true, id } | { ok:false, ... }.
|
|
273
|
+
*/
|
|
274
|
+
async createUser(accessToken, { username, email } = {}) {
|
|
275
|
+
// `username` carries through as-is (including `undefined`, matching the source's
|
|
276
|
+
// `const body = { username }`); the property type allows `undefined` explicitly
|
|
277
|
+
// so this assignment is valid under `exactOptionalPropertyTypes`.
|
|
278
|
+
const body = { username };
|
|
279
|
+
if (typeof email === 'string' && email.length > 0)
|
|
280
|
+
body.email = email;
|
|
281
|
+
const r = await http.post('/identity/users', body, { bearerToken: accessToken });
|
|
282
|
+
if (r.ok)
|
|
283
|
+
return { ok: true, id: r.data?.id };
|
|
284
|
+
return fail(r, 'Could not create the user.');
|
|
285
|
+
},
|
|
286
|
+
/** Update a user (partial: username / email / status) → { ok:true } | { ok:false, ... }. */
|
|
287
|
+
async updateUser(accessToken, uuid, patch) {
|
|
288
|
+
const r = await http.put(`/identity/users/${encodeURIComponent(uuid)}`, patch ?? {}, {
|
|
289
|
+
bearerToken: accessToken,
|
|
290
|
+
});
|
|
291
|
+
if (r.ok)
|
|
292
|
+
return { ok: true };
|
|
293
|
+
return fail(r, 'Could not update the user.');
|
|
294
|
+
},
|
|
295
|
+
/** Delete a user → { ok:true } | { ok:false, ... }. */
|
|
296
|
+
async deleteUser(accessToken, uuid) {
|
|
297
|
+
const r = await http.delete(`/identity/users/${encodeURIComponent(uuid)}`, {}, { bearerToken: accessToken });
|
|
298
|
+
if (r.ok)
|
|
299
|
+
return { ok: true };
|
|
300
|
+
return fail(r, 'Could not delete the user.');
|
|
301
|
+
},
|
|
302
|
+
// ── Memberships + postings (Phase 5's Assignments editor) ─────────────────
|
|
303
|
+
/**
|
|
304
|
+
* The user's membership cards + their postings, with EVERY uuid resolved to a
|
|
305
|
+
* display NAME server-side (companyName / roleName / departmentName / branchName).
|
|
306
|
+
* → { ok:true, memberships } | { ok:false, ... }.
|
|
307
|
+
*/
|
|
308
|
+
async getUserMemberships(accessToken, userUuid) {
|
|
309
|
+
const r = await http.get(`/identity/users/${encodeURIComponent(userUuid)}/memberships`, {
|
|
310
|
+
bearerToken: accessToken,
|
|
311
|
+
});
|
|
312
|
+
if (r.ok)
|
|
313
|
+
return { ok: true, memberships: r.data?.memberships ?? [] };
|
|
314
|
+
return fail(r, 'Could not load the user’s memberships.');
|
|
315
|
+
},
|
|
316
|
+
/** Add the user to a company (creates an inactive card) → { ok:true, id } | { ok:false, ... }. */
|
|
317
|
+
async addMembership(accessToken, userUuid, companyUuid) {
|
|
318
|
+
const r = await http.post(`/identity/users/${encodeURIComponent(userUuid)}/memberships`, { companyUuid }, { bearerToken: accessToken });
|
|
319
|
+
if (r.ok)
|
|
320
|
+
return { ok: true, id: r.data?.id };
|
|
321
|
+
return fail(r, 'Could not add the membership.');
|
|
322
|
+
},
|
|
323
|
+
/**
|
|
324
|
+
* Mark a membership the active-login company (the one-active invariant — the server
|
|
325
|
+
* deactivates the user's other memberships). `userUuid` is required so the server can
|
|
326
|
+
* enforce it. → { ok:true } | { ok:false, ... }.
|
|
327
|
+
*/
|
|
328
|
+
async setMembershipActive(accessToken, membershipUuid, userUuid) {
|
|
329
|
+
const r = await http.put(`/identity/memberships/${encodeURIComponent(membershipUuid)}`, { isActive: true, userUuid }, { bearerToken: accessToken });
|
|
330
|
+
if (r.ok)
|
|
331
|
+
return { ok: true };
|
|
332
|
+
return fail(r, 'Could not activate the membership.');
|
|
333
|
+
},
|
|
334
|
+
/** Remove a membership card (its postings cascade) → { ok:true } | { ok:false, ... }. */
|
|
335
|
+
async removeMembership(accessToken, membershipUuid) {
|
|
336
|
+
const r = await http.delete(`/identity/memberships/${encodeURIComponent(membershipUuid)}`, {}, { bearerToken: accessToken });
|
|
337
|
+
if (r.ok)
|
|
338
|
+
return { ok: true };
|
|
339
|
+
return fail(r, 'Could not remove the membership.');
|
|
340
|
+
},
|
|
341
|
+
/**
|
|
342
|
+
* Atomically replace a membership's FULL posting set (the multi-row editor submits the
|
|
343
|
+
* whole list; the server diffs → add/remove). `postings` is an array of
|
|
344
|
+
* `{ roleUuid, departmentUuid?, branchUuid?, effectiveFrom?, effectiveUntil? }`.
|
|
345
|
+
* → { ok:true } | { ok:false, ... }.
|
|
346
|
+
*/
|
|
347
|
+
async replacePostings(accessToken, membershipUuid, postings) {
|
|
348
|
+
const r = await http.put(`/identity/memberships/${encodeURIComponent(membershipUuid)}/postings`, { postings }, { bearerToken: accessToken });
|
|
349
|
+
if (r.ok)
|
|
350
|
+
return { ok: true };
|
|
351
|
+
return fail(r, 'Could not save the postings.');
|
|
352
|
+
},
|
|
353
|
+
// ── Company-scoped catalogs (dept/branch option lists for the posting editor) ──
|
|
354
|
+
//
|
|
355
|
+
// These back the company-scoped dropdowns in Phase 5's Assignments editor. The
|
|
356
|
+
// server route lands with that phase; until then the call resolves { ok:false }
|
|
357
|
+
// gracefully (the editor treats an empty catalog as "no options yet").
|
|
358
|
+
/** List a company's departments → { ok:true, rows } | { ok:false, ... }. */
|
|
359
|
+
async listDepartments(accessToken, companyUuid) {
|
|
360
|
+
const r = await http.get(`/identity/companies/${encodeURIComponent(companyUuid)}/departments`, { bearerToken: accessToken });
|
|
361
|
+
if (r.ok)
|
|
362
|
+
return { ok: true, rows: r.data?.rows ?? [] };
|
|
363
|
+
return fail(r, 'Could not load departments.');
|
|
364
|
+
},
|
|
365
|
+
/** List a company's branches → { ok:true, rows } | { ok:false, ... }. */
|
|
366
|
+
async listBranches(accessToken, companyUuid) {
|
|
367
|
+
const r = await http.get(`/identity/companies/${encodeURIComponent(companyUuid)}/branches`, { bearerToken: accessToken });
|
|
368
|
+
if (r.ok)
|
|
369
|
+
return { ok: true, rows: r.data?.rows ?? [] };
|
|
370
|
+
return fail(r, 'Could not load branches.');
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=identityService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identityService.js","sourceRoot":"","sources":["../../src/auth/identityService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public barrel for the framework's identity surface. Mirrors
|
|
3
|
+
* astram3/shared/src/auth/index.js MINUS the excluded cross-tenant/demo services —
|
|
4
|
+
* `createNotesService`, `createShareService`, and `createGrantService` are NOT ported
|
|
5
|
+
* and MUST NOT be re-exported here.
|
|
6
|
+
*/
|
|
7
|
+
export { createAuthService } from './authService.js';
|
|
8
|
+
export { createAccountService } from './accountService.js';
|
|
9
|
+
export { createIdentityService } from './identityService.js';
|
|
10
|
+
export { createAuditService } from './auditService.js';
|
|
11
|
+
export { isAuthenticated, accessTokenOf, tenantOf, principalOf } from './session.js';
|
|
12
|
+
export { isRestorablePath, encodeReturnPath, decodeReturnPath } from './returnPath.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public barrel for the framework's identity surface. Mirrors
|
|
3
|
+
* astram3/shared/src/auth/index.js MINUS the excluded cross-tenant/demo services —
|
|
4
|
+
* `createNotesService`, `createShareService`, and `createGrantService` are NOT ported
|
|
5
|
+
* and MUST NOT be re-exported here.
|
|
6
|
+
*/
|
|
7
|
+
export { createAuthService } from './authService.js';
|
|
8
|
+
export { createAccountService } from './accountService.js';
|
|
9
|
+
export { createIdentityService } from './identityService.js';
|
|
10
|
+
export { createAuditService } from './auditService.js';
|
|
11
|
+
export { isAuthenticated, accessTokenOf, tenantOf, principalOf } from './session.js';
|
|
12
|
+
export { isRestorablePath, encodeReturnPath, decodeReturnPath } from './returnPath.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return-path logic — PURE + platform-agnostic (no storage). Lets the next successful
|
|
3
|
+
* login return the user to the page they were on when they left (logout OR session
|
|
4
|
+
* expiry), instead of always landing on /dashboard.
|
|
5
|
+
*
|
|
6
|
+
* Storage is the APP's concern (web: localStorage via platform/returnPathStore.js;
|
|
7
|
+
* mobile: AsyncStorage) — this module only decides WHICH paths are restorable and
|
|
8
|
+
* obfuscates/deobfuscates the value so a readable route isn't sitting in plain text.
|
|
9
|
+
* Obfuscation, not secrecy: the user owns their storage; the goal is "not human-readable".
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* True for real in-app routes; false for empty, root, and auth/transient pages.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isRestorablePath(path: string | null | undefined): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Obfuscate `path` to an opaque blob, or null if non-restorable / btoa unavailable.
|
|
17
|
+
*/
|
|
18
|
+
export declare function encodeReturnPath(path: string | null | undefined): string | null;
|
|
19
|
+
/**
|
|
20
|
+
* De-obfuscate a blob back to a path, or null if missing / corrupt / non-restorable.
|
|
21
|
+
*/
|
|
22
|
+
export declare function decodeReturnPath(blob: string | null | undefined): string | null;
|
|
23
|
+
//# sourceMappingURL=returnPath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"returnPath.d.ts","sourceRoot":"","sources":["../../src/auth/returnPath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2CH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAQzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAS/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAa/E"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return-path logic — PURE + platform-agnostic (no storage). Lets the next successful
|
|
3
|
+
* login return the user to the page they were on when they left (logout OR session
|
|
4
|
+
* expiry), instead of always landing on /dashboard.
|
|
5
|
+
*
|
|
6
|
+
* Storage is the APP's concern (web: localStorage via platform/returnPathStore.js;
|
|
7
|
+
* mobile: AsyncStorage) — this module only decides WHICH paths are restorable and
|
|
8
|
+
* obfuscates/deobfuscates the value so a readable route isn't sitting in plain text.
|
|
9
|
+
* Obfuscation, not secrecy: the user owns their storage; the goal is "not human-readable".
|
|
10
|
+
*/
|
|
11
|
+
// Fixed obfuscation key. Not a secret — see file header.
|
|
12
|
+
const XOR_KEY = 'astram.return.v1';
|
|
13
|
+
// Routes we must never restore to (auth / transient pages + root).
|
|
14
|
+
const NON_RESTORABLE_PREFIXES = [
|
|
15
|
+
'/login',
|
|
16
|
+
'/forgot-password',
|
|
17
|
+
'/reset-password',
|
|
18
|
+
'/account/reenroll',
|
|
19
|
+
];
|
|
20
|
+
function getBtoa() {
|
|
21
|
+
const g = globalThis;
|
|
22
|
+
return typeof g.btoa === 'function' ? g.btoa : null;
|
|
23
|
+
}
|
|
24
|
+
function getAtob() {
|
|
25
|
+
const g = globalThis;
|
|
26
|
+
return typeof g.atob === 'function' ? g.atob : null;
|
|
27
|
+
}
|
|
28
|
+
// XOR each char code with the repeating key → a Latin-1 string btoa can encode.
|
|
29
|
+
// Symmetric: applying twice returns the original.
|
|
30
|
+
function xor(input) {
|
|
31
|
+
let out = '';
|
|
32
|
+
for (let i = 0; i < input.length; i++) {
|
|
33
|
+
out += String.fromCharCode(input.charCodeAt(i) ^ XOR_KEY.charCodeAt(i % XOR_KEY.length));
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
function toBase64Url(b64) {
|
|
38
|
+
return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
39
|
+
}
|
|
40
|
+
function fromBase64Url(s) {
|
|
41
|
+
let b64 = s.replace(/-/g, '+').replace(/_/g, '/');
|
|
42
|
+
while (b64.length % 4 !== 0)
|
|
43
|
+
b64 += '=';
|
|
44
|
+
return b64;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* True for real in-app routes; false for empty, root, and auth/transient pages.
|
|
48
|
+
*/
|
|
49
|
+
export function isRestorablePath(path) {
|
|
50
|
+
if (!path || path === '/')
|
|
51
|
+
return false;
|
|
52
|
+
// Strip any hash fragment before matching so /login#x is also rejected.
|
|
53
|
+
const bare = path.split('#')[0];
|
|
54
|
+
if (!bare || bare === '/')
|
|
55
|
+
return false;
|
|
56
|
+
return !NON_RESTORABLE_PREFIXES.some((p) => bare === p || bare.startsWith(p + '/') || bare.startsWith(p + '?'));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Obfuscate `path` to an opaque blob, or null if non-restorable / btoa unavailable.
|
|
60
|
+
*/
|
|
61
|
+
export function encodeReturnPath(path) {
|
|
62
|
+
if (!isRestorablePath(path))
|
|
63
|
+
return null;
|
|
64
|
+
const btoa = getBtoa();
|
|
65
|
+
if (!btoa)
|
|
66
|
+
return null;
|
|
67
|
+
try {
|
|
68
|
+
return toBase64Url(btoa(xor(path)));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* De-obfuscate a blob back to a path, or null if missing / corrupt / non-restorable.
|
|
76
|
+
*/
|
|
77
|
+
export function decodeReturnPath(blob) {
|
|
78
|
+
if (!blob)
|
|
79
|
+
return null;
|
|
80
|
+
const atob = getAtob();
|
|
81
|
+
if (!atob)
|
|
82
|
+
return null;
|
|
83
|
+
try {
|
|
84
|
+
const path = xor(atob(fromBase64Url(blob)));
|
|
85
|
+
// A tampered/corrupt blob can decode to arbitrary bytes; only accept a value that
|
|
86
|
+
// looks like a real path (leading slash, printable ASCII).
|
|
87
|
+
if (!/^\/[\x20-\x7E]*$/.test(path))
|
|
88
|
+
return null;
|
|
89
|
+
return isRestorablePath(path) ? path : null;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=returnPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"returnPath.js","sourceRoot":"","sources":["../../src/auth/returnPath.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session helpers — pure, platform-agnostic. Storage is INJECTED (web: localStorage;
|
|
3
|
+
* mobile: AsyncStorage), so the shared logic never touches a platform storage API.
|
|
4
|
+
*
|
|
5
|
+
* A {@link SessionStore} is the tiny contract a platform provides.
|
|
6
|
+
*/
|
|
7
|
+
/** The framework session view. */
|
|
8
|
+
export interface Session {
|
|
9
|
+
sessionId?: string;
|
|
10
|
+
principalId?: string;
|
|
11
|
+
tenantId?: string;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
/** The bearer + refresh tokens. */
|
|
15
|
+
export interface SessionTokens {
|
|
16
|
+
accessToken?: string;
|
|
17
|
+
refreshToken?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface SessionState {
|
|
20
|
+
/** the framework session view ({ sessionId, principalId, tenantId, ... }) */
|
|
21
|
+
session?: Session;
|
|
22
|
+
/** { accessToken, refreshToken } */
|
|
23
|
+
tokens?: SessionTokens;
|
|
24
|
+
}
|
|
25
|
+
/** The tiny contract a platform provides for loading/saving session state. */
|
|
26
|
+
export interface SessionStore {
|
|
27
|
+
load: () => SessionState | null;
|
|
28
|
+
save: (state: SessionState | null) => void;
|
|
29
|
+
}
|
|
30
|
+
/** True if the state carries a usable access token. */
|
|
31
|
+
export declare function isAuthenticated(state: SessionState | null | undefined): boolean;
|
|
32
|
+
/** The bearer access token, or undefined. */
|
|
33
|
+
export declare function accessTokenOf(state: SessionState | null | undefined): string | undefined;
|
|
34
|
+
/** The current tenant id, or null. */
|
|
35
|
+
export declare function tenantOf(state: SessionState | null | undefined): string | null;
|
|
36
|
+
/** The principal id (who you're acting as), or null. */
|
|
37
|
+
export declare function principalOf(state: SessionState | null | undefined): string | null;
|
|
38
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/auth/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kCAAkC;AAClC,MAAM,WAAW,OAAO;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;CAC5C;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE/E;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAExF;AAED,sCAAsC;AACtC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAE9E;AAED,wDAAwD;AACxD,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAEjF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session helpers — pure, platform-agnostic. Storage is INJECTED (web: localStorage;
|
|
3
|
+
* mobile: AsyncStorage), so the shared logic never touches a platform storage API.
|
|
4
|
+
*
|
|
5
|
+
* A {@link SessionStore} is the tiny contract a platform provides.
|
|
6
|
+
*/
|
|
7
|
+
/** True if the state carries a usable access token. */
|
|
8
|
+
export function isAuthenticated(state) {
|
|
9
|
+
return Boolean(state?.tokens?.accessToken);
|
|
10
|
+
}
|
|
11
|
+
/** The bearer access token, or undefined. */
|
|
12
|
+
export function accessTokenOf(state) {
|
|
13
|
+
return state?.tokens?.accessToken ?? undefined;
|
|
14
|
+
}
|
|
15
|
+
/** The current tenant id, or null. */
|
|
16
|
+
export function tenantOf(state) {
|
|
17
|
+
return state?.session?.tenantId ?? null;
|
|
18
|
+
}
|
|
19
|
+
/** The principal id (who you're acting as), or null. */
|
|
20
|
+
export function principalOf(state) {
|
|
21
|
+
return state?.session?.principalId ?? null;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/auth/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6BH,uDAAuD;AACvD,MAAM,UAAU,eAAe,CAAC,KAAsC;IACpE,OAAO,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,aAAa,CAAC,KAAsC;IAClE,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,IAAI,SAAS,CAAC;AACjD,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,QAAQ,CAAC,KAAsC;IAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;AAC1C,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,WAAW,CAAC,KAAsC;IAChE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC;AAC7C,CAAC"}
|