forked from admin/zeropost-engine
feat: series API — тематические подборки статей
- БД: таблица series (slug, title, intro, icon, color, article_ids JSONB, is_featured, sort_order) - routes/series.js: CRUD серий, GET /:slug возвращает серию вместе со статьями (через JOIN по array_position для сохранения порядка) - Индекс idx_series_slug
This commit is contained in:
@@ -157,6 +157,23 @@ const migrate = async () => {
|
||||
);
|
||||
`);
|
||||
|
||||
// series — тематические серии статей
|
||||
await query(`
|
||||
CREATE TABLE IF NOT EXISTS series (
|
||||
id SERIAL PRIMARY KEY,
|
||||
slug VARCHAR(120) UNIQUE NOT NULL,
|
||||
title VARCHAR(255) NOT NULL,
|
||||
intro TEXT,
|
||||
icon VARCHAR(40),
|
||||
color VARCHAR(20) DEFAULT 'emerald',
|
||||
article_ids JSONB DEFAULT '[]'::jsonb,
|
||||
is_featured BOOLEAN DEFAULT false,
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
`);
|
||||
|
||||
// индексы
|
||||
await query(`
|
||||
CREATE INDEX IF NOT EXISTS idx_channels_user ON channels(user_id);
|
||||
@@ -167,6 +184,7 @@ const migrate = async () => {
|
||||
CREATE INDEX IF NOT EXISTS idx_articles_slug ON articles(slug);
|
||||
CREATE INDEX IF NOT EXISTS idx_articles_status_pub ON articles(status, published_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_notes_pub ON editor_notes(is_published, created_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_series_slug ON series(slug);
|
||||
`);
|
||||
|
||||
console.log('[DB] Migrations applied');
|
||||
|
||||
Reference in New Issue
Block a user