From a8cd2cd4d432581457cde6e55f07fb2ba93ae0a4 Mon Sep 17 00:00:00 2001 From: dmitriylaukhin Date: Wed, 17 Jun 2026 14:05:52 +0500 Subject: [PATCH] feat: auto-enroll new signups into free course obsidian-start (freemium) Co-Authored-By: Claude Opus 4.8 (1M context) --- .env.example | 3 +++ src/app/api/register/route.ts | 39 ++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 7a38b11..f54d3c5 100644 --- a/.env.example +++ b/.env.example @@ -21,3 +21,6 @@ KINESCOPE_API_KEY="" # Internal access-provisioning (payment-router → /api/internal/grant) INTERNAL_GRANT_SECRET="" + +# Freemium: slug бесплатного курса, в который авто-записываем новых юзеров при регистрации +FREE_COURSE_SLUG=obsidian-start diff --git a/src/app/api/register/route.ts b/src/app/api/register/route.ts index d6bb361..c03adfd 100644 --- a/src/app/api/register/route.ts +++ b/src/app/api/register/route.ts @@ -76,7 +76,7 @@ export async function POST(request: NextRequest) { process.env.BETTER_AUTH_URL ?? `https://${request.headers.get("host")}`; - return auth.handler( + const response = await auth.handler( new Request(`${baseUrl}/api/auth/sign-up/email`, { method: "POST", headers: new Headers({ @@ -86,4 +86,41 @@ export async function POST(request: NextRequest) { body: JSON.stringify({ name, email, password, callbackURL: "/dashboard" }), }) ); + + // Freemium: при успешной регистрации авто-записываем в бесплатный курс. + // Не валим регистрацию, если enroll не удался. + if (response.ok && email) { + try { + const freeSlug = process.env.FREE_COURSE_SLUG ?? "obsidian-start"; + const [user, course] = await Promise.all([ + prisma.user.findFirst({ + where: { email: { equals: email, mode: "insensitive" } }, + select: { id: true }, + }), + prisma.course.findUnique({ + where: { slug: freeSlug }, + select: { id: true }, + }), + ]); + if (user && course) { + await prisma.courseEnrollment.upsert({ + where: { userId_courseId: { userId: user.id, courseId: course.id } }, + update: {}, + create: { userId: user.id, courseId: course.id }, + }); + await prisma.accessLog.create({ + data: { + courseId: course.id, + userId: user.id, + action: "granted", + method: "free-signup", + }, + }); + } + } catch (e) { + console.error("free-enroll failed", e); + } + } + + return response; }