Skip to content

Commit 27d2d34

Browse files
committed
feat: Changed operations to return a JSONResponse
1 parent dcf492c commit 27d2d34

File tree

9 files changed

+154
-116
lines changed

9 files changed

+154
-116
lines changed

app/controllers/config_operation_controller.py

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,7 @@ async def valid_config(
5151
model_text = await smt_model.transform()
5252
await replace_smt_text(smt_text_id, model_text)
5353
config = await read_serial_numbers_by_releases(valid_config_request.node_type.value, valid_config_request.config)
54-
result = await execute_valid_config(smt_model, config)
55-
return JSONResponse(
56-
status_code=status.HTTP_200_OK, content=json_encoder(
57-
{
58-
"result": result,
59-
"code": "valid_config_success",
60-
}
61-
)
62-
)
54+
return await execute_valid_config(smt_model, config)
6355
else:
6456
return JSONResponse(
6557
status_code=status.HTTP_200_OK,
@@ -95,15 +87,7 @@ async def complete_config(
9587
model_text = await smt_model.transform()
9688
await replace_smt_text(smt_text_id, model_text)
9789
config = await read_serial_numbers_by_releases(complete_config_request.node_type.value, complete_config_request.config)
98-
result = await execute_complete_config(smt_model, config)
99-
return JSONResponse(
100-
status_code=status.HTTP_200_OK, content=json_encoder(
101-
{
102-
"result": result,
103-
"code": "complete_config_success",
104-
}
105-
)
106-
)
90+
return await execute_complete_config(smt_model, config)
10791
else:
10892
return JSONResponse(
10993
status_code=status.HTTP_200_OK,
@@ -138,15 +122,7 @@ async def config_by_impact(
138122
else:
139123
model_text = await smt_model.transform()
140124
await replace_smt_text(smt_text_id, model_text)
141-
result = execute_config_by_impact(smt_model, config_by_impact_request.impact)
142-
return JSONResponse(
143-
status_code=status.HTTP_200_OK, content=json_encoder(
144-
{
145-
"result": result,
146-
"code": "config_by_impact_success",
147-
}
148-
)
149-
)
125+
return execute_config_by_impact(smt_model, config_by_impact_request.impact)
150126
else:
151127
return JSONResponse(
152128
status_code=status.HTTP_200_OK,

app/controllers/file_operation_controller.py

Lines changed: 35 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -57,25 +57,37 @@ async def requirement_file_info(
5757
file_info_request.requirement_file_id,
5858
file_info_request.max_level
5959
)
60-
for direct_package in result["direct_dependencies"]:
61-
direct_package["versions"] = await filter_versions(
62-
file_info_request.node_type.value,
63-
direct_package["versions"],
64-
direct_package["package_constraints"]
65-
)
66-
for _, indirect_packages in result["indirect_dependencies_by_depth"].items():
67-
for indirect_package in indirect_packages:
68-
indirect_package["versions"] = await filter_versions(
60+
if operation_result["total_direct_dependencies"] == 0:
61+
for direct_package in result["direct_dependencies"]:
62+
direct_package["versions"] = await filter_versions(
6963
file_info_request.node_type.value,
70-
indirect_package["versions"],
71-
indirect_package["package_constraints"]
64+
direct_package["versions"],
65+
direct_package["package_constraints"]
7266
)
67+
for _, indirect_packages in result["indirect_dependencies_by_depth"].items():
68+
for indirect_package in indirect_packages:
69+
indirect_package["versions"] = await filter_versions(
70+
file_info_request.node_type.value,
71+
indirect_package["versions"],
72+
indirect_package["package_constraints"]
73+
)
74+
else:
75+
return JSONResponse(
76+
status_code=status.HTTP_200_OK,
77+
content=json_encoder(
78+
{
79+
"code": "no_dependencies",
80+
}
81+
),
82+
)
7383
await replace_operation_result(operation_result_id, result)
7484
return JSONResponse(
75-
status_code=status.HTTP_200_OK, content=json_encoder({
76-
"result": result,
77-
"code": "file_info_success",
78-
})
85+
status_code=status.HTTP_200_OK, content=json_encoder(
86+
{
87+
"result": result,
88+
"code": "file_info_success",
89+
}
90+
)
7991
)
8092

8193

@@ -102,16 +114,10 @@ async def valid_graph(
102114
else:
103115
model_text = await smt_model.transform()
104116
await replace_smt_text(smt_text_id, model_text)
105-
result = execute_valid_graph(smt_model)
106-
return JSONResponse(
107-
status_code=status.HTTP_200_OK, content=json_encoder({
108-
"result": result,
109-
"code": "valid_graph_success",
110-
})
111-
)
117+
return execute_valid_graph(smt_model)
112118
else:
113119
return JSONResponse(
114-
status_code=status.HTTP_400_BAD_REQUEST,
120+
status_code=status.HTTP_200_OK,
115121
content=json_encoder(
116122
{
117123
"code": "no_dependencies",
@@ -143,18 +149,10 @@ async def minimize_impact(
143149
else:
144150
model_text = await smt_model.transform()
145151
await replace_smt_text(smt_text_id, model_text)
146-
result = await execute_minimize_impact(smt_model, min_max_impact_request.limit)
147-
return JSONResponse(
148-
status_code=status.HTTP_200_OK, content=json_encoder(
149-
{
150-
"result": result,
151-
"code": "minimize_impact_success",
152-
}
153-
)
154-
)
152+
return await execute_minimize_impact(smt_model, min_max_impact_request.limit)
155153
else:
156154
return JSONResponse(
157-
status_code=status.HTTP_400_BAD_REQUEST,
155+
status_code=status.HTTP_200_OK,
158156
content=json_encoder(
159157
{
160158
"code": "no_dependencies",
@@ -186,18 +184,10 @@ async def maximize_impact(
186184
else:
187185
model_text = await smt_model.transform()
188186
await replace_smt_text(smt_text_id, model_text)
189-
result = await execute_maximize_impact(smt_model, min_max_impact_request.limit)
190-
return JSONResponse(
191-
status_code=status.HTTP_200_OK, content=json_encoder(
192-
{
193-
"result": result,
194-
"code": "maximize_impact_success"
195-
}
196-
)
197-
)
187+
return await execute_maximize_impact(smt_model, min_max_impact_request.limit)
198188
else:
199189
return JSONResponse(
200-
status_code=status.HTTP_400_BAD_REQUEST,
190+
status_code=status.HTTP_200_OK,
201191
content=json_encoder(
202192
{
203193
"code": "no_dependencies",
@@ -229,18 +219,10 @@ async def filter_configs(
229219
else:
230220
model_text = await smt_model.transform()
231221
await replace_smt_text(smt_text_id, model_text)
232-
result = await execute_filter_configs(smt_model, filter_configs_request.max_threshold, filter_configs_request.min_threshold, filter_configs_request.limit)
233-
return JSONResponse(
234-
status_code=status.HTTP_200_OK, content=json_encoder(
235-
{
236-
"result": result,
237-
"code": "filter_configs_success",
238-
}
239-
)
240-
)
222+
return await execute_filter_configs(smt_model, filter_configs_request.max_threshold, filter_configs_request.min_threshold, filter_configs_request.limit)
241223
else:
242224
return JSONResponse(
243-
status_code=status.HTTP_400_BAD_REQUEST,
225+
status_code=status.HTTP_200_OK,
244226
content=json_encoder(
245227
{
246228
"code": "no_dependencies",
Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
from z3 import Int, Optimize, sat, unknown
22

3+
from fastapi import status
4+
from fastapi.responses import JSONResponse
5+
36
from app.utils.smt.config_sanitizer import config_sanitizer
47
from app.utils.smt.model import SMTModel
8+
from app.utils import json_encoder
59

610

7-
async def execute_complete_config(model: SMTModel, config: dict[str, int]) -> list[dict[str, float | int]] | str:
11+
async def execute_complete_config(model: SMTModel, config: dict[str, int]) -> JSONResponse:
812
solver = Optimize()
913
solver.set("timeout", 3000)
1014
result = []
@@ -14,13 +18,19 @@ async def execute_complete_config(model: SMTModel, config: dict[str, int]) -> li
1418
solver.add(model.domain)
1519
for package, serial_number in config.items():
1620
solver.add(Int(package) == serial_number)
17-
while solver.check() == sat:
21+
if solver.check() == sat:
1822
config = solver.model()
1923
sanitized_config = await config_sanitizer(model.node_type, config)
2024
result.append(sanitized_config)
21-
break
22-
if solver.check() == unknown:
23-
result = (
24-
"Execution timed out after 3 seconds. The complexity of the model is too high, try lowering the maximum level of the graph."
25+
code = "operation_success"
26+
elif solver.check() == unknown:
27+
result = ""
28+
code = "smt_timeout"
29+
return JSONResponse(
30+
status_code=status.HTTP_200_OK, content=json_encoder(
31+
{
32+
"result": result,
33+
"code": code,
34+
}
2535
)
26-
return result
36+
)
Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
from z3 import Abs, Optimize, sat, unknown
22

3+
from fastapi import status
4+
from fastapi.responses import JSONResponse
5+
36
from app.utils.smt.config_sanitizer import config_sanitizer
47
from app.utils.smt.model import SMTModel
8+
from app.utils import json_encoder
59

610

7-
async def execute_config_by_impact(model: SMTModel, impact: int) -> list[dict[str, float | int]] | str:
11+
async def execute_config_by_impact(model: SMTModel, impact: int) -> JSONResponse:
812
solver = Optimize()
913
solver.set("timeout", 3000)
1014
result = []
@@ -13,13 +17,19 @@ async def execute_config_by_impact(model: SMTModel, impact: int) -> list[dict[st
1317
obj = Abs(impact - impact)
1418
solver.minimize(obj)
1519
solver.add(model.domain)
16-
while solver.check() == sat:
20+
if solver.check() == sat:
1721
config = solver.model()
1822
sanitized_config = await config_sanitizer(model.node_type, config)
1923
result.append(sanitized_config)
20-
break
21-
if solver.check() == unknown:
22-
result = (
23-
"Execution timed out after 3 seconds. The complexity of the model is too high, try lowering the maximum level of the graph."
24+
code = "operation_success"
25+
elif solver.check() == unknown:
26+
result = ""
27+
code = "smt_timeout"
28+
return JSONResponse(
29+
status_code=status.HTTP_200_OK, content=json_encoder(
30+
{
31+
"result": result,
32+
"code": code,
33+
}
2434
)
25-
return result
35+
)

app/utils/smt/operations/filter_configs.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
from z3 import And, Or, Solver, sat, unknown
22

3+
from fastapi import status
4+
from fastapi.responses import JSONResponse
5+
36
from app.utils.smt.config_sanitizer import config_sanitizer
47
from app.utils.smt.model import SMTModel
8+
from app.utils import json_encoder
59

610

7-
async def execute_filter_configs(model: SMTModel, max_threshold: float, min_threshold: float, limit: int) -> list[dict[str, float | int]] | str:
11+
async def execute_filter_configs(model: SMTModel, max_threshold: float, min_threshold: float, limit: int) -> JSONResponse:
812
if model.func_obj is not None:
913
impact = model.func_obj
1014
max_ctc = impact <= max_threshold
@@ -25,7 +29,15 @@ async def execute_filter_configs(model: SMTModel, max_threshold: float, min_thre
2529
block.append(config[var] != variable)
2630
solver.add(Or(block))
2731
if solver.check() == unknown:
28-
result = (
29-
"Execution timed out after 3 seconds. The complexity of the model is too high, try lowering the maximum level of the graph."
32+
result = ""
33+
code = "smt_timeout"
34+
else:
35+
code = "operation_success"
36+
return JSONResponse(
37+
status_code=status.HTTP_200_OK, content=json_encoder(
38+
{
39+
"result": result,
40+
"code": code,
41+
}
3042
)
31-
return result
43+
)

app/utils/smt/operations/maximize_impact.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
from z3 import Optimize, Or, sat, unknown
22

3+
from fastapi import status
4+
from fastapi.responses import JSONResponse
5+
36
from app.utils.smt.config_sanitizer import config_sanitizer
47
from app.utils.smt.model import SMTModel
8+
from app.utils import json_encoder
59

610

7-
async def execute_maximize_impact(model: SMTModel, limit: int) -> list[dict[str, float | int]] | str:
11+
async def execute_maximize_impact(model: SMTModel, limit: int) -> JSONResponse:
812
solver = Optimize()
913
solver.set("timeout", 3000)
1014
result = []
@@ -24,7 +28,15 @@ async def execute_maximize_impact(model: SMTModel, limit: int) -> list[dict[str,
2428
block.append(config[var] != variable)
2529
solver.add(Or(block))
2630
if solver.check() == unknown:
27-
result = (
28-
"Execution timed out after 3 seconds. The complexity of the model is too high, try lowering the maximum level of the graph."
31+
result = ""
32+
code = "smt_timeout"
33+
else:
34+
code = "operation_success"
35+
return JSONResponse(
36+
status_code=status.HTTP_200_OK, content=json_encoder(
37+
{
38+
"result": result,
39+
"code": code,
40+
}
2941
)
30-
return result
42+
)

app/utils/smt/operations/minimize_impact.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
from z3 import Optimize, Or, sat, unknown
22

3+
from fastapi import status
4+
from fastapi.responses import JSONResponse
5+
36
from app.utils.smt.config_sanitizer import config_sanitizer
47
from app.utils.smt.model import SMTModel
8+
from app.utils import json_encoder
59

610

7-
async def execute_minimize_impact(model: SMTModel, limit: int) -> list[dict[str, float | int]] | str:
11+
async def execute_minimize_impact(model: SMTModel, limit: int) -> JSONResponse:
812
solver = Optimize()
913
solver.set("timeout", 3000)
1014
result = []
@@ -24,7 +28,15 @@ async def execute_minimize_impact(model: SMTModel, limit: int) -> list[dict[str,
2428
block.append(config[var] != variable)
2529
solver.add(Or(block))
2630
if solver.check() == unknown:
27-
result = (
28-
"Execution timed out after 3 seconds. The complexity of the model is too high, try lowering the maximum level of the graph."
31+
result = ""
32+
code = "smt_timeout"
33+
else:
34+
code = "operation_success"
35+
return JSONResponse(
36+
status_code=status.HTTP_200_OK, content=json_encoder(
37+
{
38+
"result": result,
39+
"code": code,
40+
}
2941
)
30-
return result
42+
)

0 commit comments

Comments
 (0)