From 1d0816ea4fcdfd5baa9f9aa711300b419eba2f16 Mon Sep 17 00:00:00 2001
From: 2427021 <s.a.vink@students.uu.nl>
Date: Fri, 13 Oct 2023 11:39:51 +0200
Subject: [PATCH] feat(databaseConnection): added database testing
 functionality

---
 .../navbar/AddDatabaseForm/mockDatabases.ts   |  70 +++
 .../AddDatabaseForm/newdatabaseform.tsx       | 507 +++++++++++-------
 apps/web/src/favicon.ico                      | Bin 15086 -> 33674 bytes
 libs/shared/lib/data-access/api/database.ts   |  22 +-
 4 files changed, 398 insertions(+), 201 deletions(-)
 create mode 100644 apps/web/src/components/navbar/AddDatabaseForm/mockDatabases.ts

diff --git a/apps/web/src/components/navbar/AddDatabaseForm/mockDatabases.ts b/apps/web/src/components/navbar/AddDatabaseForm/mockDatabases.ts
new file mode 100644
index 000000000..8d6d868e7
--- /dev/null
+++ b/apps/web/src/components/navbar/AddDatabaseForm/mockDatabases.ts
@@ -0,0 +1,70 @@
+import { DatabaseType } from '@graphpolaris/shared/lib/data-access';
+
+export const mockDatabases = [
+  {
+    name: 'Recommendations',
+    subtitle: 'Hosted by Neo4j',
+    username: 'recommendations',
+    password: 'recommendations',
+    url: 'demo.neo4jlabs.com',
+    port: 7687,
+    protocol: 'neo4j+s://',
+    internal_database_name: 'recommendations',
+    type: DatabaseType.Neo4j,
+  },
+  {
+    name: 'Movies',
+    subtitle: 'Hosted by Neo4j',
+    username: 'movies',
+    password: 'movies',
+    url: 'demo.neo4jlabs.com',
+    port: 7687,
+    protocol: 'neo4j+s://',
+    internal_database_name: 'movies',
+    type: DatabaseType.Neo4j,
+  },
+  {
+    name: 'Northwind',
+    subtitle: 'Hosted by Neo4j',
+    username: 'northwind',
+    password: 'northwind',
+    url: 'demo.neo4jlabs.com',
+    port: 7687,
+    protocol: 'neo4j://',
+    internal_database_name: 'northwind',
+    type: DatabaseType.Neo4j,
+  },
+  {
+    name: 'Fincen',
+    subtitle: 'Hosted by Neo4j',
+    username: 'fincen',
+    password: 'fincen',
+    url: 'demo.neo4jlabs.com',
+    port: 7687,
+    protocol: 'neo4j://',
+    internal_database_name: 'fincen',
+    type: DatabaseType.Neo4j,
+  },
+  {
+    name: 'Slack',
+    subtitle: 'Hosted by Neo4j',
+    username: 'slack',
+    password: 'slack',
+    url: 'demo.neo4jlabs.com',
+    port: 7687,
+    protocol: 'neo4j://',
+    internal_database_name: 'slack',
+    type: DatabaseType.Neo4j,
+  },
+  {
+    name: 'Game of Thrones',
+    subtitle: 'Hosted by Neo4j',
+    username: 'gameofthrones',
+    password: 'gameofthrones',
+    url: 'demo.neo4jlabs.com',
+    port: 7687,
+    protocol: 'neo4j://',
+    internal_database_name: 'gameofthrones',
+    type: DatabaseType.Neo4j,
+  },
+];
diff --git a/apps/web/src/components/navbar/AddDatabaseForm/newdatabaseform.tsx b/apps/web/src/components/navbar/AddDatabaseForm/newdatabaseform.tsx
index 45289f807..57418e0dc 100644
--- a/apps/web/src/components/navbar/AddDatabaseForm/newdatabaseform.tsx
+++ b/apps/web/src/components/navbar/AddDatabaseForm/newdatabaseform.tsx
@@ -10,45 +10,61 @@ import {
 import React, { useEffect, useRef, useState } from 'react';
 import { RequiredInput } from './requiredinput';
 import { addError } from '@graphpolaris/shared/lib/data-access/store/configSlice';
+import { ArrowBack, ErrorOutline } from '@mui/icons-material';
+import { mockDatabases } from './mockDatabases';
+
+const INITIAL_DB_STATE = {
+  username: 'neo4j',
+  password: 'DevOnlyPass',
+  url: 'localhost',
+  port: 7687,
+  name: 'neo4j',
+  protocol: 'neo4j://',
+  internal_database_name: 'neo4j',
+  type: DatabaseType.Neo4j,
+};
+
+interface Connection {
+  connecting: boolean;
+  status: null | string;
+  verified: boolean | null;
+}
 
 export const NewDatabaseForm = (props: { onClose(): void; open: boolean }) => {
   const dispatch = useAppDispatch();
   const ref = useRef<HTMLDialogElement>(null);
-  const [state, setState] = useState<AddDatabaseRequest>({
-    // username: 'root',
-    // password: 'DikkeDraak',
-    // url: 'https://datastrophe.science.uu.nl/',
-    // port: 8529,
-    // name: 'Tweede Kamer Dataset',
-    // internal_database_name: 'TweedeKamer',
-    // type: DatabaseType.ArangoDB,
-
-    // username: 'neo4j',
-    // password: 'oL3nNlebrx4le2A0zxaFVqAo3HAvodHxwEiI_7_2JxI',
-    // url: '635176c8.databases.neo4j.io',
-    // port: 7687,
-    // name: 'neo4j',
-    // internal_database_name: 'neo4j',
-    // type: DatabaseType.Neo4j,
-
-    username: 'neo4j',
-    password: 'DevOnlyPass',
-    url: 'localhost',
-    port: 7687,
-    name: 'neo4j',
-    protocol: 'neo4j://',
-    internal_database_name: 'neo4j',
-    type: DatabaseType.Neo4j,
-  });
+  const [state, setState] = useState<AddDatabaseRequest>(INITIAL_DB_STATE);
   const api = useDatabaseAPI();
   const schemaApi = useSchemaAPI();
   const [hasError, setHasError] = useState({});
+  const [sampleData, setSampleData] = useState<boolean | null>(false);
+  const [connection, setConnection] = useState<Connection>({
+    connecting: false,
+    status: null,
+    verified: null,
+  });
 
   useEffect(() => {
     if (props.open) ref.current?.showModal();
     else ref.current?.close();
   }, [props.open]);
 
+  useEffect(() => {
+    function handleOverlayClick(event: MouseEvent) {
+      if (event.target === ref.current) {
+        closeDialog();
+      }
+    }
+
+    if (props.open) {
+      ref.current?.addEventListener('click', handleOverlayClick);
+    }
+
+    return () => {
+      ref.current?.removeEventListener('click', handleOverlayClick);
+    };
+  }, [props.open]);
+
   useEffect(() => {
     if (!state) return;
     if (state.type === DatabaseType.ArangoDB && state.port === 7687) {
@@ -58,203 +74,294 @@ export const NewDatabaseForm = (props: { onClose(): void; open: boolean }) => {
     }
   }, [state.type]);
 
-  /**
-   * Validates if the port value is numerical. Only then will the state be updated.
-   * @param port The new port value.
-   */
-  function handlePortChanged(port: string): void {
-    if (!isNaN(Number(port))) setState({ ...state, port: Number(port) });
+  function handleInputChange(field: string, value: unknown) {
+    setState({
+      ...state,
+      [field]: value,
+    });
   }
 
-  /** Handles the submit button click. Calls the onSubmit in the props with all the fields. */
-  function handleSubmitClicked(): void {
-    if (!Object.values(hasError).some((e) => e === true)) {
+  async function testDatabaseConnection() {
+    setConnection(() => ({
+      connecting: true,
+      status: 'Verifying database connection',
+      verified: null,
+    }));
+
+    try {
       api
-        .AddDatabase(state, { updateDatabaseCache: true, setAsCurrent: true })
-        .then(() => {
-          schemaApi.RequestSchema(state.name);
+        .TestDatabaseConnection(state)
+        .then((res: any) => {
+          setConnection((prevState) => ({
+            ...prevState,
+            status: res.message,
+            verified: res.verified,
+          }));
         })
-        .catch((e) => {
-          dispatch(addError(e.message));
+        .catch((error) => {
+          setConnection((prevState) => ({
+            ...prevState,
+            connecting: false,
+            status: 'Database connection failed',
+            verified: false,
+          }));
         });
-      props.onClose();
+    } catch (e) {
+      setConnection((prevState) => ({
+        ...prevState,
+        status: 'Database connection failed',
+        verified: false,
+      }));
     }
   }
 
+  function loadMockDatabase({ username, password, url, port, name, protocol, internal_database_name, type }: AddDatabaseRequest) {
+    setState((prevState) => ({
+      ...prevState,
+      username,
+      password,
+      url,
+      port,
+      name,
+      protocol,
+      internal_database_name,
+      type,
+    }));
+    setSampleData(false);
+  }
+
+  function handlePortChanged(port: string): void {
+    if (!isNaN(Number(port))) setState({ ...state, port: Number(port) });
+  }
+
+  useEffect(() => {
+    if (connection.verified === true) {
+      try {
+        api
+          .AddDatabase(state, { updateDatabaseCache: true, setAsCurrent: true })
+          .then(() => {
+            schemaApi.RequestSchema(state.name);
+          })
+          .catch((e) => {
+            dispatch(addError(e.message));
+          });
+      } catch (e: any) {
+        dispatch(addError(e.message));
+      } finally {
+        closeDialog();
+      }
+    }
+  }, [connection.verified]);
+
+  function closeDialog(): void {
+    setConnection({
+      connecting: false,
+      status: null,
+      verified: null,
+    });
+    setState(INITIAL_DB_STATE);
+    setSampleData(false);
+    props.onClose();
+    ref.current?.close();
+  }
+
   return (
     <dialog ref={ref}>
       <form
         className="card flex gap-4 p-4 rounded-sm"
         onSubmit={(event: React.FormEvent) => {
           event.preventDefault();
-          handleSubmitClicked();
+          testDatabaseConnection();
         }}
       >
-        <h1 className="card-title">New Database</h1>
-        <RequiredInput
-          errorText="This field is required"
-          label="Name of the database"
-          placeHolder="neo4j"
-          value={state.name}
-          validate={(v) => {
-            setHasError({ ...hasError, name: v.length === 0 });
-            return v.length > 0;
-          }}
-          onChange={(value) =>
-            setState({
-              ...state,
-              name: value,
-            })
-          }
-          type="text"
-        />
-
-        <RequiredInput
-          errorText="This field is required"
-          label="Internal database name"
-          placeHolder="internal_database_name"
-          value={state.internal_database_name}
-          validate={(v) => {
-            setHasError({ ...hasError, internal_database_name: v.length === 0 });
-            return v.length > 0;
-          }}
-          onChange={(value) =>
-            setState({
-              ...state,
-              internal_database_name: value,
-            })
-          }
-          type="internalDatabaseName"
-        />
+        <div className="flex justify-between align-center">
+          <h1 className="card-title">New Database</h1>
+          <div>
+            {sampleData ? (
+              <button className="btn" onClick={() => setSampleData(false)}>
+                <ArrowBack />
+                Go back
+              </button>
+            ) : (
+              <>
+                <h1 className="font-light text-xs">No data?</h1>
+                <p className="font-light text-sm cursor-pointer underline" onClick={() => setSampleData(true)}>
+                  Try sample data
+                </p>
+              </>
+            )}
+          </div>
+        </div>
 
-        <div className="flex w-full gap-2">
-          <div className="w-full">
-            <label className="label">
-              <span className="label-text">Database Type</span>
-            </label>
-            <select
-              className="select select-bordered w-full max-w-xs"
-              value={databaseNameMapping[state.type]}
-              onChange={(event) => {
-                setState({
-                  ...state,
-                  type: databaseNameMapping.indexOf(event.currentTarget.value),
-                });
-              }}
-            >
-              {databaseNameMapping.map((dbName) => (
-                <option value={dbName} key={dbName}>
-                  {dbName}
-                </option>
-              ))}
-            </select>
+        {sampleData ? (
+          <div className="grid grid-cols-3 gap-2">
+            {mockDatabases.map((sample) => (
+              <div key={sample.name} className="card hover:bg-base-100 cursor-pointer mb-2 border" onClick={() => loadMockDatabase(sample)}>
+                <div className="card-body">
+                  <h2 className="card-title">{sample.name}</h2>
+                  <p className="font-light text-slate-400">{sample.subtitle}</p>
+                </div>
+              </div>
+            ))}
           </div>
-          <div className="w-full">
-            <label className="label">
-              <span className="label-text">Database Protocol</span>
-            </label>
-            <select
-              className="select select-bordered w-full max-w-xs"
-              value={state.protocol}
-              onChange={(event) => {
-                setState({
-                  ...state,
-                  protocol: event.currentTarget.value,
-                });
+        ) : (
+          <>
+            <RequiredInput
+              errorText="This field is required"
+              label="Name of the database"
+              placeHolder="neo4j"
+              value={state.name}
+              validate={(v) => {
+                setHasError({ ...hasError, name: v.length === 0 });
+                return v.length > 0;
               }}
-            >
-              {databaseProtocolMapping.map((protocol) => (
-                <option value={protocol} key={protocol}>
-                  {protocol}
-                </option>
-              ))}
-            </select>
-          </div>
-        </div>
+              onChange={(value) => handleInputChange('name', value)}
+              type="text"
+            />
 
-        <div className="flex w-full gap-2">
-          <RequiredInput
-            errorText="This field is required"
-            label="Hostname/IP"
-            placeHolder="neo4j"
-            value={state.url}
-            validate={(v) => {
-              setHasError({ ...hasError, url: v.length === 0 });
-              return v.length > 0;
-            }}
-            onChange={(value) =>
-              setState({
-                ...state,
-                url: value,
-              })
-            }
-            type="hostname"
-          />
+            <RequiredInput
+              errorText="This field is required"
+              label="Internal database name"
+              placeHolder="internal_database_name"
+              value={state.internal_database_name}
+              validate={(v) => {
+                setHasError({ ...hasError, internal_database_name: v.length === 0 });
+                return v.length > 0;
+              }}
+              onChange={(value) => handleInputChange('internal_database_name', value)}
+              type="internalDatabaseName"
+            />
 
-          <RequiredInput
-            errorText="Must be between 1 and 9999"
-            label="Port"
-            placeHolder="neo4j"
-            value={state.port}
-            validate={(v) => {
-              setHasError({ ...hasError, port: !(v <= 9999 && v > 0) });
-              return v <= 9999 && v > 0;
-            }}
-            onChange={(value) => handlePortChanged(value)}
-            type="port"
-          />
-        </div>
+            <div className="flex w-full gap-2">
+              <div className="w-full">
+                <label className="label">
+                  <span className="label-text">Database Type</span>
+                </label>
+                <select
+                  className="select select-bordered w-full max-w-xs"
+                  value={databaseNameMapping[state.type]}
+                  onChange={(event) => {
+                    setState({
+                      ...state,
+                      type: databaseNameMapping.indexOf(event.currentTarget.value),
+                    });
+                  }}
+                >
+                  {databaseNameMapping.map((dbName) => (
+                    <option value={dbName} key={dbName}>
+                      {dbName}
+                    </option>
+                  ))}
+                </select>
+              </div>
+              <div className="w-full">
+                <label className="label">
+                  <span className="label-text">Database Protocol</span>
+                </label>
+                <select
+                  className="select select-bordered w-full max-w-xs"
+                  value={state.protocol}
+                  onChange={(event) => {
+                    setState({
+                      ...state,
+                      protocol: event.currentTarget.value,
+                    });
+                  }}
+                >
+                  {databaseProtocolMapping.map((protocol) => (
+                    <option value={protocol} key={protocol}>
+                      {protocol}
+                    </option>
+                  ))}
+                </select>
+              </div>
+            </div>
 
-        <div className="flex w-full gap-2">
-          <RequiredInput
-            errorText="This field is required"
-            label="Username"
-            placeHolder="username"
-            value={state.username}
-            validate={(v) => {
-              setHasError({ ...hasError, username: v.length === 0 });
-              return v.length > 0;
-            }}
-            onChange={(value) =>
-              setState({
-                ...state,
-                username: value,
-              })
-            }
-            type="text"
-          />
-          <RequiredInput
-            errorText="This field is required"
-            label="Password"
-            placeHolder="password"
-            value={state.password}
-            validate={(v) => {
-              setHasError({ ...hasError, password: v.length === 0 });
-              return v.length > 0;
-            }}
-            onChange={(value) =>
-              setState({
-                ...state,
-                password: value,
-              })
-            }
-            type="password"
-          />
-        </div>
+            <div className="flex w-full gap-2">
+              <RequiredInput
+                errorText="This field is required"
+                label="Hostname/IP"
+                placeHolder="neo4j"
+                value={state.url}
+                validate={(v) => {
+                  setHasError({ ...hasError, url: v.length === 0 });
+                  return v.length > 0;
+                }}
+                onChange={(value) => handleInputChange('url', value)}
+                type="hostname"
+              />
 
-        <div className="card-actions w-full justify-center">
-          <button className={`btn btn-primary ${Object.values(hasError).some((e) => e === true) ? 'btn-disabled' : ''}`}>Submit</button>
-          <button
-            className="btn btn-outline"
-            onClick={(e) => {
-              e.preventDefault();
-              e.stopPropagation();
-              props.onClose();
-            }}
-          >
-            Cancel
-          </button>
-        </div>
+              <RequiredInput
+                errorText="Must be between 1 and 9999"
+                label="Port"
+                placeHolder="neo4j"
+                value={state.port}
+                validate={(v) => {
+                  setHasError({ ...hasError, port: !(v <= 9999 && v > 0) });
+                  return v <= 9999 && v > 0;
+                }}
+                onChange={(value) => handlePortChanged(value)}
+                type="port"
+              />
+            </div>
+
+            <div className="flex w-full gap-2">
+              <RequiredInput
+                errorText="This field is required"
+                label="Username"
+                placeHolder="username"
+                value={state.username}
+                validate={(v) => {
+                  setHasError({ ...hasError, username: v.length === 0 });
+                  return v.length > 0;
+                }}
+                onChange={(value) => handleInputChange('username', value)}
+                type="text"
+              />
+              <RequiredInput
+                errorText="This field is required"
+                label="Password"
+                placeHolder="password"
+                value={state.password}
+                validate={(v) => {
+                  setHasError({ ...hasError, password: v.length === 0 });
+                  return v.length > 0;
+                }}
+                onChange={(value) => handleInputChange('password', value)}
+                type="password"
+              />
+            </div>
+
+            {!(connection.status === null) && (
+              <div className={`flex flex-col justify-center items-center`}>
+                <div className="flex justify-center items-center">
+                  {connection.verified === false && <ErrorOutline className="text-slate-400" />}
+                  <p className="font-light text-sm	text-slate-400	">{connection.status}</p>
+                </div>
+                {connection.verified === null && <progress className="progress w-56"></progress>}
+              </div>
+            )}
+            <div className="card-actions w-full justify-center items-center">
+              <button
+                className={`btn btn-primary ${Object.values(hasError).some((e) => e === true) ? 'btn-disabled' : ''}`}
+                type="button"
+                disabled={connection.connecting || Object.values(hasError).some((e) => e === true)}
+                onClick={testDatabaseConnection}
+              >
+                {connection.connecting ? 'Connecting...' : 'Connect'}
+              </button>
+
+              <button
+                className="btn btn-outline"
+                onClick={() => {
+                  closeDialog();
+                }}
+              >
+                Cancel
+              </button>
+            </div>
+          </>
+        )}
       </form>
     </dialog>
   );
diff --git a/apps/web/src/favicon.ico b/apps/web/src/favicon.ico
index 317ebcb2336e0833a22dddf0ab287849f26fda57..a2bfa7f2cf83af624fcaff27ccf20f10b4f1aa00 100644
GIT binary patch
literal 33674
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

literal 15086
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
X*GBfq^a!*Sks)$E_17kl@BRM)`^nwN

diff --git a/libs/shared/lib/data-access/api/database.ts b/libs/shared/lib/data-access/api/database.ts
index 546c173ad..02f645993 100644
--- a/libs/shared/lib/data-access/api/database.ts
+++ b/libs/shared/lib/data-access/api/database.ts
@@ -119,5 +119,25 @@ export const useDatabaseAPI = () => {
     });
   }
 
-  return { DatabaseType, AddDatabase, GetAllDatabases, DeleteDatabase };
+  function TestDatabaseConnection(request: AddDatabaseRequest): Promise<void> {
+    return new Promise((resolve, reject) => {
+      fetch(`${domain}${useruri}/database/test-connection`, {
+        method: 'POST',
+        credentials: 'same-origin',
+        headers: new Headers({
+          Authorization: 'Bearer ' + accessToken,
+        }),
+        body: JSON.stringify(request),
+      })
+        .then((response: Response) => {
+          if (!response.ok) {
+            reject(response.statusText);
+          }
+          resolve(response.json());
+        })
+        .catch(reject);
+    });
+  }
+
+  return { DatabaseType, AddDatabase, GetAllDatabases, DeleteDatabase, TestDatabaseConnection };
 };
-- 
GitLab