Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 27 additions & 28 deletions components/data-stores/create/DataStoreProjectInitializer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand All @@ -33,10 +30,13 @@ 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<allowedDataStoreTypes>("FHIR");
const dataStoreTypeOptions = computed(() =>
Object.values(DataStoreType).map((type) => ({
label: type.toUpperCase(),
value: type,
})),
);
const selectedDataStoreType = ref<DataStoreType>(DataStoreType.Fhir);

// S3 settings
type allowedBucketAccessPolicies = "Public" | "Private";
Expand All @@ -47,8 +47,6 @@ const bucketSecretKey = ref<string>("");

const selectedProject = ref();

// const selectedAllowedMethods = ref(["GET"]);

const dataStoreSettingsMap: Map<string, string> = new Map([
["name", "Project"],
["host", "Server hostname"],
Expand Down Expand Up @@ -123,6 +121,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 || "",
Expand All @@ -132,26 +136,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", {
Expand Down Expand Up @@ -260,11 +254,16 @@ async function onSubmitCreateDataStoreAndProject() {
</InputGroupAddon>
<Select
v-model="selectedDataStoreType"
:options="dataStoreTypes"
:options="dataStoreTypeOptions"
optionLabel="label"
optionValue="value"
class="data-store-type-picker"
/>
</InputGroup>
<div v-if="selectedDataStoreType == 'S3'" class="s3-name-fields">
<div
v-if="selectedDataStoreType == DataStoreType.S3"
class="s3-name-fields"
>
<InputGroup class="data-store-path-input-s3">
<InputGroupAddon class="data-store-field-name">
<i class="pi pi-inbox"></i>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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[],
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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

Expand Down