From 5e601a0ef0bb5e9f150b07f2facc52e7ee6e7f3f Mon Sep 17 00:00:00 2001 From: gearnode Date: Sun, 30 Mar 2025 16:51:24 +0200 Subject: [PATCH] Add risk list and create risk Signed-off-by: gearnode --- .../src/pages/organizations/Routes.tsx | 4 + .../pages/organizations/risks/NewRiskPage.tsx | 29 + .../pages/organizations/risks/NewRiskView.tsx | 163 ++ .../organizations/risks/RiskListPage.tsx | 31 + .../organizations/risks/RiskListView.tsx | 404 ++++ .../NewRiskViewCreateRiskMutation.graphql.ts | 192 ++ .../RiskListViewDeleteMutation.graphql.ts | 132 ++ .../RiskListViewPaginationQuery.graphql.ts | 309 +++ .../RiskListViewQuery.graphql.ts | 311 +++ .../RiskListView_risks.graphql.ts | 244 +++ pkg/coredata/entity_type_reg.go | 7 +- pkg/coredata/migrations/20250330T163200Z.sql | 9 + pkg/coredata/risk.go | 198 ++ pkg/coredata/risk_order_field.go | 40 + pkg/probo/risk_service.go | 173 ++ pkg/probo/service.go | 2 + pkg/server/api/console/v1/schema.graphql | 75 + pkg/server/api/console/v1/schema/schema.go | 1868 +++++++++++++++++ pkg/server/api/console/v1/types/risk.go | 54 + pkg/server/api/console/v1/types/types.go | 50 + pkg/server/api/console/v1/v1_resolver.go | 97 +- 21 files changed, 4384 insertions(+), 8 deletions(-) create mode 100644 apps/console/src/pages/organizations/risks/NewRiskPage.tsx create mode 100644 apps/console/src/pages/organizations/risks/NewRiskView.tsx create mode 100644 apps/console/src/pages/organizations/risks/RiskListPage.tsx create mode 100644 apps/console/src/pages/organizations/risks/RiskListView.tsx create mode 100644 apps/console/src/pages/organizations/risks/__generated__/NewRiskViewCreateRiskMutation.graphql.ts create mode 100644 apps/console/src/pages/organizations/risks/__generated__/RiskListViewDeleteMutation.graphql.ts create mode 100644 apps/console/src/pages/organizations/risks/__generated__/RiskListViewPaginationQuery.graphql.ts create mode 100644 apps/console/src/pages/organizations/risks/__generated__/RiskListViewQuery.graphql.ts create mode 100644 apps/console/src/pages/organizations/risks/__generated__/RiskListView_risks.graphql.ts create mode 100644 pkg/coredata/migrations/20250330T163200Z.sql create mode 100644 pkg/coredata/risk.go create mode 100644 pkg/coredata/risk_order_field.go create mode 100644 pkg/probo/risk_service.go create mode 100644 pkg/server/api/console/v1/types/risk.go diff --git a/apps/console/src/pages/organizations/Routes.tsx b/apps/console/src/pages/organizations/Routes.tsx index 3afe197f7..a8bc6bc21 100644 --- a/apps/console/src/pages/organizations/Routes.tsx +++ b/apps/console/src/pages/organizations/Routes.tsx @@ -22,6 +22,8 @@ import { UpdatePolicyPage } from "./policies/UpdatePolicyPage"; import { VendorListPage } from "./vendors/VendorListPage"; import { VendorPage } from "./vendors/VendorPage"; import { MitigationNewPage } from "./mitigations/MitigationNewPage"; +import { RiskListPage } from "./risks/RiskListPage"; +import { NewRiskPage } from "./risks/NewRiskPage"; export function OrganizationsRoutes() { return ( @@ -53,6 +55,8 @@ export function OrganizationsRoutes() { path="policies/:policyId/update" element={} /> + } /> + } /> } /> } /> diff --git a/apps/console/src/pages/organizations/risks/NewRiskPage.tsx b/apps/console/src/pages/organizations/risks/NewRiskPage.tsx new file mode 100644 index 000000000..6aeda728b --- /dev/null +++ b/apps/console/src/pages/organizations/risks/NewRiskPage.tsx @@ -0,0 +1,29 @@ +import { PageTemplateSkeleton } from "@/components/PageTemplate"; +import { Suspense } from "react"; +import { lazy } from "@probo/react-lazy"; +import { useLocation } from "react-router"; +import { ErrorBoundaryWithLocation } from "../ErrorBoundary"; + +const NewRiskView = lazy(() => import("./NewRiskView")); + +export function NewRiskViewSkeleton() { + return ( + +
+
+
+ + ); +} + +export function NewRiskPage() { + const location = useLocation(); + + return ( + }> + + + + + ); +} diff --git a/apps/console/src/pages/organizations/risks/NewRiskView.tsx b/apps/console/src/pages/organizations/risks/NewRiskView.tsx new file mode 100644 index 000000000..f54286c05 --- /dev/null +++ b/apps/console/src/pages/organizations/risks/NewRiskView.tsx @@ -0,0 +1,163 @@ +import { useState } from "react"; +import { useNavigate, useParams } from "react-router"; +import { ConnectionHandler, graphql, useMutation } from "react-relay"; +import { + Card, + CardContent, + CardHeader, + CardTitle, + CardDescription, +} from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { useToast } from "@/hooks/use-toast"; +import { PageTemplate } from "@/components/PageTemplate"; + +const createRiskMutation = graphql` + mutation NewRiskViewCreateRiskMutation( + $input: CreateRiskInput! + $connections: [ID!]! + ) { + createRisk(input: $input) { + riskEdge @prependEdge(connections: $connections) { + node { + id + name + description + createdAt + updatedAt + } + } + } + } +`; + +export default function NewRiskView() { + const navigate = useNavigate(); + const { organizationId } = useParams<{ organizationId: string }>(); + const [name, setName] = useState(""); + const [description, setDescription] = useState(""); + const [isSubmitting, setIsSubmitting] = useState(false); + const { toast } = useToast(); + + const [commitMutation, isInFlight] = useMutation(createRiskMutation); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + + if (!name.trim()) { + toast({ + title: "Error", + description: "Please enter a name for the risk.", + variant: "destructive", + }); + return; + } + + setIsSubmitting(true); + + const input = { + organizationId: organizationId!, + name, + description, + }; + + commitMutation({ + variables: { + input, + connections: [ + ConnectionHandler.getConnectionID( + organizationId!, + "RiskListView_risks" + ), + ], + }, + onCompleted: (response, errors) => { + setIsSubmitting(false); + if (errors) { + console.error("Error creating risk:", errors); + toast({ + title: "Error", + description: "Failed to create risk. Please try again.", + variant: "destructive", + }); + return; + } + + toast({ + title: "Success", + description: "Risk created successfully!", + }); + + navigate(`/organizations/${organizationId}/risks`); + }, + onError: (error) => { + setIsSubmitting(false); + console.error("Error creating risk:", error); + toast({ + title: "Error", + description: "Failed to create risk. Please try again.", + variant: "destructive", + }); + }, + }); + }; + + return ( + + + + Risk Details + + Enter the details of the risk you want to add to your organization. + + + +
+
+ + setName(e.target.value)} + required + /> +
+ +
+ +