181 lines · 7.9 KB
import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireViewer, viewerMiddleware } from "./middleware";
import { forbidden } from "~/server/errors";
import { limitWrite, limitAccountWrite } from "~/server/limits";
import { billingAccountFor, requireSiteAdmin, topUsage } from "~/server/metering/access";
import { plans, setPlan, setSpendingLimit } from "~/server/metering/quota";
import { MAX_SPENDING_LIMIT_CENTS } from "~/lib/plans";
import { periodOf } from "~/server/metering/record";
import { usageSummary } from "~/server/metering/summary";
import { creditLedger } from "~/server/metering/credits";
import { setCustomDomainsGrant } from "~/server/billing/domain-addon";
import { BYOK_PROVIDERS, endpointSummary } from "~/server/ai/endpoint";
import { PRO_PRICE_CENTS, creditPoolFor } from "~/lib/pricing";
import { meterDef } from "~/lib/meters";
import type { MeterId } from "~/lib/meters";
import { rateLabel } from "~/lib/pricing-display";
import { accountDisableState, disabledNotice } from "~/server/account-disable";
import {
  createDomainAddonCheckout,
  createPortalSession,
  createSubscriptionCheckout,
  createTopupCheckout,
  followBillingPlan,
  stripeBillingView,
} from "~/server/billing/checkout";

const period = z
  .string()
  .regex(/^\d{4}-(0[1-9]|1[0-2])$/)
  .optional();
const org = z.string().min(1).max(100).nullable();

export const getBilling = createServerFn({ method: "GET" })
  .middleware([viewerMiddleware])
  .validator(z.object({ org, period }))
  .handler(async ({ data, context }) => {
    const viewer = requireViewer(context.viewer);
    const account = await billingAccountFor(viewer, data.org);
    if (!account.canView) throw forbidden("Only owners can view billing for this organization");