feat(radar): pagination & filtering

This commit is contained in:
Daniel Hougaard
2025-01-15 16:39:08 +01:00
parent c359cf162f
commit 4147725260
12 changed files with 495 additions and 128 deletions
@@ -1,5 +1,6 @@
export {
useCreateNewInstallationSession,
useExportSecretScanningRisks,
useLinkGitAppInstallationWithOrg,
useUpdateRiskStatus
} from "./mutation";
@@ -2,7 +2,12 @@ import { useMutation } from "@tanstack/react-query";
import { apiRequest } from "@app/config/request";
import { RiskStatus, TGitAppOrg, TSecretScanningGitRisks } from "./types";
import {
RiskStatus,
SecretScanningResolvedStatus,
TGitAppOrg,
TSecretScanningGitRisks
} from "./types";
export const useCreateNewInstallationSession = () => {
return useMutation<{ sessionId: string }, object, { organizationId: string }>({
@@ -43,3 +48,31 @@ export const useLinkGitAppInstallationWithOrg = () => {
}
});
};
export const useExportSecretScanningRisks = () => {
return useMutation<
TSecretScanningGitRisks[],
object,
{
orgId: string;
filter: {
repositoryNames?: string[];
resolvedStatus?: SecretScanningResolvedStatus;
};
}
>({
mutationFn: async ({ filter, orgId }) => {
const params = new URLSearchParams({
...(filter.resolvedStatus && { resolvedStatus: filter.resolvedStatus }),
...(filter.repositoryNames && { repositoryNames: filter.repositoryNames.join(",") })
});
const { data } = await apiRequest.get<{
risks: TSecretScanningGitRisks[];
}>(`/api/v1/secret-scanning/organization/${orgId}/risks/export`, {
params
});
return data.risks;
}
});
};
@@ -2,11 +2,19 @@ import { useQuery } from "@tanstack/react-query";
import { apiRequest } from "@app/config/request";
import { TSecretScanningGitRisks } from "./types";
import { SecretScanningOrderBy, SecretScanningRiskFilter, TSecretScanningGitRisks } from "./types";
export const secretScanningQueryKeys = {
getInstallationStatus: (orgId: string) => ["secret-scanning-installation-status", { orgId }],
getRisksByOrganizatio: (orgId: string) => ["secret-scanning-risks", { orgId }]
getRisksByOrganization: (
orgId: string,
sort: {
offset: number;
limit: number;
orderBy: SecretScanningOrderBy;
},
filter: SecretScanningRiskFilter
) => ["secret-scanning-risks", { orgId, sort, filter }]
};
const fetchSecretScanningInstallationStatus = async (organizationId: string) => {
@@ -22,15 +30,43 @@ export const useGetSecretScanningInstallationStatus = (orgId: string) =>
queryFn: () => fetchSecretScanningInstallationStatus(orgId)
});
const fetchSecretScanningRisksByOrgId = async (oranizationId: string) => {
const { data } = await apiRequest.get<{ risks: TSecretScanningGitRisks[] }>(
`/api/v1/secret-scanning/organization/${oranizationId}/risks`
);
return data.risks;
const fetchSecretScanningRisksByOrgId = async (
organizationId: string,
sort: {
offset: number;
limit: number;
orderBy: SecretScanningOrderBy;
},
filter: SecretScanningRiskFilter
) => {
const params = new URLSearchParams({
offset: String(sort.offset),
limit: String(sort.limit),
orderBy: sort.orderBy,
...(filter.resolvedStatus && { resolvedStatus: filter.resolvedStatus }),
...(filter.repositoryNames && { repositoryNames: filter.repositoryNames.join(",") })
});
const { data } = await apiRequest.get<{
risks: TSecretScanningGitRisks[];
totalCount: number;
repos: string[];
}>(`/api/v1/secret-scanning/organization/${organizationId}/risks`, {
params
});
return data;
};
export const useGetSecretScanningRisks = (orgId: string) =>
export const useGetSecretScanningRisks = (
orgId: string,
sort: {
offset: number;
limit: number;
orderBy: SecretScanningOrderBy;
},
filter: SecretScanningRiskFilter
) =>
useQuery({
queryKey: secretScanningQueryKeys.getRisksByOrganizatio(orgId),
queryFn: () => fetchSecretScanningRisksByOrgId(orgId)
queryKey: secretScanningQueryKeys.getRisksByOrganization(orgId, sort, filter),
queryFn: () => fetchSecretScanningRisksByOrgId(orgId, sort, filter)
});
@@ -5,6 +5,21 @@ export enum RiskStatus {
UNRESOLVED = "UNRESOLVED"
}
export enum SecretScanningOrderBy {
CreatedAt = "createdAt"
}
export enum SecretScanningResolvedStatus {
All = "all",
Resolved = "resolved",
Unresolved = "unresolved"
}
export type SecretScanningRiskFilter = {
repositoryNames?: string[];
resolvedStatus?: SecretScanningResolvedStatus;
};
export type TSecretScanningGitRisks = {
id: string;
description: string;