Skip to content

Commit 24063af

Browse files
committed
update engine API routes to include team slug (#6407)
blocked by: https://app.graphite.dev/github/pr/thirdweb-dev/api-server/1437/add-team-engine-management-endpoints <!-- start pr-codex --> --- ## PR-Codex overview This PR focuses on updating the handling of `teamIdOrSlug` across various components and utility functions related to engine instances and alerts, ensuring that the correct team context is maintained throughout the application. ### Detailed summary - Added `teamIdOrSlug` parameter to multiple functions and components. - Updated API endpoints to include `teamIdOrSlug` in fetch calls. - Modified components like `EngineAlertsPage`, `EngineSystem`, and `EngineInstancesTable` to pass `teamIdOrSlug`. - Adjusted data structure handling in API responses to use `result` instead of `data`. > ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}` <!-- end pr-codex -->
1 parent e2c9d4d commit 24063af

File tree

16 files changed

+116
-44
lines changed

16 files changed

+116
-44
lines changed

apps/dashboard/src/@3rdweb-sdk/react/hooks/useEngine.ts

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -232,13 +232,15 @@ export function useEngineUpdateDeployment() {
232232

233233
export type RemoveEngineFromDashboardIParams = {
234234
instanceId: string;
235+
teamIdOrSlug: string;
235236
};
236237

237238
export async function removeEngineFromDashboard({
238239
instanceId,
240+
teamIdOrSlug,
239241
}: RemoveEngineFromDashboardIParams) {
240242
const res = await apiServerProxy({
241-
pathname: `/v1/engine/${instanceId}`,
243+
pathname: `/v1/teams/${teamIdOrSlug}/engine/${instanceId}`,
242244
method: "DELETE",
243245
});
244246

@@ -273,18 +275,20 @@ export async function deleteCloudHostedEngine({
273275
}
274276

275277
export type EditEngineInstanceParams = {
278+
teamIdOrSlug: string;
276279
instanceId: string;
277280
name: string;
278281
url: string;
279282
};
280283

281284
export async function editEngineInstance({
285+
teamIdOrSlug,
282286
instanceId,
283287
name,
284288
url,
285289
}: EditEngineInstanceParams) {
286290
const res = await apiServerProxy({
287-
pathname: `/v1/engine/${instanceId}`,
291+
pathname: `/v1/teams/${teamIdOrSlug}/engine/${instanceId}`,
288292
method: "PUT",
289293
headers: {
290294
"Content-Type": "application/json",
@@ -1628,7 +1632,7 @@ export function useEngineSubscriptionsLastBlock(params: {
16281632

16291633
interface EngineResourceMetrics {
16301634
error: string;
1631-
data: {
1635+
result: {
16321636
cpu: number;
16331637
memory: number;
16341638
errorRate: ResultItem[];
@@ -1637,15 +1641,15 @@ interface EngineResourceMetrics {
16371641
};
16381642
}
16391643

1640-
export function useEngineSystemMetrics(engineId: string) {
1644+
export function useEngineSystemMetrics(engineId: string, teamIdOrSlug: string) {
16411645
const [enabled, setEnabled] = useState(true);
16421646

16431647
return useQuery({
16441648
queryKey: engineKeys.systemMetrics(engineId),
16451649
queryFn: async () => {
16461650
const res = await apiServerProxy({
16471651
method: "GET",
1648-
pathname: `/v1/engine/${engineId}/metrics`,
1652+
pathname: `/v1/teams/${teamIdOrSlug}/engine/${engineId}/metrics`,
16491653
});
16501654

16511655
if (!res.ok) {
@@ -1674,14 +1678,14 @@ export interface EngineAlertRule {
16741678
pausedAt: Date | null;
16751679
}
16761680

1677-
export function useEngineAlertRules(engineId: string) {
1681+
export function useEngineAlertRules(engineId: string, teamIdOrSlug: string) {
16781682
return useQuery({
16791683
queryKey: engineKeys.alertRules(engineId),
16801684
queryFn: async () => {
16811685
const res = await apiServerProxy<{
16821686
data: EngineAlertRule[];
16831687
}>({
1684-
pathname: `/v1/engine/${engineId}/alert-rules`,
1688+
pathname: `/v1/teams/${teamIdOrSlug}/engine/${engineId}/alert-rules`,
16851689
method: "GET",
16861690
});
16871691

@@ -1703,14 +1707,19 @@ export interface EngineAlert {
17031707
endsAt: Date | null;
17041708
}
17051709

1706-
export function useEngineAlerts(engineId: string, limit: number, offset = 0) {
1710+
export function useEngineAlerts(
1711+
engineId: string,
1712+
teamIdOrSlug: string,
1713+
limit: number,
1714+
offset = 0,
1715+
) {
17071716
return useQuery({
17081717
queryKey: engineKeys.alerts(engineId),
17091718
queryFn: async () => {
17101719
const res = await apiServerProxy<{
17111720
data: EngineAlert[];
17121721
}>({
1713-
pathname: `/v1/engine/${engineId}/alerts`,
1722+
pathname: `/v1/teams/${teamIdOrSlug}/engine/${engineId}/alerts`,
17141723
searchParams: {
17151724
limit: `${limit}`,
17161725
offset: `${offset}`,
@@ -1754,14 +1763,17 @@ export type EngineNotificationChannel = {
17541763
subscriptionRoutes: string[];
17551764
};
17561765

1757-
export function useEngineNotificationChannels(engineId: string) {
1766+
export function useEngineNotificationChannels(
1767+
engineId: string,
1768+
teamIdOrSlug: string,
1769+
) {
17581770
return useQuery({
17591771
queryKey: engineKeys.notificationChannels(engineId),
17601772
queryFn: async () => {
17611773
const res = await apiServerProxy<{
17621774
data: EngineNotificationChannel[];
17631775
}>({
1764-
pathname: `/v1/engine/${engineId}/notification-channels`,
1776+
pathname: `/v1/teams/${teamIdOrSlug}/engine/${engineId}/notification-channels`,
17651777
method: "GET",
17661778
});
17671779

@@ -1781,15 +1793,18 @@ export interface CreateNotificationChannelInput {
17811793
value: string;
17821794
}
17831795

1784-
export function useEngineCreateNotificationChannel(engineId: string) {
1796+
export function useEngineCreateNotificationChannel(
1797+
engineId: string,
1798+
teamIdOrSlug: string,
1799+
) {
17851800
const queryClient = useQueryClient();
17861801

17871802
return useMutation({
17881803
mutationFn: async (input: CreateNotificationChannelInput) => {
17891804
const res = await apiServerProxy<{
17901805
data: EngineNotificationChannel;
17911806
}>({
1792-
pathname: `/v1/engine/${engineId}/notification-channels`,
1807+
pathname: `/v1/teams/${teamIdOrSlug}/engine/${engineId}/notification-channels`,
17931808
method: "POST",
17941809
headers: {
17951810
"Content-Type": "application/json",
@@ -1812,13 +1827,16 @@ export function useEngineCreateNotificationChannel(engineId: string) {
18121827
});
18131828
}
18141829

1815-
export function useEngineDeleteNotificationChannel(engineId: string) {
1830+
export function useEngineDeleteNotificationChannel(
1831+
engineId: string,
1832+
teamIdOrSlug: string,
1833+
) {
18161834
const queryClient = useQueryClient();
18171835

18181836
return useMutation({
18191837
mutationFn: async (notificationChannelId: string) => {
18201838
const res = await apiServerProxy({
1821-
pathname: `/v1/engine/${engineId}/notification-channels/${notificationChannelId}`,
1839+
pathname: `/v1/teams/${teamIdOrSlug}/engine/${engineId}/notification-channels/${notificationChannelId}`,
18221840
method: "DELETE",
18231841
});
18241842

apps/dashboard/src/app/team/[team_slug]/(team)/~/engine/(general)/import/EngineImportPage.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,15 @@ const formSchema = z.object({
2828

2929
type ImportEngineParams = z.infer<typeof formSchema>;
3030

31-
async function importEngine(data: ImportEngineParams) {
31+
async function importEngine({
32+
teamIdOrSlug,
33+
...data
34+
}: ImportEngineParams & { teamIdOrSlug: string }) {
3235
// Instance URLs should end with a /.
3336
const url = data.url.endsWith("/") ? data.url : `${data.url}/`;
3437

3538
const res = await apiServerProxy({
36-
pathname: "/v1/engine",
39+
pathname: `/v1/teams/${teamIdOrSlug}/engine`,
3740
method: "POST",
3841
headers: {
3942
"Content-Type": "application/json",
@@ -59,7 +62,7 @@ export function EngineImportCard(props: {
5962
<EngineImportCardUI
6063
prefillImportUrl={props.prefillImportUrl}
6164
importEngine={async (params) => {
62-
await importEngine(params);
65+
await importEngine({ ...params, teamIdOrSlug: props.teamSlug });
6366
router.push(`/team/${props.teamSlug}/~/engine`);
6467
}}
6568
/>

apps/dashboard/src/app/team/[team_slug]/(team)/~/engine/(general)/overview/engine-instances-table.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,15 @@ type RemovedEngineFromDashboard = (
7474
) => Promise<void>;
7575

7676
export function EngineInstancesTable(props: {
77+
teamIdOrSlug: string;
7778
instances: EngineInstance[];
7879
engineLinkPrefix: string;
7980
}) {
8081
const router = useDashboardRouter();
8182

8283
return (
8384
<EngineInstancesTableUI
85+
teamIdOrSlug={props.teamIdOrSlug}
8486
instances={props.instances}
8587
engineLinkPrefix={props.engineLinkPrefix}
8688
deleteCloudHostedEngine={async (params) => {
@@ -100,6 +102,7 @@ export function EngineInstancesTable(props: {
100102
}
101103

102104
export function EngineInstancesTableUI(props: {
105+
teamIdOrSlug: string;
103106
instances: EngineInstance[];
104107
engineLinkPrefix: string;
105108
deleteCloudHostedEngine: DeletedCloudHostedEngine;
@@ -124,6 +127,7 @@ export function EngineInstancesTableUI(props: {
124127
{props.instances.map((instance) => (
125128
<EngineInstanceRow
126129
key={instance.id}
130+
teamIdOrSlug={props.teamIdOrSlug}
127131
instance={instance}
128132
engineLinkPrefix={props.engineLinkPrefix}
129133
deleteCloudHostedEngine={props.deleteCloudHostedEngine}
@@ -145,6 +149,7 @@ export function EngineInstancesTableUI(props: {
145149
}
146150

147151
function EngineInstanceRow(props: {
152+
teamIdOrSlug: string;
148153
instance: EngineInstance;
149154
engineLinkPrefix: string;
150155
deleteCloudHostedEngine: DeletedCloudHostedEngine;
@@ -187,13 +192,15 @@ function EngineInstanceRow(props: {
187192
</TableRow>
188193

189194
<EditModal
195+
teamIdOrSlug={props.teamIdOrSlug}
190196
instance={instance}
191197
open={isEditModalOpen}
192198
onOpenChange={setIsEditModalOpen}
193199
editEngineInstance={props.editEngineInstance}
194200
/>
195201

196202
<RemoveModal
203+
teamIdOrSlug={props.teamIdOrSlug}
197204
instance={instance}
198205
onOpenChange={setIsRemoveModalOpen}
199206
open={isRemoveModalOpen}
@@ -349,6 +356,7 @@ function EngineActionsDropdown(props: {
349356

350357
function EditModal(props: {
351358
open: boolean;
359+
teamIdOrSlug: string;
352360
onOpenChange: (open: boolean) => void;
353361
instance: EngineInstance;
354362
editEngineInstance: EditedEngineInstance;
@@ -357,6 +365,7 @@ function EditModal(props: {
357365
<Dialog open={props.open} onOpenChange={props.onOpenChange}>
358366
<DialogContent className="overflow-hidden p-0">
359367
<EditModalContent
368+
teamIdOrSlug={props.teamIdOrSlug}
360369
instance={props.instance}
361370
editEngineInstance={props.editEngineInstance}
362371
closeModal={() => props.onOpenChange(false)}
@@ -372,6 +381,7 @@ const editEngineFormSchema = z.object({
372381
});
373382

374383
function EditModalContent(props: {
384+
teamIdOrSlug: string;
375385
instance: EngineInstance;
376386
editEngineInstance: EditedEngineInstance;
377387
closeModal: () => void;
@@ -396,6 +406,7 @@ function EditModalContent(props: {
396406
onSubmit={form.handleSubmit((data) =>
397407
editInstance.mutate(
398408
{
409+
teamIdOrSlug: props.teamIdOrSlug,
399410
instanceId: props.instance.id,
400411
name: data.name,
401412
url: data.url,
@@ -475,6 +486,7 @@ function EditModalContent(props: {
475486
}
476487

477488
function RemoveModal(props: {
489+
teamIdOrSlug: string;
478490
instance: EngineInstance;
479491
open: boolean;
480492
onOpenChange: (open: boolean) => void;
@@ -491,6 +503,7 @@ function RemoveModal(props: {
491503
(instance.status === "active" && !instance.deploymentId) ? (
492504
<RemoveEngineFromDashboardModalContent
493505
instance={instance}
506+
teamIdOrSlug={props.teamIdOrSlug}
494507
close={() => onOpenChange(false)}
495508
removeEngineFromDashboard={props.removeEngineFromDashboard}
496509
/>
@@ -507,6 +520,7 @@ function RemoveModal(props: {
507520
}
508521

509522
function RemoveEngineFromDashboardModalContent(props: {
523+
teamIdOrSlug: string;
510524
instance: EngineInstance;
511525
close: () => void;
512526
removeEngineFromDashboard: RemovedEngineFromDashboard;
@@ -552,6 +566,7 @@ function RemoveEngineFromDashboardModalContent(props: {
552566
removeFromDashboard.mutate(
553567
{
554568
instanceId: instance.id,
569+
teamIdOrSlug: props.teamIdOrSlug,
555570
},
556571
{
557572
onSuccess: () => {

apps/dashboard/src/app/team/[team_slug]/(team)/~/engine/(general)/overview/engine-list.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const EngineInstancesList = (props: {
1212
return (
1313
<div className="flex grow flex-col">
1414
<EngineInstancesTable
15+
teamIdOrSlug={props.team_slug}
1516
instances={props.instances}
1617
engineLinkPrefix={engineLinkPrefix}
1718
/>

apps/dashboard/src/app/team/[team_slug]/(team)/~/engine/(general)/page.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ export default async function Page(props: {
2929
loginRedirect(`/team/${params.team_slug}/~/engine`);
3030
}
3131

32-
const res = await getEngineInstances({ authToken });
32+
const res = await getEngineInstances({
33+
authToken,
34+
teamIdOrSlug: params.team_slug,
35+
});
3336

3437
return (
3538
<EngineInstancesList

apps/dashboard/src/app/team/[team_slug]/(team)/~/engine/(instance)/[engineId]/alerts/components/EngineAlertsPage.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ import { RecentEngineAlertsSection } from "./RecentEngineAlerts";
99

1010
export function EngineAlertsPage(props: {
1111
instance: EngineInstance;
12+
teamIdOrSlug: string;
1213
}) {
13-
const alertRulesQuery = useEngineAlertRules(props.instance.id);
14+
const alertRulesQuery = useEngineAlertRules(
15+
props.instance.id,
16+
props.teamIdOrSlug,
17+
);
1418
const alertRules = alertRulesQuery.data ?? [];
1519

1620
return (
@@ -19,12 +23,14 @@ export function EngineAlertsPage(props: {
1923
alertRules={alertRules}
2024
engineId={props.instance.id}
2125
alertRulesIsLoading={alertRulesQuery.isLoading}
26+
teamIdOrSlug={props.teamIdOrSlug}
2227
/>
2328
<div className="h-8" />
2429
<RecentEngineAlertsSection
2530
alertRules={alertRules}
2631
engineId={props.instance.id}
2732
alertRulesIsLoading={alertRulesQuery.isLoading}
33+
teamIdOrSlug={props.teamIdOrSlug}
2834
/>
2935
</div>
3036
);

apps/dashboard/src/app/team/[team_slug]/(team)/~/engine/(instance)/[engineId]/alerts/components/ManageEngineAlerts.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,23 @@ type CreateAlertMutation = UseMutationResult<
4343
>;
4444

4545
export function ManageEngineAlertsSection(props: {
46+
teamIdOrSlug: string;
4647
alertRules: EngineAlertRule[];
4748
alertRulesIsLoading: boolean;
4849
engineId: string;
4950
}) {
5051
const notificationChannelsQuery = useEngineNotificationChannels(
5152
props.engineId,
53+
props.teamIdOrSlug,
5254
);
5355
const deleteAlertMutation = useEngineDeleteNotificationChannel(
5456
props.engineId,
57+
props.teamIdOrSlug,
5558
);
5659

5760
const createAlertMutation = useEngineCreateNotificationChannel(
5861
props.engineId,
62+
props.teamIdOrSlug,
5963
);
6064

6165
// not passing the mutation to avoid multiple rows sharing the same mutation state, we create the new mutation for each row instead in each component instead

0 commit comments

Comments
 (0)