From a0049d488c4e28de50935a096b9cd2a26793e95d Mon Sep 17 00:00:00 2001 From: Bruce Schultz Date: Thu, 5 Feb 2026 07:54:27 +0100 Subject: [PATCH 1/3] refactor(datastore): only add minio config if s3 and private --- .../create/DataStoreProjectInitializer.vue | 47 ++++++++----------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/components/data-stores/create/DataStoreProjectInitializer.vue b/components/data-stores/create/DataStoreProjectInitializer.vue index c35769f5..65166ae1 100644 --- a/components/data-stores/create/DataStoreProjectInitializer.vue +++ b/components/data-stores/create/DataStoreProjectInitializer.vue @@ -10,18 +10,15 @@ import InputGroup from "primevue/inputgroup"; import DataStoreHelpBox from "~/components/data-stores/create/DataStoreHelpBox.vue"; import { HelpTextField } from "~/components/data-stores/create/index"; import { useToast } from "primevue/usetoast"; +import { + type BodyKongInitializeKongInitializePost, + DataStoreType, +} from "~/services/Api"; const props = defineProps({ projects: Array, }); -export interface kongBody { - datastore: object; - project_id: string; - methods: string[]; - ds_type: string; -} - const loading = ref(false); const helpActive = ref(); @@ -33,10 +30,7 @@ const connMsgColor = computed(() => const toast = useToast(); // Project settings -// const availableMethods = ["GET", "POST", "PUT", "DELETE"]; -const dataStoreTypes = ["FHIR", "S3"]; -type allowedDataStoreTypes = (typeof dataStoreTypes)[number]; -const selectedDataStoreType = ref("FHIR"); +const selectedDataStoreType = ref(DataStoreType.Fhir); // S3 settings type allowedBucketAccessPolicies = "Public" | "Private"; @@ -47,8 +41,6 @@ const bucketSecretKey = ref(""); const selectedProject = ref(); -// const selectedAllowedMethods = ref(["GET"]); - const dataStoreSettingsMap: Map = new Map([ ["name", "Project"], ["host", "Server hostname"], @@ -123,6 +115,12 @@ async function onSubmitCreateDataStoreAndProject() { protocol: protocol.value, }; + const configSettings: BodyKongInitializeKongInitializePost = { + datastore: datastoreSettings, + project_id: selectedProject.value.id, + ds_type: selectedDataStoreType.value, + }; + const minioSettings = { minio_access_key: bucketAccessKey.value || "", minio_secret_key: bucketSecretKey.value || "", @@ -132,26 +130,16 @@ async function onSubmitCreateDataStoreAndProject() { // Check settings are filled in let settingsValidated: boolean; settingsValidated = verifyValuesFilled(datastoreSettings); + if ( - selectedDataStoreType.value == "S3" && + selectedDataStoreType.value == DataStoreType.S3 && selectedBucketAccessPolicy.value == "Private" ) { + configSettings.minio_config = minioSettings; settingsValidated = settingsValidated && verifyValuesFilled(minioSettings); } if (settingsValidated) { - const configSettings: kongBody = { - datastore: datastoreSettings, - project_id: selectedProject.value.id, - // methods: selectedAllowedMethods.value, - methods: ["GET"], // Hardcode to GET only to prevent abuse/security issues - ds_type: selectedDataStoreType.value.toLowerCase() as string, - }; - - if (selectedBucketAccessPolicy.value == "Private") { - configSettings["minio_config"] = minioSettings; - } - loading.value = true; const creationResp = await useNuxtApp() .$hubApi("/kong/initialize", { @@ -260,11 +248,14 @@ async function onSubmitCreateDataStoreAndProject() { From 0e393b12441b61f2287a8d2137f8f608b131723c Mon Sep 17 00:00:00 2001 From: Bruce Schultz Date: Thu, 5 Feb 2026 08:34:33 +0100 Subject: [PATCH 3/3] test(datastore): update unit tests to use proper types --- .../create/DataStoreProjectInitializer.spec.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/components/data-stores/create/DataStoreProjectInitializer.spec.ts b/test/components/data-stores/create/DataStoreProjectInitializer.spec.ts index bfa993e4..9c7ff263 100644 --- a/test/components/data-stores/create/DataStoreProjectInitializer.spec.ts +++ b/test/components/data-stores/create/DataStoreProjectInitializer.spec.ts @@ -12,6 +12,7 @@ import { import DataStoreProjectInitializer from "~/components/data-stores/create/DataStoreProjectInitializer.vue"; import { fakeParsedProjects } from "~/test/components/data-stores/constants"; import type { availableProject } from "~/components/data-stores/create/ResourceManagerTabs.vue"; +import { DataStoreType } from "~/services/Api"; describe("DataStoreProjectInitializer.vue", () => { let spy; @@ -114,7 +115,7 @@ describe("DataStoreProjectInitializer.vue", () => { toastDetail: string, server: string = "whonnock", path: string = "/fake/path", - storeType: string = "FHIR", + storeType: DataStoreType = DataStoreType.Fhir, port: string = "80", protocol: string = "http", // methods?: string[], @@ -148,7 +149,9 @@ describe("DataStoreProjectInitializer.vue", () => { // Set data store type wrapper.vm.selectedDataStoreType = storeType; await wrapper.vm.$nextTick(); - expect(wrapper.find(".data-store-type-input span").text()).toBe(storeType); + expect( + wrapper.find(".data-store-type-input span").text().toLowerCase(), + ).toBe(storeType); // Set port const portWrapper = wrapper.find(".data-store-port-input"); @@ -218,7 +221,7 @@ describe("DataStoreProjectInitializer.vue", () => { wrapper.findComponent(".bucket-access-policy-radio").exists(), ).toBeFalsy(); // Starts on FHIR so should not be in view const select = wrapper.findComponent(".data-store-type-picker"); - await select.vm.$emit("update:modelValue", "S3"); // Simulate the S3 option being clicked + await select.vm.$emit("update:modelValue", DataStoreType.S3); // Simulate the S3 option being clicked await wrapper.vm.$nextTick(); expect(wrapper.find(".bucket-access-policy-radio").exists()).toBe(true); // Check radio options exist now