feat: add category_overrides table schema and migration
This commit is contained in:
@@ -368,6 +368,9 @@ export function runMigrations(db: Database.Database): void {
|
|||||||
// ─── Clean up stale attachment records for profile images ───────────────
|
// ─── Clean up stale attachment records for profile images ───────────────
|
||||||
migrateCleanupProfileAttachmentRecords(db);
|
migrateCleanupProfileAttachmentRecords(db);
|
||||||
|
|
||||||
|
// ─── Add category_overrides table ────────────────────────────────────────
|
||||||
|
migrateCategoryOverrides(db);
|
||||||
|
|
||||||
console.log('Migrations complete.');
|
console.log('Migrations complete.');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1003,6 +1006,26 @@ function migrateCleanupProfileAttachmentRecords(db: Database.Database): void {
|
|||||||
db.prepare('UPDATE instance_settings SET profile_attachments_cleaned = 1 WHERE id = 1').run();
|
db.prepare('UPDATE instance_settings SET profile_attachments_cleaned = 1 WHERE id = 1').run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function migrateCategoryOverrides(db: Database.Database): void {
|
||||||
|
const exists = db.prepare(
|
||||||
|
"SELECT name FROM sqlite_master WHERE type='table' AND name='category_overrides'"
|
||||||
|
).get();
|
||||||
|
if (exists) return;
|
||||||
|
|
||||||
|
console.log('Migrating: Adding category_overrides table...');
|
||||||
|
db.exec(`
|
||||||
|
CREATE TABLE IF NOT EXISTS category_overrides (
|
||||||
|
category_id TEXT NOT NULL REFERENCES channel_categories(id) ON DELETE CASCADE,
|
||||||
|
target_type TEXT NOT NULL,
|
||||||
|
target_id TEXT NOT NULL,
|
||||||
|
allow TEXT NOT NULL DEFAULT '0',
|
||||||
|
deny TEXT NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (category_id, target_type, target_id)
|
||||||
|
);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_category_overrides_category_id ON category_overrides(category_id);
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Async backfill: generate thumbnails for all existing image attachments that
|
* Async backfill: generate thumbnails for all existing image attachments that
|
||||||
* don't have one yet. Runs once after server startup, gated by a persistent
|
* don't have one yet. Runs once after server startup, gated by a persistent
|
||||||
|
|||||||
@@ -202,6 +202,16 @@ export const channelOverrides = sqliteTable('channel_overrides', {
|
|||||||
pk: primaryKey({ columns: [table.channelId, table.targetType, table.targetId] }),
|
pk: primaryKey({ columns: [table.channelId, table.targetType, table.targetId] }),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
export const categoryOverrides = sqliteTable('category_overrides', {
|
||||||
|
categoryId: text('category_id').notNull().references(() => channelCategories.id, { onDelete: 'cascade' }),
|
||||||
|
targetType: text('target_type').notNull(),
|
||||||
|
targetId: text('target_id').notNull(),
|
||||||
|
allow: text('allow').notNull().default('0'),
|
||||||
|
deny: text('deny').notNull().default('0'),
|
||||||
|
}, (table) => ({
|
||||||
|
pk: primaryKey({ columns: [table.categoryId, table.targetType, table.targetId] }),
|
||||||
|
}));
|
||||||
|
|
||||||
export const readStates = sqliteTable('read_states', {
|
export const readStates = sqliteTable('read_states', {
|
||||||
userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),
|
userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),
|
||||||
channelId: text('channel_id').notNull(),
|
channelId: text('channel_id').notNull(),
|
||||||
|
|||||||
Reference in New Issue
Block a user