diff --git a/backend/src/controllers/v1/integrationController.ts b/backend/src/controllers/v1/integrationController.ts index 91b32c805..431b9f80f 100644 --- a/backend/src/controllers/v1/integrationController.ts +++ b/backend/src/controllers/v1/integrationController.ts @@ -27,7 +27,8 @@ export const createIntegration = async (req: Request, res: Response) => { owner, path, region, - secretPath + secretPath, + secretGroup } = req.body; const folders = await Folder.findOne({ @@ -61,6 +62,7 @@ export const createIntegration = async (req: Request, res: Response) => { path, region, secretPath, + secretGroup, integration: req.integrationAuth.integration, integrationAuth: new Types.ObjectId(integrationAuthId) }).save(); diff --git a/backend/src/integrations/sync.ts b/backend/src/integrations/sync.ts index 2ba9ab60f..0d9a5cbd7 100644 --- a/backend/src/integrations/sync.ts +++ b/backend/src/integrations/sync.ts @@ -2109,6 +2109,7 @@ const syncSecretsCodefresh = async ({ } ); }; + /* Sync/push [secrets] to Northflank * @param {Object} obj * @param {IIntegration} obj.integration - integration details diff --git a/backend/src/models/integration.ts b/backend/src/models/integration.ts index 6e3e82694..8400ab819 100644 --- a/backend/src/models/integration.ts +++ b/backend/src/models/integration.ts @@ -168,6 +168,7 @@ const integrationSchema = new Schema( default: "/", }, secretGroup: { + // northflank-specific service type: String, default: null, }, diff --git a/backend/src/routes/v1/integration.ts b/backend/src/routes/v1/integration.ts index 1820f4bb8..f2685c3f6 100644 --- a/backend/src/routes/v1/integration.ts +++ b/backend/src/routes/v1/integration.ts @@ -37,6 +37,7 @@ router.post( body("owner").trim(), body("path").trim(), body("region").trim(), + body("secretGroup").isString().trim(), validateRequest, integrationController.createIntegration ); diff --git a/frontend/public/data/frequentConstants.ts b/frontend/public/data/frequentConstants.ts index d4c0aa729..c2c9e5c9a 100644 --- a/frontend/public/data/frequentConstants.ts +++ b/frontend/public/data/frequentConstants.ts @@ -22,7 +22,8 @@ const integrationSlugNameMapping: Mapping = { "hashicorp-vault": "Vault", "cloudflare-pages": "Cloudflare Pages", "codefresh": "Codefresh", - bitbucket: "BitBucket" + bitbucket: "BitBucket", + northflank: "Northflank" }; const envMapping: Mapping = { diff --git a/frontend/public/images/integrations/Northflank.png b/frontend/public/images/integrations/Northflank.png new file mode 100644 index 000000000..f2d94060b Binary files /dev/null and b/frontend/public/images/integrations/Northflank.png differ diff --git a/frontend/src/pages/api/integrations/createIntegration.ts b/frontend/src/pages/api/integrations/createIntegration.ts index 78e463f49..31a3a4288 100644 --- a/frontend/src/pages/api/integrations/createIntegration.ts +++ b/frontend/src/pages/api/integrations/createIntegration.ts @@ -4,7 +4,7 @@ interface Props { integrationAuthId: string; isActive: boolean; secretPath: string; - secretGroup: string; + secretGroup?: string; app: string | null; appId: string | null; sourceEnvironment: string; diff --git a/frontend/src/pages/integrations/northflank/create.tsx b/frontend/src/pages/integrations/northflank/create.tsx index d6c0d8905..7ffd7151a 100644 --- a/frontend/src/pages/integrations/northflank/create.tsx +++ b/frontend/src/pages/integrations/northflank/create.tsx @@ -33,7 +33,7 @@ export default function NorthflankCreateIntegrationPage() { const [secretPath, setSecretPath] = useState("/"); const [targetApp, setTargetApp] = useState(""); const [secretGroupList, setSecretGroupList] = useState([]); - const [targetSecretGroup, setTargetSecretGroup] = useState(""); + const [targetSecretGroup, setTargetSecretGroup] = useState(""); const [isLoading, setIsLoading] = useState(false); @@ -57,10 +57,13 @@ export default function NorthflankCreateIntegrationPage() { if (integrationAuthApps) { if (integrationAuthApps.length > 0) { const selectedApp = integrationAuthApps?.filter((integrationAuthApp) => integrationAuthApp.name === targetApp); - setSecretGroupList(selectedApp[0].secretGroups); - setTargetSecretGroup(selectedApp[0]?.secretGroups[0]); - } else { - setTargetSecretGroup("none"); + if (selectedApp.length > 0) { + setSecretGroupList(selectedApp[0].secretGroups); + setTargetSecretGroup(selectedApp[0]?.secretGroups[0]); + } else { + setSecretGroupList([]); + setTargetSecretGroup("none"); + } } } }, [targetApp]) @@ -169,7 +172,7 @@ export default function NorthflankCreateIntegrationPage() { )) ) : ( - + No secret groups found )} @@ -180,7 +183,7 @@ export default function NorthflankCreateIntegrationPage() { color="mineshaft" className="mt-4" isLoading={isLoading} - isDisabled={integrationAuthApps.length === 0} + isDisabled={integrationAuthApps.length === 0 && secretGroupList === 0} > Create Integration diff --git a/package.json b/package.json index e85b46477..80f12205e 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ ] }, "devDependencies": { - "@types/picomatch": "^2.3.0", "eslint": "^8.29.0", "husky": "^8.0.2" }