Add credit card data parameter (#1599)
This commit is contained in:
@@ -36,10 +36,13 @@ import { stringify as convertToYAML } from "yaml";
|
|||||||
import {
|
import {
|
||||||
AWSSecretParameter,
|
AWSSecretParameter,
|
||||||
WorkflowApiResponse,
|
WorkflowApiResponse,
|
||||||
|
WorkflowEditorParameterTypes,
|
||||||
|
WorkflowParameterTypes,
|
||||||
WorkflowParameterValueType,
|
WorkflowParameterValueType,
|
||||||
WorkflowSettings,
|
WorkflowSettings,
|
||||||
} from "../types/workflowTypes";
|
} from "../types/workflowTypes";
|
||||||
import {
|
import {
|
||||||
|
BitwardenCreditCardDataParameterYAML,
|
||||||
BitwardenLoginCredentialParameterYAML,
|
BitwardenLoginCredentialParameterYAML,
|
||||||
BitwardenSensitiveInformationParameterYAML,
|
BitwardenSensitiveInformationParameterYAML,
|
||||||
BlockYAML,
|
BlockYAML,
|
||||||
@@ -50,6 +53,11 @@ import {
|
|||||||
} from "../types/workflowYamlTypes";
|
} from "../types/workflowYamlTypes";
|
||||||
import { WorkflowHeader } from "./WorkflowHeader";
|
import { WorkflowHeader } from "./WorkflowHeader";
|
||||||
import { WorkflowParametersStateContext } from "./WorkflowParametersStateContext";
|
import { WorkflowParametersStateContext } from "./WorkflowParametersStateContext";
|
||||||
|
import {
|
||||||
|
BITWARDEN_CLIENT_ID_AWS_SECRET_KEY,
|
||||||
|
BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY,
|
||||||
|
BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY,
|
||||||
|
} from "./constants";
|
||||||
import { edgeTypes } from "./edges";
|
import { edgeTypes } from "./edges";
|
||||||
import {
|
import {
|
||||||
AppNode,
|
AppNode,
|
||||||
@@ -82,11 +90,12 @@ function convertToParametersYAML(
|
|||||||
| BitwardenLoginCredentialParameterYAML
|
| BitwardenLoginCredentialParameterYAML
|
||||||
| ContextParameterYAML
|
| ContextParameterYAML
|
||||||
| BitwardenSensitiveInformationParameterYAML
|
| BitwardenSensitiveInformationParameterYAML
|
||||||
|
| BitwardenCreditCardDataParameterYAML
|
||||||
> {
|
> {
|
||||||
return parameters.map((parameter) => {
|
return parameters.map((parameter) => {
|
||||||
if (parameter.parameterType === "workflow") {
|
if (parameter.parameterType === WorkflowEditorParameterTypes.Workflow) {
|
||||||
return {
|
return {
|
||||||
parameter_type: "workflow",
|
parameter_type: WorkflowParameterTypes.Workflow,
|
||||||
key: parameter.key,
|
key: parameter.key,
|
||||||
description: parameter.description || null,
|
description: parameter.description || null,
|
||||||
workflow_parameter_type: parameter.dataType,
|
workflow_parameter_type: parameter.dataType,
|
||||||
@@ -94,39 +103,58 @@ function convertToParametersYAML(
|
|||||||
? {}
|
? {}
|
||||||
: { default_value: parameter.defaultValue }),
|
: { default_value: parameter.defaultValue }),
|
||||||
};
|
};
|
||||||
} else if (parameter.parameterType === "context") {
|
} else if (
|
||||||
|
parameter.parameterType === WorkflowEditorParameterTypes.Context
|
||||||
|
) {
|
||||||
return {
|
return {
|
||||||
parameter_type: "context",
|
parameter_type: WorkflowParameterTypes.Context,
|
||||||
key: parameter.key,
|
key: parameter.key,
|
||||||
description: parameter.description || null,
|
description: parameter.description || null,
|
||||||
source_parameter_key: parameter.sourceParameterKey,
|
source_parameter_key: parameter.sourceParameterKey,
|
||||||
};
|
};
|
||||||
} else if (parameter.parameterType === "secret") {
|
} else if (
|
||||||
|
parameter.parameterType === WorkflowEditorParameterTypes.Secret
|
||||||
|
) {
|
||||||
return {
|
return {
|
||||||
parameter_type: "bitwarden_sensitive_information",
|
parameter_type: WorkflowParameterTypes.Bitwarden_Sensitive_Information,
|
||||||
key: parameter.key,
|
key: parameter.key,
|
||||||
bitwarden_identity_key: parameter.identityKey,
|
bitwarden_identity_key: parameter.identityKey,
|
||||||
bitwarden_identity_fields: parameter.identityFields,
|
bitwarden_identity_fields: parameter.identityFields,
|
||||||
description: parameter.description || null,
|
description: parameter.description || null,
|
||||||
bitwarden_collection_id: parameter.collectionId,
|
bitwarden_collection_id: parameter.collectionId,
|
||||||
bitwarden_client_id_aws_secret_key: "SKYVERN_BITWARDEN_CLIENT_ID",
|
bitwarden_client_id_aws_secret_key: BITWARDEN_CLIENT_ID_AWS_SECRET_KEY,
|
||||||
bitwarden_client_secret_aws_secret_key:
|
bitwarden_client_secret_aws_secret_key:
|
||||||
"SKYVERN_BITWARDEN_CLIENT_SECRET",
|
BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY,
|
||||||
bitwarden_master_password_aws_secret_key:
|
bitwarden_master_password_aws_secret_key:
|
||||||
"SKYVERN_BITWARDEN_MASTER_PASSWORD",
|
BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY,
|
||||||
|
};
|
||||||
|
} else if (
|
||||||
|
parameter.parameterType === WorkflowEditorParameterTypes.CreditCardData
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
parameter_type: WorkflowParameterTypes.Bitwarden_Credit_Card_Data,
|
||||||
|
key: parameter.key,
|
||||||
|
description: parameter.description || null,
|
||||||
|
bitwarden_item_id: parameter.itemId,
|
||||||
|
bitwarden_collection_id: parameter.collectionId,
|
||||||
|
bitwarden_client_id_aws_secret_key: BITWARDEN_CLIENT_ID_AWS_SECRET_KEY,
|
||||||
|
bitwarden_client_secret_aws_secret_key:
|
||||||
|
BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY,
|
||||||
|
bitwarden_master_password_aws_secret_key:
|
||||||
|
BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
parameter_type: "bitwarden_login_credential",
|
parameter_type: WorkflowParameterTypes.Bitwarden_Login_Credential,
|
||||||
key: parameter.key,
|
key: parameter.key,
|
||||||
description: parameter.description || null,
|
description: parameter.description || null,
|
||||||
bitwarden_collection_id: parameter.collectionId,
|
bitwarden_collection_id: parameter.collectionId,
|
||||||
url_parameter_key: parameter.urlParameterKey,
|
url_parameter_key: parameter.urlParameterKey,
|
||||||
bitwarden_client_id_aws_secret_key: "SKYVERN_BITWARDEN_CLIENT_ID",
|
bitwarden_client_id_aws_secret_key: BITWARDEN_CLIENT_ID_AWS_SECRET_KEY,
|
||||||
bitwarden_client_secret_aws_secret_key:
|
bitwarden_client_secret_aws_secret_key:
|
||||||
"SKYVERN_BITWARDEN_CLIENT_SECRET",
|
BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY,
|
||||||
bitwarden_master_password_aws_secret_key:
|
bitwarden_master_password_aws_secret_key:
|
||||||
"SKYVERN_BITWARDEN_MASTER_PASSWORD",
|
BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -161,6 +189,13 @@ export type ParametersState = Array<
|
|||||||
collectionId: string;
|
collectionId: string;
|
||||||
description?: string | null;
|
description?: string | null;
|
||||||
}
|
}
|
||||||
|
| {
|
||||||
|
key: string;
|
||||||
|
parameterType: "creditCardData";
|
||||||
|
itemId: string;
|
||||||
|
collectionId: string;
|
||||||
|
description?: string | null;
|
||||||
|
}
|
||||||
>;
|
>;
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
|||||||
@@ -7,7 +7,12 @@ import { useWorkflowQuery } from "../hooks/useWorkflowQuery";
|
|||||||
import { FlowRenderer } from "./FlowRenderer";
|
import { FlowRenderer } from "./FlowRenderer";
|
||||||
import { getElements } from "./workflowEditorUtils";
|
import { getElements } from "./workflowEditorUtils";
|
||||||
import { LogoMinimized } from "@/components/LogoMinimized";
|
import { LogoMinimized } from "@/components/LogoMinimized";
|
||||||
import { WorkflowSettings } from "../types/workflowTypes";
|
import {
|
||||||
|
isDisplayedInWorkflowEditor,
|
||||||
|
WorkflowEditorParameterTypes,
|
||||||
|
WorkflowParameterTypes,
|
||||||
|
WorkflowSettings,
|
||||||
|
} from "../types/workflowTypes";
|
||||||
|
|
||||||
function WorkflowEditor() {
|
function WorkflowEditor() {
|
||||||
const { workflowPermanentId } = useParams();
|
const { workflowPermanentId } = useParams();
|
||||||
@@ -27,7 +32,6 @@ function WorkflowEditor() {
|
|||||||
setHasChanges(false);
|
setHasChanges(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return (
|
return (
|
||||||
<div className="flex h-screen w-full items-center justify-center">
|
<div className="flex h-screen w-full items-center justify-center">
|
||||||
@@ -56,13 +60,7 @@ function WorkflowEditor() {
|
|||||||
initialNodes={elements.nodes}
|
initialNodes={elements.nodes}
|
||||||
initialEdges={elements.edges}
|
initialEdges={elements.edges}
|
||||||
initialParameters={workflow.workflow_definition.parameters
|
initialParameters={workflow.workflow_definition.parameters
|
||||||
.filter(
|
.filter((parameter) => isDisplayedInWorkflowEditor(parameter))
|
||||||
(parameter) =>
|
|
||||||
parameter.parameter_type === "workflow" ||
|
|
||||||
parameter.parameter_type === "bitwarden_login_credential" ||
|
|
||||||
parameter.parameter_type === "context" ||
|
|
||||||
parameter.parameter_type === "bitwarden_sensitive_information",
|
|
||||||
)
|
|
||||||
.map((parameter) => {
|
.map((parameter) => {
|
||||||
if (parameter.parameter_type === "workflow") {
|
if (parameter.parameter_type === "workflow") {
|
||||||
return {
|
return {
|
||||||
@@ -90,6 +88,17 @@ function WorkflowEditor() {
|
|||||||
identityFields: parameter.bitwarden_identity_fields,
|
identityFields: parameter.bitwarden_identity_fields,
|
||||||
description: parameter.description,
|
description: parameter.description,
|
||||||
};
|
};
|
||||||
|
} else if (
|
||||||
|
parameter.parameter_type ===
|
||||||
|
WorkflowParameterTypes.Bitwarden_Credit_Card_Data
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
key: parameter.key,
|
||||||
|
parameterType: WorkflowEditorParameterTypes.CreditCardData,
|
||||||
|
collectionId: parameter.bitwarden_collection_id,
|
||||||
|
itemId: parameter.bitwarden_item_id,
|
||||||
|
description: parameter.description,
|
||||||
|
};
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
key: parameter.key,
|
key: parameter.key,
|
||||||
|
|||||||
@@ -14,3 +14,9 @@ export const SMTP_USERNAME_AWS_KEY = "SKYVERN_SMTP_USERNAME_SES";
|
|||||||
export const SMTP_PASSWORD_AWS_KEY = "SKYVERN_SMTP_PASSWORD_SES";
|
export const SMTP_PASSWORD_AWS_KEY = "SKYVERN_SMTP_PASSWORD_SES";
|
||||||
|
|
||||||
export const EMAIL_BLOCK_SENDER = "hello@skyvern.com";
|
export const EMAIL_BLOCK_SENDER = "hello@skyvern.com";
|
||||||
|
|
||||||
|
export const BITWARDEN_CLIENT_ID_AWS_SECRET_KEY = "SKYVERN_BITWARDEN_CLIENT_ID";
|
||||||
|
export const BITWARDEN_CLIENT_SECRET_AWS_SECRET_KEY =
|
||||||
|
"SKYVERN_BITWARDEN_CLIENT_SECRET";
|
||||||
|
export const BITWARDEN_MASTER_PASSWORD_AWS_SECRET_KEY =
|
||||||
|
"SKYVERN_BITWARDEN_MASTER_PASSWORD";
|
||||||
|
|||||||
@@ -2,7 +2,10 @@ import { Cross2Icon } from "@radix-ui/react-icons";
|
|||||||
import { Label } from "@/components/ui/label";
|
import { Label } from "@/components/ui/label";
|
||||||
import { Input } from "@/components/ui/input";
|
import { Input } from "@/components/ui/input";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { WorkflowParameterValueType } from "../../types/workflowTypes";
|
import {
|
||||||
|
WorkflowEditorParameterType,
|
||||||
|
WorkflowParameterValueType,
|
||||||
|
} from "../../types/workflowTypes";
|
||||||
import {
|
import {
|
||||||
Select,
|
Select,
|
||||||
SelectContent,
|
SelectContent,
|
||||||
@@ -21,7 +24,7 @@ import { SourceParameterKeySelector } from "../../components/SourceParameterKeyS
|
|||||||
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
|
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
type: "workflow" | "credential" | "context" | "secret";
|
type: WorkflowEditorParameterType;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
onSave: (value: ParametersState[number]) => void;
|
onSave: (value: ParametersState[number]) => void;
|
||||||
};
|
};
|
||||||
@@ -35,7 +38,7 @@ const workflowParameterTypeOptions = [
|
|||||||
{ label: "JSON", value: WorkflowParameterValueType.JSON },
|
{ label: "JSON", value: WorkflowParameterValueType.JSON },
|
||||||
];
|
];
|
||||||
|
|
||||||
function header(type: "workflow" | "credential" | "context" | "secret") {
|
function header(type: WorkflowEditorParameterType) {
|
||||||
if (type === "workflow") {
|
if (type === "workflow") {
|
||||||
return "Add Input Parameter";
|
return "Add Input Parameter";
|
||||||
}
|
}
|
||||||
@@ -45,6 +48,9 @@ function header(type: "workflow" | "credential" | "context" | "secret") {
|
|||||||
if (type === "secret") {
|
if (type === "secret") {
|
||||||
return "Add Secret Parameter";
|
return "Add Secret Parameter";
|
||||||
}
|
}
|
||||||
|
if (type === "creditCardData") {
|
||||||
|
return "Add Credit Card Data Parameter";
|
||||||
|
}
|
||||||
return "Add Context Parameter";
|
return "Add Context Parameter";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,6 +74,7 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
|
|||||||
|
|
||||||
const [identityKey, setIdentityKey] = useState("");
|
const [identityKey, setIdentityKey] = useState("");
|
||||||
const [identityFields, setIdentityFields] = useState("");
|
const [identityFields, setIdentityFields] = useState("");
|
||||||
|
const [itemId, setItemId] = useState("");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ScrollArea>
|
<ScrollArea>
|
||||||
@@ -230,6 +237,24 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
|
|||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
{type === "creditCardData" && (
|
||||||
|
<>
|
||||||
|
<div className="space-y-1">
|
||||||
|
<Label className="text-xs text-slate-300">Item ID</Label>
|
||||||
|
<Input
|
||||||
|
value={itemId}
|
||||||
|
onChange={(e) => setItemId(e.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-1">
|
||||||
|
<Label className="text-xs text-slate-300">Collection ID</Label>
|
||||||
|
<Input
|
||||||
|
value={collectionId}
|
||||||
|
onChange={(e) => setCollectionId(e.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
<div className="flex justify-end">
|
<div className="flex justify-end">
|
||||||
<Button
|
<Button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
@@ -264,15 +289,21 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
|
|||||||
: null,
|
: null,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (type === "credential") {
|
if (
|
||||||
|
type === "credential" ||
|
||||||
|
type === "secret" ||
|
||||||
|
type === "creditCardData"
|
||||||
|
) {
|
||||||
if (!collectionId) {
|
if (!collectionId) {
|
||||||
toast({
|
toast({
|
||||||
variant: "destructive",
|
variant: "destructive",
|
||||||
title: "Failed to add parameter",
|
title: "Failed to save parameter",
|
||||||
description: "Collection ID is required",
|
description: "Collection ID is required",
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (type === "credential") {
|
||||||
onSave({
|
onSave({
|
||||||
key,
|
key,
|
||||||
parameterType: "credential",
|
parameterType: "credential",
|
||||||
@@ -282,14 +313,6 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (type === "secret") {
|
if (type === "secret") {
|
||||||
if (!collectionId) {
|
|
||||||
toast({
|
|
||||||
variant: "destructive",
|
|
||||||
title: "Failed to add parameter",
|
|
||||||
description: "Collection ID is required",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
onSave({
|
onSave({
|
||||||
key,
|
key,
|
||||||
parameterType: "secret",
|
parameterType: "secret",
|
||||||
@@ -302,6 +325,15 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
|
|||||||
description,
|
description,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (type === "creditCardData") {
|
||||||
|
onSave({
|
||||||
|
key,
|
||||||
|
parameterType: "creditCardData",
|
||||||
|
collectionId,
|
||||||
|
itemId,
|
||||||
|
description,
|
||||||
|
});
|
||||||
|
}
|
||||||
if (type === "context") {
|
if (type === "context") {
|
||||||
if (!sourceParameterKey) {
|
if (!sourceParameterKey) {
|
||||||
toast({
|
toast({
|
||||||
|
|||||||
@@ -2,7 +2,10 @@ import { Cross2Icon } from "@radix-ui/react-icons";
|
|||||||
import { Label } from "@/components/ui/label";
|
import { Label } from "@/components/ui/label";
|
||||||
import { Input } from "@/components/ui/input";
|
import { Input } from "@/components/ui/input";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { WorkflowParameterValueType } from "../../types/workflowTypes";
|
import {
|
||||||
|
WorkflowEditorParameterType,
|
||||||
|
WorkflowParameterValueType,
|
||||||
|
} from "../../types/workflowTypes";
|
||||||
import {
|
import {
|
||||||
Select,
|
Select,
|
||||||
SelectContent,
|
SelectContent,
|
||||||
@@ -21,7 +24,7 @@ import { SourceParameterKeySelector } from "../../components/SourceParameterKeyS
|
|||||||
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
|
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
type: "workflow" | "credential" | "context" | "secret";
|
type: WorkflowEditorParameterType;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
onSave: (value: ParametersState[number]) => void;
|
onSave: (value: ParametersState[number]) => void;
|
||||||
initialValues: ParametersState[number];
|
initialValues: ParametersState[number];
|
||||||
@@ -36,7 +39,7 @@ const workflowParameterTypeOptions = [
|
|||||||
{ label: "JSON", value: WorkflowParameterValueType.JSON },
|
{ label: "JSON", value: WorkflowParameterValueType.JSON },
|
||||||
];
|
];
|
||||||
|
|
||||||
function header(type: "workflow" | "credential" | "context" | "secret") {
|
function header(type: WorkflowEditorParameterType) {
|
||||||
if (type === "workflow") {
|
if (type === "workflow") {
|
||||||
return "Edit Input Parameter";
|
return "Edit Input Parameter";
|
||||||
}
|
}
|
||||||
@@ -46,6 +49,9 @@ function header(type: "workflow" | "credential" | "context" | "secret") {
|
|||||||
if (type === "secret") {
|
if (type === "secret") {
|
||||||
return "Edit Secret Parameter";
|
return "Edit Secret Parameter";
|
||||||
}
|
}
|
||||||
|
if (type === "creditCardData") {
|
||||||
|
return "Edit Credit Card Data Parameter";
|
||||||
|
}
|
||||||
return "Edit Context Parameter";
|
return "Edit Context Parameter";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +72,8 @@ function WorkflowParameterEditPanel({
|
|||||||
);
|
);
|
||||||
const [collectionId, setCollectionId] = useState(
|
const [collectionId, setCollectionId] = useState(
|
||||||
initialValues.parameterType === "credential" ||
|
initialValues.parameterType === "credential" ||
|
||||||
initialValues.parameterType === "secret"
|
initialValues.parameterType === "secret" ||
|
||||||
|
initialValues.parameterType === "creditCardData"
|
||||||
? initialValues.collectionId
|
? initialValues.collectionId
|
||||||
: "",
|
: "",
|
||||||
);
|
);
|
||||||
@@ -110,6 +117,12 @@ function WorkflowParameterEditPanel({
|
|||||||
: "",
|
: "",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const [itemId, setItemId] = useState(
|
||||||
|
initialValues.parameterType === "creditCardData"
|
||||||
|
? initialValues.itemId
|
||||||
|
: "",
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ScrollArea>
|
<ScrollArea>
|
||||||
<ScrollAreaViewport className="max-h-[500px]">
|
<ScrollAreaViewport className="max-h-[500px]">
|
||||||
@@ -271,6 +284,24 @@ function WorkflowParameterEditPanel({
|
|||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
{type === "creditCardData" && (
|
||||||
|
<>
|
||||||
|
<div className="space-y-1">
|
||||||
|
<Label className="text-xs text-slate-300">Item ID</Label>
|
||||||
|
<Input
|
||||||
|
value={itemId}
|
||||||
|
onChange={(e) => setItemId(e.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-1">
|
||||||
|
<Label className="text-xs text-slate-300">Collection ID</Label>
|
||||||
|
<Input
|
||||||
|
value={collectionId}
|
||||||
|
onChange={(e) => setCollectionId(e.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
<div className="flex justify-end">
|
<div className="flex justify-end">
|
||||||
<Button
|
<Button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
@@ -305,7 +336,11 @@ function WorkflowParameterEditPanel({
|
|||||||
: null,
|
: null,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (type === "credential") {
|
if (
|
||||||
|
type === "credential" ||
|
||||||
|
type === "secret" ||
|
||||||
|
type === "creditCardData"
|
||||||
|
) {
|
||||||
if (!collectionId) {
|
if (!collectionId) {
|
||||||
toast({
|
toast({
|
||||||
variant: "destructive",
|
variant: "destructive",
|
||||||
@@ -314,6 +349,8 @@ function WorkflowParameterEditPanel({
|
|||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (type === "credential") {
|
||||||
onSave({
|
onSave({
|
||||||
key,
|
key,
|
||||||
parameterType: "credential",
|
parameterType: "credential",
|
||||||
@@ -323,14 +360,6 @@ function WorkflowParameterEditPanel({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (type === "secret") {
|
if (type === "secret") {
|
||||||
if (!collectionId) {
|
|
||||||
toast({
|
|
||||||
variant: "destructive",
|
|
||||||
title: "Failed to add parameter",
|
|
||||||
description: "Collection ID is required",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
onSave({
|
onSave({
|
||||||
key,
|
key,
|
||||||
parameterType: "secret",
|
parameterType: "secret",
|
||||||
@@ -343,6 +372,15 @@ function WorkflowParameterEditPanel({
|
|||||||
description,
|
description,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (type === "creditCardData") {
|
||||||
|
onSave({
|
||||||
|
key,
|
||||||
|
parameterType: "creditCardData",
|
||||||
|
collectionId,
|
||||||
|
itemId,
|
||||||
|
description,
|
||||||
|
});
|
||||||
|
}
|
||||||
if (type === "context") {
|
if (type === "context") {
|
||||||
if (!sourceParameterKey) {
|
if (!sourceParameterKey) {
|
||||||
toast({
|
toast({
|
||||||
|
|||||||
@@ -27,6 +27,10 @@ import {
|
|||||||
import { useReactFlow } from "@xyflow/react";
|
import { useReactFlow } from "@xyflow/react";
|
||||||
import { useWorkflowHasChangesStore } from "@/store/WorkflowHasChangesStore";
|
import { useWorkflowHasChangesStore } from "@/store/WorkflowHasChangesStore";
|
||||||
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
|
import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area";
|
||||||
|
import {
|
||||||
|
WorkflowEditorParameterType,
|
||||||
|
WorkflowEditorParameterTypes,
|
||||||
|
} from "../../types/workflowTypes";
|
||||||
|
|
||||||
const WORKFLOW_EDIT_PANEL_WIDTH = 20 * 16;
|
const WORKFLOW_EDIT_PANEL_WIDTH = 20 * 16;
|
||||||
const WORKFLOW_EDIT_PANEL_GAP = 1 * 16;
|
const WORKFLOW_EDIT_PANEL_GAP = 1 * 16;
|
||||||
@@ -41,7 +45,7 @@ function WorkflowParametersPanel() {
|
|||||||
active: boolean;
|
active: boolean;
|
||||||
operation: "add" | "edit";
|
operation: "add" | "edit";
|
||||||
parameter?: ParametersState[number] | null;
|
parameter?: ParametersState[number] | null;
|
||||||
type: "workflow" | "credential" | "context" | "secret";
|
type: WorkflowEditorParameterType;
|
||||||
}>({
|
}>({
|
||||||
active: false,
|
active: false,
|
||||||
operation: "add",
|
operation: "add",
|
||||||
@@ -114,6 +118,17 @@ function WorkflowParametersPanel() {
|
|||||||
>
|
>
|
||||||
Secret Parameter
|
Secret Parameter
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem
|
||||||
|
onClick={() => {
|
||||||
|
setOperationPanelState({
|
||||||
|
active: true,
|
||||||
|
operation: "add",
|
||||||
|
type: WorkflowEditorParameterTypes.CreditCardData,
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Credit Card Data Parameter
|
||||||
|
</DropdownMenuItem>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
|
|
||||||
|
|||||||
@@ -2,14 +2,16 @@ import Dagre from "@dagrejs/dagre";
|
|||||||
import type { Node } from "@xyflow/react";
|
import type { Node } from "@xyflow/react";
|
||||||
import { Edge } from "@xyflow/react";
|
import { Edge } from "@xyflow/react";
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import type {
|
import {
|
||||||
AWSSecretParameter,
|
WorkflowBlockTypes,
|
||||||
OutputParameter,
|
WorkflowParameterTypes,
|
||||||
Parameter,
|
type AWSSecretParameter,
|
||||||
WorkflowApiResponse,
|
type OutputParameter,
|
||||||
WorkflowBlock,
|
type Parameter,
|
||||||
WorkflowParameterValueType,
|
type WorkflowApiResponse,
|
||||||
WorkflowSettings,
|
type WorkflowBlock,
|
||||||
|
type WorkflowParameterValueType,
|
||||||
|
type WorkflowSettings,
|
||||||
} from "../types/workflowTypes";
|
} from "../types/workflowTypes";
|
||||||
import {
|
import {
|
||||||
ActionBlockYAML,
|
ActionBlockYAML,
|
||||||
@@ -1241,22 +1243,22 @@ const sendEmailExpectedParameters = [
|
|||||||
{
|
{
|
||||||
key: SMTP_HOST_PARAMETER_KEY,
|
key: SMTP_HOST_PARAMETER_KEY,
|
||||||
aws_key: SMTP_HOST_AWS_KEY,
|
aws_key: SMTP_HOST_AWS_KEY,
|
||||||
parameter_type: "aws_secret",
|
parameter_type: WorkflowParameterTypes.AWS_Secret,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: SMTP_PORT_PARAMETER_KEY,
|
key: SMTP_PORT_PARAMETER_KEY,
|
||||||
aws_key: SMTP_PORT_AWS_KEY,
|
aws_key: SMTP_PORT_AWS_KEY,
|
||||||
parameter_type: "aws_secret",
|
parameter_type: WorkflowParameterTypes.AWS_Secret,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: SMTP_USERNAME_PARAMETER_KEY,
|
key: SMTP_USERNAME_PARAMETER_KEY,
|
||||||
aws_key: SMTP_USERNAME_AWS_KEY,
|
aws_key: SMTP_USERNAME_AWS_KEY,
|
||||||
parameter_type: "aws_secret",
|
parameter_type: WorkflowParameterTypes.AWS_Secret,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: SMTP_PASSWORD_PARAMETER_KEY,
|
key: SMTP_PASSWORD_PARAMETER_KEY,
|
||||||
aws_key: SMTP_PASSWORD_AWS_KEY,
|
aws_key: SMTP_PASSWORD_AWS_KEY,
|
||||||
parameter_type: "aws_secret",
|
parameter_type: WorkflowParameterTypes.AWS_Secret,
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
@@ -1265,7 +1267,7 @@ function getAdditionalParametersForEmailBlock(
|
|||||||
parameters: Array<ParameterYAML>,
|
parameters: Array<ParameterYAML>,
|
||||||
): Array<ParameterYAML> {
|
): Array<ParameterYAML> {
|
||||||
const emailBlocks = blocks.filter(
|
const emailBlocks = blocks.filter(
|
||||||
(block) => block.block_type === "send_email",
|
(block) => block.block_type === WorkflowBlockTypes.SendEmail,
|
||||||
);
|
);
|
||||||
if (emailBlocks.length === 0) {
|
if (emailBlocks.length === 0) {
|
||||||
return [];
|
return [];
|
||||||
@@ -1371,32 +1373,35 @@ function convertParametersToParameterYAML(
|
|||||||
const base = {
|
const base = {
|
||||||
key: parameter.key,
|
key: parameter.key,
|
||||||
description: parameter.description,
|
description: parameter.description,
|
||||||
|
parameter_type: parameter.parameter_type,
|
||||||
};
|
};
|
||||||
switch (parameter.parameter_type) {
|
switch (parameter.parameter_type) {
|
||||||
case "aws_secret": {
|
case WorkflowParameterTypes.AWS_Secret: {
|
||||||
return {
|
return {
|
||||||
...base,
|
...base,
|
||||||
parameter_type: "aws_secret",
|
parameter_type: WorkflowParameterTypes.AWS_Secret,
|
||||||
aws_key: parameter.aws_key,
|
aws_key: parameter.aws_key,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case "bitwarden_login_credential": {
|
case WorkflowParameterTypes.Bitwarden_Login_Credential: {
|
||||||
return {
|
return {
|
||||||
...base,
|
...base,
|
||||||
parameter_type: "bitwarden_login_credential",
|
parameter_type: WorkflowParameterTypes.Bitwarden_Login_Credential,
|
||||||
bitwarden_collection_id: parameter.bitwarden_collection_id,
|
bitwarden_collection_id: parameter.bitwarden_collection_id,
|
||||||
url_parameter_key: parameter.url_parameter_key,
|
url_parameter_key: parameter.url_parameter_key,
|
||||||
bitwarden_client_id_aws_secret_key: "SKYVERN_BITWARDEN_CLIENT_ID",
|
bitwarden_client_id_aws_secret_key:
|
||||||
|
parameter.bitwarden_client_id_aws_secret_key,
|
||||||
bitwarden_client_secret_aws_secret_key:
|
bitwarden_client_secret_aws_secret_key:
|
||||||
"SKYVERN_BITWARDEN_CLIENT_SECRET",
|
parameter.bitwarden_client_secret_aws_secret_key,
|
||||||
bitwarden_master_password_aws_secret_key:
|
bitwarden_master_password_aws_secret_key:
|
||||||
"SKYVERN_BITWARDEN_MASTER_PASSWORD",
|
parameter.bitwarden_master_password_aws_secret_key,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case "bitwarden_sensitive_information": {
|
case WorkflowParameterTypes.Bitwarden_Sensitive_Information: {
|
||||||
return {
|
return {
|
||||||
...base,
|
...base,
|
||||||
parameter_type: "bitwarden_sensitive_information",
|
parameter_type:
|
||||||
|
WorkflowParameterTypes.Bitwarden_Sensitive_Information,
|
||||||
bitwarden_collection_id: parameter.bitwarden_collection_id,
|
bitwarden_collection_id: parameter.bitwarden_collection_id,
|
||||||
bitwarden_identity_key: parameter.bitwarden_identity_key,
|
bitwarden_identity_key: parameter.bitwarden_identity_key,
|
||||||
bitwarden_identity_fields: parameter.bitwarden_identity_fields,
|
bitwarden_identity_fields: parameter.bitwarden_identity_fields,
|
||||||
@@ -1408,17 +1413,31 @@ function convertParametersToParameterYAML(
|
|||||||
parameter.bitwarden_master_password_aws_secret_key,
|
parameter.bitwarden_master_password_aws_secret_key,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case "context": {
|
case WorkflowParameterTypes.Bitwarden_Credit_Card_Data: {
|
||||||
return {
|
return {
|
||||||
...base,
|
...base,
|
||||||
parameter_type: "context",
|
parameter_type: WorkflowParameterTypes.Bitwarden_Credit_Card_Data,
|
||||||
|
bitwarden_collection_id: parameter.bitwarden_collection_id,
|
||||||
|
bitwarden_item_id: parameter.bitwarden_item_id,
|
||||||
|
bitwarden_client_id_aws_secret_key:
|
||||||
|
parameter.bitwarden_client_id_aws_secret_key,
|
||||||
|
bitwarden_client_secret_aws_secret_key:
|
||||||
|
parameter.bitwarden_client_secret_aws_secret_key,
|
||||||
|
bitwarden_master_password_aws_secret_key:
|
||||||
|
parameter.bitwarden_master_password_aws_secret_key,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
case WorkflowParameterTypes.Context: {
|
||||||
|
return {
|
||||||
|
...base,
|
||||||
|
parameter_type: WorkflowParameterTypes.Context,
|
||||||
source_parameter_key: parameter.source.key,
|
source_parameter_key: parameter.source.key,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case "workflow": {
|
case WorkflowParameterTypes.Workflow: {
|
||||||
return {
|
return {
|
||||||
...base,
|
...base,
|
||||||
parameter_type: "workflow",
|
parameter_type: WorkflowParameterTypes.Workflow,
|
||||||
workflow_parameter_type: parameter.workflow_parameter_type,
|
workflow_parameter_type: parameter.workflow_parameter_type,
|
||||||
default_value: parameter.default_value,
|
default_value: parameter.default_value,
|
||||||
};
|
};
|
||||||
@@ -1645,7 +1664,7 @@ function convertBlocksToBlockYAML(
|
|||||||
|
|
||||||
function convert(workflow: WorkflowApiResponse): WorkflowCreateYAMLRequest {
|
function convert(workflow: WorkflowApiResponse): WorkflowCreateYAMLRequest {
|
||||||
const userParameters = workflow.workflow_definition.parameters.filter(
|
const userParameters = workflow.workflow_definition.parameters.filter(
|
||||||
(parameter) => parameter.parameter_type !== "output",
|
(parameter) => parameter.parameter_type !== WorkflowParameterTypes.Output,
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
title: workflow.title,
|
title: workflow.title,
|
||||||
|
|||||||
@@ -45,6 +45,20 @@ export type BitwardenSensitiveInformationParameter = WorkflowParameterBase & {
|
|||||||
deleted_at: string | null;
|
deleted_at: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type BitwardenCreditCardDataParameter = WorkflowParameterBase & {
|
||||||
|
parameter_type: "bitwarden_credit_card_data";
|
||||||
|
workflow_id: string;
|
||||||
|
bitwarden_credit_card_data_parameter_id: string;
|
||||||
|
bitwarden_client_id_aws_secret_key: string;
|
||||||
|
bitwarden_client_secret_aws_secret_key: string;
|
||||||
|
bitwarden_master_password_aws_secret_key: string;
|
||||||
|
bitwarden_collection_id: string;
|
||||||
|
bitwarden_item_id: string;
|
||||||
|
created_at: string;
|
||||||
|
modified_at: string;
|
||||||
|
deleted_at: string | null;
|
||||||
|
};
|
||||||
|
|
||||||
export type WorkflowParameter = WorkflowParameterBase & {
|
export type WorkflowParameter = WorkflowParameterBase & {
|
||||||
parameter_type: "workflow";
|
parameter_type: "workflow";
|
||||||
workflow_id: string;
|
workflow_id: string;
|
||||||
@@ -83,17 +97,38 @@ export const WorkflowParameterValueType = {
|
|||||||
export type WorkflowParameterValueType =
|
export type WorkflowParameterValueType =
|
||||||
(typeof WorkflowParameterValueType)[keyof typeof WorkflowParameterValueType];
|
(typeof WorkflowParameterValueType)[keyof typeof WorkflowParameterValueType];
|
||||||
|
|
||||||
export const WorkflowParameterType = {
|
export const WorkflowParameterTypes = {
|
||||||
Workflow: "workflow",
|
Workflow: "workflow",
|
||||||
Context: "context",
|
Context: "context",
|
||||||
Output: "output",
|
Output: "output",
|
||||||
AWS_Secret: "aws_secret",
|
AWS_Secret: "aws_secret",
|
||||||
Bitwarden_Login_Credential: "bitwarden_login_credential",
|
Bitwarden_Login_Credential: "bitwarden_login_credential",
|
||||||
Bitwarden_Sensitive_Information: "bitwarden_sensitive_information",
|
Bitwarden_Sensitive_Information: "bitwarden_sensitive_information",
|
||||||
|
Bitwarden_Credit_Card_Data: "bitwarden_credit_card_data",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export type WorkflowParameterType =
|
export type WorkflowParameterType =
|
||||||
(typeof WorkflowParameterType)[keyof typeof WorkflowParameterType];
|
(typeof WorkflowParameterTypes)[keyof typeof WorkflowParameterTypes];
|
||||||
|
|
||||||
|
export function isDisplayedInWorkflowEditor(
|
||||||
|
parameter: Parameter,
|
||||||
|
): parameter is
|
||||||
|
| WorkflowParameter
|
||||||
|
| ContextParameter
|
||||||
|
| BitwardenCreditCardDataParameter
|
||||||
|
| BitwardenLoginCredentialParameter
|
||||||
|
| BitwardenSensitiveInformationParameter {
|
||||||
|
return (
|
||||||
|
parameter.parameter_type === WorkflowParameterTypes.Workflow ||
|
||||||
|
parameter.parameter_type ===
|
||||||
|
WorkflowParameterTypes.Bitwarden_Login_Credential ||
|
||||||
|
parameter.parameter_type === WorkflowParameterTypes.Context ||
|
||||||
|
parameter.parameter_type ===
|
||||||
|
WorkflowParameterTypes.Bitwarden_Sensitive_Information ||
|
||||||
|
parameter.parameter_type ===
|
||||||
|
WorkflowParameterTypes.Bitwarden_Credit_Card_Data
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export type Parameter =
|
export type Parameter =
|
||||||
| WorkflowParameter
|
| WorkflowParameter
|
||||||
@@ -101,6 +136,7 @@ export type Parameter =
|
|||||||
| ContextParameter
|
| ContextParameter
|
||||||
| BitwardenLoginCredentialParameter
|
| BitwardenLoginCredentialParameter
|
||||||
| BitwardenSensitiveInformationParameter
|
| BitwardenSensitiveInformationParameter
|
||||||
|
| BitwardenCreditCardDataParameter
|
||||||
| AWSSecretParameter;
|
| AWSSecretParameter;
|
||||||
|
|
||||||
export type WorkflowBlock =
|
export type WorkflowBlock =
|
||||||
@@ -155,6 +191,17 @@ export function isTaskVariantBlock(item: {
|
|||||||
export type WorkflowBlockType =
|
export type WorkflowBlockType =
|
||||||
(typeof WorkflowBlockTypes)[keyof typeof WorkflowBlockTypes];
|
(typeof WorkflowBlockTypes)[keyof typeof WorkflowBlockTypes];
|
||||||
|
|
||||||
|
export const WorkflowEditorParameterTypes = {
|
||||||
|
Workflow: "workflow",
|
||||||
|
Credential: "credential",
|
||||||
|
Secret: "secret",
|
||||||
|
Context: "context",
|
||||||
|
CreditCardData: "creditCardData",
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export type WorkflowEditorParameterType =
|
||||||
|
(typeof WorkflowEditorParameterTypes)[keyof typeof WorkflowEditorParameterTypes];
|
||||||
|
|
||||||
export type WorkflowBlockBase = {
|
export type WorkflowBlockBase = {
|
||||||
label: string;
|
label: string;
|
||||||
block_type: WorkflowBlockType;
|
block_type: WorkflowBlockType;
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ export type ParameterYAML =
|
|||||||
| AWSSecretParameterYAML
|
| AWSSecretParameterYAML
|
||||||
| ContextParameterYAML
|
| ContextParameterYAML
|
||||||
| OutputParameterYAML
|
| OutputParameterYAML
|
||||||
| BitwardenSensitiveInformationParameterYAML;
|
| BitwardenSensitiveInformationParameterYAML
|
||||||
|
| BitwardenCreditCardDataParameterYAML;
|
||||||
|
|
||||||
export type ParameterYAMLBase = {
|
export type ParameterYAMLBase = {
|
||||||
parameter_type: string;
|
parameter_type: string;
|
||||||
@@ -40,9 +41,9 @@ export type BitwardenLoginCredentialParameterYAML = ParameterYAMLBase & {
|
|||||||
parameter_type: "bitwarden_login_credential";
|
parameter_type: "bitwarden_login_credential";
|
||||||
bitwarden_collection_id: string;
|
bitwarden_collection_id: string;
|
||||||
url_parameter_key: string;
|
url_parameter_key: string;
|
||||||
bitwarden_client_id_aws_secret_key: "SKYVERN_BITWARDEN_CLIENT_ID";
|
bitwarden_client_id_aws_secret_key: string;
|
||||||
bitwarden_client_secret_aws_secret_key: "SKYVERN_BITWARDEN_CLIENT_SECRET";
|
bitwarden_client_secret_aws_secret_key: string;
|
||||||
bitwarden_master_password_aws_secret_key: "SKYVERN_BITWARDEN_MASTER_PASSWORD";
|
bitwarden_master_password_aws_secret_key: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type AWSSecretParameterYAML = ParameterYAMLBase & {
|
export type AWSSecretParameterYAML = ParameterYAMLBase & {
|
||||||
@@ -60,6 +61,18 @@ export type BitwardenSensitiveInformationParameterYAML = ParameterYAMLBase & {
|
|||||||
bitwarden_master_password_aws_secret_key: string;
|
bitwarden_master_password_aws_secret_key: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type BitwardenCreditCardDataParameterYAML = ParameterYAMLBase & {
|
||||||
|
parameter_type: "bitwarden_credit_card_data";
|
||||||
|
|
||||||
|
// bitwarden ids for the credit card item
|
||||||
|
bitwarden_collection_id: string;
|
||||||
|
bitwarden_item_id: string;
|
||||||
|
|
||||||
|
bitwarden_client_id_aws_secret_key: string;
|
||||||
|
bitwarden_client_secret_aws_secret_key: string;
|
||||||
|
bitwarden_master_password_aws_secret_key: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type ContextParameterYAML = ParameterYAMLBase & {
|
export type ContextParameterYAML = ParameterYAMLBase & {
|
||||||
parameter_type: "context";
|
parameter_type: "context";
|
||||||
source_parameter_key: string;
|
source_parameter_key: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user