feat: add embeds database table with schema and migration
This commit is contained in:
@@ -232,6 +232,30 @@ export function runMigrations(db: Database.Database): void {
|
|||||||
);
|
);
|
||||||
`);
|
`);
|
||||||
|
|
||||||
|
// Ensure embeds table exists (idempotent)
|
||||||
|
db.exec(`
|
||||||
|
CREATE TABLE IF NOT EXISTS embeds (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
message_id TEXT REFERENCES messages(id) ON DELETE CASCADE,
|
||||||
|
dm_message_id TEXT REFERENCES dm_messages(id) ON DELETE CASCADE,
|
||||||
|
url TEXT NOT NULL,
|
||||||
|
embed_type TEXT NOT NULL CHECK (embed_type IN ('generic', 'video', 'image', 'audio', 'rich')),
|
||||||
|
provider TEXT,
|
||||||
|
title TEXT,
|
||||||
|
description TEXT,
|
||||||
|
image TEXT,
|
||||||
|
embed_url TEXT,
|
||||||
|
width INTEGER,
|
||||||
|
height INTEGER,
|
||||||
|
color TEXT,
|
||||||
|
created_at INTEGER NOT NULL,
|
||||||
|
CHECK (
|
||||||
|
(message_id IS NOT NULL AND dm_message_id IS NULL) OR
|
||||||
|
(message_id IS NULL AND dm_message_id IS NOT NULL)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
`);
|
||||||
|
|
||||||
// ─── Legacy permissions: convert JSON arrays to decimal strings ───────────
|
// ─── Legacy permissions: convert JSON arrays to decimal strings ───────────
|
||||||
migrateLegacyPermissions(db);
|
migrateLegacyPermissions(db);
|
||||||
|
|
||||||
@@ -323,6 +347,10 @@ export function runMigrations(db: Database.Database): void {
|
|||||||
// ─── Add indexes on FK columns for query performance ─────────────────────
|
// ─── Add indexes on FK columns for query performance ─────────────────────
|
||||||
migrateAddIndexes(db);
|
migrateAddIndexes(db);
|
||||||
|
|
||||||
|
// ─── Embed indexes (outside fast-path guard so they run on existing DBs) ──
|
||||||
|
db.exec('CREATE INDEX IF NOT EXISTS idx_embeds_message_id ON embeds(message_id)');
|
||||||
|
db.exec('CREATE INDEX IF NOT EXISTS idx_embeds_dm_message_id ON embeds(dm_message_id)');
|
||||||
|
|
||||||
// ─── Clean up stale attachment records for profile images ───────────────
|
// ─── Clean up stale attachment records for profile images ───────────────
|
||||||
migrateCleanupProfileAttachmentRecords(db);
|
migrateCleanupProfileAttachmentRecords(db);
|
||||||
|
|
||||||
@@ -436,6 +464,10 @@ function migrateAddIndexes(db: Database.Database): void {
|
|||||||
|
|
||||||
// Categories
|
// Categories
|
||||||
'CREATE INDEX IF NOT EXISTS idx_channel_categories_space_id ON channel_categories(space_id)',
|
'CREATE INDEX IF NOT EXISTS idx_channel_categories_space_id ON channel_categories(space_id)',
|
||||||
|
|
||||||
|
// Embeds
|
||||||
|
'CREATE INDEX IF NOT EXISTS idx_embeds_message_id ON embeds(message_id)',
|
||||||
|
'CREATE INDEX IF NOT EXISTS idx_embeds_dm_message_id ON embeds(dm_message_id)',
|
||||||
];
|
];
|
||||||
|
|
||||||
db.exec(indexes.join(';\n'));
|
db.exec(indexes.join(';\n'));
|
||||||
|
|||||||
@@ -92,6 +92,23 @@ export const attachments = sqliteTable('attachments', {
|
|||||||
createdAt: integer('created_at').notNull(),
|
createdAt: integer('created_at').notNull(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const embeds = sqliteTable('embeds', {
|
||||||
|
id: text('id').primaryKey(),
|
||||||
|
messageId: text('message_id').references(() => messages.id, { onDelete: 'cascade' }),
|
||||||
|
dmMessageId: text('dm_message_id').references(() => dmMessages.id, { onDelete: 'cascade' }),
|
||||||
|
url: text('url').notNull(),
|
||||||
|
embedType: text('embed_type').notNull(),
|
||||||
|
provider: text('provider'),
|
||||||
|
title: text('title'),
|
||||||
|
description: text('description'),
|
||||||
|
image: text('image'),
|
||||||
|
embedUrl: text('embed_url'),
|
||||||
|
width: integer('width'),
|
||||||
|
height: integer('height'),
|
||||||
|
color: text('color'),
|
||||||
|
createdAt: integer('created_at').notNull(),
|
||||||
|
});
|
||||||
|
|
||||||
export const dmChannels = sqliteTable('dm_channels', {
|
export const dmChannels = sqliteTable('dm_channels', {
|
||||||
id: text('id').primaryKey(),
|
id: text('id').primaryKey(),
|
||||||
ownerId: text('owner_id'),
|
ownerId: text('owner_id'),
|
||||||
|
|||||||
Reference in New Issue
Block a user