Skip to content

Commit c5d4fd5

Browse files
OOPS & MVC Architecture, New UI, Graphical View, Autosave to DB
1 parent 7986635 commit c5d4fd5

File tree

15 files changed

+1913
-1174
lines changed

15 files changed

+1913
-1174
lines changed

src/app.py

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ def reset_controllers():
3232
"""Reset all controllers."""
3333
global chat_controller
3434
chat_controller = None
35-
# Don't reset project_controller as it maintains DB connections
3635

3736
# Routes
3837
@app.route("/")
@@ -48,31 +47,19 @@ def chat():
4847
controller = get_chat_controller()
4948
return controller.handle_chat_request()
5049

51-
@app.route("/submit_name", methods=["POST"])
52-
def submit_name():
53-
"""Submit name endpoint."""
54-
controller = get_chat_controller()
55-
return controller.submit_name()
56-
5750
@app.route("/generate_uml", methods=["POST"])
5851
def generate_uml():
5952
"""Generate UML endpoint."""
6053
controller = get_chat_controller()
6154
return controller.generate_uml()
6255

63-
@app.route("/get_scenarios", methods=["GET"])
64-
def get_scenarios():
65-
"""Get scenarios endpoint."""
56+
@app.route("/get_domain_model_descriptions", methods=["GET"])
57+
def get_domain_model_descriptions():
58+
"""Get domain model descriptions endpoint."""
6659
controller = get_chat_controller()
67-
return controller.get_current_scenario()
68-
69-
# Project routes
70-
@app.route("/save_to_database", methods=["POST"])
71-
def save_to_database():
72-
"""Save to database endpoint."""
73-
controller = get_project_controller()
74-
return controller.submit_to_database() # Keep the controller method name the same
60+
return controller.get_current_domain_model_description()
7561

62+
# Project routes (simplified to remove file management)
7663
@app.route("/get_projects", methods=["GET"])
7764
def get_projects():
7865
"""Get projects endpoint."""
@@ -85,17 +72,23 @@ def create_project():
8572
controller = get_project_controller()
8673
return controller.create_project()
8774

88-
@app.route("/create_file", methods=["POST"])
89-
def create_file():
90-
"""Create file endpoint."""
75+
@app.route("/rename_project", methods=["POST"])
76+
def rename_project():
77+
"""Rename project endpoint."""
78+
controller = get_project_controller()
79+
return controller.rename_project()
80+
81+
@app.route("/get_project_data", methods=["GET"])
82+
def get_project_data():
83+
"""Get project data endpoint."""
9184
controller = get_project_controller()
92-
return controller.create_file()
85+
return controller.get_project_data()
9386

94-
@app.route("/get_files", methods=["GET"])
95-
def get_files():
96-
"""Get files endpoint."""
87+
@app.route("/save_project_data", methods=["POST"])
88+
def save_project_data():
89+
"""Save project data endpoint."""
9790
controller = get_project_controller()
98-
return controller.get_files()
91+
return controller.save_project_data()
9992

10093
# Run the application
10194
if __name__ == "__main__":

src/controller/chat_controller.py

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,72 +15,84 @@ def handle_chat_request(self):
1515
user_input = request.json.get("message", "").strip()
1616
if not user_input:
1717
return jsonify({"error": "User input is required"}), 400
18-
19-
user_name = session.get("user_name")
20-
if not user_name:
21-
return jsonify({"error": "User name is not set"}), 400
2218

2319
# Add current input to chat history
2420
self.llm_service.add_to_chat_history("user", user_input)
2521

2622
# Get updated chat history after adding the new message
2723
updated_chat_history = self.llm_service.chat_history.get_messages()
2824

29-
result = self.llm_service.determine_input_type(updated_chat_history)
25+
# Format chat history as a single string
26+
chat_history_text = "\n".join([
27+
f"{'User' if msg['role'] == 'user' else 'Assistant'}: {msg['content']}"
28+
for msg in updated_chat_history
29+
])
30+
31+
# Determine input type with enhanced analysis
32+
result = self.llm_service.determine_input_type(chat_history_text)
33+
34+
# Extract all classification fields
35+
decision = result.get("decision", False)
36+
is_update = result.get("is_update", False)
37+
is_casual_comment = result.get("is_casual_comment", False)
3038
suggestions = result.get("suggestions", [])
3139

32-
# Check if there's enough info for a domain model based on decision
33-
if result.get("decision", False):
34-
# Generate domain model description if there's enough information
35-
scenario = self.llm_service.generate_scenario(user_input)
36-
formatted_suggestions = "**Suggestions to improve your domain model:**\n" + "\n".join([f"- {suggestion}" for suggestion in suggestions])
40+
# Format the response from the suggestions array
41+
formatted_suggestions = "\n".join(suggestions) if isinstance(suggestions, list) else suggestions
42+
43+
# Handle each case appropriately
44+
if is_casual_comment:
45+
# Casual comment - don't regenerate the domain model
46+
self.llm_service.add_to_chat_history("assistant", formatted_suggestions)
47+
return jsonify({
48+
"response": formatted_suggestions,
49+
"history": self.llm_service.get_chat_history()
50+
})
51+
52+
elif decision:
53+
# Enough information for domain modeling (either new model or update)
54+
domain_model_description = self.llm_service.generate_domain_model_description(chat_history_text)
3755

38-
# Add suggestions to chat history
56+
# Add response to chat history
3957
self.llm_service.add_to_chat_history("assistant", formatted_suggestions)
4058

41-
return jsonify({"scenario": scenario, "suggestion": formatted_suggestions})
42-
else:
43-
# Not enough info for domain modeling - show suggestions for what's needed
44-
formatted_suggestions = "**To create a domain model, I need more information:**\n" + "\n".join([f"- {suggestion}" for suggestion in suggestions])
59+
return jsonify({
60+
"domain_model_description": domain_model_description,
61+
"suggestion": formatted_suggestions
62+
})
4563

46-
# Add suggestions to chat history
64+
else:
65+
# Not enough info for domain modeling
4766
self.llm_service.add_to_chat_history("assistant", formatted_suggestions)
4867

49-
# Return response in a format that won't trigger domain model description display
50-
return jsonify({"response": formatted_suggestions, "history": self.llm_service.get_chat_history()})
68+
return jsonify({
69+
"response": formatted_suggestions,
70+
"history": self.llm_service.get_chat_history()
71+
})
5172

5273
except Exception as e:
5374
print(f"Error in chat request: {e}")
75+
import traceback
76+
traceback.print_exc() # Add traceback for better error debugging
5477
return jsonify({"error": "An unexpected error occurred"}), 500
5578

56-
def submit_name(self):
57-
"""Store user's name in session"""
58-
try:
59-
user_name = request.json.get("name", "").strip()
60-
if not user_name:
61-
return jsonify({"error": "Name is required"}), 400
62-
63-
session["user_name"] = user_name
64-
return jsonify({"message": "Name saved successfully!", "name": user_name})
65-
except Exception as e:
66-
print(f"Error storing name: {e}")
67-
return jsonify({"error": "An error occurred while storing the name"}), 500
79+
# Remove submit_name method
6880

6981
def generate_uml(self):
70-
"""Generate UML diagram from scenario"""
82+
"""Generate UML diagram from domain model description"""
7183
try:
72-
scenario_text = request.json.get("scenarioText", "").strip()
73-
if not scenario_text:
84+
domain_model_description_text = request.json.get("domainModelDescriptionText", "").strip()
85+
if not domain_model_description_text:
7486
return jsonify({"error": "Domain Model Description is required"}), 400
7587

7688
client = self.llm_service.client
77-
plant_uml = gpt_v2_interface(scenario_text, client)
89+
plant_uml = gpt_v2_interface(domain_model_description_text, client)
7890
return jsonify({"plantuml": plant_uml})
7991
except Exception as e:
8092
print(f"Error generating UML: {e}")
8193
return jsonify({"error": "An error occurred while generating the UML"}), 500
8294

83-
def get_current_scenario(self):
84-
"""Retrieve the current scenario"""
85-
scenario = self.llm_service.get_current_scenario()
86-
return jsonify({"scenario": scenario})
95+
def get_current_domain_model_description(self):
96+
"""Retrieve the current domain model description"""
97+
domain_model_description = self.llm_service.get_current_domain_model_description()
98+
return jsonify({"domain_model_description": domain_model_description})

src/controller/project_controller.py

Lines changed: 31 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,10 @@
22
from src.model.project_service import ProjectService
33

44
class ProjectController:
5-
"""Controller for project management operations"""
5+
"""Controller for project management operations (simplified model)"""
66

77
def __init__(self):
88
self.project_service = ProjectService()
9-
10-
def submit_to_database(self):
11-
"""Submit work results to the database"""
12-
try:
13-
data = request.json
14-
project_name = data.get("project_name", "").strip()
15-
file_name = data.get("file_name", "").strip()
16-
username = data.get("username", "").strip()
17-
scenario = data.get("scenario", "")
18-
plant_uml = data.get("plant_uml", "")
19-
chat_history = data.get("chat_history", [])
20-
21-
result, status_code = self.project_service.submit_to_database(
22-
project_name, file_name, username, scenario, plant_uml, chat_history
23-
)
24-
25-
return jsonify(result), status_code
26-
except Exception as e:
27-
print(f"Error in submit_to_database: {e}")
28-
return jsonify({"error": "An unexpected error occurred."}), 500
299

3010
def get_projects(self):
3111
"""Get list of projects from database"""
@@ -37,38 +17,52 @@ def get_projects(self):
3717
return jsonify({"error": "An unexpected error occurred."}), 500
3818

3919
def create_project(self):
40-
"""Create a new project in the database"""
20+
"""Create a new project with auto-generated name"""
4121
try:
42-
data = request.json
43-
project_name = data.get("project_name", "").strip()
44-
username = data.get("username", session.get("user_name", "Anonymous")).strip()
45-
46-
result, status_code = self.project_service.create_project(project_name, username)
22+
result, status_code = self.project_service.create_project()
4723
return jsonify(result), status_code
4824
except Exception as e:
4925
print(f"Error in create_project: {e}")
5026
return jsonify({"error": "An unexpected error occurred."}), 500
5127

52-
def create_file(self):
53-
"""Create a new file within a project"""
28+
def rename_project(self):
29+
"""Rename an existing project"""
5430
try:
5531
data = request.json
56-
project_name = data.get("project_name", "").strip()
57-
file_name = data.get("file_name", "").strip()
32+
old_project_name = data.get("old_project_name", "").strip()
33+
new_project_name = data.get("new_project_name", "").strip()
5834

59-
result, status_code = self.project_service.create_file(project_name, file_name)
35+
result, status_code = self.project_service.rename_project(old_project_name, new_project_name)
6036
return jsonify(result), status_code
6137
except Exception as e:
62-
print(f"Error in create_file: {e}")
38+
print(f"Error in rename_project: {e}")
6339
return jsonify({"error": "An unexpected error occurred."}), 500
6440

65-
def get_files(self):
66-
"""Get list of files for a project"""
41+
def get_project_data(self):
42+
"""Get project data for the specified project"""
6743
try:
6844
project_name = request.args.get("project_name", "").strip()
6945

70-
result, status_code = self.project_service.get_files(project_name)
46+
result, status_code = self.project_service.get_project_data(project_name)
47+
return jsonify(result), status_code
48+
except Exception as e:
49+
print(f"Error in get_project_data: {e}")
50+
return jsonify({"error": "An unexpected error occurred."}), 500
51+
52+
def save_project_data(self):
53+
"""Save data for the specified project"""
54+
try:
55+
data = request.json
56+
project_name = data.get("project_name", "").strip()
57+
domain_model_description = data.get("domain_model_description")
58+
plant_uml = data.get("plant_uml")
59+
chat_history = data.get("chat_history")
60+
61+
result, status_code = self.project_service.save_project_data(
62+
project_name, domain_model_description, plant_uml, chat_history
63+
)
64+
7165
return jsonify(result), status_code
7266
except Exception as e:
73-
print(f"Error in get_files: {e}")
67+
print(f"Error in save_project_data: {e}")
7468
return jsonify({"error": "An unexpected error occurred."}), 500
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class DomainModelDescription:
2+
"""Data object for storing and managing domain model descriptions."""
3+
4+
def __init__(self, text=None):
5+
"""Initialize a domain model description"""
6+
self.text = text
7+
8+
def set_text(self, text):
9+
"""Set the domain model description."""
10+
self.text = text
11+
12+
def add_text(self, text):
13+
"""Add a new domain model description (currently replaces existing one)."""
14+
self.text = text
15+
16+
def get_text(self):
17+
"""Get the domain model description."""
18+
return self.text

0 commit comments

Comments
 (0)