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:
Executable
+108
@@ -0,0 +1,108 @@
|
||||
#!/usr/bin/env bash
|
||||
# ============================================================
|
||||
# WS6: Проверка /api/internal/grant для biz-brain-* курсов
|
||||
# ============================================================
|
||||
# Использование:
|
||||
# LMS_URL=https://school.second-brain.ru \
|
||||
# LMS_SECRET=<secret_из_env> \
|
||||
# TEST_EMAIL=laukhin@dementiy.com \
|
||||
# bash verify_biz_brain_grant.sh
|
||||
#
|
||||
# Проверяет:
|
||||
# 1. Grant base-курса (biz-brain-base)
|
||||
# 2. Grant premium-бандла (все 5 курсов)
|
||||
# 3. Идемпотентность (повтор того же order_id)
|
||||
# ============================================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
LMS_URL="${LMS_URL:-https://school.second-brain.ru}"
|
||||
LMS_SECRET="${LMS_SECRET:?Задай переменную LMS_SECRET}"
|
||||
TEST_EMAIL="${TEST_EMAIL:-laukhin@dementiy.com}"
|
||||
|
||||
echo "=== WS6: Проверка grant-эндпоинта LMS ==="
|
||||
echo " LMS: $LMS_URL"
|
||||
echo " Email: $TEST_EMAIL"
|
||||
echo ""
|
||||
|
||||
# ── Тест 1: Базовый бандл ────────────────────────────────────────────────────
|
||||
echo "[1] Grant biz-brain-base..."
|
||||
RESPONSE=$(curl -sf -X POST "$LMS_URL/api/internal/grant" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "x-internal-secret: $LMS_SECRET" \
|
||||
-d '{
|
||||
"email": "'"$TEST_EMAIL"'",
|
||||
"name": "WS6 Test",
|
||||
"course_slugs": ["biz-brain-base"],
|
||||
"order_id": "ws6-test-base-001",
|
||||
"payment_system": "robokassa"
|
||||
}')
|
||||
|
||||
echo " Ответ: $RESPONSE"
|
||||
|
||||
GRANTED=$(echo "$RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('granted',''))")
|
||||
if [[ "$GRANTED" == *"biz-brain-base"* ]]; then
|
||||
echo " ✅ biz-brain-base выдан"
|
||||
else
|
||||
IDEMPOTENT=$(echo "$RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('idempotent',''))")
|
||||
if [[ "$IDEMPOTENT" == "True" ]]; then
|
||||
echo " ℹ️ Идемпотентный ответ (уже выдан ранее)"
|
||||
else
|
||||
echo " ❌ ОШИБКА: biz-brain-base не выдан. Ответ: $RESPONSE"
|
||||
echo " Убедись что курс biz-brain-base создан в LMS!"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# ── Тест 2: Премиум-бандл ────────────────────────────────────────────────────
|
||||
echo "[2] Grant biz-brain-premium (5 курсов)..."
|
||||
RESPONSE=$(curl -sf -X POST "$LMS_URL/api/internal/grant" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "x-internal-secret: $LMS_SECRET" \
|
||||
-d '{
|
||||
"email": "'"$TEST_EMAIL"'",
|
||||
"name": "WS6 Test",
|
||||
"course_slugs": ["biz-brain-base", "biz-brain-premium", "module-caldav", "module-ai-pdf", "module-legacy"],
|
||||
"order_id": "ws6-test-premium-001",
|
||||
"payment_system": "robokassa"
|
||||
}')
|
||||
|
||||
echo " Ответ: $RESPONSE"
|
||||
|
||||
UNRESOLVED=$(echo "$RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('unresolved',[]))")
|
||||
if [[ "$UNRESOLVED" == "[]" ]]; then
|
||||
echo " ✅ Все 5 курсов разрешены и выданы"
|
||||
else
|
||||
echo " ⚠️ Не разрешены: $UNRESOLVED"
|
||||
echo " Создай недостающие курсы в LMS (slug'и должны точно совпадать)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# ── Тест 3: Идемпотентность ──────────────────────────────────────────────────
|
||||
echo "[3] Повторный grant того же order_id (должен вернуть idempotent=true)..."
|
||||
RESPONSE=$(curl -sf -X POST "$LMS_URL/api/internal/grant" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "x-internal-secret: $LMS_SECRET" \
|
||||
-d '{
|
||||
"email": "'"$TEST_EMAIL"'",
|
||||
"name": "WS6 Test",
|
||||
"course_slugs": ["biz-brain-base"],
|
||||
"order_id": "ws6-test-base-001",
|
||||
"payment_system": "robokassa"
|
||||
}')
|
||||
|
||||
IDEMPOTENT=$(echo "$RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('idempotent',''))" 2>/dev/null || echo "")
|
||||
if [[ "$IDEMPOTENT" == "True" ]]; then
|
||||
echo " ✅ Идемпотентность работает (повторный вызов вернул idempotent=true)"
|
||||
else
|
||||
echo " ⚠️ Ожидался idempotent=true, получено: $RESPONSE"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== Проверка завершена ==="
|
||||
echo ""
|
||||
echo "Следующий шаг: опубликовать курсы в admin (published=true) после наполнения контентом."
|
||||
echo " school.second-brain.ru/admin/courses"
|
||||
Reference in New Issue
Block a user