From d412d5741b71b8b19c7f619fc28bb06c27ab7204 Mon Sep 17 00:00:00 2001 From: Jaronim Pracht Date: Mon, 2 Jun 2025 19:09:16 +0200 Subject: [PATCH] Add Dockerfile for coordinator service and progress controller Add progress tracking functionality to frontend and backend - Add progress controller endpoint to handle progress updates - Implement socket.io progress updates in UploadPage - Update import path for CircularProgressWithLabel component --- project/backend/coordinator/Dockerfile | 21 ++ .../coordinator/controller/__init__.py | 2 + .../controller/progress_controller.py | 19 ++ project/frontend/biome.json | 2 +- project/frontend/bun.lockb | Bin 146934 -> 154753 bytes .../frontend/src/components/UploadPage.tsx | 318 +++++++++--------- project/frontend/src/components/pdfViewer.tsx | 155 +++++---- 7 files changed, 279 insertions(+), 238 deletions(-) create mode 100644 project/backend/coordinator/Dockerfile create mode 100644 project/backend/coordinator/controller/progress_controller.py diff --git a/project/backend/coordinator/Dockerfile b/project/backend/coordinator/Dockerfile new file mode 100644 index 0000000..1a8fe43 --- /dev/null +++ b/project/backend/coordinator/Dockerfile @@ -0,0 +1,21 @@ +# 1. Python-Image verwenden +FROM python:3.11-alpine + +# 2. Arbeitsverzeichnis im Container setzen +WORKDIR /app + +# 3. production-style server mit gunicorn +RUN pip install gunicorn eventlet + +# 4. requirements.txt kopieren und Pakete installieren +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + + +# 5. Quellcode kopieren (z.B. app.py) +COPY . . + +ENV PYTHONUNBUFFERED=1 +EXPOSE 5000 + +CMD ["gunicorn", "--worker-class", "eventlet", "-w", "1", "--bind", "0.0.0.0:5000", "app:app"] diff --git a/project/backend/coordinator/controller/__init__.py b/project/backend/coordinator/controller/__init__.py index 256d5f2..5b758cb 100644 --- a/project/backend/coordinator/controller/__init__.py +++ b/project/backend/coordinator/controller/__init__.py @@ -1,9 +1,11 @@ from controller.spacy_contoller import spacy_controller from controller.kpi_setting_controller import kpi_setting_controller from controller.pitch_book_controller import pitch_book_controller +from controller.progress_controller import progress_controller def register_routes(app): app.register_blueprint(kpi_setting_controller) app.register_blueprint(pitch_book_controller) app.register_blueprint(spacy_controller) + app.register_blueprint(progress_controller) diff --git a/project/backend/coordinator/controller/progress_controller.py b/project/backend/coordinator/controller/progress_controller.py new file mode 100644 index 0000000..90db4df --- /dev/null +++ b/project/backend/coordinator/controller/progress_controller.py @@ -0,0 +1,19 @@ +from flask import Blueprint, request, jsonify + +from controller.socketIO import socketio +progress_controller = Blueprint("progress", __name__, url_prefix="/api/progress") + + +@progress_controller.route("/", methods=["POST"]) +def progress(): + data = request.get_json() + + if 'id' not in data or 'progress' not in data: + return jsonify({"error": "Missing required fields. [id, progress]"}), 400 + + if not isinstance(data['progress'], (int, float)) or data['progress'] < 0 or data['progress'] >= 100: + return jsonify({"error": "Invalid progress value"}), 400 + + socketio.emit("progress", {"id": data["id"], "progress": data["progress"]}) + # Process the data and return a response + return jsonify({"message": "Progress updated"}) diff --git a/project/frontend/biome.json b/project/frontend/biome.json index 55240aa..2e91202 100644 --- a/project/frontend/biome.json +++ b/project/frontend/biome.json @@ -12,7 +12,7 @@ }, "formatter": { "enabled": true, - "indentStyle": "space" + "indentStyle": "tab" }, "organizeImports": { "enabled": true diff --git a/project/frontend/bun.lockb b/project/frontend/bun.lockb index 676011c22448c88f859b20853066f9b21747ae99..d5b340930964353aaf516044ae493772a55f22d3 100755 GIT binary patch delta 35255 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
  • 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%0AC@i4(cpmDfj}WDi}Aw32+5ye_9TBhq%wc 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[]); - const [pageId, setPageId] = useState(null); - const [loadingState, setLoadingState] = useState(null); - const fileTypes = ["pdf"]; - const navigate = useNavigate(); + const [files, setFiles] = useState([]); + const [pageId, setPageId] = useState(null); + const [loadingState, setLoadingState] = useState(null); + const fileTypes = ["pdf"]; + const navigate = useNavigate(); - const uploadFile = useCallback(async () => { - const formData = new FormData(); - formData.append("file", files[0]); - const response = await fetch("http://localhost:5050/api/pitch_book", { - method: "POST", - body: formData, - }); + const uploadFile = useCallback(async () => { + const formData = new FormData(); + formData.append("file", files[0]); + const response = await fetch("http://localhost:5050/api/pitch_book", { + method: "POST", + body: formData, + }); - if (response.ok) { - console.log("File uploaded successfully"); - const data = await response.json(); - console.log(data); - setPageId(data.id); - setLoadingState(0); + if (response.ok) { + console.log("File uploaded successfully"); + const data = await response.json(); + console.log(data); + setPageId(data.id); + setLoadingState(0); - !PROGRESS && - navigate({ - to: "/extractedResult/$pitchBook", - params: { pitchBook: data.id }, - }); - } else { - console.error("Failed to upload file"); - } - }, [files, navigate]); + !PROGRESS && + navigate({ + to: "/extractedResult/$pitchBook", + params: { pitchBook: data.id }, + }); + } else { + console.error("Failed to upload file"); + } + }, [files, navigate]); - const onConnection = useCallback(() => { - console.log("connected"); - }, []); + const onConnection = useCallback(() => { + console.log("connected"); + }, []); - const onProgress = useCallback( - (progress: { id: number; progress: number }) => { - console.log("Progress:", progress); - console.log(pageId); - if (Number(pageId) === progress.id) { - setLoadingState(progress.progress); + const onProgress = useCallback( + (progress: { id: number; progress: number }) => { + console.log("Progress:", progress); + console.log(pageId); + if (Number(pageId) === progress.id) { + setLoadingState(progress.progress); - if (progress.progress === 100) { - navigate({ - to: "/extractedResult/$pitchBook", - params: { pitchBook: progress.id.toString() }, - }); - } - } - }, - [pageId, navigate], - ); + if (progress.progress === 100) { + navigate({ + to: "/extractedResult/$pitchBook", + params: { pitchBook: progress.id.toString() }, + }); + } + } + }, + [pageId, navigate], + ); - useEffect(() => { - socket.on("connect", onConnection); - socket.on("progress", onProgress); - return () => { - socket.off("connect", onConnection); - socket.off("progress", onProgress); - }; - }, [onConnection, onProgress]); + useEffect(() => { + socket.on("connect", onConnection); + socket.on("progress", onProgress); + return () => { + socket.off("connect", onConnection); + socket.off("progress", onProgress); + }; + }, [onConnection, onProgress]); - return ( - <> - {PROGRESS && ( - ({ color: "#fff", zIndex: theme.zIndex.drawer + 1 })} - open={pageId !== null && loadingState !== null} - > - - - )} - - - navigate({ to: "/config" })}> - - - - - - - - - - - - ); + return ( + <> + {PROGRESS && ( + ({ color: "#fff", zIndex: theme.zIndex.drawer + 1 })} + open={pageId !== null && loadingState !== null} + > + + + )} + + + navigate({ to: "/config" })}> + + + + + + + + + + + + ); } diff --git a/project/frontend/src/components/pdfViewer.tsx b/project/frontend/src/components/pdfViewer.tsx index 3c25e13..87e1edc 100644 --- a/project/frontend/src/components/pdfViewer.tsx +++ b/project/frontend/src/components/pdfViewer.tsx @@ -7,88 +7,87 @@ import ArrowCircleRightIcon from "@mui/icons-material/ArrowCircleRight"; import { Box, IconButton } from "@mui/material"; interface PDFViewerProps { - pitchBookId: string; + pitchBookId: string; } - export default function PDFViewer({ pitchBookId }: PDFViewerProps) { - const [numPages, setNumPages] = useState(null); - const [pageNumber, setPageNumber] = useState(1); - const [containerWidth, setContainerWidth] = useState(null); - const containerRef = useRef(null); + const [numPages, setNumPages] = useState(null); + const [pageNumber, setPageNumber] = useState(1); + const [containerWidth, setContainerWidth] = useState(null); + const containerRef = useRef(null); - const onDocumentLoadSuccess = ({ numPages }: { numPages: number }) => { - setNumPages(numPages); - }; + const onDocumentLoadSuccess = ({ numPages }: { numPages: number }) => { + setNumPages(numPages); + }; - useEffect(() => { - const updateWidth = () => { - if (containerRef.current) { - setContainerWidth(containerRef.current.offsetWidth); - } - }; + useEffect(() => { + const updateWidth = () => { + if (containerRef.current) { + setContainerWidth(containerRef.current.offsetWidth); + } + }; - updateWidth(); - window.addEventListener("resize", updateWidth); - return () => window.removeEventListener("resize", updateWidth); - }, []); + updateWidth(); + window.addEventListener("resize", updateWidth); + return () => window.removeEventListener("resize", updateWidth); + }, []); - return ( - - - - console.error("Es gab ein Fehler beim Laden des PDFs:", error) - } - onSourceError={(error) => console.error("Ungültige PDF:", error)} - > - {containerWidth && ( - - )} - - - - setPageNumber((p) => p - 1)} - > - - - - {pageNumber} / {numPages} - - = (numPages || 1)} - onClick={() => setPageNumber((p) => p + 1)} - > - - - - - ); + return ( + + + + console.error("Es gab ein Fehler beim Laden des PDFs:", error) + } + onSourceError={(error) => console.error("Ungültige PDF:", error)} + > + {containerWidth && ( + + )} + + + + setPageNumber((p) => p - 1)} + > + + + + {pageNumber} / {numPages} + + = (numPages || 1)} + onClick={() => setPageNumber((p) => p + 1)} + > + + + + + ); }