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:
Alexey Pavlov
2026-05-31 10:10:18 +03:00
parent bc2d311e59
commit 116f15bf21
3 changed files with 118 additions and 0 deletions
+18
View File
@@ -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');