|
20 | 20 | add_recommended_challenge, |
21 | 21 | update_recommended_challenge_service, |
22 | 22 | ) |
| 23 | +from app.services.category import ( |
| 24 | + select_categories, |
| 25 | +) |
23 | 26 | from app.services.ai import get_ai_analysis, get_goal_challenges_analysis |
24 | 27 |
|
25 | 28 |
|
@@ -95,23 +98,49 @@ async def get_or_create_today_recommended_challenges( |
95 | 98 | # 3. AI 분석 요청 |
96 | 99 | challenges_data = await get_goal_challenges_analysis(str(user_id)) |
97 | 100 |
|
| 101 | + # 카테고리 목록 가져오기 |
| 102 | + categories = await select_categories(db) |
| 103 | + # 카테고리 이름을 키로, ID를 값으로 하는 딕셔너리 생성 |
| 104 | + category_map = { |
| 105 | + str(category.category_name.value): category.id for category in categories |
| 106 | + } |
| 107 | + |
98 | 108 | # 4. 각 목표별로 추천 도전과제 생성 |
99 | 109 | created_challenges = [] |
100 | 110 | for goal, challenge_data in challenges_data.items(): |
| 111 | + progress_rate = 0.0 |
| 112 | + # AI 분석 결과에서 받은 ID 사용 |
| 113 | + try: |
| 114 | + category_id = UUID(str(challenge_data.get("category_id", ""))) |
| 115 | + except (ValueError, TypeError): |
| 116 | + category_id = None |
| 117 | + |
| 118 | + # category_id가 None이거나 유효하지 않은 경우, 목표 이름에 따라 카테고리 매핑 |
| 119 | + if category_id is None or category_id not in category_map.values(): |
| 120 | + # 목표 이름과 카테고리 이름의 유사도를 기반으로 매핑 |
| 121 | + # 예: "운동하기" -> "운동", "영어공부" -> "영어" |
| 122 | + matched_category = None |
| 123 | + for category_name, category_id in category_map.items(): |
| 124 | + if category_name in goal or goal in category_name: |
| 125 | + matched_category = category_id |
| 126 | + break |
| 127 | + |
| 128 | + # 매칭되는 카테고리가 없으면 첫 번째 카테고리를 기본값으로 사용 |
| 129 | + category_id = ( |
| 130 | + matched_category |
| 131 | + if matched_category |
| 132 | + else next(iter(category_map.values())) |
| 133 | + ) |
| 134 | + progress_rate = -1.0 |
| 135 | + |
101 | 136 | new_challenge = RecommendedChallengeCreate( |
102 | | - progressRate=0.0, |
| 137 | + progressRate=progress_rate, |
103 | 138 | challengeTask=challenge_data["title"], |
104 | 139 | challengeDuration=challenge_data["duration"], |
105 | 140 | challengeDifficulty=challenge_data["difficulty"], |
106 | 141 | challengeSuggestion=f"{challenge_data['reason']}\n{challenge_data['motivation']}", |
107 | 142 | ) |
108 | 143 |
|
109 | | - # AI 분석 결과에서 받은 ID 사용 |
110 | | - try: |
111 | | - category_id = UUID(str(challenge_data.get("category_id", ""))) |
112 | | - except (ValueError, TypeError): |
113 | | - category_id = None |
114 | | - |
115 | 144 | created_challenge = await add_recommended_challenge( |
116 | 145 | db, user_id, category_id, new_challenge |
117 | 146 | ) |
|
0 commit comments