File size: 4,083 Bytes
7405474
 
3e269ec
7405474
3e269ec
7405474
0a4227c
6dd2090
 
7405474
5398274
7405474
 
3e269ec
 
 
 
 
 
 
 
5a9370b
 
2d94c1e
3e269ec
 
 
7405474
5398274
 
 
7405474
 
5398274
7405474
 
 
756b14b
0fa01ec
2d94c1e
 
5398274
2d94c1e
5398274
7405474
 
 
 
 
5398274
 
7405474
3e269ec
7405474
3e269ec
 
 
7405474
3e269ec
 
 
5398274
2d94c1e
7405474
 
5398274
 
 
 
0a4227c
6dd2090
 
0a4227c
6dd2090
 
 
 
 
0a4227c
6dd2090
 
 
 
0a4227c
6dd2090
 
 
0a4227c
6dd2090
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0a4227c
 
6dd2090
 
 
 
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
import streamlit as st
import os
from pathlib import Path
from PIL import Image
from rag_sec.document_search_system import DocumentSearchSystem
from chainguard.blockchain_logger import BlockchainLogger
from rag_sec.document_search_system import main
import streamlit as st
from rag_sec.document_retriver import DocumentRetriever

# Blockchain Logger
blockchain_logger = BlockchainLogger()

# Initialize DocumentSearchSystem
home_dir = Path(os.getenv("HOME", "/"))
data_dir = home_dir / "data-sets/aclImdb/train"
system = DocumentSearchSystem(
    neo4j_uri="neo4j+s://0ca71b10.databases.neo4j.io",
    neo4j_user="neo4j",
    neo4j_password="HwGDOxyGS1-79nLeTiX5bx5ohoFSpvHCmTv8IRgt-lY"
)

system.retriever.load_documents()

# Directory for storing uploaded files
UPLOAD_DIR = "uploaded_files"
os.makedirs(UPLOAD_DIR, exist_ok=True)

# Streamlit Layout
st.title("Memora: Secure File Upload with Blockchain & Neo4j")
st.subheader("Securely upload, organize, and query your files")

# File Upload
uploaded_files = st.file_uploader("Upload your files", accept_multiple_files=True, type=['jpg', 'jpeg', 'png', 'mp4', 'avi'])

if uploaded_files:
    for uploaded_file in uploaded_files:
        # Save file locally
        file_path = os.path.join(UPLOAD_DIR, uploaded_file.name)
        with open(file_path, "wb") as f:
            f.write(uploaded_file.getbuffer())
        st.success(f"File saved locally: {file_path}")

        # Display file details
        if uploaded_file.type.startswith('image'):
            image = Image.open(uploaded_file)
            st.image(image, caption=uploaded_file.name, use_column_width=True)

        # Metadata Input
        album = st.text_input(f"Album for {uploaded_file.name}", "Default Album")
        tags = st.text_input(f"Tags for {uploaded_file.name} (comma-separated)", "")

        # Log Metadata
        if st.button(f"Log Metadata for {uploaded_file.name}"):
            metadata = {"file_name": uploaded_file.name, "tags": tags.split(','), "album": album}
            blockchain_details = blockchain_logger.log_data(metadata)
            blockchain_hash = blockchain_details.get("block_hash", "N/A")

            # Use Neo4jHandler from DocumentSearchSystem to log transaction
            system.neo4j_handler.log_transaction(uploaded_file.name, file_path, blockchain_hash)
            st.write(f"Metadata logged successfully! Blockchain Details: {blockchain_details}")

# Blockchain Integrity Validation
if st.button("Validate Blockchain Integrity"):
    is_valid = blockchain_logger.is_blockchain_valid()
    st.write("Blockchain Integrity:", "Valid βœ…" if is_valid else "Invalid ❌")

# Query System
st.subheader("Query Files")

# Initialize DocumentRetriever
retriever = DocumentRetriever()

@st.cache(allow_output_mutation=True)
def load_retriever():
    """Load documents into the retriever."""
    retriever.load_documents()
    return retriever

# Load the retriever and documents
st.write("Loading documents...")
retriever = load_retriever()
st.write("Documents successfully loaded!")

# Streamlit UI
st.title("Document Search App")
st.subheader("Enter a query to search for related documents")

# Query Input
query = st.text_input("Enter your query (e.g., 'sports news', 'machine learning')")

if st.button("Search"):
    if query:
        # Retrieve documents
        results = retriever.retrieve(query)
        if results == ["Document retrieval is not initialized."]:
            st.error("Document retrieval is not initialized. Please reload the app.")
        elif not results:
            st.warning("No relevant documents found for your query.")
        else:
            st.success(f"Found {len(results)} relevant document(s).")
            for idx, doc in enumerate(results, start=1):
                st.write(f"### Document {idx}")
                st.write(doc[:500])  # Display first 500 characters of each document
    else:
        st.warning("Please enter a query to search.")

# Debugging Section
if st.checkbox("Show Debug Information"):
    st.write(f"Total documents loaded: {len(retriever.documents)}")