Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
26 changes: 13 additions & 13 deletions src/app/(dashboard)/(rest)/connectors/assets/page.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import {
AssetsContainer,
AssetsError,
AssetsList,
AssetsLoading,
} from "@/features/assets/components/assets";
import { assetsParamsLoader } from "@/features/assets/server/params-loader";
import { prefetchAssets } from "@/features/assets/server/prefetch";
AssetConnectorList,
AssetConnectorsContainer,
ConnectorsError,
ConnectorsLoading,
} from "@/features/api-key-connectors/components/connectors";
import { connectorsParamsLoader } from "@/features/api-key-connectors/server/params-loader";
import { prefetchAssetConnectors } from "@/features/api-key-connectors/server/prefetch";
import { createListPage } from "@/lib/page-factory";

export default createListPage({
paramsLoader: assetsParamsLoader,
prefetch: prefetchAssets,
Container: AssetsContainer,
List: AssetsList,
Loading: AssetsLoading,
Error: AssetsError,
paramsLoader: connectorsParamsLoader,
prefetch: prefetchAssetConnectors,
Container: AssetConnectorsContainer,
List: AssetConnectorList,
Loading: ConnectorsLoading,
Error: ConnectorsError,
});
26 changes: 13 additions & 13 deletions src/app/(dashboard)/(rest)/connectors/deviceArtifacts/page.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import {
DeviceArtifactsContainer,
DeviceArtifactsError,
DeviceArtifactsList,
DeviceArtifactsLoading,
} from "@/features/device-artifacts/components/device-artifacts";
import { deviceArtifactsParamsLoader } from "@/features/device-artifacts/server/params-loader";
import { prefetchDeviceArtifacts } from "@/features/device-artifacts/server/prefetch";
ConnectorsError,
ConnectorsLoading,
DeviceArtifactConnectorList,
DeviceArtifactConnectorsContainer,
} from "@/features/api-key-connectors/components/connectors";
import { connectorsParamsLoader } from "@/features/api-key-connectors/server/params-loader";
import { prefetchDeviceArtifactConnectors } from "@/features/api-key-connectors/server/prefetch";
import { createListPage } from "@/lib/page-factory";

export default createListPage({
paramsLoader: deviceArtifactsParamsLoader,
prefetch: prefetchDeviceArtifacts,
Container: DeviceArtifactsContainer,
List: DeviceArtifactsList,
Loading: DeviceArtifactsLoading,
Error: DeviceArtifactsError,
paramsLoader: connectorsParamsLoader,
prefetch: prefetchDeviceArtifactConnectors,
Container: DeviceArtifactConnectorsContainer,
List: DeviceArtifactConnectorList,
Loading: ConnectorsLoading,
Error: ConnectorsError,
});
26 changes: 13 additions & 13 deletions src/app/(dashboard)/(rest)/connectors/remediations/page.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import {
RemediationsContainer,
RemediationsError,
RemediationsList,
RemediationsLoading,
} from "@/features/remediations/components/remediations";
import { remediationsParamsLoader } from "@/features/remediations/server/params-loader";
import { prefetchRemediations } from "@/features/remediations/server/prefetch";
ConnectorsError,
ConnectorsLoading,
RemediationConnectorList,
RemediationConnectorsContainer,
} from "@/features/api-key-connectors/components/connectors";
import { connectorsParamsLoader } from "@/features/api-key-connectors/server/params-loader";
import { prefetchRemediationConnectors } from "@/features/api-key-connectors/server/prefetch";
import { createListPage } from "@/lib/page-factory";

export default createListPage({
paramsLoader: remediationsParamsLoader,
prefetch: prefetchRemediations,
Container: RemediationsContainer,
List: RemediationsList,
Loading: RemediationsLoading,
Error: RemediationsError,
paramsLoader: connectorsParamsLoader,
prefetch: prefetchRemediationConnectors,
Container: RemediationConnectorsContainer,
List: RemediationConnectorList,
Loading: ConnectorsLoading,
Error: ConnectorsError,
});
26 changes: 13 additions & 13 deletions src/app/(dashboard)/(rest)/connectors/vulnerabilities/page.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import {
VulnerabilitiesContainer,
VulnerabilitiesError,
VulnerabilitiesList,
VulnerabilitiesLoading,
} from "@/features/vulnerabilities/components/vulnerabilities";
import { vulnerabilitiesParamsLoader } from "@/features/vulnerabilities/server/params-loader";
import { prefetchVulnerabilities } from "@/features/vulnerabilities/server/prefetch";
ConnectorsError,
ConnectorsLoading,
VulnerabilityConnectorList,
VulnerabilityConnectorsContainer,
} from "@/features/api-key-connectors/components/connectors";
import { connectorsParamsLoader } from "@/features/api-key-connectors/server/params-loader";
import { prefetchVulnerabilityConnectors } from "@/features/api-key-connectors/server/prefetch";
import { createListPage } from "@/lib/page-factory";

export default createListPage({
paramsLoader: vulnerabilitiesParamsLoader,
prefetch: prefetchVulnerabilities,
Container: VulnerabilitiesContainer,
List: VulnerabilitiesList,
Loading: VulnerabilitiesLoading,
Error: VulnerabilitiesError,
paramsLoader: connectorsParamsLoader,
prefetch: prefetchVulnerabilityConnectors,
Container: VulnerabilityConnectorsContainer,
List: VulnerabilityConnectorList,
Loading: ConnectorsLoading,
Error: ConnectorsError,
});
3 changes: 3 additions & 0 deletions src/app/api/trpc/[trpc]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ const handler = (req: Request) =>
router: appRouter,
// @ts-expect-error
createContext: createTRPCContext,
onError: ({ path, error }) => {
console.error(path, error);
},
});

export { handler as GET, handler as POST };
86 changes: 86 additions & 0 deletions src/features/api-key-connectors/components/columns.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
"use client";

import type { ColumnDef } from "@tanstack/react-table";
import { formatDistanceToNow } from "date-fns";
import { Badge } from "@/components/ui/badge";
import { SortableHeader } from "@/components/ui/data-table";
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
import type { ConnectorResponse } from "../types";

export const columns: ColumnDef<ConnectorResponse>[] = [
{
id: "name",
accessorKey: "name",
header: ({ column }) => (
<SortableHeader header="Connector Name" column={column} />
),
},
{
accessorKey: "Username",
meta: { title: "Username" },
header: "Username",
accessorFn: (row) => row.user.name,
},
{
id: "lastRequest",
accessorKey: "lastRequest",
header: ({ column }) => (
<SortableHeader header="Last Used" column={column} />
),
cell: ({ row }) => {
const value = row.original.lastRequest;
return (
<Tooltip>
<TooltipTrigger>
{value ? `${formatDistanceToNow(value)} ago` : "Never"}
</TooltipTrigger>
<TooltipContent>
{value ? value.toLocaleString() : "Never"}
</TooltipContent>
</Tooltip>
);
},
},
{
id: "status",
accessorKey: "status",
header: "Status",
cell: ({ row }) => {
let text = "Expired";
let color = "bg-red-400";
if (row.original.apiKeyId || row.original.integrationId) {
text = "Active";
color = "bg-green-300";
}

return (
<Badge variant="outline" className={color}>
{text}
</Badge>
);
},
},
{
id: "type",
accessorKey: "type",
header: "Type",
cell: ({ row }) => {
let text = "API Key";
let color = "bg-blue-300";
if (row.original.integrationId) {
text = "Integration";
color = "bg-yellow-300";
}

return (
<Badge variant="outline" className={color}>
{text}
</Badge>
);
},
},
];
159 changes: 159 additions & 0 deletions src/features/api-key-connectors/components/connectors.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
"use client";

import {
EmptyView,
EntityContainer,
EntityHeader,
EntitySearch,
ErrorView,
LoadingView,
} from "@/components/entity-components";
import { DataTable } from "@/components/ui/data-table";
import { ResourceType } from "@/generated/prisma";
import { useEntitySearch } from "@/hooks/use-entity-search";
import {
useConnectorParams,
useSuspenseConnectorsByResourceType,
} from "../hooks/use-connectors";
import { columns } from "./columns";

export const ConnectorsLoading = () => {
return <LoadingView message="Loading connectors..." />;
};

export const ConnectorsError = () => {
return <ErrorView message="Error loading connectors" />;
};

export const ConnectorsEmpty = () => {
return (
<EmptyView message="No connectors found. Connectors are typically seeded using the database seed script." />
);
};

const ConnectorsHeader = ({
disabled,
resourceType,
}: {
disabled?: boolean;
resourceType: string;
}) => {
return (
<EntityHeader
title={`${resourceType} Connectors`}
description={`View connectors that others are using`}
disabled={disabled}
/>
);
};

const ConnectorsContainer = ({
children,
resourceType,
}: {
children: React.ReactNode;
resourceType: ResourceType | string;
}) => {
return (
<EntityContainer header={<ConnectorsHeader resourceType={resourceType} />}>
{children}
</EntityContainer>
);
};

const ConnectorsSearch = () => {
const [params, setParams] = useConnectorParams();
const { searchValue, onSearchChange } = useEntitySearch({
params,
setParams,
});

return (
<EntitySearch
value={searchValue}
onChange={onSearchChange}
placeholder="Search connectors"
/>
);
};

const ConnectorsList = ({ resourceType }: { resourceType: ResourceType }) => {
const { data: connectors, isFetching } = useSuspenseConnectorsByResourceType({
resourceType,
});

console.log("useSuspenseConnectorsByResourceType:", connectors);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Remove connector payload debug logging before merge.

Line 85 logs fetched connector data in the browser console. This is a production data-exposure/noise risk and should be removed.

Suggested fix
-  console.log("useSuspenseConnectorsByResourceType:", connectors);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
console.log("useSuspenseConnectorsByResourceType:", connectors);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/features/api-key-connectors/components/connectors.tsx` at line 85, Remove
the debug console logging of connector payloads: delete the
console.log("useSuspenseConnectorsByResourceType:", connectors) statement in the
connectors.tsx implementation (the useSuspenseConnectorsByResourceType flow that
handles the connectors variable) so fetched connector data is not printed to the
browser console; ensure no equivalent debug logs remain in the same module or
helper functions that expose connector payloads.


return (
<DataTable
paginatedData={connectors}
columns={columns}
isLoading={isFetching}
search={<ConnectorsSearch />}
/>
);
};

export const AssetConnectorsContainer = ({
children,
}: {
children: React.ReactNode;
}) => {
return (
<ConnectorsContainer resourceType={ResourceType.Asset}>
{children}
</ConnectorsContainer>
);
};

export const DeviceArtifactConnectorsContainer = ({
children,
}: {
children: React.ReactNode;
}) => {
return (
<ConnectorsContainer resourceType={"Device Artifact"}>
{children}
</ConnectorsContainer>
);
};

export const RemediationConnectorsContainer = ({
children,
}: {
children: React.ReactNode;
}) => {
return (
<ConnectorsContainer resourceType={ResourceType.Remediation}>
{children}
</ConnectorsContainer>
);
};

export const VulnerabilityConnectorsContainer = ({
children,
}: {
children: React.ReactNode;
}) => {
return (
<ConnectorsContainer resourceType={ResourceType.Vulnerability}>
{children}
</ConnectorsContainer>
);
};

export const AssetConnectorList = () => {
return <ConnectorsList resourceType={ResourceType.Asset} />;
};

export const DeviceArtifactConnectorList = () => {
return <ConnectorsList resourceType={ResourceType.DeviceArtifact} />;
};

export const RemediationConnectorList = () => {
return <ConnectorsList resourceType={ResourceType.Remediation} />;
};

export const VulnerabilityConnectorList = () => {
return <ConnectorsList resourceType={ResourceType.Vulnerability} />;
};
Loading
Loading