From 53db6677cea6066ab8fd65099abbfef257db6e98 Mon Sep 17 00:00:00 2001 From: joel-joseph-george Date: Mon, 10 Mar 2025 14:29:43 +0530 Subject: [PATCH 1/8] Adding docker --- UI/.dockerignore | 2 ++ UI/Dockerfile | 15 ++++++++++++++ docker/docker-compose.yml | 42 +++++++++++++++++++++++++++++---------- 3 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 UI/.dockerignore create mode 100644 UI/Dockerfile diff --git a/UI/.dockerignore b/UI/.dockerignore new file mode 100644 index 0000000..329d75c --- /dev/null +++ b/UI/.dockerignore @@ -0,0 +1,2 @@ +node_modules +.env.local \ No newline at end of file diff --git a/UI/Dockerfile b/UI/Dockerfile new file mode 100644 index 0000000..2dbdc74 --- /dev/null +++ b/UI/Dockerfile @@ -0,0 +1,15 @@ +FROM node:18-alpine + +WORKDIR /app + +COPY package*.json ./ + +RUN npm install + +COPY . . + +RUN npm run build + +EXPOSE 3001 + +CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"] \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 0c1fd49..73f4f8a 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -40,15 +40,35 @@ services: - gitea volumes: - ./postgres:/var/lib/postgresql/data + ui: + # image: joeljosephgeorge/gitea-ui:v1.0.3 + build: + context: ../UI + dockerfile: Dockerfile + healthcheck: + timeout: 45s + interval: 10s + retries: 10 + container_name: gitea-ui - #Uncomment the following lines to enable the gitea-ui - # ui: - # image: joeljosephgeorge/gitea-ui:v1.0.0 - # container_name: gitea-ui - # restart: always - # networks: - # - gitea - # ports: - # - "3001:3001" - # depends_on: - # - server + # env_file: + # - .env.local + environment: + - VITE_GITEA_BASE_URL=http://localhost:3000 + - VITE_GITEA_UI_URL=http://localhost:3001 + - VITE_GITEA_ORG_NAME=BCS + - VITE_FASTAPI_BASE_URL=http://localhost:8000 + #The below values are dummy values, replace them with your own values + #the values where not taking when running the api and ui in docker, i could run it by adding + #them in the .env.local file and adding the file in the env_file section + - VITE_GITEA_CLIENT_ID = {your-client-id} + - VITE_GITEA_CLIENT_SECRET = {your-client-secret} + - VITE_GITEA_REDIRECT_URI=http://localhost:3001/oauth/callback + + restart: always + networks: + - gitea + ports: + - "3001:3001" + depends_on: + - server From c6291dfd1e7ac8d95dd537cdeaccc721372b746b Mon Sep 17 00:00:00 2001 From: joel-joseph-george Date: Mon, 10 Mar 2025 14:30:27 +0530 Subject: [PATCH 2/8] Adding UI changes ( SFM support) --- UI/src/pages/ViewFile.tsx | 11 +++++++--- .../data-preprocessing/ParallelCorpora.tsx | 20 ++++++++++--------- .../pages/data-preprocessing/ParseBooks.tsx | 5 +++-- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/UI/src/pages/ViewFile.tsx b/UI/src/pages/ViewFile.tsx index eb26be0..7d8c09a 100644 --- a/UI/src/pages/ViewFile.tsx +++ b/UI/src/pages/ViewFile.tsx @@ -53,8 +53,10 @@ export const ViewFile: React.FC = () => { : (fileContent.size / 1024).toFixed(2) + " KB"; // Determine whether "Copy" and "Lines" are enabled - const isCopyEnabled = ["txt", "md", "usfm", "csv"].includes(fileExtension); - const isLineEnabled = ["txt", "pdf", "md", "usfm", "csv"].includes( + const isCopyEnabled = ["txt", "md", "usfm", "sfm", "csv"].includes( + fileExtension + ); + const isLineEnabled = ["txt", "pdf", "md", "usfm", "sfm", "csv"].includes( fileExtension ); const isDownloadEnabled = ["pdf"].includes(fileExtension); @@ -187,10 +189,13 @@ export const ViewFile: React.FC = () => { ); - } else if (["txt", "usfm", "json"].includes(fileExtension)) { + } else if (["txt", "usfm", "sfm", "json"].includes(fileExtension)) { return ( { const bibles = response?.data?.bibles || []; // Calculate the total successful books across all bibles - const successfulBooksCount = bibles.reduce((total, bible) => { + const successfulBooksCount = bibles.reduce((total: any, bible: any) => { // Check if bible has books array if (bible.books && Array.isArray(bible.books)) { // Count only the books with status "success" const successfulBooks = bible.books.filter( - (book) => book.status === "success" + (book: any) => book.status === "success" ); return total + successfulBooks.length; } @@ -133,10 +133,10 @@ const ParallelCorpora: React.FC = () => { // Same logic for repo2 const bibles = response?.data?.bibles || []; - const successfulBooksCount = bibles.reduce((total, bible) => { + const successfulBooksCount = bibles.reduce((total: any, bible: any) => { if (bible.books && Array.isArray(bible.books)) { const successfulBooks = bible.books.filter( - (book) => book.status === "success" + (book: any) => book.status === "success" ); return total + successfulBooks.length; } @@ -175,8 +175,8 @@ const ParallelCorpora: React.FC = () => { try { // Determine which API endpoint to use based on withBCV const apiEndpoint = withBCV - ? `${import.meta.env.VITE_FASTAPI_BASE_URL}/parallel_corpora/withbcv/csv/` - : `${import.meta.env.VITE_FASTAPI_BASE_URL}/parallel_corpora/withoutbcv/csv/`; + ? `${import.meta.env.VITE_FASTAPI_BASE_URL}/parallel_corpora/withbcv/` + : `${import.meta.env.VITE_FASTAPI_BASE_URL}/parallel_corpora/withoutbcv/`; // Make the API call const response = await axios.get(apiEndpoint, { @@ -193,12 +193,14 @@ const ParallelCorpora: React.FC = () => { // Create a link element and trigger download const link = document.createElement("a"); link.href = window.URL.createObjectURL(blob); - const fileName = withBCV ? `parallel_corpora_BCV_${selectedProject1}_${selectedProject2}.csv`: `parallel_corpora_${selectedProject1}_${selectedProject2}.csv`; + const fileName = withBCV + ? `parallel_corpora_BCV_${selectedProject1}_${selectedProject2}.csv` + : `parallel_corpora_${selectedProject1}_${selectedProject2}.csv`; link.download = fileName; document.body.appendChild(link); link.click(); document.body.removeChild(link); - } catch (error) { + } catch (error: any) { console.error("Error downloading CSV:", error); toast({ variant: "destructive", @@ -252,7 +254,7 @@ const ParallelCorpora: React.FC = () => { handleSelectValueChange("repo2", value) } options={projects.filter( - (project) => project.name !== selectedProject1 + (project: any) => project.name !== selectedProject1 )} placeholder="Select target project" /> diff --git a/UI/src/pages/data-preprocessing/ParseBooks.tsx b/UI/src/pages/data-preprocessing/ParseBooks.tsx index dea8874..e551a30 100644 --- a/UI/src/pages/data-preprocessing/ParseBooks.tsx +++ b/UI/src/pages/data-preprocessing/ParseBooks.tsx @@ -89,8 +89,9 @@ const ParseBooks = ({ owner, repo }: ParseBooksProps) => { const filesResponse = await API.get( `/api/v1/repos/${owner}/${repo}/contents/` ); - const usfmFiles = filesResponse.data.filter((file: { name: string }) => - file.name.endsWith(".usfm") + const usfmFiles = filesResponse.data.filter( + (file: { name: string }) => + file.name.endsWith(".usfm") || file.name.endsWith(".SFM") ); setUsfmCount(usfmFiles.length); if (usfmFiles.length === 0) return; From 8acba39dc54aa250ba78c170d786fd1827f3c02d Mon Sep 17 00:00:00 2001 From: joel-joseph-george Date: Tue, 11 Mar 2025 10:20:53 +0530 Subject: [PATCH 3/8] Adding documentation --- docker/Readme.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 docker/Readme.md diff --git a/docker/Readme.md b/docker/Readme.md new file mode 100644 index 0000000..cf7e0b5 --- /dev/null +++ b/docker/Readme.md @@ -0,0 +1,57 @@ +# Gitea Docker Setup Guide + +## Introduction + +This guide will help you set up Gitea using Docker. Gitea is a lightweight Git service that can be self-hosted. This guide assumes you have Docker and Docker Compose installed on your system. + +## Prerequisites + +- Docker +- Docker Compose + +## Steps to Install Gitea + +1. **Clone the Repository** + Clone the repository containing the Docker Compose file and other necessary configurations. + + ```sh + git clone https://github.com/Bridgeconn/ai_mft_data_preprocessing.git + cd ai_mft_data_preprocessing + ``` + +2. **Run Docker Compose** + Start the Gitea service using Docker Compose. + + ```sh + cd docker + docker compose up -d + ``` + +3. **Initial Setup of Gitea** + When you first boot the Gitea image, you will be prompted to configure the database. Since the database configuration is already included in the Docker Compose file, you can proceed with the following steps: + + - **Database Configuration**: This step will be pre-configured based on your Docker Compose settings. + - **SMTP Configuration**: You can skip this step if you do not need email notifications. + - **Root Admin Creation**: This can be done later when you create the first user. + +4. **Complete Installation** + Click the "Install" button to complete the setup. Gitea will now be running. + +5. **Accessing the Gitea** + Open your web browser and navigate to the URL where Gitea is hosted. Refer to the UI documentation for detailed instructions on how to use the Gitea-UI and how you can setup the Oauth configuration. + +## Additional Documentation + +For more detailed instructions on using the Gitea UI, please refer to the [Gitea UI Documentation](https://github.com/Bridgeconn/ai_mft_data_preprocessing/tree/main/UI/docs/Installation). + +## Adding variables + +Once you have created a new application for oauth in the gitea, you will be having a `client-id` and `client-secret` . Make sure you add them to our docker compose file. Rest for the variables are already added. + +## Note + +Once you created the backend(Gitea), create a Organization named `BCS`. and make sure if you are creating repositories in the backend, create under the organization while if you are using the UI , then you dont have to worry on that. + +## Conclusion + +You have successfully set up Gitea using Docker. You can now start using Gitea for your Git repositories. From 48643199750c3eea03de2c126fa8665cfd11d841 Mon Sep 17 00:00:00 2001 From: joel-joseph-george Date: Thu, 13 Mar 2025 17:51:35 +0530 Subject: [PATCH 4/8] Adding auth to list bibles api --- BACKEND/app/auth.py | 68 ++++++++++++++++++++++++++++++++++++++++ BACKEND/app/router.py | 16 ++++++++-- BACKEND/requirements.txt | 3 +- 3 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 BACKEND/app/auth.py diff --git a/BACKEND/app/auth.py b/BACKEND/app/auth.py new file mode 100644 index 0000000..11091b7 --- /dev/null +++ b/BACKEND/app/auth.py @@ -0,0 +1,68 @@ +from fastapi import HTTPException, status, Request +from fastapi.security import OAuth2PasswordBearer +from functools import wraps +import requests + +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") + +GITEA_API_URL = "http://localhost:3000/api/v1" + +def validate_token(func): + @wraps(func) + async def wrapper(*args, **kwargs): + request = None + for arg in args: + if isinstance(arg, Request): + request = arg + break + + if request is None: + for key, value in kwargs.items(): + if isinstance(value, Request): + request = value + break + + if request is None: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Request object not found", + ) + + auth_header = request.headers.get("Authorization") + if not auth_header or not auth_header.startswith("Bearer "): + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Missing or invalid authorization header" + ) + token = auth_header.replace("Bearer ", "") + + try: + headers = {"Authorization": f"{token}"} + response = requests.get(f"{GITEA_API_URL}/user", headers=headers) + + + if response.status_code == 401: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Token expired or invalid" + ) + elif response.status_code != 200: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Authentication failed" + ) + + if "user_info" in kwargs: + user_info = response.json() + kwargs["user_info"] = user_info + return await func(*args, **kwargs) + + except Exception as e: + if isinstance(e, HTTPException): + raise e + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Invalid authentication credentials" + ) + + return wrapper \ No newline at end of file diff --git a/BACKEND/app/router.py b/BACKEND/app/router.py index 75338cf..e867d81 100644 --- a/BACKEND/app/router.py +++ b/BACKEND/app/router.py @@ -1,5 +1,5 @@ import itertools -from fastapi import APIRouter, HTTPException,File,UploadFile,Query +from fastapi import APIRouter, HTTPException,File,UploadFile,Query, Request, Depends from fastapi import Body from pydantic import BaseModel from database import SessionLocal @@ -14,6 +14,8 @@ import crud from fastapi.responses import JSONResponse import base64 +from auth import validate_token +from utils import input_token @@ -69,13 +71,20 @@ async def add_project(request: ProjectRequest): @router.get("/list_projects/") -async def list_projects(project_name: str = Query(None)): +@validate_token +async def list_projects(request: Request, project_name: str = Query(None), + user_details=Depends(input_token), + user_info: dict = None): """ List all projects or fetch a specific project by project_name. If project_name is provided, returns the matching project or null if not found. """ session = SessionLocal() try: + + username = user_info.get("login") + print(f"User {username} is fetching projects") + if project_name: project = session.query(Project).filter(Project.project_name == project_name).first() return {"project": project if project else None} @@ -218,7 +227,8 @@ async def update_usfm( try: usfm_bytes = base64.b64decode(encoded_usfm) usfm = usfm_bytes.decode("utf-8") # Convert bytes to string - usfm=crud.normalize_text(usfm) + #errors are not displaying properly + # usfm=crud.normalize_text(usfm) except Exception as e: logging.error(f"Failed to decode USFM content: {str(e)}") raise HTTPException(status_code=400, detail="Invalid encoded USFM content") diff --git a/BACKEND/requirements.txt b/BACKEND/requirements.txt index b495fb9..87d6a41 100644 --- a/BACKEND/requirements.txt +++ b/BACKEND/requirements.txt @@ -4,4 +4,5 @@ SQLAlchemy psycopg2 uvicorn python-multipart -sacremoses \ No newline at end of file +sacremoses +requests \ No newline at end of file From 4579b1bb3653aa95865e3ea21ef36952e40a6ce4 Mon Sep 17 00:00:00 2001 From: joel-joseph-george Date: Thu, 13 Mar 2025 17:54:48 +0530 Subject: [PATCH 5/8] reverting --- BACKEND/app/crud.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/BACKEND/app/crud.py b/BACKEND/app/crud.py index 04508ad..4fe4690 100644 --- a/BACKEND/app/crud.py +++ b/BACKEND/app/crud.py @@ -46,11 +46,15 @@ def parse_usfm_to_csv(book_name, usfm_content, project_id): """ Convert USFM content to CSV format and return extracted data """ try: my_parser = USFMParser(usfm_content) # Initialize parser - output = my_parser.to_list(include_markers=Filter.BCV + Filter.TEXT) # Extract BCV and Text + output = my_parser.to_list(include_markers=Filter.BCV + Filter.TEXT) # Extract BCV and Text processed_output = [ - [re.sub(r"\s+", " ", value).strip() if isinstance(value, str) else value for value in row] - for row in output - ] + [normalize_text(value).replace("\n", " ") if isinstance(value, str) else value for value in row] + for row in output] + # processed_output = [ + # [re.sub(r"\s+", " ", value).strip() if isinstance(value, str) else value for value in row] + # for row in output + # ] + if not processed_output: logging.error(f"No data extracted for {book_name}!") else: From d21aea9781d45617c1b6ee0a54a91ca77be47efd Mon Sep 17 00:00:00 2001 From: joel-joseph-george Date: Thu, 13 Mar 2025 17:56:20 +0530 Subject: [PATCH 6/8] reverting --- BACKEND/app/router.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/BACKEND/app/router.py b/BACKEND/app/router.py index e867d81..903dce6 100644 --- a/BACKEND/app/router.py +++ b/BACKEND/app/router.py @@ -227,8 +227,7 @@ async def update_usfm( try: usfm_bytes = base64.b64decode(encoded_usfm) usfm = usfm_bytes.decode("utf-8") # Convert bytes to string - #errors are not displaying properly - # usfm=crud.normalize_text(usfm) + usfm=crud.normalize_text(usfm) except Exception as e: logging.error(f"Failed to decode USFM content: {str(e)}") raise HTTPException(status_code=400, detail="Invalid encoded USFM content") From d6e1eddac3cfc0092e19391dabecae6087c2c663 Mon Sep 17 00:00:00 2001 From: joel-joseph-george Date: Mon, 17 Mar 2025 16:14:12 +0530 Subject: [PATCH 7/8] Adding auth decorator to fastapi endpoints and its corresponsing UI changes --- BACKEND/app/router.py | 78 ++++++++++++------- BACKEND/app/utils.py | 9 +++ UI/src/pages/CreateRepo.tsx | 63 +++++++++------ .../data-preprocessing/ParallelCorpora.tsx | 14 ++-- .../pages/data-preprocessing/ParseBooks.tsx | 12 ++- UI/src/services/Api.ts | 10 +++ UI/src/stores/Store.ts | 3 +- 7 files changed, 123 insertions(+), 66 deletions(-) create mode 100644 BACKEND/app/utils.py diff --git a/BACKEND/app/router.py b/BACKEND/app/router.py index 903dce6..cef5e5d 100644 --- a/BACKEND/app/router.py +++ b/BACKEND/app/router.py @@ -37,10 +37,11 @@ class USFMUploadRequest(BaseModel): @router.post("/add_project/") -async def add_project(request: ProjectRequest): +@validate_token +async def add_project(request: Request, project_request: ProjectRequest, user_details=Depends(input_token)): """ Add a new project and return the project ID """ session = SessionLocal() - project_name = request.project_name.strip() + project_name = project_request.project_name.strip() # Validate project name (Ensure it's not empty after trimming) if not project_name: @@ -49,7 +50,7 @@ async def add_project(request: ProjectRequest): # Check if the project already exists existing_project = session.query(Project).filter_by( - project_name=request.project_name + project_name=project_request.project_name ).first() if existing_project: @@ -58,7 +59,7 @@ async def add_project(request: ProjectRequest): # Insert new project new_project = Project( - project_name=request.project_name + project_name=project_request.project_name ) session.add(new_project) session.commit() @@ -73,8 +74,7 @@ async def add_project(request: ProjectRequest): @router.get("/list_projects/") @validate_token async def list_projects(request: Request, project_name: str = Query(None), - user_details=Depends(input_token), - user_info: dict = None): + user_details=Depends(input_token)): """ List all projects or fetch a specific project by project_name. If project_name is provided, returns the matching project or null if not found. @@ -82,8 +82,8 @@ async def list_projects(request: Request, project_name: str = Query(None), session = SessionLocal() try: - username = user_info.get("login") - print(f"User {username} is fetching projects") + # username = user_info.get("login") + # print(f"User {username} is fetching projects") if project_name: project = session.query(Project).filter(Project.project_name == project_name).first() @@ -104,8 +104,9 @@ async def list_projects(request: Request, project_name: str = Query(None), @router.post("/upload_usfm/") -async def upload_usfm( - request: USFMUploadRequest +@validate_token +async def upload_usfm(request: Request, + project_request: USFMUploadRequest, user_details=Depends(input_token) ): """ Upload a USFM content as a string, process it, and store data in DB. @@ -115,9 +116,9 @@ async def upload_usfm( try: # Get project_id from project_name - project_name = request.project_name - usfm_sha = request.usfm_sha - encoded_usfm = request.encoded_usfm + project_name = project_request.project_name + usfm_sha = project_request.usfm_sha + encoded_usfm = project_request.encoded_usfm project_id = crud.get_project_id(session,project_name) logging.info(f"Processing USFM file for project: {project_name} (Project ID: {project_id})") @@ -209,17 +210,18 @@ async def upload_usfm( @router.put("/update_usfm/") -async def update_usfm( - request: USFMUploadRequest +@validate_token +async def update_usfm(request: Request, + project_request: USFMUploadRequest, user_details=Depends(input_token) ): """ Update an existing USFM file, reprocess it, and update both book and verse tables properly. """ session = SessionLocal() try: # Extract values from request body - project_name = request.project_name - usfm_sha = request.usfm_sha - encoded_usfm = request.encoded_usfm + project_name = project_request.project_name + usfm_sha = project_request.usfm_sha + encoded_usfm = project_request.encoded_usfm # Extract book name from USFM project_id = crud.get_project_id(session,project_name) @@ -227,7 +229,8 @@ async def update_usfm( try: usfm_bytes = base64.b64decode(encoded_usfm) usfm = usfm_bytes.decode("utf-8") # Convert bytes to string - usfm=crud.normalize_text(usfm) + #errors are not displaying properly + # usfm=crud.normalize_text(usfm) except Exception as e: logging.error(f"Failed to decode USFM content: {str(e)}") raise HTTPException(status_code=400, detail="Invalid encoded USFM content") @@ -298,7 +301,9 @@ async def update_usfm( @router.get("/list_books/") -async def list_books(project_name: str = Query(None)): +@validate_token +async def list_books(request: Request,project_name: str = Query(None), + user_details=Depends(input_token)): """ Retrieve all Bibles (projects) along with their books and their status, optionally filtering by project name """ session = SessionLocal() try: @@ -337,7 +342,9 @@ async def list_books(project_name: str = Query(None)): @router.get("/find_missing_verses/") -async def find_missing_verses(book_name: str, project_name: str): +@validate_token +async def find_missing_verses(request: Request,book_name: str, project_name: str, + user_details=Depends(input_token)): """Find missing verses for a given book_id and project_id by comparing with versification.json.""" session = SessionLocal() @@ -409,7 +416,9 @@ async def find_missing_verses(book_name: str, project_name: str): @router.get("/book/usfm/") -async def get_book_usfm(project_name: str, book_name: str): +@validate_token +async def get_book_usfm(request: Request,project_name: str, book_name: str, + user_details=Depends(input_token)): """ Get the USFM content of a book from the database. """ @@ -443,7 +452,9 @@ async def get_book_usfm(project_name: str, book_name: str): @router.get("/book/json/") -async def get_book_json(project_name: str, book_name: str): +@validate_token +async def get_book_json(request: Request,project_name: str, book_name: str, + user_details=Depends(input_token)): """ Get the book's content in JSON format. """ @@ -485,7 +496,9 @@ async def get_book_json(project_name: str, book_name: str): @router.get("/chapter/json/") -async def get_chapter_json(project_name: str, book_name: str, chapter: int): +@validate_token +async def get_chapter_json(request: Request,project_name: str, book_name: str, + chapter: int, user_details=Depends(input_token)): """ Get the chapter's content in JSON format. """ @@ -527,8 +540,10 @@ async def get_chapter_json(project_name: str, book_name: str, chapter: int): @router.get("/book/chapters/") +@validate_token # async def get_book_chapters(book_id: int): -async def get_book_chapters(project_name: str, book_name: str): +async def get_book_chapters(request: Request, project_name: str, book_name: str, + user_details=Depends(input_token)): """ Get the list of chapters available in a book. """ @@ -563,10 +578,13 @@ async def get_book_chapters(project_name: str, book_name: str): @router.get("/parallel_corpora/withbcv/") +@validate_token async def get_parallel_corpora_withbcv( + request: Request, project_name_1: str, project_name_2: str, - response_type: str = Query("csv", description="Set 'json' for JSON response, 'csv' for file download") + response_type: str = Query("csv", description="Set 'json' for JSON response, 'csv' for file download"), + user_details=Depends(input_token) ): """ Generate and return the parallel corpus between two projects (two languages) in CSV or JSON format. @@ -684,8 +702,12 @@ async def get_parallel_corpora_withbcv( @router.get("/parallel_corpora/withoutbcv/") -async def get_parallel_corpora_texts(project_name_1: str, project_name_2: str, - response_type: str = Query("csv", description="Set 'json' for JSON response, 'csv' for file download")): +@validate_token +async def get_parallel_corpora_texts(request: Request, + project_name_1: str, project_name_2: str, + response_type: str = Query("csv", + description="Set 'json' for JSON response, 'csv' for file download"), + user_details=Depends(input_token)): """ Generate and return the parallel corpus between two projects in CSV format with only Text_1 and Text_2. """ diff --git a/BACKEND/app/utils.py b/BACKEND/app/utils.py new file mode 100644 index 0000000..ac12e97 --- /dev/null +++ b/BACKEND/app/utils.py @@ -0,0 +1,9 @@ +from fastapi import Security +from fastapi.security import HTTPBearer + +oauth2_scheme = HTTPBearer() + +async def input_token(token: str = Security(oauth2_scheme)): + '''Function to validate API key, currently only for swagger to have a token input''' + user_token = {"token": token} + return user_token diff --git a/UI/src/pages/CreateRepo.tsx b/UI/src/pages/CreateRepo.tsx index d5be625..9d72089 100644 --- a/UI/src/pages/CreateRepo.tsx +++ b/UI/src/pages/CreateRepo.tsx @@ -22,9 +22,8 @@ import { useNavigate } from "react-router-dom"; import FeedbackDialog from "@/components/FeedbackDialog"; import { useStore } from "@/stores/Store"; import MultiSelect from "@/components/MultiSelect"; -import { API } from "@/services/Api"; +import { API, FastAPI } from "@/services/Api"; import { useAppEffects } from "@/hooks/UseAppEffects"; -import axios from "axios"; interface Option { value: string; @@ -199,20 +198,38 @@ const CreateRepo: React.FC = () => { const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); + let giteaRepoCreated = false; + try { + // Step 1: Create repo in Gitea const orgRepoData = { org: "BCS", name: formData.projectName, private: formData.isPrivate, description: formData.description, }; + const topics = [ ...selectedOptions.map((option) => option.value), formData.language, ]; + await postCreateRepoInOrg(orgRepoData, orgRepoData.org); + giteaRepoCreated = true; + await postCreateRepoCatalogue(topics, formData.projectName); + + // Step 2: Create project in FastAPI if applicable + if (selectedOptions[0]?.value === "bible") { + console.log("Executing add_project endpoint"); + const response = await FastAPI.post("/add_project", { + project_name: formData.projectName, + }); + console.log("Response from add_project endpoint:", response); + } + await fetchHomePageData(); + setDialogState({ isOpen: true, title: "Success", @@ -220,27 +237,12 @@ const CreateRepo: React.FC = () => { isError: false, type: "project", }); - - //hackathon - if (selectedOptions[0]?.value === "bible") { - console.log("Executing add_project endpoint"); - const response = await axios.post( - `${import.meta.env.VITE_FASTAPI_BASE_URL}/add_project`, - { - project_name: formData.projectName, - } - ); - console.log("Response from add_project endpoint:", response); - } - //hackathon - - // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { console.log("Error details:", error); let errorMessage = "Failed to create Project. Please try again."; + let errorTitle = "Error"; - console.log("Error details:", error.status); // Check for error status if (error.status === 409) { errorMessage = "A project with this name already exists."; @@ -251,16 +253,22 @@ const CreateRepo: React.FC = () => { "Failed to create Project. Please try again."; } + // Handle the case where Gitea repo was created but FastAPI project creation failed + if (giteaRepoCreated && selectedOptions[0]?.value === "bible") { + errorTitle = "Partial Success"; + errorMessage = + "The repository was created successfully, but we couldn't create the associated project in the system. Please try adding the project manually or contact support."; + } + setDialogState({ isOpen: true, - title: "Error", + title: errorTitle, message: errorMessage, isError: true, type: "project", }); } }; - const handleDialogClose = () => { const { isError, type } = dialogState; @@ -272,8 +280,19 @@ const CreateRepo: React.FC = () => { })); // Only navigate to /repo for successful project creation - if (!isError && type === "project") { - navigate("/repo"); + if ( + (!isError && type === "project") || + (isError && dialogState.title === "Partial Success") + ) { + // For partial success, fetch the data before navigating + if (isError && dialogState.title === "Partial Success") { + fetchHomePageData().then(() => { + navigate("/repo"); + }); + } else { + // For complete success, data is already fetched + navigate("/repo"); + } } }; diff --git a/UI/src/pages/data-preprocessing/ParallelCorpora.tsx b/UI/src/pages/data-preprocessing/ParallelCorpora.tsx index b17cb37..32099a0 100644 --- a/UI/src/pages/data-preprocessing/ParallelCorpora.tsx +++ b/UI/src/pages/data-preprocessing/ParallelCorpora.tsx @@ -2,11 +2,10 @@ import React, { useEffect, useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import SelectProjects from "./SelectProjects"; -import { API } from "@/services/Api"; +import { API, FastAPI } from "@/services/Api"; import { Spinner } from "@/components/ui/spinner"; import { useStore } from "@/stores/Store"; import { setHeader } from "@/services/Api"; -import axios from "axios"; import { useToast } from "@/hooks/use-toast"; // import SelectBooks from "./SelectBooks"; @@ -101,10 +100,9 @@ const ParallelCorpora: React.FC = () => { const fetchListBibles = async (repo: string, selectedRepo: string) => { try { - const response = await axios.get( - `${import.meta.env.VITE_FASTAPI_BASE_URL}/list_books/?project_name=${selectedRepo}` + const response = await FastAPI.get( + `/list_books/?project_name=${selectedRepo}` ); - // Handle different response scenarios if (repo === "repo1") { // Get the bibles array or default to empty array @@ -175,11 +173,11 @@ const ParallelCorpora: React.FC = () => { try { // Determine which API endpoint to use based on withBCV const apiEndpoint = withBCV - ? `${import.meta.env.VITE_FASTAPI_BASE_URL}/parallel_corpora/withbcv/` - : `${import.meta.env.VITE_FASTAPI_BASE_URL}/parallel_corpora/withoutbcv/`; + ? `/parallel_corpora/withbcv/` + : `/parallel_corpora/withoutbcv/`; // Make the API call - const response = await axios.get(apiEndpoint, { + const response = await FastAPI.get(apiEndpoint, { params: { project_name_1: selectedProject1, project_name_2: selectedProject2, diff --git a/UI/src/pages/data-preprocessing/ParseBooks.tsx b/UI/src/pages/data-preprocessing/ParseBooks.tsx index e551a30..80fe9a1 100644 --- a/UI/src/pages/data-preprocessing/ParseBooks.tsx +++ b/UI/src/pages/data-preprocessing/ParseBooks.tsx @@ -1,6 +1,5 @@ import { Button } from "@/components/ui/button"; -import { API } from "@/services/Api"; -import axios from "axios"; +import { API, FastAPI } from "@/services/Api"; import { useState } from "react"; import { Dialog, DialogContent, DialogFooter } from "@/components/ui/dialog"; @@ -28,9 +27,7 @@ const ParseBooks = ({ owner, repo }: ParseBooksProps) => { const fetchListBibles = async () => { try { - const response = await axios.get( - `${import.meta.env.VITE_FASTAPI_BASE_URL}/list_books/?project_name=${repo}` - ); + const response = await FastAPI.get(`/list_books/?project_name=${repo}`); const fetchedBooks = response?.data?.bibles[0]?.books || []; return fetchedBooks; } catch (error) { @@ -46,8 +43,9 @@ const ParseBooks = ({ owner, repo }: ParseBooksProps) => { const responseData = contentResponse.data.content; if (responseData) { try { - const uploadResponse = await axios[method]( - `${import.meta.env.VITE_FASTAPI_BASE_URL}/${method === "post" ? "upload_usfm" : "update_usfm"}`, + const uploadResponse = await FastAPI[method]( + `/${method === "post" ? "upload_usfm" : "update_usfm"}`, + { project_name: repo, usfm_sha: contentResponse?.data?.sha, diff --git a/UI/src/services/Api.ts b/UI/src/services/Api.ts index 63eb330..0419644 100644 --- a/UI/src/services/Api.ts +++ b/UI/src/services/Api.ts @@ -11,6 +11,16 @@ export const setHeader = (access_token: string | null) => { API.defaults.headers.common["Authorization"] = `token ${access_token}`; }; +const FastAPIBaseURL = import.meta.env.VITE_FASTAPI_BASE_URL as string; + +export const FastAPI = axios.create({ + baseURL: FastAPIBaseURL, +}) + +export const setFastAPIHeader = (access_token: string | null) => { + FastAPI.defaults.headers.common["Authorization"] = `Bearer token ${access_token}`; +}; + /** * Axios instance for making authenticated requests. */ diff --git a/UI/src/stores/Store.ts b/UI/src/stores/Store.ts index 2b65e42..98899e4 100644 --- a/UI/src/stores/Store.ts +++ b/UI/src/stores/Store.ts @@ -1,4 +1,4 @@ -import { apiService, setHeader } from "@/services/Api"; +import { apiService, setFastAPIHeader, setHeader } from "@/services/Api"; import { setupTokenRefresh } from "@/utils/refreshToken"; import { create } from "zustand"; import { createJSONStorage, persist } from "zustand/middleware"; @@ -176,6 +176,7 @@ export const useStore = create()( set({ access_token, refresh_token, expires_in }); set({ oauth_state: null }); setHeader(access_token); + setFastAPIHeader(access_token); setupTokenRefresh(expires_in); // Initialize repository after token is set From 144143a72f0cd37ee5337ef48da49c2ca8e9d565 Mon Sep 17 00:00:00 2001 From: joel-joseph-george Date: Tue, 18 Mar 2025 17:52:29 +0530 Subject: [PATCH 8/8] Adding diagrams --- docs/Images/Auth activity diagram.jpeg | Bin 0 -> 39277 bytes docs/Images/Repo creation diagram.png | Bin 0 -> 68434 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/Images/Auth activity diagram.jpeg create mode 100644 docs/Images/Repo creation diagram.png diff --git a/docs/Images/Auth activity diagram.jpeg b/docs/Images/Auth activity diagram.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..34f0ca7c1a3119150502545f51e969ec99fa1330 GIT binary patch literal 39277 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 Z*bf#jtfQxB%_#U|ZSG)p$;2b}{{Sbp$9Dh# literal 0 HcmV?d00001