1- from fastapi import APIRouter , Request , Form , HTTPException
1+ """Ingest endpoint for the API."""
2+
3+ from fastapi import APIRouter
24from fastapi .responses import JSONResponse
3- from typing import Optional
5+
6+ from server .form_types import IntForm , OptStrForm , StrForm
7+ from server .models import IngestErrorResponse , IngestRequest , IngestSuccessResponse , PatternType
48from server .query_processor import process_query
59from server .server_utils import limiter
6- from server .models import IngestRequest , IngestSuccessResponse , IngestErrorResponse , IngestResponse , PatternType
710
811router = APIRouter ()
912
10- @router .post ("/api/ingest" ,
11- responses = {
12- 200 : {"model" : IngestSuccessResponse , "description" : "Successful ingestion" },
13- 400 : {"model" : IngestErrorResponse , "description" : "Bad request or processing error" },
14- 500 : {"model" : IngestErrorResponse , "description" : "Internal server error" }
15- })
13+
14+ @router .post (
15+ "/api/ingest" ,
16+ responses = {
17+ 200 : {"model" : IngestSuccessResponse , "description" : "Successful ingestion" },
18+ 400 : {"model" : IngestErrorResponse , "description" : "Bad request or processing error" },
19+ 500 : {"model" : IngestErrorResponse , "description" : "Internal server error" },
20+ },
21+ )
1622@limiter .limit ("10/minute" )
1723async def api_ingest (
18- request : Request ,
19- input_text : str = Form (...) ,
20- max_file_size : int = Form (...) ,
21- pattern_type : str = Form ( "exclude" ) ,
22- pattern : str = Form ( "" ) ,
23- token : Optional [ str ] = Form ( None ) ,
24- ):
24+ * ,
25+ input_text : StrForm ,
26+ max_file_size : IntForm ,
27+ pattern_type : StrForm = "exclude" ,
28+ pattern : StrForm = "" ,
29+ token : OptStrForm = None ,
30+ ) -> JSONResponse :
2531 """Ingest a Git repository and return processed content.
26-
32+
2733 This endpoint processes a Git repository by cloning it, analyzing its structure,
2834 and returning a summary with the repository's content. The response includes
2935 file tree structure, processed content, and metadata about the ingestion.
30-
36+
3137 Parameters
3238 ----------
33- input_text : str
39+ input_text : StrForm
3440 Git repository URL or slug to ingest
35- max_file_size : int
41+ max_file_size : IntForm
3642 Maximum file size slider position (0-500) for filtering files
37- pattern_type : str
43+ pattern_type : StrForm
3844 Type of pattern to use for file filtering ("include" or "exclude")
39- pattern : str
45+ pattern : StrForm
4046 Glob/regex pattern string for file filtering
41- token : str | None
47+ token : OptStrForm
4248 GitHub personal access token (PAT) for accessing private repositories
43-
49+
4450 Returns
4551 -------
4652 JSONResponse
4753 Success response with ingestion results or error response with appropriate HTTP status code
48-
49- Raises
50- ------
51- HTTPException
52- If validation fails or processing encounters an error
54+
5355 """
5456 try :
5557 # Validate input using Pydantic model
@@ -58,19 +60,18 @@ async def api_ingest(
5860 max_file_size = max_file_size ,
5961 pattern_type = PatternType (pattern_type ),
6062 pattern = pattern ,
61- token = token
63+ token = token ,
6264 )
63-
65+
6466 context = await process_query (
65- request ,
6667 input_text = ingest_request .input_text ,
6768 slider_position = ingest_request .max_file_size ,
68- pattern_type = ingest_request .pattern_type . value ,
69+ pattern_type = ingest_request .pattern_type ,
6970 pattern = ingest_request .pattern ,
7071 is_index = True ,
7172 token = ingest_request .token ,
7273 )
73-
74+
7475 if "error" in context :
7576 # Return structured error response with 400 status code
7677 error_response = IngestErrorResponse (
@@ -79,13 +80,13 @@ async def api_ingest(
7980 default_file_size = context .get ("default_file_size" , max_file_size ),
8081 pattern_type = context .get ("pattern_type" , pattern_type ),
8182 pattern = context .get ("pattern" , pattern ),
82- token = token
83+ token = token ,
8384 )
8485 return JSONResponse (
8586 status_code = 400 ,
86- content = error_response .model_dump ()
87+ content = error_response .model_dump (),
8788 )
88-
89+
8990 # Return structured success response with 200 status code
9091 success_response = IngestSuccessResponse (
9192 result = True ,
@@ -97,39 +98,39 @@ async def api_ingest(
9798 default_file_size = context ["default_file_size" ],
9899 pattern_type = context ["pattern_type" ],
99100 pattern = context ["pattern" ],
100- token = context .get ("token" )
101+ token = context .get ("token" ),
101102 )
102103 return JSONResponse (
103104 status_code = 200 ,
104- content = success_response .model_dump ()
105+ content = success_response .model_dump (),
105106 )
106-
107+
107108 except ValueError as ve :
108109 # Handle validation errors with 400 status code
109110 error_response = IngestErrorResponse (
110- error = f"Validation error: { str ( ve ) } " ,
111+ error = f"Validation error: { ve !s } " ,
111112 repo_url = input_text ,
112113 default_file_size = max_file_size ,
113114 pattern_type = pattern_type ,
114115 pattern = pattern ,
115- token = token
116+ token = token ,
116117 )
117118 return JSONResponse (
118119 status_code = 400 ,
119- content = error_response .model_dump ()
120+ content = error_response .model_dump (),
120121 )
121-
122+
122123 except Exception as exc :
123124 # Handle unexpected errors with 500 status code
124125 error_response = IngestErrorResponse (
125- error = f"Internal server error: { str ( exc ) } " ,
126+ error = f"Internal server error: { exc !s } " ,
126127 repo_url = input_text ,
127128 default_file_size = max_file_size ,
128129 pattern_type = pattern_type ,
129130 pattern = pattern ,
130- token = token
131+ token = token ,
131132 )
132133 return JSONResponse (
133134 status_code = 500 ,
134- content = error_response .model_dump ()
135- )
135+ content = error_response .model_dump (),
136+ )
0 commit comments