From 9586ac2f9cc3c6155ee776a51933126cf624626d Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Wed, 1 Apr 2026 17:52:42 +0200 Subject: [PATCH] feat(server): add user_federation_registry table and federationRegistryUpdatedAt column --- packages/server/src/db/migrate.ts | 23 +++++++++++++++++++++++ packages/server/src/db/schema.ts | 16 ++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/packages/server/src/db/migrate.ts b/packages/server/src/db/migrate.ts index d63bb3af..61c98162 100644 --- a/packages/server/src/db/migrate.ts +++ b/packages/server/src/db/migrate.ts @@ -230,6 +230,12 @@ export function runMigrations(db: Database.Database): void { { name: 'auto_rotate_interval_days', type: 'INTEGER NOT NULL DEFAULT 90' }, ] }, + { + name: 'users', + columns: [ + { name: 'federation_registry_updated_at', type: 'INTEGER DEFAULT 0' }, + ] + }, ]; for (const table of tables) { @@ -398,6 +404,23 @@ export function runMigrations(db: Database.Database): void { ); `); + // ─── User federation registry ─────────────────────────────────────────────── + db.exec(` + CREATE TABLE IF NOT EXISTS user_federation_registry ( + user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, + origin TEXT NOT NULL, + label TEXT NOT NULL DEFAULT '', + username TEXT NOT NULL DEFAULT '', + remote_user_id TEXT NOT NULL DEFAULT '', + status TEXT NOT NULL DEFAULT 'connected', + added_at INTEGER NOT NULL, + last_connected_at INTEGER, + disconnected_at INTEGER, + error_message TEXT, + PRIMARY KEY (user_id, origin) + ); + `); + // ─── Legacy permissions: convert JSON arrays to decimal strings ─────────── migrateLegacyPermissions(db); diff --git a/packages/server/src/db/schema.ts b/packages/server/src/db/schema.ts index 92d1f414..b8e04327 100644 --- a/packages/server/src/db/schema.ts +++ b/packages/server/src/db/schema.ts @@ -21,6 +21,7 @@ export const users = sqliteTable('users', { profileUpdatedAt: integer('profile_updated_at'), passwordChangedAt: integer('password_changed_at'), showActivity: integer('show_activity').notNull().default(1), + federationRegistryUpdatedAt: integer('federation_registry_updated_at').default(0), createdAt: integer('created_at').notNull(), }); @@ -371,3 +372,18 @@ export const federationMutationLog = sqliteTable('federation_mutation_log', { mutatedAt: integer('mutated_at').notNull(), payload: text('payload'), }); + +export const userFederationRegistry = sqliteTable('user_federation_registry', { + userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }), + origin: text('origin').notNull(), + label: text('label').notNull().default(''), + username: text('username').notNull().default(''), + remoteUserId: text('remote_user_id').notNull().default(''), + status: text('status').notNull().default('connected'), + addedAt: integer('added_at').notNull(), + lastConnectedAt: integer('last_connected_at'), + disconnectedAt: integer('disconnected_at'), + errorMessage: text('error_message'), +}, (table) => ({ + pk: primaryKey({ columns: [table.userId, table.origin] }), +}));