feat(categories): CRUD endpoints + is_active for archiving

Endpoints under /api/admin/categories:
  GET    — list all with metrics (article_count, topic_count, autogen status)
  POST   — create + auto-create autogen_settings row (defaults: enabled, 1/day, 12:00 MSK)
  PATCH  — update name/desc/icon/color/sort_order/is_active (slug is immutable FK)
  DELETE — soft (is_active=false) by default; ?force=true tries hard delete
           but refuses if any articles/topics still reference the slug

Migration: ALTER TABLE categories ADD COLUMN IF NOT EXISTS is_active BOOLEAN DEFAULT true
Public GET /api/categories now filters WHERE COALESCE(is_active,true)=true.
This commit is contained in:
Aleksei Pavlov
2026-06-19 11:55:04 +03:00
parent 2f7af84ddc
commit 59e604a67b
4 changed files with 176 additions and 1 deletions
+2
View File
@@ -11,6 +11,7 @@ const statsRoutes = require('./src/routes/stats');
const notesRoutes = require('./src/routes/notes');
const seriesRoutes = require('./src/routes/series');
const categoriesRoutes = require('./src/routes/categories');
const categoriesAdminRoutes = require('./src/routes/categoriesAdmin');
const autogenRoutes = require('./src/routes/autogen');
const draftsRoutes = require('./src/routes/drafts');
const userPostsRoutes = require('./src/routes/userPosts');
@@ -131,6 +132,7 @@ app.use('/api', require('./src/routes/drafts'));
// Заметки Зеро — админская часть (за internal-secret middleware)
app.use('/api/admin/zero', require('./src/routes/zeroAdmin'));
app.use('/api/admin/categories', categoriesAdminRoutes);
app.get('/health', (req, res) => {
res.json({ ok: true, service: 'zeropost-engine', time: new Date() });