Skip to content

Commit 1321739

Browse files
committed
feat: orpc
1 parent 799b7be commit 1321739

File tree

200 files changed

+2375
-7438
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

200 files changed

+2375
-7438
lines changed

apps/api/package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@
2222
"@databuddy/sdk": "^2.2.0",
2323
"@databuddy/shared": "workspace:*",
2424
"@elysiajs/cors": "^1.4.0",
25-
"@elysiajs/trpc": "^1.1.0",
2625
"@logtail/edge": "^0.5.6",
2726
"@openrouter/ai-sdk-provider": "^1.2.0",
28-
"@trpc/server": "^11.7.1",
2927
"@upstash/ratelimit": "^2.0.6",
3028
"@upstash/redis": "^1.35.6",
3129
"ai": "^5.0.81",

apps/api/src/index.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import "./polyfills/compression";
22
import { auth } from "@databuddy/auth";
3-
import { appRouter, createTRPCContext } from "@databuddy/rpc";
3+
import { appRouter, createRPCContext } from "@databuddy/rpc";
44
import cors from "@elysiajs/cors";
5-
import { fetchRequestHandler } from "@trpc/server/adapters/fetch";
5+
import { onError } from "@orpc/server";
6+
import { RPCHandler } from "@orpc/server/fetch";
67
import { autumnHandler } from "autumn-js/elysia";
78
import { Elysia } from "elysia";
89
import { logger } from "./lib/logger";
@@ -13,6 +14,17 @@ import { health } from "./routes/health";
1314
import { publicApi } from "./routes/public";
1415
import { query } from "./routes/query";
1516

17+
const rpcHandler = new RPCHandler(appRouter, {
18+
interceptors: [
19+
onError((error) => {
20+
logger.error({
21+
message: error instanceof Error ? error.message : String(error),
22+
error,
23+
});
24+
}),
25+
],
26+
});
27+
1628
const app = new Elysia()
1729
.use(publicApi)
1830
.use(
@@ -45,17 +57,18 @@ const app = new Elysia()
4557
})
4658
)
4759
.use(query)
48-
// .use(customSQL)
4960
.use(assistant)
5061
.use(exportRoute)
51-
.all("/trpc/*", ({ request }) =>
52-
fetchRequestHandler({
53-
endpoint: "/trpc",
54-
router: appRouter,
55-
req: request,
56-
createContext: () => createTRPCContext({ headers: request.headers }),
57-
})
58-
)
62+
.all("/rpc/*", async ({ request }: { request: Request }) => {
63+
const context = await createRPCContext({ headers: request.headers });
64+
const { response } = await rpcHandler.handle(request, {
65+
prefix: "/rpc",
66+
context,
67+
});
68+
return response ?? new Response("Not Found", { status: 404 });
69+
}, {
70+
parse: "none",
71+
})
5972
.onError(({ error, code }) => {
6073
const errorMessage = error instanceof Error ? error.message : String(error);
6174
logger.error({ message: errorMessage, code, error });

apps/api/src/middleware/rate-limit.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export function createRateLimitMiddleware(options: RateLimitMiddlewareOptions) {
3232
} = options;
3333

3434
return new Elysia().onRequest(async ({ request, set }) => {
35-
if (request.url.includes("/trpc/")) {
35+
if (request.url.includes("/rpc/")) {
3636
return;
3737
}
3838

apps/dashboard/app/(auth)/login/magic/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export default function MagicLinkPage() {
7676
/>
7777
</div>
7878
<div className="flex items-center gap-3 p-3 text-info-foreground text-sm">
79-
<Sparkles className="h-5 w-5 flex-shrink-0 text-foreground" />
79+
<Sparkles className="h-5 w-5 shrink-0 text-foreground" />
8080
<p className="text-muted-foreground">
8181
We'll send a secure link to your email that will sign you in
8282
instantly — no password needed.

apps/dashboard/app/(main)/billing/components/history-tab.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ const InvoiceCard = memo(function InvoiceCardComponent({
7373
<CardContent className="p-4">
7474
<div className="flex items-center justify-between">
7575
<div className="flex min-w-0 flex-1 items-center gap-3">
76-
<div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded border bg-muted">
76+
<div className="flex h-8 w-8 shrink-0 items-center justify-center rounded border bg-muted">
7777
<FileTextIcon
7878
className="not-dark:text-primary text-muted-foreground"
7979
size={16}
@@ -94,7 +94,7 @@ const InvoiceCard = memo(function InvoiceCardComponent({
9494
</div>
9595
</div>
9696

97-
<div className="flex flex-shrink-0 items-center gap-3">
97+
<div className="flex shrink-0 items-center gap-3">
9898
<div className="text-right">
9999
<div className="font-semibold">
100100
{formatAmount(invoice.total, invoice.currency)}
@@ -146,7 +146,7 @@ const SubscriptionHistoryCard = memo(function SubscriptionHistoryCardComponent({
146146
className="flex items-start gap-2 rounded border p-2 text-sm"
147147
key={product.id}
148148
>
149-
<div className="mt-0.5 flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full bg-muted">
149+
<div className="mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-muted">
150150
<CheckIcon
151151
className="not-dark:text-primary text-primary"
152152
size={10}

apps/dashboard/app/(main)/billing/components/overview-tab.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ import { type FeatureUsage, useBillingData } from "../hooks/use-billing";
3030
import { CancelSubscriptionDialog } from "./cancel-subscription-dialog";
3131
import { NoPaymentMethodDialog } from "./no-payment-method-dialog";
3232

33-
interface UsageCardProps {
33+
type UsageCardProps = {
3434
feature: FeatureUsage;
3535
onUpgrade: () => void;
36-
}
36+
};
3737

3838
const UsageCard = memo(function UsageCardComponent({
3939
feature,
@@ -114,7 +114,7 @@ const UsageCard = memo(function UsageCardComponent({
114114
</div>
115115
</div>
116116

117-
<div className="flex-shrink-0 text-right">
117+
<div className="shrink-0 text-right">
118118
{feature.unlimited ? (
119119
<Badge>
120120
<LightningIcon
@@ -170,7 +170,7 @@ const UsageCard = memo(function UsageCardComponent({
170170
);
171171
});
172172

173-
interface PlanStatusCardProps {
173+
type PlanStatusCardProps = {
174174
plan: Product | undefined;
175175
statusDetails: string;
176176
onUpgrade: () => void;
@@ -180,7 +180,7 @@ interface PlanStatusCardProps {
180180
currentPeriodEnd?: number
181181
) => void;
182182
onManageBilling: () => void;
183-
}
183+
};
184184

185185
const PlanStatusCard = memo(function PlanStatusCardComponent({
186186
plan,
@@ -271,7 +271,7 @@ const PlanStatusCard = memo(function PlanStatusCardComponent({
271271
</div>
272272
</div>
273273

274-
<div className="flex-shrink-0 text-right">
274+
<div className="shrink-0 text-right">
275275
<div className="font-bold text-2xl sm:text-3xl">
276276
{isFree
277277
? "Free"
@@ -288,7 +288,7 @@ const PlanStatusCard = memo(function PlanStatusCardComponent({
288288
<div className="space-y-3">
289289
{plan?.items.map((item) => (
290290
<div className="flex items-start gap-3" key={item.feature_id}>
291-
<div className="mt-1 flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full bg-muted">
291+
<div className="mt-1 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-muted">
292292
<CheckIcon
293293
className="font-bold not-dark:text-primary text-foreground"
294294
size={16}
@@ -376,9 +376,9 @@ const PlanStatusCard = memo(function PlanStatusCardComponent({
376376
);
377377
});
378378

379-
interface OverviewTabProps {
379+
type OverviewTabProps = {
380380
onNavigateToPlans: () => void;
381-
}
381+
};
382382

383383
export const OverviewTab = memo(function OverviewTabComponent({
384384
onNavigateToPlans,

apps/dashboard/app/(main)/billing/cost-breakdown/page.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
"use client";
22

33
import { ChartLineUpIcon, FlaskIcon } from "@phosphor-icons/react";
4+
import { useQuery } from "@tanstack/react-query";
45
import { Suspense, useMemo, useState } from "react";
56
import { Badge } from "@/components/ui/badge";
67
import { Skeleton } from "@/components/ui/skeleton";
78
import { useOrganizations } from "@/hooks/use-organizations";
8-
import { trpc } from "@/lib/trpc";
9+
import { orpc } from "@/lib/orpc";
910
import { ConsumptionChart } from "./components/consumption-chart";
1011
import { UsageBreakdownTable } from "./components/usage-breakdown-table";
1112

@@ -31,12 +32,14 @@ export default function CostBreakdownPage() {
3132
[dateRange, activeOrganization?.id]
3233
);
3334

34-
const { data: usageData, isLoading: isLoadingUsage } =
35-
trpc.billing.getUsage.useQuery(usageQueryInput, {
36-
enabled: !isLoadingOrganizations,
37-
});
35+
const { data: usageData, isLoading: isLoadingUsage } = useQuery({
36+
...orpc.billing.getUsage.queryOptions({ input: usageQueryInput }),
37+
enabled: !isLoadingOrganizations,
38+
});
3839

39-
const { data: organizationUsage } = trpc.organizations.getUsage.useQuery();
40+
const { data: organizationUsage } = useQuery({
41+
...orpc.organizations.getUsage.queryOptions(),
42+
});
4043

4144
const isLoading = isLoadingUsage;
4245

@@ -66,7 +69,7 @@ export default function CostBreakdownPage() {
6669

6770
return (
6871
<div className="flex h-full flex-col">
69-
<div className="border-b bg-gradient-to-r from-background to-muted/20 px-6 py-6">
72+
<div className="border-b bg-linear-to-r from-background to-muted/20 px-6 py-6">
7073
<div className="flex items-center gap-4">
7174
<div className="rounded-xl border border-primary/20 bg-primary/10 p-3">
7275
<ChartLineUpIcon className="h-6 w-6 text-primary" />

apps/dashboard/app/(main)/billing/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export default function BillingPage() {
8181

8282
return (
8383
<div className="flex h-full flex-col">
84-
<div className="border-b bg-gradient-to-r from-background via-background to-muted/20">
84+
<div className="border-b bg-linear-to-r from-background via-background to-muted/20">
8585
<div className="flex flex-col justify-between gap-3 p-4 sm:flex-row sm:items-center sm:gap-0 sm:px-6 sm:py-6">
8686
<div className="min-w-0 flex-1">
8787
<div className="flex items-center gap-4">

apps/dashboard/app/(main)/invitations/[id]/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export default function AcceptInvitationPage() {
179179
</div>
180180

181181
<div className="mb-8 space-y-4">
182-
<h3 className="bg-gradient-to-r from-foreground to-foreground/70 bg-clip-text font-bold text-2xl text-transparent">
182+
<h3 className="bg-linear-to-r from-foreground to-foreground/70 bg-clip-text font-bold text-2xl text-transparent">
183183
You're Invited!
184184
</h3>
185185
<p className="max-w-md text-lg text-muted-foreground leading-relaxed">
@@ -298,7 +298,7 @@ export default function AcceptInvitationPage() {
298298
</div>
299299

300300
<div className="mb-8 space-y-4">
301-
<h3 className="bg-gradient-to-r from-green-600 to-green-500 bg-clip-text font-bold text-2xl text-transparent">
301+
<h3 className="bg-linear-to-r from-green-600 to-green-500 bg-clip-text font-bold text-2xl text-transparent">
302302
Welcome Aboard!
303303
</h3>
304304
<p className="text-lg text-muted-foreground leading-relaxed">

apps/dashboard/app/(main)/observability/database/[id]/online-advisor/page.tsx

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import {
2222
import { Skeleton } from "@/components/ui/skeleton";
2323
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
2424
import { useDbConnection } from "@/hooks/use-db-connections";
25-
import { trpc } from "@/lib/trpc";
2625

2726
interface OnlineAdvisorPageProps {
2827
params: Promise<{ id: string }>;
@@ -31,7 +30,7 @@ interface OnlineAdvisorPageProps {
3130
function LoadingState() {
3231
return (
3332
<div className="flex h-full flex-col">
34-
<div className="border-b bg-gradient-to-r from-background to-muted/20 px-6 py-6">
33+
<div className="border-b bg-linear-to-r from-background to-muted/20 px-6 py-6">
3534
<div className="flex items-center gap-4">
3635
<div className="rounded border border-primary/20 bg-primary/10 p-3">
3736
<SparkleIcon className="h-6 w-6 text-primary" weight="duotone" />
@@ -119,7 +118,7 @@ function RecommendationCard({
119118
Click apply to execute this recommendation
120119
</div>
121120
<Button
122-
className="gap-2 bg-gradient-to-r from-primary to-primary/90 hover:from-primary/90 hover:to-primary"
121+
className="gap-2 bg-linear-to-r from-primary to-primary/90 hover:from-primary/90 hover:to-primary"
123122
disabled={isApplying}
124123
onClick={onApply}
125124
size="sm"
@@ -152,31 +151,31 @@ export default function OnlineAdvisorPage({ params }: OnlineAdvisorPageProps) {
152151
const resolvedParams = use(params);
153152
const connectionId = resolvedParams.id;
154153

155-
const utils = trpc.useUtils();
154+
const utils = orpc.useUtils();
156155

157156
const { data: connection } = useDbConnection(connectionId);
158157

159158
const { data: advisorStatus, isLoading: statusLoading } =
160-
trpc.performance.checkOnlineAdvisorStatus.useQuery({ id: connectionId });
159+
orpc.performance.checkOnlineAdvisorStatus.useQuery({ id: connectionId });
161160

162161
const { data: indexRecommendations, isLoading: indexLoading } =
163-
trpc.performance.getIndexRecommendations.useQuery(
162+
orpc.performance.getIndexRecommendations.useQuery(
164163
{ id: connectionId },
165164
{ enabled: advisorStatus?.enabled }
166165
);
167166

168167
const { data: statisticsRecommendations, isLoading: statsLoading } =
169-
trpc.performance.getStatisticsRecommendations.useQuery(
168+
orpc.performance.getStatisticsRecommendations.useQuery(
170169
{ id: connectionId },
171170
{ enabled: advisorStatus?.enabled }
172171
);
173172

174-
const { data: executorStats } = trpc.performance.getExecutorStats.useQuery(
173+
const { data: executorStats } = orpc.performance.getExecutorStats.useQuery(
175174
{ id: connectionId },
176175
{ enabled: advisorStatus?.enabled }
177176
);
178177

179-
const activateMutation = trpc.performance.activateOnlineAdvisor.useMutation({
178+
const activateMutation = orpc.performance.activateOnlineAdvisor.useMutation({
180179
onSuccess: () => {
181180
utils.performance.checkOnlineAdvisorStatus.invalidate({
182181
id: connectionId,
@@ -197,7 +196,7 @@ export default function OnlineAdvisorPage({ params }: OnlineAdvisorPageProps) {
197196
},
198197
});
199198

200-
const installMutation = trpc.dbConnections.installExtension.useMutation({
199+
const installMutation = orpc.dbConnections.installExtension.useMutation({
201200
onSuccess: () => {
202201
utils.performance.checkOnlineAdvisorStatus.invalidate({
203202
id: connectionId,
@@ -213,7 +212,7 @@ export default function OnlineAdvisorPage({ params }: OnlineAdvisorPageProps) {
213212
});
214213

215214
const applyIndexMutation =
216-
trpc.performance.applyIndexRecommendation.useMutation({
215+
orpc.performance.applyIndexRecommendation.useMutation({
217216
onSuccess: (result, variables) => {
218217
if (result.success) {
219218
utils.performance.getIndexRecommendations.invalidate({
@@ -248,7 +247,7 @@ export default function OnlineAdvisorPage({ params }: OnlineAdvisorPageProps) {
248247
});
249248

250249
const applyStatsMutation =
251-
trpc.performance.applyStatisticsRecommendation.useMutation({
250+
orpc.performance.applyStatisticsRecommendation.useMutation({
252251
onSuccess: (result, variables) => {
253252
if (result.success) {
254253
utils.performance.getStatisticsRecommendations.invalidate({
@@ -300,7 +299,7 @@ export default function OnlineAdvisorPage({ params }: OnlineAdvisorPageProps) {
300299

301300
return (
302301
<div className="flex h-full flex-col">
303-
<div className="border-b bg-gradient-to-r from-background to-muted/20 px-6 py-6">
302+
<div className="border-b bg-linear-to-r from-background to-muted/20 px-6 py-6">
304303
<div className="flex items-center gap-4">
305304
<div className="rounded-xl border border-primary/20 bg-primary/10 p-3">
306305
<SparkleIcon className="h-6 w-6 text-primary" weight="duotone" />

0 commit comments

Comments
 (0)