fluxmail 0.2.1 → 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.
- package/README.md +15 -51
- package/dist/accounts/gmailConnection.d.ts +5 -1
- package/dist/accounts/gmailConnection.d.ts.map +1 -1
- package/dist/accounts/gmailConnection.js +14 -2
- package/dist/accounts/gmailConnection.js.map +1 -1
- package/dist/accounts/googleAuth.js +1 -1
- package/dist/accounts/googleAuth.js.map +1 -1
- package/dist/accounts/microsoftAuth.d.ts +21 -0
- package/dist/accounts/microsoftAuth.d.ts.map +1 -0
- package/dist/accounts/microsoftAuth.js +220 -0
- package/dist/accounts/microsoftAuth.js.map +1 -0
- package/dist/accounts/registry.d.ts +21 -8
- package/dist/accounts/registry.d.ts.map +1 -1
- package/dist/accounts/registry.js +190 -24
- package/dist/accounts/registry.js.map +1 -1
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +881 -572
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +105 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +128 -13
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +7 -1
- package/dist/context.js.map +1 -1
- package/dist/http/admin.d.ts +21 -0
- package/dist/http/admin.d.ts.map +1 -0
- package/dist/http/admin.js +618 -0
- package/dist/http/admin.js.map +1 -0
- package/dist/http/app.d.ts +2 -0
- package/dist/http/app.d.ts.map +1 -1
- package/dist/http/app.js +332 -45
- package/dist/http/app.js.map +1 -1
- package/dist/http/rest.d.ts +28 -0
- package/dist/http/rest.d.ts.map +1 -0
- package/dist/http/rest.js +1130 -0
- package/dist/http/rest.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/licensing/refresher.d.ts +23 -7
- package/dist/licensing/refresher.d.ts.map +1 -1
- package/dist/licensing/refresher.js +93 -37
- package/dist/licensing/refresher.js.map +1 -1
- package/dist/mcp/buildServer.d.ts +4 -2
- package/dist/mcp/buildServer.d.ts.map +1 -1
- package/dist/mcp/buildServer.js +286 -230
- package/dist/mcp/buildServer.js.map +1 -1
- package/dist/permissions.d.ts +30 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +119 -0
- package/dist/permissions.js.map +1 -0
- package/dist/service/emailService.d.ts +16 -9
- package/dist/service/emailService.d.ts.map +1 -1
- package/dist/service/emailService.js +44 -19
- package/dist/service/emailService.js.map +1 -1
- package/dist/storage/adminAudit.d.ts +14 -0
- package/dist/storage/adminAudit.d.ts.map +1 -0
- package/dist/storage/adminAudit.js +32 -0
- package/dist/storage/adminAudit.js.map +1 -0
- package/dist/storage/apiKeys.d.ts +28 -5
- package/dist/storage/apiKeys.d.ts.map +1 -1
- package/dist/storage/apiKeys.js +153 -10
- package/dist/storage/apiKeys.js.map +1 -1
- package/dist/storage/db.d.ts +524 -0
- package/dist/storage/db.d.ts.map +1 -1
- package/dist/storage/db.js +184 -8
- package/dist/storage/db.js.map +1 -1
- package/dist/storage/gmailConnectionGrants.d.ts +9 -0
- package/dist/storage/gmailConnectionGrants.d.ts.map +1 -1
- package/dist/storage/gmailConnectionGrants.js +30 -7
- package/dist/storage/gmailConnectionGrants.js.map +1 -1
- package/dist/storage/members.d.ts +7 -4
- package/dist/storage/members.d.ts.map +1 -1
- package/dist/storage/members.js +34 -8
- package/dist/storage/members.js.map +1 -1
- package/dist/storage/restIdempotency.d.ts +28 -0
- package/dist/storage/restIdempotency.d.ts.map +1 -0
- package/dist/storage/restIdempotency.js +47 -0
- package/dist/storage/restIdempotency.js.map +1 -0
- package/dist/telemetry.d.ts +9 -2
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +117 -54
- package/dist/telemetry.js.map +1 -1
- package/package.json +7 -5
package/dist/storage/db.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import Database from 'better-sqlite3';
|
|
2
2
|
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
3
|
-
import { index, integer, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
|
|
3
|
+
import { index, integer, primaryKey, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
|
|
4
4
|
export const members = sqliteTable('members', {
|
|
5
5
|
id: text('id').primaryKey(),
|
|
6
6
|
name: text('name').notNull(),
|
|
7
7
|
email: text('email'),
|
|
8
|
+
role: text('role').notNull().default('member'),
|
|
8
9
|
createdAt: integer('created_at').notNull(),
|
|
9
10
|
}, (table) => [uniqueIndex('members_email_unique').on(table.email)]);
|
|
10
11
|
export const accounts = sqliteTable('accounts', {
|
|
@@ -14,9 +15,18 @@ export const accounts = sqliteTable('accounts', {
|
|
|
14
15
|
displayName: text('display_name'),
|
|
15
16
|
status: text('status').notNull().default('active'),
|
|
16
17
|
createdAt: integer('created_at').notNull(),
|
|
17
|
-
/** Owning member
|
|
18
|
+
/** Owning member. NULL is retained only for migrated installs with no members. */
|
|
18
19
|
memberId: text('member_id').references(() => members.id, { onDelete: 'set null' }),
|
|
20
|
+
sharingMode: text('sharing_mode').notNull().default('private'),
|
|
19
21
|
}, (table) => [uniqueIndex('accounts_provider_email_unique').on(table.provider, table.email)]);
|
|
22
|
+
export const accountMemberShares = sqliteTable('account_member_shares', {
|
|
23
|
+
accountId: text('account_id')
|
|
24
|
+
.notNull()
|
|
25
|
+
.references(() => accounts.id, { onDelete: 'cascade' }),
|
|
26
|
+
memberId: text('member_id')
|
|
27
|
+
.notNull()
|
|
28
|
+
.references(() => members.id, { onDelete: 'cascade' }),
|
|
29
|
+
}, (table) => [primaryKey({ columns: [table.accountId, table.memberId] })]);
|
|
20
30
|
export const oauthTokens = sqliteTable('oauth_tokens', {
|
|
21
31
|
accountId: text('account_id')
|
|
22
32
|
.primaryKey()
|
|
@@ -62,15 +72,36 @@ export const apiKeys = sqliteTable('api_keys', {
|
|
|
62
72
|
keyHash: text('key_hash').notNull().unique(),
|
|
63
73
|
createdAt: integer('created_at').notNull(),
|
|
64
74
|
lastUsedAt: integer('last_used_at'),
|
|
65
|
-
/** Member the key was issued to; NULL
|
|
75
|
+
/** Member the key was issued to; NULL is reserved for migrated system credentials. */
|
|
66
76
|
memberId: text('member_id').references(() => members.id, { onDelete: 'set null' }),
|
|
77
|
+
/** Named MCP permission profile, or "custom" when customCapabilities is populated. */
|
|
78
|
+
permissionProfile: text('permission_profile').notNull().default('full'),
|
|
79
|
+
/** JSON array of explicit MCP capabilities for custom policies. */
|
|
80
|
+
customCapabilities: text('custom_capabilities'),
|
|
81
|
+
/** JSON array of admin capabilities added to a named mail profile. */
|
|
82
|
+
supplementalCapabilities: text('supplemental_capabilities').notNull().default('[]'),
|
|
83
|
+
/** NULL means no extra narrowing; otherwise a JSON array of canonical account ids. */
|
|
84
|
+
accountIds: text('account_ids'),
|
|
67
85
|
});
|
|
86
|
+
export const adminAuditEvents = sqliteTable('admin_audit_events', {
|
|
87
|
+
id: integer('id').primaryKey({ autoIncrement: true }),
|
|
88
|
+
timestamp: integer('timestamp').notNull(),
|
|
89
|
+
operation: text('operation').notNull(),
|
|
90
|
+
outcome: text('outcome').notNull(),
|
|
91
|
+
actorKeyId: text('actor_key_id'),
|
|
92
|
+
actorMemberId: text('actor_member_id'),
|
|
93
|
+
resourceType: text('resource_type'),
|
|
94
|
+
resourceId: text('resource_id'),
|
|
95
|
+
errorCode: text('error_code'),
|
|
96
|
+
}, (table) => [index('admin_audit_events_timestamp').on(table.timestamp)]);
|
|
68
97
|
export const gmailConnectionGrants = sqliteTable('gmail_connection_grants', {
|
|
69
98
|
/** SHA-256 hex digest. The raw token is printed once and never stored. */
|
|
70
99
|
tokenHash: text('token_hash').primaryKey(),
|
|
71
100
|
scope: text('scope').notNull(),
|
|
72
101
|
memberId: text('member_id'),
|
|
73
102
|
reauthorizeAccountId: text('reauthorize_account_id'),
|
|
103
|
+
sharingMode: text('sharing_mode'),
|
|
104
|
+
sharedMemberIds: text('shared_member_ids'),
|
|
74
105
|
createdAt: integer('created_at').notNull(),
|
|
75
106
|
expiresAt: integer('expires_at').notNull(),
|
|
76
107
|
consumedAt: integer('consumed_at'),
|
|
@@ -102,11 +133,25 @@ export const scheduledSends = sqliteTable('scheduled_sends', {
|
|
|
102
133
|
claimToken: text('claim_token'),
|
|
103
134
|
claimUntil: integer('claim_until'),
|
|
104
135
|
}, (table) => [index('scheduled_sends_pending_due').on(table.status, table.sendAt)]);
|
|
136
|
+
export const restIdempotency = sqliteTable('rest_idempotency', {
|
|
137
|
+
principalId: text('principal_id').notNull(),
|
|
138
|
+
idempotencyKey: text('idempotency_key').notNull(),
|
|
139
|
+
requestHash: text('request_hash').notNull(),
|
|
140
|
+
state: text('state').notNull(),
|
|
141
|
+
responseStatus: integer('response_status'),
|
|
142
|
+
responseBody: text('response_body'),
|
|
143
|
+
createdAt: integer('created_at').notNull(),
|
|
144
|
+
expiresAt: integer('expires_at').notNull(),
|
|
145
|
+
}, (table) => [
|
|
146
|
+
primaryKey({ columns: [table.principalId, table.idempotencyKey] }),
|
|
147
|
+
index('rest_idempotency_expires_at').on(table.expiresAt),
|
|
148
|
+
]);
|
|
105
149
|
const BOOTSTRAP_SQL = `
|
|
106
150
|
CREATE TABLE IF NOT EXISTS members (
|
|
107
151
|
id TEXT PRIMARY KEY,
|
|
108
152
|
name TEXT NOT NULL,
|
|
109
153
|
email TEXT,
|
|
154
|
+
role TEXT NOT NULL DEFAULT 'member',
|
|
110
155
|
created_at INTEGER NOT NULL
|
|
111
156
|
);
|
|
112
157
|
CREATE UNIQUE INDEX IF NOT EXISTS members_email_unique ON members(email);
|
|
@@ -117,10 +162,14 @@ CREATE TABLE IF NOT EXISTS accounts (
|
|
|
117
162
|
display_name TEXT,
|
|
118
163
|
status TEXT NOT NULL DEFAULT 'active',
|
|
119
164
|
created_at INTEGER NOT NULL,
|
|
120
|
-
member_id TEXT REFERENCES members(id) ON DELETE SET NULL
|
|
165
|
+
member_id TEXT REFERENCES members(id) ON DELETE SET NULL,
|
|
166
|
+
sharing_mode TEXT NOT NULL DEFAULT 'private'
|
|
167
|
+
);
|
|
168
|
+
CREATE TABLE IF NOT EXISTS account_member_shares (
|
|
169
|
+
account_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
|
|
170
|
+
member_id TEXT NOT NULL REFERENCES members(id) ON DELETE CASCADE,
|
|
171
|
+
PRIMARY KEY (account_id, member_id)
|
|
121
172
|
);
|
|
122
|
-
CREATE UNIQUE INDEX IF NOT EXISTS accounts_provider_email_unique
|
|
123
|
-
ON accounts(provider, email);
|
|
124
173
|
CREATE TABLE IF NOT EXISTS oauth_tokens (
|
|
125
174
|
account_id TEXT PRIMARY KEY REFERENCES accounts(id) ON DELETE CASCADE,
|
|
126
175
|
encrypted_tokens TEXT NOT NULL,
|
|
@@ -160,13 +209,32 @@ CREATE TABLE IF NOT EXISTS api_keys (
|
|
|
160
209
|
key_hash TEXT NOT NULL UNIQUE,
|
|
161
210
|
created_at INTEGER NOT NULL,
|
|
162
211
|
last_used_at INTEGER,
|
|
163
|
-
member_id TEXT REFERENCES members(id) ON DELETE SET NULL
|
|
212
|
+
member_id TEXT REFERENCES members(id) ON DELETE SET NULL,
|
|
213
|
+
permission_profile TEXT NOT NULL DEFAULT 'full',
|
|
214
|
+
custom_capabilities TEXT,
|
|
215
|
+
supplemental_capabilities TEXT NOT NULL DEFAULT '[]',
|
|
216
|
+
account_ids TEXT
|
|
217
|
+
);
|
|
218
|
+
CREATE TABLE IF NOT EXISTS admin_audit_events (
|
|
219
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
220
|
+
timestamp INTEGER NOT NULL,
|
|
221
|
+
operation TEXT NOT NULL,
|
|
222
|
+
outcome TEXT NOT NULL,
|
|
223
|
+
actor_key_id TEXT,
|
|
224
|
+
actor_member_id TEXT,
|
|
225
|
+
resource_type TEXT,
|
|
226
|
+
resource_id TEXT,
|
|
227
|
+
error_code TEXT
|
|
164
228
|
);
|
|
229
|
+
CREATE INDEX IF NOT EXISTS admin_audit_events_timestamp
|
|
230
|
+
ON admin_audit_events(timestamp);
|
|
165
231
|
CREATE TABLE IF NOT EXISTS gmail_connection_grants (
|
|
166
232
|
token_hash TEXT PRIMARY KEY,
|
|
167
233
|
scope TEXT NOT NULL,
|
|
168
234
|
member_id TEXT,
|
|
169
235
|
reauthorize_account_id TEXT,
|
|
236
|
+
sharing_mode TEXT,
|
|
237
|
+
shared_member_ids TEXT,
|
|
170
238
|
created_at INTEGER NOT NULL,
|
|
171
239
|
expires_at INTEGER NOT NULL,
|
|
172
240
|
consumed_at INTEGER
|
|
@@ -196,6 +264,19 @@ CREATE TABLE IF NOT EXISTS scheduled_sends (
|
|
|
196
264
|
);
|
|
197
265
|
CREATE INDEX IF NOT EXISTS scheduled_sends_pending_due
|
|
198
266
|
ON scheduled_sends(status, send_at);
|
|
267
|
+
CREATE TABLE IF NOT EXISTS rest_idempotency (
|
|
268
|
+
principal_id TEXT NOT NULL,
|
|
269
|
+
idempotency_key TEXT NOT NULL,
|
|
270
|
+
request_hash TEXT NOT NULL,
|
|
271
|
+
state TEXT NOT NULL,
|
|
272
|
+
response_status INTEGER,
|
|
273
|
+
response_body TEXT,
|
|
274
|
+
created_at INTEGER NOT NULL,
|
|
275
|
+
expires_at INTEGER NOT NULL,
|
|
276
|
+
PRIMARY KEY (principal_id, idempotency_key)
|
|
277
|
+
);
|
|
278
|
+
CREATE INDEX IF NOT EXISTS rest_idempotency_expires_at
|
|
279
|
+
ON rest_idempotency(expires_at);
|
|
199
280
|
`;
|
|
200
281
|
function tableColumns(sqlite, table) {
|
|
201
282
|
return new Set(sqlite.prepare(`PRAGMA table_info(${table})`).all().map((column) => column.name));
|
|
@@ -220,13 +301,108 @@ export function openDb(dbPath) {
|
|
|
220
301
|
sqlite.exec('ALTER TABLE scheduled_sends ADD COLUMN claim_token TEXT');
|
|
221
302
|
if (!scheduledCols.has('claim_until'))
|
|
222
303
|
sqlite.exec('ALTER TABLE scheduled_sends ADD COLUMN claim_until INTEGER');
|
|
223
|
-
|
|
304
|
+
const memberCols = tableColumns(sqlite, 'members');
|
|
305
|
+
if (!memberCols.has('role')) {
|
|
306
|
+
sqlite.exec("ALTER TABLE members ADD COLUMN role TEXT NOT NULL DEFAULT 'member'");
|
|
307
|
+
// Existing installations gain one administrator: the earliest member.
|
|
308
|
+
sqlite.exec(`
|
|
309
|
+
UPDATE members SET role = 'admin'
|
|
310
|
+
WHERE id = (SELECT id FROM members ORDER BY created_at, id LIMIT 1)
|
|
311
|
+
`);
|
|
312
|
+
}
|
|
224
313
|
if (!tableColumns(sqlite, 'accounts').has('member_id')) {
|
|
225
314
|
sqlite.exec('ALTER TABLE accounts ADD COLUMN member_id TEXT REFERENCES members(id) ON DELETE SET NULL');
|
|
226
315
|
}
|
|
316
|
+
const accountCols = tableColumns(sqlite, 'accounts');
|
|
317
|
+
if (!accountCols.has('sharing_mode')) {
|
|
318
|
+
sqlite.exec('ALTER TABLE accounts ADD COLUMN sharing_mode TEXT');
|
|
319
|
+
sqlite.exec("UPDATE accounts SET sharing_mode = CASE WHEN member_id IS NULL THEN 'all' ELSE 'private' END");
|
|
320
|
+
}
|
|
321
|
+
sqlite.exec(`
|
|
322
|
+
CREATE TABLE IF NOT EXISTS account_member_shares (
|
|
323
|
+
account_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
|
|
324
|
+
member_id TEXT NOT NULL REFERENCES members(id) ON DELETE CASCADE,
|
|
325
|
+
PRIMARY KEY (account_id, member_id)
|
|
326
|
+
)
|
|
327
|
+
`);
|
|
328
|
+
// Migrated ownerless mailboxes remain shared with all, but receive an owner
|
|
329
|
+
// when the installation already has a member.
|
|
330
|
+
sqlite.exec(`
|
|
331
|
+
UPDATE accounts SET member_id = (
|
|
332
|
+
SELECT id FROM members ORDER BY CASE role WHEN 'admin' THEN 0 ELSE 1 END, created_at, id LIMIT 1
|
|
333
|
+
)
|
|
334
|
+
WHERE member_id IS NULL AND sharing_mode = 'all' AND EXISTS (SELECT 1 FROM members)
|
|
335
|
+
`);
|
|
227
336
|
if (!tableColumns(sqlite, 'api_keys').has('member_id')) {
|
|
228
337
|
sqlite.exec('ALTER TABLE api_keys ADD COLUMN member_id TEXT REFERENCES members(id) ON DELETE SET NULL');
|
|
229
338
|
}
|
|
339
|
+
const apiKeyCols = tableColumns(sqlite, 'api_keys');
|
|
340
|
+
if (!apiKeyCols.has('permission_profile')) {
|
|
341
|
+
sqlite.exec("ALTER TABLE api_keys ADD COLUMN permission_profile TEXT NOT NULL DEFAULT 'full'");
|
|
342
|
+
}
|
|
343
|
+
if (!apiKeyCols.has('custom_capabilities')) {
|
|
344
|
+
sqlite.exec('ALTER TABLE api_keys ADD COLUMN custom_capabilities TEXT');
|
|
345
|
+
}
|
|
346
|
+
if (!apiKeyCols.has('supplemental_capabilities')) {
|
|
347
|
+
sqlite.exec("ALTER TABLE api_keys ADD COLUMN supplemental_capabilities TEXT NOT NULL DEFAULT '[]'");
|
|
348
|
+
// Preserve the account-management authority that admin and memberless keys
|
|
349
|
+
// held before administrative capabilities existed. Broader capabilities
|
|
350
|
+
// must still be granted explicitly.
|
|
351
|
+
sqlite.exec(`
|
|
352
|
+
UPDATE api_keys
|
|
353
|
+
SET supplemental_capabilities = '["admin.accounts"]'
|
|
354
|
+
WHERE permission_profile != 'custom'
|
|
355
|
+
AND (
|
|
356
|
+
member_id IS NULL
|
|
357
|
+
OR member_id IN (SELECT id FROM members WHERE role = 'admin')
|
|
358
|
+
)
|
|
359
|
+
`);
|
|
360
|
+
sqlite.exec(`
|
|
361
|
+
UPDATE api_keys
|
|
362
|
+
SET custom_capabilities = json_insert(
|
|
363
|
+
COALESCE(custom_capabilities, '[]'),
|
|
364
|
+
'$[#]', 'admin.accounts'
|
|
365
|
+
)
|
|
366
|
+
WHERE permission_profile = 'custom'
|
|
367
|
+
AND (
|
|
368
|
+
member_id IS NULL
|
|
369
|
+
OR member_id IN (SELECT id FROM members WHERE role = 'admin')
|
|
370
|
+
)
|
|
371
|
+
`);
|
|
372
|
+
}
|
|
373
|
+
if (!apiKeyCols.has('account_ids')) {
|
|
374
|
+
sqlite.exec('ALTER TABLE api_keys ADD COLUMN account_ids TEXT');
|
|
375
|
+
}
|
|
376
|
+
const grantCols = tableColumns(sqlite, 'gmail_connection_grants');
|
|
377
|
+
if (!grantCols.has('sharing_mode')) {
|
|
378
|
+
sqlite.exec('ALTER TABLE gmail_connection_grants ADD COLUMN sharing_mode TEXT');
|
|
379
|
+
}
|
|
380
|
+
if (!grantCols.has('shared_member_ids')) {
|
|
381
|
+
sqlite.exec('ALTER TABLE gmail_connection_grants ADD COLUMN shared_member_ids TEXT');
|
|
382
|
+
}
|
|
383
|
+
// Account identity is the mailbox address, regardless of provider. Gmail
|
|
384
|
+
// wins when an older database contains the same address as both Gmail and IMAP.
|
|
385
|
+
sqlite.exec(`
|
|
386
|
+
DELETE FROM accounts
|
|
387
|
+
WHERE EXISTS (
|
|
388
|
+
SELECT 1 FROM accounts AS winner
|
|
389
|
+
WHERE lower(winner.email) = lower(accounts.email)
|
|
390
|
+
AND (
|
|
391
|
+
CASE winner.provider WHEN 'gmail' THEN 0 ELSE 1 END
|
|
392
|
+
< CASE accounts.provider WHEN 'gmail' THEN 0 ELSE 1 END
|
|
393
|
+
OR (
|
|
394
|
+
CASE winner.provider WHEN 'gmail' THEN 0 ELSE 1 END
|
|
395
|
+
= CASE accounts.provider WHEN 'gmail' THEN 0 ELSE 1 END
|
|
396
|
+
AND (
|
|
397
|
+
winner.created_at < accounts.created_at
|
|
398
|
+
OR (winner.created_at = accounts.created_at AND winner.id < accounts.id)
|
|
399
|
+
)
|
|
400
|
+
)
|
|
401
|
+
)
|
|
402
|
+
)
|
|
403
|
+
`);
|
|
404
|
+
sqlite.exec('DROP INDEX IF EXISTS accounts_provider_email_unique');
|
|
405
|
+
sqlite.exec('CREATE UNIQUE INDEX IF NOT EXISTS accounts_email_unique_ci ON accounts(lower(email))');
|
|
230
406
|
return drizzle(sqlite);
|
|
231
407
|
}
|
|
232
408
|
//# sourceMappingURL=db.js.map
|
package/dist/storage/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { type FluxmailDb } from './db.js';
|
|
2
|
+
import type { AccountSharingMode } from '@fluxmail/core';
|
|
2
3
|
export declare const GMAIL_CONNECTION_GRANT_TTL_MS: number;
|
|
3
4
|
export interface GmailConnectionIntent {
|
|
4
5
|
memberId?: string;
|
|
5
6
|
reauthorizeAccountId?: string;
|
|
7
|
+
sharingMode?: AccountSharingMode;
|
|
8
|
+
sharedMemberIds?: string[];
|
|
6
9
|
}
|
|
7
10
|
export interface GmailConnectionGrant extends GmailConnectionIntent {
|
|
8
11
|
expiresAt: number;
|
|
@@ -20,9 +23,15 @@ export type GmailConnectionClaim = {
|
|
|
20
23
|
export type GmailConnectionGrantStatus = 'available' | 'invalid' | 'expired' | 'used';
|
|
21
24
|
export declare function gmailConnectionTokenHash(token: string): string;
|
|
22
25
|
export declare function inspectGmailConnectionGrant(db: FluxmailDb, token: string, now?: number): GmailConnectionGrantStatus;
|
|
26
|
+
export declare function inspectOutlookConnectionGrant(db: FluxmailDb, token: string, now?: number): GmailConnectionGrantStatus;
|
|
23
27
|
export declare function createGmailConnectionGrant(db: FluxmailDb, intent?: GmailConnectionIntent, now?: number): {
|
|
24
28
|
token: string;
|
|
25
29
|
expiresAt: number;
|
|
26
30
|
};
|
|
31
|
+
export declare function createOutlookConnectionGrant(db: FluxmailDb, intent?: GmailConnectionIntent, now?: number): {
|
|
32
|
+
token: string;
|
|
33
|
+
expiresAt: number;
|
|
34
|
+
};
|
|
27
35
|
export declare function claimGmailConnectionGrant(db: FluxmailDb, token: string, now?: number): GmailConnectionClaim;
|
|
36
|
+
export declare function claimOutlookConnectionGrant(db: FluxmailDb, token: string, now?: number): GmailConnectionClaim;
|
|
28
37
|
//# sourceMappingURL=gmailConnectionGrants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gmailConnectionGrants.d.ts","sourceRoot":"","sources":["../../src/storage/gmailConnectionGrants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"gmailConnectionGrants.d.ts","sourceRoot":"","sources":["../../src/storage/gmailConnectionGrants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,eAAO,MAAM,6BAA6B,QAAiB,CAAC;AAK5D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,GAClD;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,MAAM,MAAM,0BAA0B,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAItF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9D;AAoBD,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,MAAM,EACb,GAAG,SAAa,GACf,0BAA0B,CAE5B;AAED,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,MAAM,EACb,GAAG,SAAa,GACf,0BAA0B,CAE5B;AA+BD,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,UAAU,EACd,MAAM,GAAE,qBAA0B,EAClC,GAAG,SAAa,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAEtC;AAED,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,UAAU,EACd,MAAM,GAAE,qBAA0B,EAClC,GAAG,SAAa,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAEtC;AA8CD,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,oBAAoB,CAE/G;AAED,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,oBAAoB,CAEjH"}
|
|
@@ -3,15 +3,16 @@ import { and, eq, gt, isNull, lt } from 'drizzle-orm';
|
|
|
3
3
|
import { gmailConnectionGrants } from './db.js';
|
|
4
4
|
export const GMAIL_CONNECTION_GRANT_TTL_MS = 10 * 60 * 1000;
|
|
5
5
|
const GMAIL_CONNECTION_SCOPE = 'gmail_connect';
|
|
6
|
+
const OUTLOOK_CONNECTION_SCOPE = 'outlook_connect';
|
|
6
7
|
const RETENTION_MS = 24 * 60 * 60 * 1000;
|
|
7
8
|
export function gmailConnectionTokenHash(token) {
|
|
8
9
|
return createHash('sha256').update(token).digest('hex');
|
|
9
10
|
}
|
|
10
|
-
|
|
11
|
+
function inspectConnectionGrant(db, token, scope, now = Date.now()) {
|
|
11
12
|
const existing = db
|
|
12
13
|
.select()
|
|
13
14
|
.from(gmailConnectionGrants)
|
|
14
|
-
.where(and(eq(gmailConnectionGrants.tokenHash, gmailConnectionTokenHash(token)), eq(gmailConnectionGrants.scope,
|
|
15
|
+
.where(and(eq(gmailConnectionGrants.tokenHash, gmailConnectionTokenHash(token)), eq(gmailConnectionGrants.scope, scope)))
|
|
15
16
|
.get();
|
|
16
17
|
if (!existing)
|
|
17
18
|
return 'invalid';
|
|
@@ -19,7 +20,13 @@ export function inspectGmailConnectionGrant(db, token, now = Date.now()) {
|
|
|
19
20
|
return 'used';
|
|
20
21
|
return existing.expiresAt > now ? 'available' : 'expired';
|
|
21
22
|
}
|
|
22
|
-
export function
|
|
23
|
+
export function inspectGmailConnectionGrant(db, token, now = Date.now()) {
|
|
24
|
+
return inspectConnectionGrant(db, token, GMAIL_CONNECTION_SCOPE, now);
|
|
25
|
+
}
|
|
26
|
+
export function inspectOutlookConnectionGrant(db, token, now = Date.now()) {
|
|
27
|
+
return inspectConnectionGrant(db, token, OUTLOOK_CONNECTION_SCOPE, now);
|
|
28
|
+
}
|
|
29
|
+
function createConnectionGrant(db, scope, intent = {}, now = Date.now()) {
|
|
23
30
|
const token = randomBytes(32).toString('base64url');
|
|
24
31
|
const expiresAt = now + GMAIL_CONNECTION_GRANT_TTL_MS;
|
|
25
32
|
db.delete(gmailConnectionGrants)
|
|
@@ -28,9 +35,11 @@ export function createGmailConnectionGrant(db, intent = {}, now = Date.now()) {
|
|
|
28
35
|
db.insert(gmailConnectionGrants)
|
|
29
36
|
.values({
|
|
30
37
|
tokenHash: gmailConnectionTokenHash(token),
|
|
31
|
-
scope
|
|
38
|
+
scope,
|
|
32
39
|
memberId: intent.memberId ?? null,
|
|
33
40
|
reauthorizeAccountId: intent.reauthorizeAccountId ?? null,
|
|
41
|
+
sharingMode: intent.sharingMode ?? null,
|
|
42
|
+
sharedMemberIds: intent.sharedMemberIds ? JSON.stringify(intent.sharedMemberIds) : null,
|
|
34
43
|
createdAt: now,
|
|
35
44
|
expiresAt,
|
|
36
45
|
consumedAt: null,
|
|
@@ -38,12 +47,18 @@ export function createGmailConnectionGrant(db, intent = {}, now = Date.now()) {
|
|
|
38
47
|
.run();
|
|
39
48
|
return { token, expiresAt };
|
|
40
49
|
}
|
|
41
|
-
export function
|
|
50
|
+
export function createGmailConnectionGrant(db, intent = {}, now = Date.now()) {
|
|
51
|
+
return createConnectionGrant(db, GMAIL_CONNECTION_SCOPE, intent, now);
|
|
52
|
+
}
|
|
53
|
+
export function createOutlookConnectionGrant(db, intent = {}, now = Date.now()) {
|
|
54
|
+
return createConnectionGrant(db, OUTLOOK_CONNECTION_SCOPE, intent, now);
|
|
55
|
+
}
|
|
56
|
+
function claimConnectionGrant(db, token, scope, now = Date.now()) {
|
|
42
57
|
const tokenHash = gmailConnectionTokenHash(token);
|
|
43
58
|
const claimed = db
|
|
44
59
|
.update(gmailConnectionGrants)
|
|
45
60
|
.set({ consumedAt: now })
|
|
46
|
-
.where(and(eq(gmailConnectionGrants.tokenHash, tokenHash), eq(gmailConnectionGrants.scope,
|
|
61
|
+
.where(and(eq(gmailConnectionGrants.tokenHash, tokenHash), eq(gmailConnectionGrants.scope, scope), isNull(gmailConnectionGrants.consumedAt), gt(gmailConnectionGrants.expiresAt, now)))
|
|
47
62
|
.returning()
|
|
48
63
|
.get();
|
|
49
64
|
if (claimed) {
|
|
@@ -53,13 +68,15 @@ export function claimGmailConnectionGrant(db, token, now = Date.now()) {
|
|
|
53
68
|
expiresAt: claimed.expiresAt,
|
|
54
69
|
...(claimed.memberId ? { memberId: claimed.memberId } : {}),
|
|
55
70
|
...(claimed.reauthorizeAccountId ? { reauthorizeAccountId: claimed.reauthorizeAccountId } : {}),
|
|
71
|
+
...(claimed.sharingMode ? { sharingMode: claimed.sharingMode } : {}),
|
|
72
|
+
...(claimed.sharedMemberIds ? { sharedMemberIds: JSON.parse(claimed.sharedMemberIds) } : {}),
|
|
56
73
|
},
|
|
57
74
|
};
|
|
58
75
|
}
|
|
59
76
|
const existing = db
|
|
60
77
|
.select()
|
|
61
78
|
.from(gmailConnectionGrants)
|
|
62
|
-
.where(and(eq(gmailConnectionGrants.tokenHash, tokenHash), eq(gmailConnectionGrants.scope,
|
|
79
|
+
.where(and(eq(gmailConnectionGrants.tokenHash, tokenHash), eq(gmailConnectionGrants.scope, scope)))
|
|
63
80
|
.get();
|
|
64
81
|
if (!existing)
|
|
65
82
|
return { status: 'invalid' };
|
|
@@ -67,4 +84,10 @@ export function claimGmailConnectionGrant(db, token, now = Date.now()) {
|
|
|
67
84
|
return { status: 'used' };
|
|
68
85
|
return { status: 'expired' };
|
|
69
86
|
}
|
|
87
|
+
export function claimGmailConnectionGrant(db, token, now = Date.now()) {
|
|
88
|
+
return claimConnectionGrant(db, token, GMAIL_CONNECTION_SCOPE, now);
|
|
89
|
+
}
|
|
90
|
+
export function claimOutlookConnectionGrant(db, token, now = Date.now()) {
|
|
91
|
+
return claimConnectionGrant(db, token, OUTLOOK_CONNECTION_SCOPE, now);
|
|
92
|
+
}
|
|
70
93
|
//# sourceMappingURL=gmailConnectionGrants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gmailConnectionGrants.js","sourceRoot":"","sources":["../../src/storage/gmailConnectionGrants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAmB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"gmailConnectionGrants.js","sourceRoot":"","sources":["../../src/storage/gmailConnectionGrants.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,27 +3,30 @@ export interface MemberInfo {
|
|
|
3
3
|
id: string;
|
|
4
4
|
name: string;
|
|
5
5
|
email: string | null;
|
|
6
|
+
role: MemberRole;
|
|
6
7
|
createdAt: number;
|
|
7
8
|
/** Mailboxes owned by this member (shared mailboxes are not counted). */
|
|
8
9
|
accountCount: number;
|
|
9
10
|
apiKeyCount: number;
|
|
10
11
|
}
|
|
12
|
+
export type MemberRole = 'admin' | 'member';
|
|
11
13
|
export declare function addMember(db: FluxmailDb, input: {
|
|
12
14
|
name: string;
|
|
13
15
|
email?: string;
|
|
16
|
+
role?: MemberRole;
|
|
14
17
|
}): MemberInfo;
|
|
15
18
|
export declare function getMember(db: FluxmailDb, id: string): MemberInfo;
|
|
16
19
|
/** Resolve a member by id or email, for CLI --member flags. */
|
|
17
20
|
export declare function findMember(db: FluxmailDb, ref: string): MemberInfo;
|
|
18
21
|
export declare function listMembers(db: FluxmailDb): MemberInfo[];
|
|
22
|
+
export declare function setMemberRole(db: FluxmailDb, ref: string, role: MemberRole): MemberInfo;
|
|
19
23
|
/**
|
|
20
|
-
* Delete a member
|
|
21
|
-
*
|
|
22
|
-
*
|
|
24
|
+
* Delete a member after every mailbox they own has been reassigned or removed.
|
|
25
|
+
* Their API keys and selected sharing grants are deleted by the transaction and
|
|
26
|
+
* foreign-key cascades.
|
|
23
27
|
*/
|
|
24
28
|
export declare function removeMember(db: FluxmailDb, id: string): {
|
|
25
29
|
name: string;
|
|
26
|
-
freedAccounts: number;
|
|
27
30
|
revokedApiKeys: number;
|
|
28
31
|
};
|
|
29
32
|
//# sourceMappingURL=members.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../src/storage/members.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"members.d.ts","sourceRoot":"","sources":["../../src/storage/members.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAa5C,wBAAgB,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,GAAG,UAAU,CA8BhH;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,CAIhE;AAED,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAWlE;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,UAAU,GAAG,UAAU,EAAE,CAMxD;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAIvF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAejG"}
|
package/dist/storage/members.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { randomBytes } from 'node:crypto';
|
|
2
|
-
import { eq } from 'drizzle-orm';
|
|
2
|
+
import { eq, sql } from 'drizzle-orm';
|
|
3
3
|
import { EmailError } from '@fluxmail/core';
|
|
4
4
|
import { accounts, apiKeys, members } from './db.js';
|
|
5
5
|
import { assertMemberLimit, getEntitlements } from '../licensing/entitlements.js';
|
|
6
6
|
function toInfo(db, row) {
|
|
7
7
|
return {
|
|
8
8
|
...row,
|
|
9
|
+
role: row.role,
|
|
9
10
|
accountCount: db.select().from(accounts).where(eq(accounts.memberId, row.id)).all().length,
|
|
10
11
|
apiKeyCount: db.select().from(apiKeys).where(eq(apiKeys.memberId, row.id)).all().length,
|
|
11
12
|
};
|
|
@@ -17,14 +18,26 @@ export function addMember(db, input) {
|
|
|
17
18
|
const email = input.email?.trim().toLowerCase();
|
|
18
19
|
const id = `member_${randomBytes(6).toString('hex')}`;
|
|
19
20
|
db.transaction((tx) => {
|
|
20
|
-
if (email &&
|
|
21
|
+
if (email &&
|
|
22
|
+
tx
|
|
23
|
+
.select()
|
|
24
|
+
.from(members)
|
|
25
|
+
.where(sql `lower(${members.email}) = ${email}`)
|
|
26
|
+
.get()) {
|
|
21
27
|
throw new EmailError('invalid_request', `A member with email ${email} already exists`);
|
|
22
28
|
}
|
|
23
29
|
const memberCount = tx.select().from(members).all().length;
|
|
24
30
|
assertMemberLimit(memberCount, getEntitlements(tx));
|
|
31
|
+
const role = input.role ?? (memberCount === 0 ? 'admin' : 'member');
|
|
25
32
|
tx.insert(members)
|
|
26
|
-
.values({ id, name, email: email ?? null, createdAt: Date.now() })
|
|
33
|
+
.values({ id, name, email: email ?? null, role, createdAt: Date.now() })
|
|
27
34
|
.run();
|
|
35
|
+
if (memberCount === 0) {
|
|
36
|
+
tx.update(accounts)
|
|
37
|
+
.set({ memberId: id })
|
|
38
|
+
.where(sql `${accounts.memberId} IS NULL`)
|
|
39
|
+
.run();
|
|
40
|
+
}
|
|
28
41
|
});
|
|
29
42
|
return getMember(db, id);
|
|
30
43
|
}
|
|
@@ -39,7 +52,12 @@ export function findMember(db, ref) {
|
|
|
39
52
|
const byId = db.select().from(members).where(eq(members.id, ref)).get();
|
|
40
53
|
if (byId)
|
|
41
54
|
return toInfo(db, byId);
|
|
42
|
-
const
|
|
55
|
+
const email = ref.trim().toLowerCase();
|
|
56
|
+
const byEmail = db
|
|
57
|
+
.select()
|
|
58
|
+
.from(members)
|
|
59
|
+
.where(sql `lower(${members.email}) = ${email}`)
|
|
60
|
+
.get();
|
|
43
61
|
if (byEmail)
|
|
44
62
|
return toInfo(db, byEmail);
|
|
45
63
|
throw new EmailError('not_found', `No member with id or email "${ref}". Run "fluxmail members list" to see members.`);
|
|
@@ -51,17 +69,25 @@ export function listMembers(db) {
|
|
|
51
69
|
.all()
|
|
52
70
|
.map((row) => toInfo(db, row));
|
|
53
71
|
}
|
|
72
|
+
export function setMemberRole(db, ref, role) {
|
|
73
|
+
const member = findMember(db, ref);
|
|
74
|
+
db.update(members).set({ role }).where(eq(members.id, member.id)).run();
|
|
75
|
+
return getMember(db, member.id);
|
|
76
|
+
}
|
|
54
77
|
/**
|
|
55
|
-
* Delete a member
|
|
56
|
-
*
|
|
57
|
-
*
|
|
78
|
+
* Delete a member after every mailbox they own has been reassigned or removed.
|
|
79
|
+
* Their API keys and selected sharing grants are deleted by the transaction and
|
|
80
|
+
* foreign-key cascades.
|
|
58
81
|
*/
|
|
59
82
|
export function removeMember(db, id) {
|
|
60
83
|
const info = getMember(db, id);
|
|
84
|
+
if (info.accountCount > 0) {
|
|
85
|
+
throw new EmailError('invalid_request', `${info.name} still owns ${info.accountCount} mailbox${info.accountCount === 1 ? '' : 'es'}. Reassign or remove ${info.accountCount === 1 ? 'it' : 'them'} first.`);
|
|
86
|
+
}
|
|
61
87
|
db.transaction((tx) => {
|
|
62
88
|
tx.delete(apiKeys).where(eq(apiKeys.memberId, id)).run();
|
|
63
89
|
tx.delete(members).where(eq(members.id, id)).run();
|
|
64
90
|
});
|
|
65
|
-
return { name: info.name,
|
|
91
|
+
return { name: info.name, revokedApiKeys: info.apiKeyCount };
|
|
66
92
|
}
|
|
67
93
|
//# sourceMappingURL=members.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/storage/members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/storage/members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAmB,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAiBlF,SAAS,MAAM,CAAC,EAAc,EAAE,GAAc;IAC5C,OAAO;QACL,GAAG,GAAG;QACN,IAAI,EAAE,GAAG,CAAC,IAAkB;QAC5B,YAAY,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM;QAC1F,WAAW,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM;KACxF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAc,EAAE,KAA0D;IAClG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,6BAA6B,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,EAAE,GAAG,UAAU,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACtD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE;QACpB,IACE,KAAK;YACL,EAAE;iBACC,MAAM,EAAE;iBACR,IAAI,CAAC,OAAO,CAAC;iBACb,KAAK,CAAC,GAAG,CAAA,SAAS,OAAO,CAAC,KAAK,OAAO,KAAK,EAAE,CAAC;iBAC9C,GAAG,EAAE,EACR,CAAC;YACD,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,uBAAuB,KAAK,iBAAiB,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,WAAW,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;QAC3D,iBAAiB,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACpE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;aACf,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;aACvE,GAAG,EAAE,CAAC;QACT,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;iBAChB,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;iBACrB,KAAK,CAAC,GAAG,CAAA,GAAG,QAAQ,CAAC,QAAQ,UAAU,CAAC;iBACxC,GAAG,EAAE,CAAC;QACX,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAc,EAAE,EAAU;IAClD,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACtE,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,WAAW,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;IACzE,OAAO,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,UAAU,CAAC,EAAc,EAAE,GAAW;IACpD,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACxE,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,EAAE;SACf,MAAM,EAAE;SACR,IAAI,CAAC,OAAO,CAAC;SACb,KAAK,CAAC,GAAG,CAAA,SAAS,OAAO,CAAC,KAAK,OAAO,KAAK,EAAE,CAAC;SAC9C,GAAG,EAAE,CAAC;IACT,IAAI,OAAO;QAAE,OAAO,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,UAAU,CAAC,WAAW,EAAE,+BAA+B,GAAG,gDAAgD,CAAC,CAAC;AACxH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAc;IACxC,OAAO,EAAE;SACN,MAAM,EAAE;SACR,IAAI,CAAC,OAAO,CAAC;SACb,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAc,EAAE,GAAW,EAAE,IAAgB;IACzE,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACnC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACxE,OAAO,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAAc,EAAE,EAAU;IACrD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,CAClB,iBAAiB,EACjB,GAAG,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,YAAY,WAAW,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,wBACxF,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MACnC,SAAS,CACV,CAAC;IACJ,CAAC;IACD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE;QACpB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACzD,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;AAC/D,CAAC"}
|