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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191 | from fastapi import APIRouter, Body, Query, Request
from fastapi.responses import HTMLResponse, PlainTextResponse, Response
from openfoodfacts_proxy.core.application_container import ApplicationContainer
from openfoodfacts_proxy.models.search_a_licious import (
ErrorSearchResponse,
SearchALiciousAutocompleteResponse,
SearchALiciousDocumentResponse,
SearchALiciousHealthResponse,
SearchParameters,
SuccessSearchResponse,
)
router = APIRouter(prefix="/search-a-licious")
compatibility_router = APIRouter()
@router.get("/", response_class=HTMLResponse, summary="Off Demo")
async def search_a_licious_demo(request: Request) -> Response:
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(request)
@router.get("/off-test", response_class=HTMLResponse, summary="Html Search")
async def search_a_licious_html_search(
request: Request,
q: str | None = Query(None),
page: int = Query(1),
page_size: int = Query(24),
langs: str = Query("fr,en"),
sort_by: str | None = Query(None),
index_id: str | None = Query(None),
display_debug: bool = Query(False),
) -> Response:
del q, page, page_size, langs, sort_by, index_id, display_debug
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(request)
@router.get(
"/document/{identifier}",
response_model=SearchALiciousDocumentResponse,
summary="Get Document",
description="Fetch a document from Elasticsearch with the specified identifier.",
)
async def get_document(
request: Request,
identifier: str,
index_id: str | None = Query(None),
) -> Response:
del identifier, index_id
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(request)
@compatibility_router.get(
"/document/{identifier}",
response_model=SearchALiciousDocumentResponse,
summary="Get Document",
description="Search host compatibility alias for the document endpoint.",
)
async def get_document_compat(
request: Request,
identifier: str,
index_id: str | None = Query(None),
) -> Response:
del index_id
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(
request,
upstream_path=f"/document/{identifier}",
)
@router.get(
"/search",
response_model=SuccessSearchResponse | ErrorSearchResponse,
summary="Search Get",
)
async def search_get(
request: Request,
q: str | None = Query(None, description="The Lucene or full-text search query."),
langs: str | None = Query(None, description="Comma-separated list of languages to support during search."),
page_size: int = Query(10, description="Number of results to return per page."),
page: int = Query(1, ge=1, description="Page to request, starting at 1."),
fields: str | None = Query(None, description="Comma-separated list of fields to include in the response."),
sort_by: str | None = Query(None, description="Field name or script name to use for sorting."),
facets: str | None = Query(None, description="Comma-separated list of facets to include."),
charts: str | None = Query(None, description="Comma-separated chart definitions to request."),
index_id: str | None = Query(None, description="Index identifier to query."),
) -> Response:
del q, langs, page_size, page, fields, sort_by, facets, charts, index_id
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(request)
@compatibility_router.get(
"/search",
response_model=SuccessSearchResponse | ErrorSearchResponse,
summary="Search Get",
)
async def search_get_compat(
request: Request,
q: str | None = Query(None, description="The Lucene or full-text search query."),
langs: str | None = Query(None, description="Comma-separated list of languages to support during search."),
page_size: int = Query(10, description="Number of results to return per page."),
page: int = Query(1, ge=1, description="Page to request, starting at 1."),
fields: str | None = Query(None, description="Comma-separated list of fields to include in the response."),
sort_by: str | None = Query(None, description="Field name or script name to use for sorting."),
facets: str | None = Query(None, description="Comma-separated list of facets to include."),
charts: str | None = Query(None, description="Comma-separated chart definitions to request."),
index_id: str | None = Query(None, description="Index identifier to query."),
) -> Response:
del q, langs, page_size, page, fields, sort_by, facets, charts, index_id
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(
request,
upstream_path="/search",
)
@router.post(
"/search",
response_model=SuccessSearchResponse | ErrorSearchResponse,
summary="Search",
)
async def search_post(
request: Request,
payload: SearchParameters = Body(...),
) -> Response:
del payload
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(request)
@compatibility_router.post(
"/search",
response_model=SuccessSearchResponse | ErrorSearchResponse,
summary="Search",
)
async def search_post_compat(
request: Request,
payload: SearchParameters = Body(...),
) -> Response:
del payload
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(
request,
upstream_path="/search",
)
@router.get(
"/autocomplete",
response_model=SearchALiciousAutocompleteResponse,
summary="Taxonomy Autocomplete",
)
async def autocomplete(
request: Request,
q: str = Query(..., description="User autocomplete query."),
taxonomy_names: str = Query(..., description="Comma-separated taxonomy names to search in."),
lang: str = Query("en", description="Language to search in."),
size: int = Query(10, description="Number of results to return."),
fuzziness: int | None = Query(None, description="Optional fuzziness level to use."),
index_id: str | None = Query(None, description="Index identifier to query."),
) -> Response:
del q, taxonomy_names, lang, size, fuzziness, index_id
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(request)
@compatibility_router.get(
"/autocomplete",
response_model=SearchALiciousAutocompleteResponse,
summary="Taxonomy Autocomplete",
)
async def autocomplete_compat(
request: Request,
q: str = Query(..., description="User autocomplete query."),
taxonomy_names: str = Query(..., description="Comma-separated taxonomy names to search in."),
lang: str = Query("en", description="Language to search in."),
size: int = Query(10, description="Number of results to return."),
fuzziness: int | None = Query(None, description="Optional fuzziness level to use."),
index_id: str | None = Query(None, description="Index identifier to query."),
) -> Response:
del q, taxonomy_names, lang, size, fuzziness, index_id
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(
request,
upstream_path="/autocomplete",
)
@router.get("/health", response_model=SearchALiciousHealthResponse, summary="Healthcheck")
async def health(request: Request) -> Response:
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(request)
@router.get("/robots.txt", response_class=PlainTextResponse, summary="Robots Txt")
async def robots_txt(request: Request) -> Response:
return await ApplicationContainer.from_app(request.app).search_a_licious_handler.handle(request)
|