File size: 5,224 Bytes
ff78816
32115ec
ff78816
 
f8257f5
 
ff78816
f8257f5
ff78816
 
f8257f5
ff78816
f8257f5
ff78816
f8257f5
ff78816
32115ec
ff78816
32115ec
 
 
ff78816
32115ec
 
f8257f5
32115ec
 
 
 
ff78816
32115ec
 
 
ff78816
32115ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f8257f5
32115ec
f8257f5
32115ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f8257f5
32115ec
 
 
 
 
 
 
 
 
 
 
 
 
 
ff78816
f8257f5
32115ec
f8257f5
 
32115ec
 
 
f8257f5
 
32115ec
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import streamlit as st
from azure.cosmos import CosmosClient, exceptions
import os
import pandas as pd
import traceback
import requests
import shutil
import zipfile
from github import Github
from git import Repo
from datetime import datetime
import base64
import json

st.set_page_config(layout="wide")

# ... (keep all the existing imports and configurations)

# New functions for dynamic sidebar
def get_databases(client):
    return [db['id'] for db in client.list_databases()]

def get_containers(database):
    return [container['id'] for container in database.list_containers()]

def get_documents(container, limit=1000):
    query = "SELECT * FROM c"
    items = list(container.query_items(query=query, enable_cross_partition_query=True, max_item_count=limit))
    return items

# Modify the main app
def main():
    st.title("🌟 Cosmos DB and GitHub Integration")

    # Initialize session state
    if 'logged_in' not in st.session_state:
        st.session_state.logged_in = False
    if 'selected_records' not in st.session_state:
        st.session_state.selected_records = []
    if 'client' not in st.session_state:
        st.session_state.client = None
    if 'selected_database' not in st.session_state:
        st.session_state.selected_database = None
    if 'selected_container' not in st.session_state:
        st.session_state.selected_container = None

    # Login section
    if not st.session_state.logged_in:
        st.subheader("πŸ” Login")
        input_key = st.text_input("Enter your Cosmos DB key", type="password")
        if st.button("πŸš€ Login"):
            if input_key:
                st.session_state.primary_key = input_key
                st.session_state.logged_in = True
                st.rerun()
            else:
                st.error("Invalid key. Please check your input.")
    else:
        # Initialize Cosmos DB client
        try:
            if st.session_state.client is None:
                st.session_state.client = CosmosClient(ENDPOINT, credential=st.session_state.primary_key)
            
            # Sidebar for database, container, and document selection
            st.sidebar.title("πŸ—„οΈ Cosmos DB Navigator")
            
            databases = get_databases(st.session_state.client)
            selected_db = st.sidebar.selectbox("πŸ—ƒοΈ Select Database", databases)
            
            if selected_db != st.session_state.selected_database:
                st.session_state.selected_database = selected_db
                st.session_state.selected_container = None
                st.rerun()
            
            if st.session_state.selected_database:
                database = st.session_state.client.get_database_client(st.session_state.selected_database)
                containers = get_containers(database)
                selected_container = st.sidebar.selectbox("πŸ“ Select Container", containers)
                
                if selected_container != st.session_state.selected_container:
                    st.session_state.selected_container = selected_container
                    st.rerun()
                
                if st.session_state.selected_container:
                    container = database.get_container_client(st.session_state.selected_container)
                    
                    limit_to_1000 = st.sidebar.checkbox("πŸ”’ Limit to top 1000 documents", value=True)
                    documents = get_documents(container, limit=1000 if limit_to_1000 else None)
                    
                    if documents:
                        document_ids = [doc.get('id', 'Unknown') for doc in documents]
                        selected_document = st.sidebar.selectbox("πŸ“„ Select Document", document_ids)
                        
                        if selected_document:
                            st.subheader(f"πŸ“„ Document Details: {selected_document}")
                            selected_doc = next((doc for doc in documents if doc.get('id') == selected_document), None)
                            if selected_doc:
                                st.json(selected_doc)
                    else:
                        st.sidebar.info("No documents found in this container.")
            
            # Main content area
            st.subheader(f"πŸ“Š Container: {st.session_state.selected_container}")
            if st.session_state.selected_container:
                df = pd.DataFrame(documents)
                st.dataframe(df)
            
            # ... (keep the rest of your existing code for GitHub operations, etc.)

        except exceptions.CosmosHttpResponseError as e:
            st.error(f"Failed to connect to Cosmos DB. HTTP error: {str(e)}. Status code: {e.status_code}")
        except Exception as e:
            st.error(f"An unexpected error occurred: {str(e)}")

    # Logout button
    if st.session_state.logged_in and st.sidebar.button("πŸšͺ Logout"):
        st.session_state.logged_in = False
        st.session_state.selected_records.clear()
        st.session_state.client = None
        st.session_state.selected_database = None
        st.session_state.selected_container = None
        st.rerun()

if __name__ == "__main__":
    main()