@@ -74,11 +74,24 @@ public function generate(Request $request, string $period): JsonResponse
7474 return response ()->json (['error ' => '無効な期間です ' ], 400 );
7575 }
7676
77- $ papers = Paper::with ('journal:id,name ' )
77+ // Get tag IDs from request (optional)
78+ $ tagIds = $ request ->input ('tagIds ' , []);
79+ if (!is_array ($ tagIds )) {
80+ $ tagIds = [];
81+ }
82+
83+ $ papersQuery = Paper::with (['journal:id,name ' , 'tags:id,name ' ])
7884 ->forUser ($ user ->id )
79- ->whereBetween ('published_date ' , [$ dateRange ['from ' ], $ dateRange ['to ' ]])
80- ->orderBy ('published_date ' , 'desc ' )
81- ->get ();
85+ ->whereBetween ('published_date ' , [$ dateRange ['from ' ], $ dateRange ['to ' ]]);
86+
87+ // Filter by tags if specified
88+ if (!empty ($ tagIds )) {
89+ $ papersQuery ->whereHas ('tags ' , function ($ query ) use ($ tagIds ) {
90+ $ query ->whereIn ('tags.id ' , $ tagIds );
91+ });
92+ }
93+
94+ $ papers = $ papersQuery ->orderBy ('published_date ' , 'desc ' )->get ();
8295
8396 if ($ papers ->isEmpty ()) {
8497 return response ()->json ([
@@ -98,7 +111,7 @@ public function generate(Request $request, string $period): JsonResponse
98111 $ provider = $ request ->input ('provider ' , config ('services.ai.provider ' , 'claude ' ));
99112
100113 try {
101- $ summary = $ this ->generateTrendSummary ($ papers , $ period , $ dateRange , $ provider );
114+ $ summary = $ this ->generateTrendSummary ($ user -> id , $ papers , $ period , $ dateRange , $ provider, $ tagIds );
102115
103116 return response ()->json ([
104117 'success ' => true ,
@@ -109,6 +122,7 @@ public function generate(Request $request, string $period): JsonResponse
109122 ],
110123 'paperCount ' => $ papers ->count (),
111124 'provider ' => $ provider ,
125+ 'tagIds ' => $ tagIds ,
112126 'summary ' => $ summary ,
113127 ]);
114128 } catch (\Exception $ e ) {
@@ -123,6 +137,8 @@ public function generate(Request $request, string $period): JsonResponse
123137 */
124138 public function summary (Request $ request , string $ period ): JsonResponse
125139 {
140+ $ user = $ request ->attributes ->get ('user ' );
141+
126142 $ dateRange = $ this ->getDateRange ($ period );
127143
128144 if (!$ dateRange ) {
@@ -132,8 +148,14 @@ public function summary(Request $request, string $period): JsonResponse
132148 $ dateFrom = $ dateRange ['from ' ]->format ('Y-m-d ' );
133149 $ dateTo = $ dateRange ['to ' ]->format ('Y-m-d ' );
134150
135- // Try to get from database
136- $ savedSummary = TrendSummary::findByPeriodAndDate ($ period , $ dateFrom , $ dateTo );
151+ // Get tag IDs from query string (optional)
152+ $ tagIds = $ request ->query ('tagIds ' , []);
153+ if (is_string ($ tagIds )) {
154+ $ tagIds = $ tagIds ? array_map ('intval ' , explode (', ' , $ tagIds )) : [];
155+ }
156+
157+ // Try to get latest summary for user with matching tags
158+ $ savedSummary = TrendSummary::findLatestForUser ($ user ->id , $ period , $ tagIds ?: null );
137159
138160 if ($ savedSummary ) {
139161 return response ()->json ([
@@ -147,6 +169,7 @@ public function summary(Request $request, string $period): JsonResponse
147169 'provider ' => $ savedSummary ->ai_provider ,
148170 'model ' => $ savedSummary ->ai_model ,
149171 'paperCount ' => $ savedSummary ->paper_count ,
172+ 'tagIds ' => $ savedSummary ->tag_ids ?? [],
150173 'summary ' => $ savedSummary ->toApiResponse (),
151174 ]);
152175 }
@@ -163,6 +186,22 @@ public function summary(Request $request, string $period): JsonResponse
163186 ]);
164187 }
165188
189+ /**
190+ * Get trend summary history for a user
191+ */
192+ public function history (Request $ request ): JsonResponse
193+ {
194+ $ user = $ request ->attributes ->get ('user ' );
195+ $ limit = (int ) $ request ->query ('limit ' , 20 );
196+
197+ $ summaries = TrendSummary::getHistoryForUser ($ user ->id , $ limit );
198+
199+ return response ()->json ([
200+ 'success ' => true ,
201+ 'summaries ' => $ summaries ->map (fn ($ s ) => $ s ->toApiResponse ()),
202+ ]);
203+ }
204+
166205 /**
167206 * Get statistics for all periods
168207 */
@@ -225,7 +264,7 @@ private function getDateRange(string $period): ?array
225264 /**
226265 * Generate trend summary using AI
227266 */
228- private function generateTrendSummary ($ papers , string $ period , array $ dateRange , string $ provider = 'claude ' ): array
267+ private function generateTrendSummary (int $ userId , $ papers , string $ period , array $ dateRange , string $ provider = 'claude ' , array $ tagIds = [] ): array
229268 {
230269 $ periodLabels = [
231270 'day ' => '今日 ' ,
@@ -254,11 +293,12 @@ private function generateTrendSummary($papers, string $period, array $dateRange,
254293
255294 $ result = $ this ->aiService ->generateCustomSummary ($ prompt , $ provider );
256295
257- // Save to database
296+ // Save to database (always create new record for history)
258297 $ dateFrom = $ dateRange ['from ' ]->format ('Y-m-d ' );
259298 $ dateTo = $ dateRange ['to ' ]->format ('Y-m-d ' );
260299
261- TrendSummary::createOrUpdateSummary ([
300+ TrendSummary::createSummary ([
301+ 'user_id ' => $ userId ,
262302 'period ' => $ period ,
263303 'date_from ' => $ dateFrom ,
264304 'date_to ' => $ dateTo ,
@@ -270,6 +310,7 @@ private function generateTrendSummary($papers, string $period, array $dateRange,
270310 'journal_insights ' => $ result ['journalInsights ' ] ?? null ,
271311 'recommendations ' => $ result ['recommendations ' ] ?? null ,
272312 'paper_count ' => $ papers ->count (),
313+ 'tag_ids ' => !empty ($ tagIds ) ? $ tagIds : null ,
273314 ]);
274315
275316 return $ result ;
0 commit comments