Skip to content

Commit d53ba43

Browse files
Backend connection config (#1060)
* Make all usercredential params are non-required * Add uri in backend_config_api * backend api connection * Handle string null in source_api_list API * config changes * few more changes * Handle usercredential None while backend connection config * bloom url * schema_visulization api issue fixed * handle creds sending * code refactring for API's * console issue * chat-history --------- Co-authored-by: Pravesh Kumar <121786590+praveshkumar1988@users.noreply.github.com>
1 parent 4b831df commit d53ba43

File tree

18 files changed

+240
-314
lines changed

18 files changed

+240
-314
lines changed

backend/score.py

Lines changed: 66 additions & 58 deletions
Large diffs are not rendered by default.

backend/src/graph_query.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ def get_graphDB_driver(uri, username, password,database="neo4j"):
1616
"""
1717
try:
1818
logging.info(f"Attempting to connect to the Neo4j database at {uri}")
19+
if all(v is None for v in [username, password]):
20+
username= os.getenv('NEO4J_USERNAME')
21+
database= os.getenv('NEO4J_DATABASE')
22+
password= os.getenv('NEO4J_PASSWORD')
23+
1924
enable_user_agent = os.environ.get("ENABLE_USER_AGENT", "False").lower() in ("true", "1", "yes")
2025
if enable_user_agent:
2126
driver = GraphDatabase.driver(uri, auth=(username, password),database=database, user_agent=os.environ.get('NEO4J_USER_AGENT'))
@@ -229,7 +234,7 @@ def get_chunktext_results(uri, username, password, database, document_name, page
229234
offset = 10
230235
skip = (page_no - 1) * offset
231236
limit = offset
232-
driver = GraphDatabase.driver(uri, auth=(username, password))
237+
driver = get_graphDB_driver(uri, username, password,database)
233238
with driver.session(database=database) as session:
234239
total_chunks_result = session.run(COUNT_CHUNKS_QUERY, file_name=document_name)
235240
total_chunks = total_chunks_result.single()["total_chunks"]
@@ -261,7 +266,7 @@ def visualize_schema(uri, userName, password, database):
261266
driver = None
262267
try:
263268
logging.info("Starting visualizing graph schema")
264-
driver = GraphDatabase.driver(uri, auth=(userName, password),database=database)
269+
driver = get_graphDB_driver(uri, userName, password,database)
265270
records, summary, keys = driver.execute_query(SCHEMA_VISUALIZATION_QUERY)
266271
nodes = records[0].get("nodes", [])
267272
relationships = records[0].get("relationships", [])

frontend/src/API/Index.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ const api = axios.create({
99

1010
export const createDefaultFormData = (userCredentials: UserCredentials) => {
1111
const formData = new FormData();
12-
formData.append('uri', userCredentials?.uri ?? '');
13-
formData.append('database', userCredentials?.database ?? '');
14-
formData.append('userName', userCredentials?.userName ?? '');
15-
formData.append('password', userCredentials?.password ?? '');
16-
formData.append('email', userCredentials?.email ?? '');
12+
if (userCredentials?.uri) formData.append('uri', userCredentials?.uri);
13+
if (userCredentials?.database) formData.append('database', userCredentials?.database);
14+
if (userCredentials?.userName) formData.append('userName', userCredentials?.userName);
15+
if (userCredentials?.password) formData.append('password', userCredentials?.password);
16+
if (userCredentials?.email) formData.append('email', userCredentials?.email);
1717
api.interceptors.request.use(
1818
(config) => {
1919
if (config.data instanceof FormData) {

frontend/src/components/ChatBot/ChatInfoModal.tsx

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,11 @@ const ChatInfoModal: React.FC<chatInfoMessage> = ({
8282
error?.length
8383
? 10
8484
: mode === chatModeLables['global search+vector+fulltext']
85-
? 7
86-
: mode === chatModeLables.graph
87-
? 4
88-
: 3
85+
? 7
86+
: mode === chatModeLables.graph
87+
? 4
88+
: 3
8989
);
90-
const { userCredentials } = useCredentials();
9190
const [, copy] = useCopyToClipboard();
9291
const [copiedText, setcopiedText] = useState<boolean>(false);
9392
const [showMetricsTable, setShowMetricsTable] = useState<boolean>(Boolean(metricDetails));
@@ -99,15 +98,15 @@ const ChatInfoModal: React.FC<chatInfoMessage> = ({
9998
multiModelMetrics.length > 0 && Object.keys(multiModelMetrics[0]).length > 4
10099
? true
101100
: multiModelMetrics.length > 0 && Object.keys(multiModelMetrics[0]).length <= 4
102-
? false
103-
: null
101+
? false
102+
: null
104103
);
105104
const [isAdditionalMetricsWithSingleMode, setIsAdditionalMetricsWithSingleMode] = useState<boolean | null>(
106105
metricDetails != undefined && Object.keys(metricDetails).length > 3
107106
? true
108107
: metricDetails != undefined && Object.keys(metricDetails).length <= 3
109-
? false
110-
: null
108+
? false
109+
: null
111110
);
112111

113112
const actions: React.ComponentProps<typeof IconButton<'button'>>[] = useMemo(
@@ -141,7 +140,11 @@ const ChatInfoModal: React.FC<chatInfoMessage> = ({
141140
(async () => {
142141
toggleInfoLoading();
143142
try {
144-
const response = await chunkEntitiesAPI(userCredentials?.database, nodeDetails, entities_ids, mode);
143+
const response = await chunkEntitiesAPI(
144+
nodeDetails,
145+
entities_ids,
146+
mode,
147+
);
145148
if (response.data.status === 'Failure') {
146149
throw new Error(response.data.error);
147150
}
@@ -350,9 +353,9 @@ const ChatInfoModal: React.FC<chatInfoMessage> = ({
350353
{mode != chatModeLables.graph ? <Tabs.Tab tabId={3}>Sources used</Tabs.Tab> : <></>}
351354
{mode != chatModeLables.graph ? <Tabs.Tab tabId={5}>Chunks</Tabs.Tab> : <></>}
352355
{mode === chatModeLables['graph+vector'] ||
353-
mode === chatModeLables.graph ||
354-
mode === chatModeLables['graph+vector+fulltext'] ||
355-
mode === chatModeLables['entity search+vector'] ? (
356+
mode === chatModeLables.graph ||
357+
mode === chatModeLables['graph+vector+fulltext'] ||
358+
mode === chatModeLables['entity search+vector'] ? (
356359
<Tabs.Tab tabId={4}>Top Entities used</Tabs.Tab>
357360
) : (
358361
<></>

frontend/src/components/ChatBot/ChatOnlyComponent.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,17 @@ const ChatContent: React.FC<ChatProps> = ({ chatMessages }) => {
3434
const port = urlParams.get('port');
3535
const email = urlParams.get('email');
3636
const openModal = urlParams.get('open') === 'true';
37+
const connectionStatus = urlParams.get('connectionStatus') === 'true';
3738
if (openModal || !(uri && user && encodedPassword && database && port)) {
38-
setOpenConnection((prev) => ({ ...prev, openPopUp: true }));
39-
} else {
39+
if (connectionStatus) {
40+
setShowBackButton();
41+
setConnectionStatus(connectionStatus);
42+
setMessages(chatMessages);
43+
} else {
44+
setOpenConnection((prev) => ({ ...prev, openPopUp: true }));
45+
}
46+
}
47+
else {
4048
const credentialsForAPI: UserCredentials = {
4149
uri,
4250
userName: user,
@@ -75,9 +83,9 @@ const ChatContent: React.FC<ChatProps> = ({ chatMessages }) => {
7583
try {
7684
setClearHistoryData(true);
7785
setIsDeleteChatLoading(true);
78-
const credentials = JSON.parse(localStorage.getItem('neo4j.connection') || '{}') as UserCredentials;
86+
// const credentials = JSON.parse(localStorage.getItem('neo4j.connection') || '{}') as UserCredentials;
7987
const sessionId = sessionStorage.getItem('session_id') || '';
80-
const response = await clearChatAPI(credentials, sessionId);
88+
const response = await clearChatAPI(sessionId);
8189
setIsDeleteChatLoading(false);
8290
if (response.data.status !== 'Success') {
8391
setClearHistoryData(false);

frontend/src/components/Content.tsx

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -272,10 +272,7 @@ const Content: React.FC<ContentProps> = ({
272272
const { name } = fileItem;
273273
triggerStatusUpdateAPI(
274274
name as string,
275-
userCredentials?.uri,
276-
userCredentials?.userName,
277-
userCredentials?.password,
278-
userCredentials?.database,
275+
userCredentials,
279276
updateStatusForLargeFiles
280277
);
281278
}
@@ -543,14 +540,15 @@ const Content: React.FC<ContentProps> = ({
543540

544541
const handleOpenGraphClick = () => {
545542
const bloomUrl = process.env.VITE_BLOOM_URL;
546-
const uriCoded = userCredentials?.uri.replace(/:\d+$/, '');
547-
const connectURL = `${uriCoded?.split('//')[0]}//${userCredentials?.userName}@${uriCoded?.split('//')[1]}:${
548-
userCredentials?.port ?? '7687'
549-
}`;
550-
const encodedURL = encodeURIComponent(connectURL);
551-
const replacedUrl = bloomUrl?.replace('{CONNECT_URL}', encodedURL);
552-
window.open(replacedUrl, '_blank');
553-
};
543+
let finalUrl = bloomUrl;
544+
if (userCredentials?.database && userCredentials.uri && userCredentials.userName) {
545+
const uriCoded = userCredentials.uri.replace(/:\d+$/, '');
546+
const connectURL = `${uriCoded.split('//')[0]}//${userCredentials.userName}@${uriCoded.split('//')[1]}:${userCredentials.port ?? '7687'}`;
547+
const encodedURL = encodeURIComponent(connectURL);
548+
finalUrl = bloomUrl?.replace('{CONNECT_URL}', encodedURL);
549+
}
550+
window.open(finalUrl, '_blank');
551+
};
554552

555553
const handleGraphView = () => {
556554
setOpenGraphView(true);
@@ -884,7 +882,7 @@ const Content: React.FC<ContentProps> = ({
884882
<DatabaseStatusIcon
885883
isConnected={connectionStatus}
886884
isGdsActive={isGdsActive}
887-
uri={userCredentials && userCredentials?.uri}
885+
uri={userCredentials?.uri}
888886
/>
889887
<div className='pt-1 flex gap-1 items-center'>
890888
<div>{!hasSelections ? <StatusIndicator type='danger' /> : <StatusIndicator type='success' />}</div>

frontend/src/components/FileTable.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -685,10 +685,7 @@ const FileTable: ForwardRefRenderFunction<ChildRef, FileTableProps> = (props, re
685685
const handleSmallFile = (item: SourceNode, userCredentials: UserCredentials) => {
686686
subscribe(
687687
item.fileName,
688-
userCredentials?.uri,
689-
userCredentials?.userName,
690-
userCredentials?.database,
691-
userCredentials?.password,
688+
userCredentials,
692689
updatestatus,
693690
updateProgress
694691
).catch(handleFileUploadError);
@@ -697,10 +694,7 @@ const FileTable: ForwardRefRenderFunction<ChildRef, FileTableProps> = (props, re
697694
const handleLargeFile = (item: SourceNode, userCredentials: UserCredentials) => {
698695
triggerStatusUpdateAPI(
699696
item.fileName,
700-
userCredentials.uri,
701-
userCredentials.userName,
702-
userCredentials.password,
703-
userCredentials.database,
697+
userCredentials,
704698
updateStatusForLargeFiles
705699
);
706700
};

frontend/src/components/Layout/DrawerChatbot.tsx

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,25 @@ const DrawerChatbot: React.FC<DrawerChatbotProps> = ({ isExpanded, clearHistoryD
1212
const location = useLocation();
1313

1414
useEffect(() => {
15-
if (location && location.state && Array.isArray(location.state)) {
16-
setMessages(location.state);
17-
} else if (
18-
location &&
19-
location.state &&
20-
typeof location.state === 'object' &&
21-
Object.keys(location.state).length > 1
22-
) {
23-
setUserCredentials(location.state.credential);
24-
setIsGCSActive(location.state.isGCSActive);
25-
setGdsActive(location.state.isgdsActive);
26-
setIsReadOnlyUser(location.state.isReadOnlyUser);
15+
// const localStorageData = localStorage.getItem('neo4j.connection');
16+
// const connectionLocal = JSON.parse(localStorageData ?? '');
17+
// if (connectionStatus && (connectionLocal.uri === userCredentials?.uri)) {
18+
if (connectionStatus) {
19+
if (location && location.state && Array.isArray(location.state)) {
20+
setMessages(location.state);
21+
} else if (
22+
location &&
23+
location.state &&
24+
typeof location.state === 'object' &&
25+
Object.keys(location.state).length > 1
26+
) {
27+
setUserCredentials(location.state.credential);
28+
setIsGCSActive(location.state.isGCSActive);
29+
setGdsActive(location.state.isgdsActive);
30+
setIsReadOnlyUser(location.state.isReadOnlyUser);
31+
}
2732
}
28-
}, [location]);
33+
}, [location, connectionStatus]);
2934

3035
const getIsLoading = (messages: Messages[]) => {
3136
return messages.length > 1 ? messages.some((msg) => msg.isTyping || msg.isLoading) : false;

frontend/src/components/Layout/Header.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,21 @@ const Header: React.FC<HeaderProp> = ({ chatOnly, deleteOnClick, setOpenConnecti
4747
const isLoading = getIsLoading(messages);
4848
if (session) {
4949
const neo4jConnection = JSON.parse(session);
50-
const { uri } = neo4jConnection;
51-
const userName = neo4jConnection.user;
52-
const { password } = neo4jConnection;
53-
const { database } = neo4jConnection;
50+
const { uri, userName, password, database } = neo4jConnection;
5451
const [, port] = uri.split(':');
5552
const encodedPassword = btoa(password);
5653
const chatUrl = `/chat-only?uri=${encodeURIComponent(
5754
uri
5855
)}&user=${userName}&password=${encodedPassword}&database=${database}&port=${port}&connectionStatus=${connectionStatus}`;
5956
navigate(chatUrl, { state: { messages, isLoading } });
57+
} else if (connectionStatus) {
58+
const chatUrl = `/chat-only?connectionStatus=${connectionStatus}`;
59+
navigate(chatUrl, { state: { messages, isLoading } });
6060
} else {
6161
const chatUrl = `/chat-only?openModal=true`;
6262
window.open(chatUrl, '_blank');
6363
}
64-
}, [messages]);
64+
}, [messages, connectionStatus, navigate]);
6565

6666
const onBackButtonClick = () => {
6767
navigate('/', { state: messages });

0 commit comments

Comments
 (0)