feat(ws6): SQL-скрипт создания курсов-носителей biz-brain + verify-скрипт

- scripts/create_biz_brain_courses.sql: идемпотентное создание 5 курсов
  (biz-brain-base, biz-brain-premium, module-caldav, module-ai-pdf, module-legacy)
- scripts/verify_biz_brain_grant.sh: проверка /api/internal/grant (Нужен Дмитрий для запуска на проде)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-27 19:27:22 +05:00
parent 39e2102a18
commit 47e301a5b8
2 changed files with 236 additions and 0 deletions
+128
View File
@@ -0,0 +1,128 @@
-- ============================================================
-- WS6: Создание курсов-носителей «Второй мозг для бизнеса»
-- ============================================================
-- ВАЖНО: Выполнять НА ПРОДЕ только после проверки на staging.
-- Запускать через SSH: psql <db_url> -f create_biz_brain_courses.sql
-- Идемпотентно: INSERT IGNORE по slug (уникальный ключ).
--
-- Курсы-носители (5 штук):
-- biz-brain-base — основной курс (ZIP хранилища + видео-онбординг)
-- biz-brain-premium — премиум-раздел (консультации, инструкции по расширениям)
-- module-caldav — расширение CalDAV-календарь
-- module-ai-pdf — расширение AI-разбор PDF
-- module-legacy — расширение Legacy-миграция
-- ============================================================
BEGIN;
-- Функция для генерации cuid-подобного ID (через gen_random_uuid как fallback)
-- В реальности Prisma генерирует cuid автоматически — используем это свойство.
-- Если у вас Postgres 14+: gen_random_uuid() дает UUID, но Prisma ожидает cuid.
-- Безопаснее создать через Prisma API или LMS-Admin.
-- Проверяем что slug ещё не существует перед вставкой
DO $$
BEGIN
-- biz-brain-base
IF NOT EXISTS (SELECT 1 FROM "Course" WHERE slug = 'biz-brain-base') THEN
INSERT INTO "Course" (id, slug, title, description, published, "allowAudio", "order", "createdAt", "updatedAt")
VALUES (
'clbizbrainbase0000001',
'biz-brain-base',
'Второй мозг для бизнеса — Базовый',
'Готовое хранилище Obsidian для собственника: CRM-воронка, финансовый кокпит, журнал решений, витрина команды. Разовый платёж, бессрочный доступ.',
false, -- опубликовать вручную после наполнения контентом
false,
100,
NOW(),
NOW()
);
RAISE NOTICE 'Создан курс biz-brain-base';
ELSE
RAISE NOTICE 'Курс biz-brain-base уже существует — пропуск';
END IF;
-- biz-brain-premium
IF NOT EXISTS (SELECT 1 FROM "Course" WHERE slug = 'biz-brain-premium') THEN
INSERT INTO "Course" (id, slug, title, description, published, "allowAudio", "order", "createdAt", "updatedAt")
VALUES (
'clbizbrainprem0000002',
'biz-brain-premium',
'Второй мозг для бизнеса — Премиум (инструкции и консультации)',
'Раздел для премиум-покупателей: инструкции по установке расширений, запись на 2 персональные консультации, ответы на частые вопросы.',
false,
false,
101,
NOW(),
NOW()
);
RAISE NOTICE 'Создан курс biz-brain-premium';
ELSE
RAISE NOTICE 'Курс biz-brain-premium уже существует — пропуск';
END IF;
-- module-caldav
IF NOT EXISTS (SELECT 1 FROM "Course" WHERE slug = 'module-caldav') THEN
INSERT INTO "Course" (id, slug, title, description, published, "allowAudio", "order", "createdAt", "updatedAt")
VALUES (
'clmodulecaldav00000003',
'module-caldav',
'Расширение: CalDAV-календарь',
'Двусторонняя синхронизация задач и событий Obsidian с Google Calendar / Apple Calendar через CalDAV. Плагин Full Calendar Remastered v0.13.2.',
false,
false,
200,
NOW(),
NOW()
);
RAISE NOTICE 'Создан курс module-caldav';
ELSE
RAISE NOTICE 'Курс module-caldav уже существует — пропуск';
END IF;
-- module-ai-pdf
IF NOT EXISTS (SELECT 1 FROM "Course" WHERE slug = 'module-ai-pdf') THEN
INSERT INTO "Course" (id, slug, title, description, published, "allowAudio", "order", "createdAt", "updatedAt")
VALUES (
'clmoduleaipdf000000004',
'module-ai-pdf',
'Расширение: AI-разбор PDF и исследований',
'Промпты А1/А2/А3 для структурированного разбора PDF-документов, статей и исследований с помощью AI. Включает эталонный прогон и демо-PDF.',
false,
false,
201,
NOW(),
NOW()
);
RAISE NOTICE 'Создан курс module-ai-pdf';
ELSE
RAISE NOTICE 'Курс module-ai-pdf уже существует — пропуск';
END IF;
-- module-legacy
IF NOT EXISTS (SELECT 1 FROM "Course" WHERE slug = 'module-legacy') THEN
INSERT INTO "Course" (id, slug, title, description, published, "allowAudio", "order", "createdAt", "updatedAt")
VALUES (
'clmodulelegacy00000005',
'module-legacy',
'Расширение: Legacy-миграция из Evernote / Notion',
'Пошаговые инструкции и чеклист пост-обработки для переноса данных из Evernote и Notion в хранилище «Второй мозг для бизнеса».',
false,
false,
202,
NOW(),
NOW()
);
RAISE NOTICE 'Создан курс module-legacy';
ELSE
RAISE NOTICE 'Курс module-legacy уже существует — пропуск';
END IF;
END
$$;
COMMIT;
-- Проверка результата
SELECT slug, title, published, "order" FROM "Course"
WHERE slug IN ('biz-brain-base', 'biz-brain-premium', 'module-caldav', 'module-ai-pdf', 'module-legacy')
ORDER BY "order";