Skip to content

Commit

Permalink
Merge pull request #73 from oven-2023/feature/recommendation
Browse files Browse the repository at this point in the history
feat: add recommend api
  • Loading branch information
haen-su authored Nov 23, 2023
2 parents 6adff05 + d08613d commit 6e77d1c
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public interface RatingWorkRepository extends JpaRepository<RatingWork, Long> {

List<RatingWork> findByUserOrderByCreatedAtDesc(User user);

List<RatingWork> findByUser(User user);

RatingWork findByUserAndWork(User user, Work work);

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;


Expand All @@ -14,4 +15,6 @@ public interface UserRepository extends JpaRepository<User, Long> {

Optional<User> findByUsername(String username);

List<User> findUsersByIdIsNot(Long userId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -51,17 +51,23 @@ public Response<List<WorkListDto>> getPopularWorkList() {
@Operation(summary = "맞춤 작품 추천 API")
@GetMapping("/recommendation/works")
public Response<List<WorkListDto>> getRecommendWorkList(@AuthenticationPrincipal User user) {

String userId = String.valueOf(user.getId());
String response = flaskFeignClient.getDataFromFlask(userId);
try {
List<WorkListDto> recommendWorkDtoList = getRecommendWorkListService.getRecommendWorkList(response);
return Response.success(ResponseCode.SUCCESS_OK, recommendWorkDtoList);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
return Response.success(ResponseCode.SUCCESS_OK, getRecommendWorkListService.getRecommendWorkList(user));
}

// @Operation(summary = "맞춤 작품 추천 API")
// @GetMapping("/recommendation/works")
// public Response<List<WorkListDto>> getRecommendWorkList(@AuthenticationPrincipal User user) {
//
// String userId = String.valueOf(user.getId());
// String response = flaskFeignClient.getDataFromFlask(userId);
// try {
// List<WorkListDto> recommendWorkDtoList = getRecommendWorkListService.getRecommendWorkList(response);
// return Response.success(ResponseCode.SUCCESS_OK, recommendWorkDtoList);
// } catch (JsonProcessingException e) {
// throw new RuntimeException(e);
// }
// }

@Autowired
public HomeController(GetRecommendProviderService getRecommendProviderService, GetPopularWorkListService getPopularWorkListService, GetRecommendWorksService getRecommendWorkListService, FlaskFeignClient flaskFeignClient) {
this.getRecommendProviderService = getRecommendProviderService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,7 @@ public interface WorkRepository extends JpaRepository<Work, Long>, WorkRepositor
@Query(value = "SELECT * FROM oven.work order by RAND() limit 4",nativeQuery = true)
List<Work> findRandoms();

@Query(value = "select w from Work w where w.id in :ids")
List<Work> findWorksByIdIn(List<Long> ids);

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,58 +3,132 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.oven.server.api.user.domain.RatingWork;
import com.oven.server.api.user.domain.User;
import com.oven.server.api.user.repository.RatingWorkRepository;
import com.oven.server.api.user.repository.UserRepository;
import com.oven.server.common.exception.BaseException;
import com.oven.server.api.work.domain.Work;
import com.oven.server.api.work.dto.response.WorkListDto;
import com.oven.server.api.work.repository.WorkRepository;
import com.oven.server.common.response.ResponseCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
@Slf4j
public class GetRecommendWorksService {

private final WorkRepository workRepository;
private final UserRepository userRepository;
private final RatingWorkRepository ratingWorkRepository;

public List<WorkListDto> getRecommendWorkList(String dataFromFlask) throws BaseException, JsonProcessingException {
public List<WorkListDto> getRecommendWorkList(User user) {

user = userRepository.findByUsername(user.getUsername()).orElseThrow(
() -> new BaseException(ResponseCode.USER_NOT_FOUND)
);

ObjectMapper objectMapper = new ObjectMapper();
System.out.println(dataFromFlask);
System.out.println(dataFromFlask.getClass().getName());
List<RatingWork> ratingWorks = ratingWorkRepository.findByUser(user);

Map<String, String> dataMap = objectMapper.readValue(dataFromFlask, new TypeReference<Map<String, String>>() {});
String resultString = dataMap.get("result");
log.info("----ratingWorks: {}", ratingWorks.size());

List<Long> longList = Arrays.stream(resultString.split(","))
.map(s -> s.replaceAll("[\\[\\]\\\\\"]", "")).map(String::trim)
.map(Long::parseLong)
.collect(Collectors.toList());
int max = 0;
List<RatingWork> result = new ArrayList<>();

for(User findUser : userRepository.findUsersByIdIsNot(user.getId())) {

log.info("-----findUser: {}", findUser.getUsername());

List<RatingWork> findRatingWorks = ratingWorkRepository.findByUser(findUser);
List<RatingWork> tmp = findRatingWorks;
List<RatingWork> sameWorks = new ArrayList<>();

log.info("-----findRatingWorks: {}", findRatingWorks.size());

int count = 0;

List<Work> recommendations = new ArrayList<Work>();
for(int i = 0; i < ratingWorks.size(); i++) {
for(int j = 0; j < findRatingWorks.size(); j++) {
if(ratingWorks.get(i).getWork().equals(findRatingWorks.get(j).getWork())) {
count++;
tmp.remove(findRatingWorks.get(j));
log.info("-----ratingWork: {}, findRatingWork: {}", ratingWorks.get(i).getWork().getId(),findRatingWorks.get(j).getWork().getId());
}
}
}

for (int i = 0; i < longList.size(); i++) {
recommendations.add(workRepository.findById(longList.get(i)).get());
log.info("-----count: {}", count);
log.info("----tmp size: {}", tmp.size());

if(count > max) {
max = count;
result = tmp;
}
}

log.info("-----max: {}", max);

List<Long> recommend = new ArrayList<>();

for(RatingWork ratingWork : result) {
recommend.add(ratingWork.getWork().getId());
}

List<WorkListDto> recommendWorkDtoList = recommendations
.stream()
return workRepository.findWorksByIdIn(recommend).stream()
.map(
recommendWork -> WorkListDto
.builder()
.workId(recommendWork.getId())
.title(recommendWork.getTitleKr())
.poster(recommendWork.getPoster())
work -> WorkListDto.builder()
.workId(work.getId())
.title(work.getTitleKr())
.poster(work.getPoster())
.build()
)
.collect(Collectors.toList());

return recommendWorkDtoList;
}

// public List<WorkListDto> getRecommendWorkList(String dataFromFlask) throws BaseException, JsonProcessingException {
//
//
// ObjectMapper objectMapper = new ObjectMapper();
// System.out.println(dataFromFlask);
// System.out.println(dataFromFlask.getClass().getName());
//
// Map<String, String> dataMap = objectMapper.readValue(dataFromFlask, new TypeReference<Map<String, String>>() {});
// String resultString = dataMap.get("result");
//
// List<Long> longList = Arrays.stream(resultString.split(","))
// .map(s -> s.replaceAll("[\\[\\]\\\\\"]", "")).map(String::trim)
// .map(Long::parseLong)
// .collect(Collectors.toList());
//
// List<Work> recommendations = new ArrayList<Work>();
//
// for (int i = 0; i < longList.size(); i++) {
// recommendations.add(workRepository.findById(longList.get(i)).get());
// }
//
// List<WorkListDto> recommendWorkDtoList = recommendations
// .stream()
// .map(
// recommendWork -> WorkListDto
// .builder()
// .workId(recommendWork.getId())
// .title(recommendWork.getTitleKr())
// .poster(recommendWork.getPoster())
// .build()
// )
// .collect(Collectors.toList());
//
// return recommendWorkDtoList;
// }
}

0 comments on commit 6e77d1c

Please sign in to comment.