44import com .example .ForDay .domain .activity .dto .FastAPIHobbyCardReqDto ;
55import com .example .ForDay .domain .activity .dto .request .UpdateActivityReqDto ;
66import com .example .ForDay .domain .activity .dto .response .FastAPIHobbyCardResDto ;
7+ import com .example .ForDay .domain .activity .dto .response .GetAiRecommendItemsResDto ;
78import com .example .ForDay .domain .activity .entity .Activity ;
9+ import com .example .ForDay .domain .activity .entity .ActivityRecommendItem ;
10+ import com .example .ForDay .domain .activity .repository .ActivityRecommendItemRepository ;
811import com .example .ForDay .domain .friend .repository .FriendRelationRepository ;
912import com .example .ForDay .domain .friend .type .FriendRelationStatus ;
1013import com .example .ForDay .domain .hobby .dto .request .FastAPIRecommendReqDto ;
3639import org .springframework .util .StringUtils ;
3740import org .springframework .web .client .RestTemplate ;
3841
42+ import java .time .LocalDate ;
43+ import java .time .LocalDateTime ;
44+ import java .time .LocalTime ;
45+ import java .util .Collections ;
46+ import java .util .List ;
3947import java .util .Objects ;
4048
4149@ Slf4j
@@ -52,6 +60,7 @@ public class ActivityService {
5260 private final HobbyRepository hobbyRepository ;
5361 private final FriendRelationRepository friendRelationRepository ;
5462 private final RestTemplate restTemplate ;
63+ private final ActivityRecommendItemRepository recommendItemRepository ;
5564
5665 @ Value ("${fastapi.url}" )
5766 private String fastApiBaseUrl ;
@@ -353,6 +362,46 @@ public CollectActivityResDto collectActivity(Long hobbyId, Long activityId, Cust
353362 return new CollectActivityResDto (hobby .getId (), hobby .getHobbyName (), build .getId (), build .getContent (), "ํ๋์ด ์ ์์ ์ผ๋ก ๋ด๊ฒผ์ต๋๋ค." );
354363 }
355364
365+ @ Transactional (readOnly = true )
366+ public GetAiRecommendItemsResDto getAiRecommendItems (CustomUserDetails user ) {
367+ User currentUser = userUtil .getCurrentUser (user );
368+ String currentUserId = currentUser .getId ();
369+
370+ // ๋ฉ์ธ์ง ์กฐํ -> ๋
ผ์ ํ ํ ์์ ์์
371+
372+ // 1. ํ์ฌ ์ ์ ์ ํ์ฌ ์งํ ์ค์ธ ์ทจ๋ฏธ ์กฐํ
373+ List <Hobby > progressHobbies = hobbyRepository .findAllByUserIdAndStatusOrderByIdDesc (
374+ currentUserId ,
375+ HobbyStatus .IN_PROGRESS
376+ );
377+
378+ if (progressHobbies .isEmpty ()) {
379+ return new GetAiRecommendItemsResDto (new GetAiRecommendItemsResDto .MessageDto (), Collections .emptyList ());
380+ }
381+
382+ // 2. ์ค๋ ๋ ์ง ๋ฒ์ ์ค์
383+ LocalDateTime startOfToday = LocalDate .now ().atStartOfDay ();
384+ LocalDateTime endOfToday = LocalDate .now ().atTime (LocalTime .MAX );
385+
386+ // 3. ์ค๋ ์์ฑ๋ ์ถ์ฒ ์์ดํ
์กฐํ
387+ List <ActivityRecommendItem > items = recommendItemRepository .findAllByHobbiesAndDate (
388+ progressHobbies , startOfToday , endOfToday
389+ );
390+
391+ // 4. DTO ๋ณํ
392+ List <GetAiRecommendItemsResDto .ItemDto > itemDtos = items .stream ()
393+ .map (item -> new GetAiRecommendItemsResDto .ItemDto (
394+ item .getId (),
395+ item .getHobby ().getId (),
396+ item .getHobby ().getHobbyName (),
397+ item .getContent (),
398+ item .getDescription ()
399+ ))
400+ .toList ();
401+
402+ return new GetAiRecommendItemsResDto (new GetAiRecommendItemsResDto .MessageDto (), itemDtos );
403+ }
404+
356405 // ์ ํธ ํด๋์ค
357406 private Activity getActivityByUserId (Long activityId , String userId ) {
358407 return activityRepository .findByIdAndUserId (activityId , userId ).orElseThrow (() -> new CustomException (ErrorCode .ACTIVITY_NOT_FOUND ));
0 commit comments