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