Skip to content

Commit

Permalink
feat: content 관련 api 완성
Browse files Browse the repository at this point in the history
  • Loading branch information
JONG-KYEONG committed Aug 13, 2024
1 parent 3614f06 commit 09fb44d
Show file tree
Hide file tree
Showing 58 changed files with 172 additions and 21 deletions.
Binary file modified server/.gradle/8.8/executionHistory/executionHistory.bin
Binary file not shown.
Binary file modified server/.gradle/8.8/executionHistory/executionHistory.lock
Binary file not shown.
Binary file modified server/.gradle/8.8/fileHashes/fileHashes.bin
Binary file not shown.
Binary file modified server/.gradle/8.8/fileHashes/fileHashes.lock
Binary file not shown.
Binary file modified server/.gradle/8.8/fileHashes/resourceHashesCache.bin
Binary file not shown.
Binary file modified server/.gradle/buildOutputCleanup/buildOutputCleanup.lock
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified server/build/tmp/compileJava/previous-compilation-data.bin
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package com.example.hackathon.content.application;

import com.example.hackathon.content.dto.ContentDto;
import com.example.hackathon.content.dto.InterestContentResponse;
import com.example.hackathon.content.dto.ScrapContentResponse;
import com.example.hackathon.content.dto.SimpleContentDto;
import com.example.hackathon.content.dto.*;
import com.example.hackathon.dataset.domain.Data;
import com.example.hackathon.dataset.domain.DataField;
import com.example.hackathon.dataset.domain.DataFieldUser;
import com.example.hackathon.dataset.repository.DataFieldRepository;
import com.example.hackathon.dataset.repository.DataFieldUserRepository;
import com.example.hackathon.dataset.repository.DataRepository;
import com.example.hackathon.exception.BadRequestException;
import com.example.hackathon.user.model.User;
import com.example.hackathon.user.domain.User;
import com.example.hackathon.user.domain.UserSearch;
import com.example.hackathon.user.repository.UserRepository;
import com.example.hackathon.user.repository.UserSearchRepository;
import lombok.AllArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
Expand All @@ -30,6 +30,7 @@ public class ContentService {
private final DataRepository dataRepository;
private final DataFieldRepository dataFieldRepository;
private final DataFieldUserRepository dataFieldUserRepository;
private final UserSearchRepository userSearchRepository;
public InterestContentResponse getInterestContentResponse(Long userId, Integer pagesize){
User user = userRepository.findById(userId)
.orElseThrow(() -> new BadRequestException("유저 토큰 값을 다시 확인해주세요"));
Expand Down Expand Up @@ -119,4 +120,62 @@ public Boolean isScraped(User user, DataField dataField){
else
return true;
}

public String scrapContent(Long userId, Long contentId){
Optional<DataFieldUser> dataFieldUser = dataFieldUserRepository.findByUserIdAndDataFieldId(userId, contentId);
if(dataFieldUser.isEmpty()){
DataField dataField = dataFieldRepository.findById(contentId)
.orElseThrow(() -> new BadRequestException("contentId 값을 다시 확인해주세요"));
User user = userRepository.findById(userId)
.orElseThrow(() -> new BadRequestException("유저 토큰 값을 다시 확인해주세요"));
DataFieldUser newDataFieldUser = new DataFieldUser();
newDataFieldUser.setUser(user);
newDataFieldUser.setDataField(dataField);
dataFieldUserRepository.save(newDataFieldUser);
return "add scrap";
}
else{
dataFieldUserRepository.delete(dataFieldUser.get());
return "remove scrap";
}
}

public SearchContentResponse searchContent(Long userId, String keyword, String searchType, Integer pagesize, Integer pageindex){
Pageable pageable = PageRequest.of(pageindex, pagesize);
Page<DataField> dataFields = dataFieldRepository.findByKewordAndSearch(keyword, searchType, pageable);

List<SearchContentDto> searchContentDtos = new ArrayList<>();
for(DataField dataField : dataFields.getContent()){
SearchContentDto searchContentDto = SearchContentDto.builder()
.contentId(dataField.getId())
.contentTitle(dataField.getTitleName())
.contentImage(dataField.getImage())
.build();
searchContentDtos.add(searchContentDto);
}
boolean hasNextPage = true;
if(pageindex==dataFields.getTotalPages()-1){
hasNextPage = false;
}

User user = userRepository.findById(userId)
.orElseThrow(() -> new BadRequestException("유저 토큰 값을 다시 확인해주세요"));
UserSearch userSearch = new UserSearch();
userSearch.setUser(user);
userSearch.setRecentSearchKeyword(keyword);
userSearchRepository.save(userSearch);

SearchContentResponse searchContentResponse = new SearchContentResponse(hasNextPage, searchContentDtos);
return searchContentResponse;
}

public RecentKeywordResponse getRecentKeyword(Long userId){
Pageable pageable = PageRequest.of(0, 6, Sort.by("id").descending());
List<UserSearch> userSearches = userSearchRepository.findByRecentKeyword(userId, pageable);
List<String> recentKeywords = new ArrayList<>();
for (UserSearch userSearch : userSearches){
recentKeywords.add(userSearch.getRecentSearchKeyword());
}
return new RecentKeywordResponse(recentKeywords);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@

import com.example.hackathon.content.application.ContentService;
import com.example.hackathon.content.dto.InterestContentResponse;
import com.example.hackathon.content.dto.RecentKeywordResponse;
import com.example.hackathon.content.dto.ScrapContentResponse;
import com.example.hackathon.content.dto.SearchContentResponse;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

@RestController
@AllArgsConstructor
Expand All @@ -30,4 +29,28 @@ public ResponseEntity<ScrapContentResponse> getScrapContentResponse(@RequestPara
ScrapContentResponse scrapContentResponse = contentService.getScrapContentResponse(userId);
return new ResponseEntity<>(scrapContentResponse, HttpStatus.OK);
}
}

@PatchMapping("/scrap")
@Operation(summary = "원하는 작품 찜하기. " ,description = "userId와 contentId를 파라미터로 넣어주세요. \n 스크랩된 상태면 스크랩이 해제되고, 스크랩 안된 상태면 스크랩이 됩니다.")
public ResponseEntity<String> getScrapContentResponse(@RequestParam Long userId, @RequestParam Long contentId) {
return new ResponseEntity<>(contentService.scrapContent(userId, contentId), HttpStatus.OK);
}

@GetMapping("/search")
@Operation(summary = "검색어로 원하는 컨텐츠 검색하는 api 입니다. " ,description = "검색 키워드와 검색 타입을 입력해주세요. \n 검색 타입은 (movie, drama) 두가지입니다. \n hasNextPage 값 -> true : 다음 페이지 있음, false : 다음 페이지 없음, 현재 페이지가 끝")
public ResponseEntity<SearchContentResponse> getScrapContentResponse(@RequestParam(defaultValue = "1") Long userId,
@RequestParam String keyword,
@RequestParam(defaultValue = "drama") String searchType,
@RequestParam(defaultValue = "9") Integer pagesize,
@RequestParam(defaultValue = "0") Integer pageindex) {
SearchContentResponse searchContentResponse = contentService.searchContent(userId,keyword, searchType, pagesize, pageindex);
return new ResponseEntity<>(searchContentResponse, HttpStatus.OK);
}
@GetMapping("/search/recent/keyword")
@Operation(summary = "최근 검색한 키워드를 가져옵니다 " ,description = "userId를 파라미터로 넣어주세요.\n 최대 6개까지만 가져옵니다.")
public ResponseEntity<RecentKeywordResponse> getRecentKeyword(@RequestParam(defaultValue = "1") Long userId) {
RecentKeywordResponse recentKeywordResponse = contentService.getRecentKeyword(userId);
return new ResponseEntity<>(recentKeywordResponse, HttpStatus.OK);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.hackathon.content.dto;

import lombok.Builder;

import java.util.List;
@Builder
public record RecentKeywordResponse(
List<String> keywords
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.hackathon.content.dto;

import lombok.Builder;

@Builder
public record SearchContentDto(
Long contentId,
String contentTitle,
String contentImage) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.hackathon.content.dto;

import lombok.Builder;

import java.util.List;
@Builder
public record SearchContentResponse(
Boolean hasNextPage,
List<SearchContentDto> searchContentDtos
) {
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
package com.example.hackathon.dataset.domain;

import com.example.hackathon.user.model.User;
import com.example.hackathon.user.domain.User;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class DataFieldUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
package com.example.hackathon.dataset.repository;

import com.example.hackathon.dataset.domain.DataField;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

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

@Repository
public interface DataFieldRepository extends JpaRepository<DataField, Long> {
@Query("SELECT df FROM DataField df ORDER BY RAND()")
List<DataField> findDataFieldRandom(Pageable pageable);
@Query("SELECT df FROM DataField df WHERE df.genre LIKE %:genre% ORDER BY RAND()")
List<DataField> findDataFieldByGenre(@Param("genre")String genre , Pageable pageable);

@Query("SELECT df FROM DataField df WHERE df.titleName LIKE %:keyword% AND df.mediaType=:searchType")
Page<DataField> findByKewordAndSearch(@Param("keyword")String keyword, @Param("searchType")String searchType , Pageable pageable);
Optional<DataField> findById(Long contentId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.example.hackathon.dataset.domain.DataField;
import com.example.hackathon.dataset.domain.DataFieldUser;
import com.example.hackathon.user.model.User;
import com.example.hackathon.user.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
Expand All @@ -20,4 +20,6 @@ public interface DataFieldUserRepository extends JpaRepository<DataFieldUser, Lo
List<DataFieldUser> findListByUserId(@Param("userId")Long userId);

Optional<DataFieldUser>findByUserAndDataField(User user, DataField dataField);
@Query("SELECT dfu FROM DataFieldUser dfu WHERE dfu.user.id=:userId AND dfu.dataField.id=:contentId")
Optional<DataFieldUser>findByUserIdAndDataFieldId(@Param("userId")Long userId, @Param("contentId")Long contentId);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.example.hackathon.oauth.security;

import com.example.hackathon.exception.ResourceNotFoundException;
import com.example.hackathon.user.model.User;
import com.example.hackathon.user.domain.User;
import com.example.hackathon.user.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.example.hackathon.oauth.security;

import com.example.hackathon.user.model.User;
import com.example.hackathon.user.domain.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import com.example.hackathon.exception.OAuth2AuthenticationProcessingException;
import com.example.hackathon.oauth.model.AuthProvider;
import com.example.hackathon.user.model.User;
import com.example.hackathon.user.domain.User;
import com.example.hackathon.user.repository.UserRepository;
import com.example.hackathon.oauth.security.UserPrincipal;
import com.example.hackathon.oauth.security.oauth2.user.OAuth2UserInfo;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.example.hackathon.user.controller;

import com.example.hackathon.exception.ResourceNotFoundException;
import com.example.hackathon.user.model.User;
import com.example.hackathon.user.domain.User;
import com.example.hackathon.user.repository.UserRepository;
import com.example.hackathon.oauth.security.CurrentUser;
import com.example.hackathon.oauth.security.UserPrincipal;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.hackathon.user.model;
package com.example.hackathon.user.domain;
import com.example.hackathon.oauth.model.AuthProvider;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.hackathon.user.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class UserSearch {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private User user;
private String recentSearchKeyword;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.example.hackathon.user.repository;

import com.example.hackathon.user.model.User;
import com.example.hackathon.user.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.hackathon.user.repository;

import com.example.hackathon.user.domain.UserSearch;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserSearchRepository extends JpaRepository<UserSearch, Long> {
@Query("SELECT us FROM UserSearch us WHERE us.user.id=:userId ")
List<UserSearch> findByRecentKeyword(@Param("userId")Long userId, Pageable pageable);
}

0 comments on commit 09fb44d

Please sign in to comment.