feat(db): add relay_message_id column to friend_requests

Nullable indexed column tracking the entityId of the originating relay
event for federated friend requests. Used by the rollback hook in
federationRollback.ts to locate and delete rows when a federated
friend_request_create is permanently rejected (spec §5).
This commit is contained in:
Jannis Braun
2026-04-25 21:22:25 +02:00
parent 1a9dc547c4
commit e4086fecff
2 changed files with 4 additions and 0 deletions
@@ -0,0 +1,2 @@
ALTER TABLE `friend_requests` ADD `relay_message_id` text;--> statement-breakpoint
CREATE INDEX `idx_friend_requests_relay_message_id` ON `friend_requests` (`relay_message_id`);
+2
View File
@@ -194,9 +194,11 @@ export const friendRequests = sqliteTable('friend_requests', {
toId: text('to_id').notNull().references(() => users.id, { onDelete: 'cascade' }), toId: text('to_id').notNull().references(() => users.id, { onDelete: 'cascade' }),
status: text('status').default('pending'), // 'pending', 'accepted', 'declined' status: text('status').default('pending'), // 'pending', 'accepted', 'declined'
createdAt: integer('created_at').notNull(), createdAt: integer('created_at').notNull(),
relayMessageId: text('relay_message_id'), // entityId of the originating relay event; null for local-only requests. Used by the rollback hook in federationRollback.ts to find rows for deletion when a federated friend_request_create is permanently rejected.
}, (table) => ({ }, (table) => ({
toIdx: index('idx_friend_requests_to_id').on(table.toId), toIdx: index('idx_friend_requests_to_id').on(table.toId),
fromIdx: index('idx_friend_requests_from_id').on(table.fromId), fromIdx: index('idx_friend_requests_from_id').on(table.fromId),
relayMessageIdx: index('idx_friend_requests_relay_message_id').on(table.relayMessageId),
})); }));
export const reactions = sqliteTable('reactions', { export const reactions = sqliteTable('reactions', {