Skip to content

Commit 279f877

Browse files
committed
wip: migrating some data sources code to data connectors
1 parent 3023ef9 commit 279f877

File tree

7 files changed

+779
-41
lines changed

7 files changed

+779
-41
lines changed
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
/*!
2+
* Copyright 2024 - Swiss Data Science Center (SDSC)
3+
* A partnership between École Polytechnique Fédérale de Lausanne (EPFL) and
4+
* Eidgenössische Technische Hochschule Zürich (ETHZ).
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
import cx from "classnames";
20+
import { useCallback, useEffect } from "react";
21+
import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from "reactstrap";
22+
import { XLg } from "react-bootstrap-icons";
23+
24+
import { RtkErrorAlert } from "../../../components/errors/RtkErrorAlert";
25+
import {
26+
useDeleteDataConnectorsByDataConnectorIdSecretsMutation,
27+
usePostDataConnectorsByDataConnectorIdSecretsMutation,
28+
} from "../../projectsV2/api/projectV2.enhanced-api";
29+
import type { DataConnectorRead } from "../../projectsV2/api/data-connectors.api";
30+
import type { SessionStartCloudStorageConfiguration } from "../../sessionsV2/startSessionOptionsV2.types";
31+
import DataConnectorSecretsModal from "../../sessionsV2/DataConnectorSecretsModal";
32+
33+
import useDataConnectorConfiguration from "./useDataConnectorConfiguration.hook";
34+
import { Loader } from "../../../components/Loader";
35+
36+
interface DataSourceCredentialsModalProps {
37+
isOpen: boolean;
38+
setOpen: (isOpen: boolean) => void;
39+
dataConnector: DataConnectorRead;
40+
}
41+
export default function DataSourceCredentialsModal({
42+
isOpen,
43+
dataConnector,
44+
setOpen,
45+
}: DataSourceCredentialsModalProps) {
46+
const { dataConnectorConfigs } = useDataConnectorConfiguration({
47+
dataConnectors: [dataConnector],
48+
});
49+
50+
const [saveCredentials, saveCredentialsResult] =
51+
usePostDataConnectorsByDataConnectorIdSecretsMutation();
52+
const [deleteCredentials, deleteCredentialsResult] =
53+
useDeleteDataConnectorsByDataConnectorIdSecretsMutation();
54+
55+
const onSave = useCallback(
56+
(configs: SessionStartCloudStorageConfiguration[]) => {
57+
const activeConfigs = configs.filter((c) => c.active);
58+
if (activeConfigs.length === 0) {
59+
if (!deleteCredentialsResult.isUninitialized) return;
60+
deleteCredentials({ dataConnectorId: dataConnector.id });
61+
return;
62+
}
63+
if (!saveCredentialsResult.isUninitialized) return;
64+
const config = configs[0];
65+
saveCredentials({
66+
dataConnectorId: dataConnector.id,
67+
cloudStorageSecretPostList: Object.entries(
68+
config.sensitiveFieldValues
69+
).map(([key, value]) => ({
70+
name: key,
71+
value,
72+
})),
73+
});
74+
},
75+
[
76+
deleteCredentials,
77+
deleteCredentialsResult,
78+
dataConnector,
79+
saveCredentials,
80+
saveCredentialsResult,
81+
]
82+
);
83+
84+
useEffect(() => {
85+
if (deleteCredentialsResult.isSuccess || saveCredentialsResult.isSuccess) {
86+
setOpen(false);
87+
}
88+
}, [deleteCredentialsResult, saveCredentialsResult.isSuccess, setOpen]);
89+
if (!isOpen) return null;
90+
91+
if (
92+
dataConnector.storage.sensitive_fields == null ||
93+
dataConnector.storage.sensitive_fields.length === 0
94+
) {
95+
return (
96+
<Modal
97+
centered
98+
data-cy="cloud-storage-credentials-not-needed-modal"
99+
isOpen={isOpen}
100+
size="lg"
101+
>
102+
<ModalHeader className={cx("fw-bold")}>
103+
No credentials required
104+
</ModalHeader>
105+
<ModalBody>
106+
This data source does not require any credentials.
107+
</ModalBody>
108+
<ModalFooter>
109+
<Button
110+
className="btn-outline-rk-green"
111+
onClick={() => setOpen(false)}
112+
>
113+
<XLg className={cx("bi", "me-1")} />
114+
Close
115+
</Button>
116+
</ModalFooter>
117+
</Modal>
118+
);
119+
}
120+
121+
if (
122+
(!saveCredentialsResult.isUninitialized &&
123+
saveCredentialsResult.error != null) ||
124+
(!deleteCredentialsResult.isUninitialized &&
125+
deleteCredentialsResult.error != null)
126+
) {
127+
const error = saveCredentialsResult.error || deleteCredentialsResult.error;
128+
return (
129+
<Modal
130+
centered
131+
data-cy="cloud-storage-credentials-error-modal"
132+
isOpen={isOpen}
133+
size="lg"
134+
>
135+
<ModalHeader className={cx("fw-bold")}>
136+
Cloud Storage Credentials Update Error
137+
</ModalHeader>
138+
<ModalBody>
139+
<RtkErrorAlert error={error} />
140+
</ModalBody>
141+
<ModalFooter>
142+
<Button
143+
className="btn-outline-rk-green"
144+
onClick={() => setOpen(false)}
145+
>
146+
<XLg className={cx("bi", "me-1")} />
147+
Close
148+
</Button>
149+
</ModalFooter>
150+
</Modal>
151+
);
152+
}
153+
154+
if (saveCredentialsResult.isLoading) {
155+
return (
156+
<Modal
157+
centered
158+
data-cy="cloud-storage-credentials-modal"
159+
isOpen={isOpen}
160+
size="lg"
161+
>
162+
<ModalHeader className={cx("fw-bold")}>
163+
Saving Cloud Storage Credentials
164+
</ModalHeader>
165+
<ModalBody>
166+
<Loader />
167+
</ModalBody>
168+
</Modal>
169+
);
170+
}
171+
172+
if (deleteCredentialsResult.isLoading) {
173+
return (
174+
<Modal
175+
centered
176+
data-cy="cloud-storage-credentials-modal"
177+
isOpen={isOpen}
178+
size="lg"
179+
>
180+
<ModalHeader className={cx("fw-bold")}>
181+
Clearing Cloud Storage Credentials
182+
</ModalHeader>
183+
<ModalBody>
184+
<Loader />
185+
</ModalBody>
186+
</Modal>
187+
);
188+
}
189+
190+
return (
191+
<DataConnectorSecretsModal
192+
dataConnectorConfigs={dataConnectorConfigs}
193+
context="storage"
194+
isOpen={isOpen}
195+
onCancel={() => setOpen(false)}
196+
onStart={onSave}
197+
/>
198+
);
199+
}

0 commit comments

Comments
 (0)