Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .env.development
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,6 @@ CONFIG_PATH=${PWD}/config.json # Path to the sourcebot config file (if one exist
# Redis
REDIS_URL="redis://localhost:6379"

# Stripe
# STRIPE_SECRET_KEY: z.string().optional(),
# STRIPE_PRODUCT_ID: z.string().optional(),
# STRIPE_WEBHOOK_SECRET: z.string().optional(),
# STRIPE_ENABLE_TEST_CLOCKS=false

# Agents

# GITHUB_APP_ID=
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Removed
- [EE] Removed Stripe billing integration, including subscription management, billing UI, and related database schema [#1069](https://github.com/sourcebot-dev/sourcebot/pull/1069)

## [4.16.4] - 2026-04-01

### Added
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
Warnings:
- You are about to drop the column `stripeCustomerId` on the `Org` table. All the data in the column will be lost.
- You are about to drop the column `stripeLastUpdatedAt` on the `Org` table. All the data in the column will be lost.
- You are about to drop the column `stripeSubscriptionStatus` on the `Org` table. All the data in the column will be lost.
*/
-- AlterTable
ALTER TABLE "Org" DROP COLUMN "stripeCustomerId",
DROP COLUMN "stripeLastUpdatedAt",
DROP COLUMN "stripeSubscriptionStatus";

-- DropEnum
DROP TYPE "StripeSubscriptionStatus";
9 changes: 0 additions & 9 deletions packages/db/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,6 @@ enum ConnectionSyncStatus {
FAILED
}

enum StripeSubscriptionStatus {
ACTIVE
INACTIVE
}

enum ChatVisibility {
PRIVATE
PUBLIC
Expand Down Expand Up @@ -283,10 +278,6 @@ model Org {

memberApprovalRequired Boolean @default(true)

stripeCustomerId String?
stripeSubscriptionStatus StripeSubscriptionStatus?
stripeLastUpdatedAt DateTime?

/// List of pending invites to this organization
invites Invite[]

Expand Down
1 change: 0 additions & 1 deletion packages/shared/src/entitlements.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ export type Plan = keyof typeof planLabels;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const entitlements = [
"search-contexts",
"billing",
"anonymous-access",
"multi-tenancy",
"sso",
Expand Down
6 changes: 0 additions & 6 deletions packages/shared/src/env.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,12 +163,6 @@ const options = {
SMTP_PASSWORD: z.string().optional(),
EMAIL_FROM_ADDRESS: z.string().email().optional(),

// Stripe
STRIPE_SECRET_KEY: z.string().optional(),
STRIPE_PRODUCT_ID: z.string().optional(),
STRIPE_WEBHOOK_SECRET: z.string().optional(),
STRIPE_ENABLE_TEST_CLOCKS: booleanSchema.default('false'),

LOGTAIL_TOKEN: z.string().optional(),
LOGTAIL_HOST: z.string().url().optional(),

Expand Down
4 changes: 0 additions & 4 deletions packages/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
"openapi:generate": "tsx tools/generateOpenApi.ts",
"generate:protos": "proto-loader-gen-types --includeComments --longs=Number --enums=String --defaults --oneofs --grpcLib=@grpc/grpc-js --keepCase --includeDirs=../../vendor/zoekt/grpc/protos --outDir=src/proto zoekt/webserver/v1/webserver.proto zoekt/webserver/v1/query.proto",
"dev:emails": "email dev --dir ./src/emails",
"stripe:listen": "stripe listen --forward-to http://localhost:3000/api/stripe",
"tool:decrypt-jwe": "tsx tools/decryptJWE.ts"
},
"dependencies": {
Expand Down Expand Up @@ -102,8 +101,6 @@
"@sourcebot/schemas": "workspace:*",
"@sourcebot/shared": "workspace:*",
"@ssddanbrown/codemirror-lang-twig": "^1.0.0",
"@stripe/react-stripe-js": "^3.1.1",
"@stripe/stripe-js": "^5.6.0",
"@tailwindcss/typography": "^0.5.16",
"@tanstack/react-query": "^5.53.3",
"@tanstack/react-table": "^8.20.5",
Expand Down Expand Up @@ -187,7 +184,6 @@
"slate-history": "^0.113.1",
"slate-react": "^0.117.1",
"strip-json-comments": "^5.0.1",
"stripe": "^17.6.0",
"tailwind-merge": "^2.5.2",
"tailwindcss-animate": "^1.0.7",
"use-stick-to-bottom": "^1.1.3",
Expand Down
3 changes: 0 additions & 3 deletions packages/web/src/__mocks__/prisma.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ export const MOCK_ORG: Org = {
imageUrl: null,
metadata: null,
memberApprovalRequired: false,
stripeCustomerId: null,
stripeSubscriptionStatus: null,
stripeLastUpdatedAt: null,
inviteLinkEnabled: false,
inviteLinkId: null
}
Expand Down
33 changes: 6 additions & 27 deletions packages/web/src/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { prisma } from "@/prisma";
import { render } from "@react-email/components";
import * as Sentry from '@sentry/nextjs';
import { generateApiKey, getTokenFromConfig, hashSecret } from "@sourcebot/shared";
import { ApiKey, ConnectionSyncJobStatus, Org, OrgRole, Prisma, RepoIndexingJobStatus, RepoIndexingJobType, StripeSubscriptionStatus } from "@sourcebot/db";
import { ApiKey, ConnectionSyncJobStatus, Org, OrgRole, Prisma, RepoIndexingJobStatus, RepoIndexingJobType } from "@sourcebot/db";
import { createLogger } from "@sourcebot/shared";
import { GiteaConnectionConfig } from "@sourcebot/schemas/v3/gitea.type";
import { GithubConnectionConfig } from "@sourcebot/schemas/v3/github.type";
Expand All @@ -22,8 +22,6 @@ import { createTransport } from "nodemailer";
import { Octokit } from "octokit";
import { auth } from "./auth";
import { getOrgFromDomain } from "./data/org";
import { getSubscriptionForOrg } from "./ee/features/billing/serverUtils";
import { IS_BILLING_ENABLED } from "./ee/features/billing/stripe";
import InviteUserEmail from "./emails/inviteUserEmail";
import JoinRequestApprovedEmail from "./emails/joinRequestApprovedEmail";
import JoinRequestSubmittedEmail from "./emails/joinRequestSubmittedEmail";
Expand Down Expand Up @@ -188,31 +186,12 @@ export const withTenancyModeEnforcement = async<T>(mode: TenancyMode, fn: () =>
export const completeOnboarding = async (domain: string): Promise<{ success: boolean } | ServiceError> => sew(() =>
withAuth((userId) =>
withOrgMembership(userId, domain, async ({ org }) => {
// If billing is not enabled, we can just mark the org as onboarded.
if (!IS_BILLING_ENABLED) {
await prisma.org.update({
where: { id: org.id },
data: {
isOnboarded: true,
}
});

// Else, validate that the org has an active subscription.
} else {
const subscriptionOrError = await getSubscriptionForOrg(org.id, prisma);
if (isServiceError(subscriptionOrError)) {
return subscriptionOrError;
await prisma.org.update({
where: { id: org.id },
data: {
isOnboarded: true,
}

await prisma.org.update({
where: { id: org.id },
data: {
isOnboarded: true,
stripeSubscriptionStatus: StripeSubscriptionStatus.ACTIVE,
stripeLastUpdatedAt: new Date(),
}
});
}
});

return {
success: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import { auth } from "@/auth";
import { Button } from "@/components/ui/button";
import { NavigationMenu as NavigationMenuBase } from "@/components/ui/navigation-menu";
import { Separator } from "@/components/ui/separator";
import { getSubscriptionInfo } from "@/ee/features/billing/actions";
import { IS_BILLING_ENABLED } from "@/ee/features/billing/stripe";
import { env } from "@sourcebot/shared";
import { ServiceErrorException } from "@/lib/serviceError";
import { isServiceError } from "@/lib/utils";
Expand All @@ -16,7 +14,6 @@ import { MeControlDropdownMenu } from "../meControlDropdownMenu";
import WhatsNewIndicator from "../whatsNewIndicator";
import { NavigationItems } from "./navigationItems";
import { ProgressIndicator } from "./progressIndicator";
import { TrialIndicator } from "./trialIndicator";
import { redirect } from "next/navigation";
import { AppearanceDropdownMenu } from "../appearanceDropdownMenu";

Expand All @@ -28,7 +25,6 @@ interface NavigationMenuProps {
export const NavigationMenu = async ({
domain,
}: NavigationMenuProps) => {
const subscription = IS_BILLING_ENABLED ? await getSubscriptionInfo(domain) : null;
const session = await auth();
const isAuthenticated = session?.user !== undefined;

Expand Down Expand Up @@ -134,7 +130,6 @@ export const NavigationMenu = async ({
numberOfReposWithFirstTimeIndexingJobsInProgress={numberOfReposWithFirstTimeIndexingJobsInProgress}
sampleRepos={sampleRepos}
/>
<TrialIndicator subscription={subscription} />
<WhatsNewIndicator />
{session ? (
<MeControlDropdownMenu
Expand Down

This file was deleted.

31 changes: 0 additions & 31 deletions packages/web/src/app/[domain]/components/upgradeGuard.tsx

This file was deleted.

20 changes: 0 additions & 20 deletions packages/web/src/app/[domain]/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,13 @@ import { auth } from "@/auth";
import { getOrgFromDomain } from "@/data/org";
import { isServiceError } from "@/lib/utils";
import { OnboardGuard } from "./components/onboardGuard";
import { UpgradeGuard } from "./components/upgradeGuard";
import { cookies, headers } from "next/headers";
import { getSelectorsByUserAgent } from "react-device-detect";
import { MobileUnsupportedSplashScreen } from "./components/mobileUnsupportedSplashScreen";
import { MOBILE_UNSUPPORTED_SPLASH_SCREEN_DISMISSED_COOKIE_NAME, OPTIONAL_PROVIDERS_LINK_SKIPPED_COOKIE_NAME } from "@/lib/constants";
import { SyntaxReferenceGuide } from "./components/syntaxReferenceGuide";
import { SyntaxGuideProvider } from "./components/syntaxGuideProvider";
import { IS_BILLING_ENABLED } from "@/ee/features/billing/stripe";
import { notFound, redirect } from "next/navigation";
import { getSubscriptionInfo } from "@/ee/features/billing/actions";
import { PendingApprovalCard } from "./components/pendingApproval";
import { SubmitJoinRequest } from "./components/submitJoinRequest";
import { hasEntitlement } from "@sourcebot/shared";
Expand Down Expand Up @@ -152,23 +149,6 @@ export default async function Layout(props: LayoutProps) {
}
}

if (IS_BILLING_ENABLED) {
const subscription = await getSubscriptionInfo(domain);
if (
subscription &&
(
isServiceError(subscription) ||
(subscription.status !== "active" && subscription.status !== "trialing")
)
) {
return (
<UpgradeGuard>
{children}
</UpgradeGuard>
)
}
}

const headersList = await headers();
const cookieStore = await cookies()
const userAgent = headersList.get('user-agent');
Expand Down
Loading
Loading