diff --git a/requirements.txt b/requirements.txt index 3e391e0..793be08 100644 Binary files a/requirements.txt and b/requirements.txt differ diff --git a/simple_server.py b/simple_server.py index 466d4d5..656e957 100644 --- a/simple_server.py +++ b/simple_server.py @@ -1,24 +1,87 @@ -import http.server +from fastapi import FastAPI, HTTPException +from fastapi.responses import FileResponse, HTMLResponse +from fastapi.staticfiles import StaticFiles +import uvicorn import os -PORT = 8050 +PORT = 8051 DIRECTORY = "./data/db" -class CustomHandler(http.server.SimpleHTTPRequestHandler): - def translate_path(self, path): - # Serve files from the specified directory - path = super().translate_path(path) - return os.path.join(DIRECTORY, os.path.relpath(path, os.path.dirname(path))) +# Ensure the data directory exists (if not already handled elsewhere) +os.makedirs(DIRECTORY, exist_ok=True) -def run(server_class=http.server.HTTPServer, handler_class=CustomHandler): - server_address = ("", PORT) - httpd = server_class(server_address, handler_class) - print(f"Serving on port {PORT}... Press Ctrl-C to stop.") - try: - while True: - httpd.handle_request() - except KeyboardInterrupt: - print("\nServer stopped by user.") +app = FastAPI() + +# Mount static files to serve content from the database directory +app.mount("/data", StaticFiles(directory=DIRECTORY), name="data") +app.mount("/static", StaticFiles(directory="static"), name="static") + +@app.get("/files", response_class=HTMLResponse) +async def list_files(): + files_html = "" + for root, _, files in os.walk(DIRECTORY): + for file in files: + file_path = os.path.join(root, file) + relative_path = os.path.relpath(file_path, DIRECTORY) + try: + file_size = os.path.getsize(file_path) + # convert to GB + file_size = file_size / (1024 * 1024 * 1024) + files_html += f""" +
  • + {relative_path} ({file_size:.3f} GB) + Download + +
  • + """ + except Exception as e: + files_html += f"
  • Error accessing {relative_path}: {e}
  • " + + return f""" + + + Files in Directory + + + +

    Files in {DIRECTORY}

    + +

    Back to Home

    + + + """ + +@app.delete("/delete_file/{filename}") +async def delete_single_file(filename: str): + file_path = os.path.join(DIRECTORY, filename) + if os.path.exists(file_path): + try: + os.remove(file_path) + return {"message": f"File {filename} deleted successfully.", "status": "deleted"} + except Exception as e: + raise HTTPException(status_code=500, detail=f"Error deleting file {filename}: {e}") + else: + raise HTTPException(status_code=404, detail=f"File {filename} not found.") + +@app.get("/") +async def root(): + return HTMLResponse(""" + + + Market Data Server + + + +

    Market Data Server

    +

    Welcome to the Market Data Server.

    +

    Database Files

    +

    Access database files directly via /data/your_file.db

    +

    List Files

    + + + """) if __name__ == "__main__": - run() \ No newline at end of file + uvicorn.run(app, host="0.0.0.0", port=PORT) \ No newline at end of file diff --git a/static/script.js b/static/script.js new file mode 100644 index 0000000..c2d6397 --- /dev/null +++ b/static/script.js @@ -0,0 +1,15 @@ +async function deleteFile(filename) { + if (confirm('Are you sure you want to delete ' + filename + '?')) { + const response = await fetch(`/delete_file/${filename}`, { method: 'DELETE' }); + const data = await response.json(); + alert(data.message); + if (response.ok) { + location.reload(); // Reload the page to update the file list + } + } +} + +// Initial check when page loads +document.addEventListener('DOMContentLoaded', () => { + // No archive functions needed now +}); \ No newline at end of file