Update UI and migrations, fix dockerfile

This commit is contained in:
Your Name
2026-07-18 21:29:05 +05:00
parent 580c75cbf6
commit 26ef145ccf
95 changed files with 9541 additions and 111 deletions
@@ -0,0 +1,46 @@
CREATE TABLE IF NOT EXISTS schema_migrations (
version TEXT PRIMARY KEY,
applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS articles (
id BIGSERIAL PRIMARY KEY,
external_id TEXT NOT NULL UNIQUE,
slug TEXT NOT NULL UNIQUE,
title TEXT NOT NULL,
lead TEXT NOT NULL DEFAULT '',
body TEXT NOT NULL,
category_name TEXT NOT NULL,
category_tag TEXT NOT NULL,
producer_name TEXT NOT NULL,
producer_tag TEXT NOT NULL,
source_url TEXT,
seo_title TEXT NOT NULL DEFAULT '',
seo_description TEXT NOT NULL DEFAULT '',
status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'published')),
published_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_articles_feed
ON articles(status, published_at DESC, id DESC);
CREATE INDEX IF NOT EXISTS idx_articles_category
ON articles(category_tag, status, published_at DESC);
CREATE INDEX IF NOT EXISTS idx_articles_producer
ON articles(producer_tag, status, published_at DESC);
CREATE TABLE IF NOT EXISTS article_media (
id BIGSERIAL PRIMARY KEY,
article_id BIGINT NOT NULL REFERENCES articles(id) ON DELETE CASCADE,
media_type TEXT NOT NULL CHECK (media_type IN ('image', 'video')),
url TEXT NOT NULL,
alt_text TEXT NOT NULL DEFAULT '',
width INTEGER,
height INTEGER,
sort_order INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_article_media_order
ON article_media(article_id, sort_order, id);
@@ -0,0 +1,35 @@
CREATE TABLE IF NOT EXISTS categories (
tag TEXT PRIMARY KEY,
name TEXT NOT NULL,
sort_order INTEGER NOT NULL DEFAULT 100,
is_active BOOLEAN NOT NULL DEFAULT TRUE
);
INSERT INTO categories(tag, name, sort_order) VALUES
('odezhda', 'Одежда', 1),
('snaryazhenie', 'Снаряжение', 2),
('bronya', 'Броня', 3),
('aksessuary', 'Аксессуары', 4),
('svyaz', 'Связь', 5),
('patchi', 'Патчи', 6),
('navigaciya', 'Навигация', 7),
('pricely', 'Прицелы', 8),
('nochnye-pribory', 'Ночные приборы', 9),
('medicina', 'Медицина', 10),
('svet', 'Свет', 11),
('elektronika', 'Электроника', 12),
('nozhi', 'Ножи и мультитулы', 13),
('oruzheynyy-obves', 'Оружейный обвес', 14),
('praktika', 'Практика', 15),
('teoriya', 'Теория', 16),
('pushki', 'Оружие', 17)
ON CONFLICT(tag) DO UPDATE SET
name=EXCLUDED.name,
sort_order=EXCLUDED.sort_order;
UPDATE articles a
SET category_name=c.name,
updated_at=NOW()
FROM categories c
WHERE a.category_tag=c.tag
AND a.category_name<>c.name;