gitextract_7h_8njrb/ ├── .gitignore ├── LICENSE ├── README.md ├── components.json ├── docker-compose.yml ├── drizzle.config.ts ├── eslint.config.mjs ├── next.config.ts ├── package.json ├── postcss.config.mjs ├── src/ │ ├── app/ │ │ ├── (auth)/ │ │ │ ├── layout.tsx │ │ │ ├── sign-in/ │ │ │ │ └── [[...sign-in]]/ │ │ │ │ └── page.tsx │ │ │ └── sign-up/ │ │ │ └── [[...sign-up]]/ │ │ │ └── page.tsx │ │ ├── (consumer)/ │ │ │ ├── courses/ │ │ │ │ ├── [courseId]/ │ │ │ │ │ ├── _client.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ ├── lessons/ │ │ │ │ │ │ └── [lessonId]/ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ ├── page.tsx │ │ │ ├── products/ │ │ │ │ ├── [productId]/ │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── purchase/ │ │ │ │ │ ├── page.tsx │ │ │ │ │ └── success/ │ │ │ │ │ └── page.tsx │ │ │ │ └── purchase-failure/ │ │ │ │ └── page.tsx │ │ │ └── purchases/ │ │ │ ├── [purchaseId]/ │ │ │ │ └── page.tsx │ │ │ └── page.tsx │ │ ├── admin/ │ │ │ ├── courses/ │ │ │ │ ├── [courseId]/ │ │ │ │ │ └── edit/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── new/ │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ ├── page.tsx │ │ │ ├── products/ │ │ │ │ ├── [productId]/ │ │ │ │ │ └── edit/ │ │ │ │ │ └── page.tsx │ │ │ │ ├── new/ │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ └── sales/ │ │ │ └── page.tsx │ │ ├── api/ │ │ │ ├── clerk/ │ │ │ │ └── syncUsers/ │ │ │ │ └── route.ts │ │ │ └── webhooks/ │ │ │ ├── clerk/ │ │ │ │ └── route.ts │ │ │ └── stripe/ │ │ │ └── route.ts │ │ ├── globals.css │ │ └── layout.tsx │ ├── components/ │ │ ├── ActionButton.tsx │ │ ├── LoadingSpinner.tsx │ │ ├── PageHeader.tsx │ │ ├── RequiredLabelIcon.tsx │ │ ├── Skeleton.tsx │ │ ├── SortableList.tsx │ │ └── ui/ │ │ ├── accordion.tsx │ │ ├── alert-dialog.tsx │ │ ├── badge.tsx │ │ ├── button.tsx │ │ ├── card.tsx │ │ ├── command.tsx │ │ ├── custom/ │ │ │ └── multi-select.tsx │ │ ├── dialog.tsx │ │ ├── form.tsx │ │ ├── input.tsx │ │ ├── label.tsx │ │ ├── popover.tsx │ │ ├── select.tsx │ │ ├── table.tsx │ │ ├── tabs.tsx │ │ ├── textarea.tsx │ │ ├── toast.tsx │ │ └── toaster.tsx │ ├── data/ │ │ ├── env/ │ │ │ ├── client.ts │ │ │ └── server.ts │ │ ├── pppCoupons.ts │ │ └── typeOverrides/ │ │ └── clerk.d.ts │ ├── drizzle/ │ │ ├── db.ts │ │ ├── migrations/ │ │ │ ├── 0000_orange_wind_dancer.sql │ │ │ └── meta/ │ │ │ ├── 0000_snapshot.json │ │ │ └── _journal.json │ │ ├── schema/ │ │ │ ├── course.ts │ │ │ ├── courseProduct.ts │ │ │ ├── courseSection.ts │ │ │ ├── lesson.ts │ │ │ ├── product.ts │ │ │ ├── purchase.ts │ │ │ ├── user.ts │ │ │ ├── userCourseAccess.ts │ │ │ └── userLessonComplete.ts │ │ ├── schema.ts │ │ └── schemaHelpers.ts │ ├── features/ │ │ ├── courseSections/ │ │ │ ├── actions/ │ │ │ │ └── sections.ts │ │ │ ├── components/ │ │ │ │ ├── SectionForm.tsx │ │ │ │ ├── SectionFormDialog.tsx │ │ │ │ └── SortableSectionList.tsx │ │ │ ├── db/ │ │ │ │ ├── cache.ts │ │ │ │ └── sections.ts │ │ │ ├── permissions/ │ │ │ │ └── sections.ts │ │ │ └── schemas/ │ │ │ └── sections.ts │ │ ├── courses/ │ │ │ ├── actions/ │ │ │ │ └── courses.ts │ │ │ ├── components/ │ │ │ │ ├── CourseForm.tsx │ │ │ │ └── CourseTable.tsx │ │ │ ├── db/ │ │ │ │ ├── cache/ │ │ │ │ │ ├── courses.ts │ │ │ │ │ └── userCourseAccess.ts │ │ │ │ ├── courses.ts │ │ │ │ └── userCourseAcccess.ts │ │ │ ├── permissions/ │ │ │ │ └── courses.ts │ │ │ └── schemas/ │ │ │ └── courses.ts │ │ ├── lessons/ │ │ │ ├── actions/ │ │ │ │ ├── lessons.ts │ │ │ │ └── userLessonComplete.ts │ │ │ ├── components/ │ │ │ │ ├── LessonForm.tsx │ │ │ │ ├── LessonFormDialog.tsx │ │ │ │ ├── SortableLessonList.tsx │ │ │ │ └── YouTubeVideoPlayer.tsx │ │ │ ├── db/ │ │ │ │ ├── cache/ │ │ │ │ │ ├── lessons.ts │ │ │ │ │ └── userLessonComplete.ts │ │ │ │ ├── lessons.ts │ │ │ │ └── userLessonComplete.ts │ │ │ ├── permissions/ │ │ │ │ ├── lessons.ts │ │ │ │ └── userLessonComplete.ts │ │ │ └── schemas/ │ │ │ └── lessons.ts │ │ ├── products/ │ │ │ ├── actions/ │ │ │ │ └── products.ts │ │ │ ├── components/ │ │ │ │ ├── ProductCard.tsx │ │ │ │ ├── ProductForm.tsx │ │ │ │ └── ProductTable.tsx │ │ │ ├── db/ │ │ │ │ ├── cache.ts │ │ │ │ └── products.ts │ │ │ ├── permissions/ │ │ │ │ └── products.ts │ │ │ └── schema/ │ │ │ └── products.ts │ │ ├── purchases/ │ │ │ ├── actions/ │ │ │ │ └── purchases.ts │ │ │ ├── components/ │ │ │ │ ├── PurchaseTable.tsx │ │ │ │ └── UserPurchaseTable.tsx │ │ │ ├── db/ │ │ │ │ ├── cache.ts │ │ │ │ └── purchases.ts │ │ │ └── permissions/ │ │ │ └── products.ts │ │ └── users/ │ │ └── db/ │ │ ├── cache.ts │ │ └── users.ts │ ├── hooks/ │ │ └── use-toast.ts │ ├── lib/ │ │ ├── dataCache.ts │ │ ├── formatters.ts │ │ ├── sumArray.ts │ │ ├── userCountryHeader.ts │ │ └── utils.ts │ ├── middleware.ts │ ├── permissions/ │ │ └── general.ts │ └── services/ │ ├── clerk.ts │ └── stripe/ │ ├── actions/ │ │ └── stripe.ts │ ├── components/ │ │ └── StripeCheckoutForm.tsx │ ├── stripeClient.ts │ └── stripeServer.ts ├── tailwind.config.ts └── tsconfig.json