Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/weekly' into feature/1-branch-ac…
Browse files Browse the repository at this point in the history
…count
  • Loading branch information
choboss00 committed Nov 9, 2023
2 parents 0b3415f + aeb5cb7 commit 1bef9ec
Show file tree
Hide file tree
Showing 10 changed files with 358 additions and 191 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class MentorPostRequest {
@Setter
public static class CreateMentorPostDTO {
@NotNull
@Size(max = 100, message = "100자를 초과하면 안됩니다.")
@Size(max = 50, message = "50자를 초과하면 안됩니다.")
private String title;

@Size(max = 300, message = "300자를 초과하면 안됩니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.data.repository.query.Param;
import org.springframework.data.domain.Pageable;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

Expand Down Expand Up @@ -55,4 +56,6 @@ public interface MentorPostJPARepostiory extends JpaRepository<MentoringBoard, I
"and m.state = 'DONE'")
int countDoneByMentorId(int userId);

@Query("select m.createdAt from MentorPost m where m.writer.id = :userId order by m.createdAt desc")
Page<LocalDateTime> createdRecentPost(int userId, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example.demo.mentoring.service;

import com.example.demo.config.errors.exception.Exception401;
import com.example.demo.config.errors.exception.Exception403;
import com.example.demo.config.errors.exception.Exception500;
import com.example.demo.config.errors.exception.Exception404;
import com.example.demo.mentoring.domain.MentoringBoard;
Expand All @@ -21,6 +22,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
Expand All @@ -38,7 +41,21 @@ public class MentorPostService {
public void createMentorPost(MentorPostRequest.CreateMentorPostDTO createMentorPostDTO, User writer) {
isMentor(writer);

<<<<<<< HEAD:src/main/java/com/example/demo/mentoring/service/MentorPostService.java
MentoringBoard mentoringBoard = new MentoringBoard( writer, createMentorPostDTO.getTitle(), createMentorPostDTO.getContent());
=======
Pageable recentPostTime = PageRequest.of(0, 1);
Page<LocalDateTime> recentPostDate = mentorPostJPARepository.createdRecentPost(writer.getId(), recentPostTime);
if(recentPostDate != null && !recentPostDate.getContent().isEmpty())
{
Duration duration = Duration.between(recentPostDate.getContent().get(0), LocalDateTime.now());
if (duration.toMinutes() < 5) {
throw new Exception403("5분이내로 글을 작성 할 수 없습니다.");
}
}

MentorPost mentorPost = new MentorPost( writer, createMentorPostDTO.getTitle(), createMentorPostDTO.getContent());
>>>>>>> origin/weekly:src/main/java/com/example/demo/mentoring/MentorPostService.java

try {
mentorPostJPARepository.save(mentoringBoard);
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/com/example/demo/user/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ public class User extends BaseTime {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(nullable = false)
@Column(nullable = false, length = 50)
private String firstName;

@Column(nullable = false)
@Column(nullable = false, length = 50)
private String lastName;

@Column(length = 100, nullable = false, unique = true)
Expand All @@ -38,7 +38,7 @@ public class User extends BaseTime {
@Column(nullable = false)
private String country;

@Column
@Column(length = 300)
private String introduction;

@Column(nullable = false)
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/example/demo/user/dto/UserRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,10 +120,12 @@ public static class PasswordCheckDTO {
public static class ProfileUpdateDTO {
@Schema(description = "이름", nullable = false, example = "Anna")
@NotNull(message = "이름을 입력해주세요.")
@Size(max = 50, message = "50자 제한입니다.")
private String firstName;

@Schema(description = "성", nullable = false, example = "Lee")
@NotNull(message = "성을 입력해주세요.")
@Size(max = 50, message = "50자 제한입니다.")
private String lastName;

@Schema(description = "비밀번호", nullable = false, example = "garden123!")
Expand All @@ -136,7 +138,11 @@ public static class ProfileUpdateDTO {
@NotNull(message = "국가를 선택해주세요.")
private String country;

<<<<<<< HEAD:src/main/java/com/example/demo/user/dto/UserRequest.java
@Schema(description = "자기 소개", nullable = true, example = "Hello, My name is Anna Lee. I'm interested in Korean.")
=======
@Size(max = 300, message = "300자 제한입니다.")
>>>>>>> origin/weekly:src/main/java/com/example/demo/user/UserRequest.java
private String introduction;

@Schema(description = "생년월일", nullable = false, example = "2000-01-01")
Expand Down
182 changes: 182 additions & 0 deletions src/main/java/com/example/demo/video/VideoService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
package com.example.demo.video;

import com.example.demo.config.auth.CustomUserDetails;
import com.example.demo.config.errors.exception.Exception401;
import com.example.demo.config.errors.exception.Exception404;
import com.example.demo.interest.Interest;
import com.example.demo.user.Role;
import com.example.demo.user.User;
import com.example.demo.user.userInterest.UserInterest;
import com.example.demo.user.userInterest.UserInterestJPARepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

@Transactional
@RequiredArgsConstructor
@Service
public class VideoService {
private final VideoJPARepository videoJPARepository;
private final VideoInterestJPARepository videoInterestJPARepository;
private final SubtitleJPARepository subtitleJPARepository;
private final UserInterestJPARepository userInterestJPARepository;
private final VideoHistoryJPARepository videoHistoryJPARepository;

private final int MAINVIDEOTOTAL = 16;
private final int MAINVIDEONUM = 4;
private final int HISTORYVIDEONUM = 5;

public VideoResponse.VideoPageResponseDTO findAllVideo(int page, int categoryId) {
Pageable pageable = PageRequest.of(page ,MAINVIDEOTOTAL);

Page<Video> pageContent = getPageContentByCategoryId(categoryId, pageable);

// 각 Video에대해서 Interest 끌어오기
List<VideoResponse.VideoAllResponseDTO> videoDTOList = pageContent.getContent().stream().map(
video -> {
VideoInterest videoInterests = videoInterestJPARepository.findVideoInterestByVideoId(video.getId());
return new VideoResponse.VideoAllResponseDTO(video, videoInterests);
}
).collect(Collectors.toList());

//랜덤으로 섞기
Collections.shuffle(videoDTOList);

boolean isLastPage = pageContent.getNumberOfElements() < MAINVIDEOTOTAL;
List<VideoResponse.VideoAllResponseDTO> contents = videoDTOList.stream()
.limit(MAINVIDEONUM)
.collect(Collectors.toList());
VideoResponse.VideoPageResponseDTO videoPageResponseDTOs = new VideoResponse.VideoPageResponseDTO(page, contents, isLastPage);

return videoPageResponseDTOs;
}

public Page<Video> getPageContentByCategoryId(int categoryId, Pageable pageable) throws Exception404 {
Page<Video> pageContent = (categoryId == 0) ?
videoJPARepository.findAll(pageable) :
videoJPARepository.findByCategoryId(categoryId, pageable);
return pageContent;
}


public VideoResponse.VideoResponseDTO findVideo(int id, CustomUserDetails customUserDetails) {

User user = Optional.ofNullable(customUserDetails)
.map(CustomUserDetails::getUser)
.orElse(null);

Video video = videoJPARepository.findById(id)
.orElseThrow(() -> new Exception404("해당 영상이 존재하지 않습니다.\n" + "id : " + id));

video.addView();

if(user != null)
{
//최근 기록이 같은 영상일 경우 추가해서는 안됨.
Page<VideoHistory> recentVideos = videoHistoryJPARepository.findHistoryVideo(user.getId(), PageRequest.of(0, 1));
if (isNewVideoHistory(recentVideos, video)) {
VideoHistory videoHistory = new VideoHistory(user, video);
videoHistoryJPARepository.save(videoHistory);
}
}

VideoInterest videoInterest = videoInterestJPARepository.findVideoInterestByVideoId(video.getId());
List<Subtitle> videoSubtitles = subtitleJPARepository.findSubtitleByVideoId(video.getId());

List<Video> recommendVideo = videoJPARepository.findThreeRandomVideo(id);
List<VideoInterest> recommendVideoInterest = recommendVideo.stream()
.map(rv -> videoInterestJPARepository.findVideoInterestByVideoId(rv.getId()))
.collect(Collectors.toList());

return new VideoResponse.VideoResponseDTO(video, videoInterest, videoSubtitles,recommendVideo,recommendVideoInterest);
}

private boolean isNewVideoHistory(Page<VideoHistory> recentVideos, Video currentVideo) {
return recentVideos != null &&
!recentVideos.getContent().isEmpty() &&
recentVideos.getContent().get(0).getVideo().getId() != currentVideo.getId();
}

public List<VideoResponse.VideoAllResponseDTO> findHistoryVideo(Integer page, int id) {
Pageable pageable = PageRequest.of(page,HISTORYVIDEONUM);

Page<VideoHistory> pageContent = videoHistoryJPARepository.findHistoryVideo(id, pageable);

// 각 Video에대해서 Interest 끌어오기
List<VideoResponse.VideoAllResponseDTO> videoDTOList = pageContent.getContent().stream().map(
video -> {
VideoInterest videoInterest = videoInterestJPARepository.findVideoInterestByVideoId(video.getVideo().getId());

return new VideoResponse.VideoAllResponseDTO(video.getVideo(), videoInterest);
}
).collect(Collectors.toList());
return videoDTOList;
}

public List<VideoResponse.VideoAllResponseDTO> findUserCategory(int id) {
List<UserInterest> userInterests = userInterestJPARepository.findAllById(id);
List<String> Interests = userInterests.stream()
.map(userInterest -> userInterest.getInterest().getCategory()).collect(Collectors.toList());
Pageable pageable = PageRequest.of(0,4);

Page<Video> pageContent = userInterests.isEmpty()
? videoJPARepository.findAll(pageable)
: videoJPARepository.findByVideoCategory(Interests, pageable);

// 각 Video에대해서 Interest 끌어오기
List<VideoResponse.VideoAllResponseDTO> videoDTOList = pageContent.getContent().stream().map(
video -> {
VideoInterest videoInterests = videoInterestJPARepository.findVideoInterestByVideoId(video.getId());
return new VideoResponse.VideoAllResponseDTO(video, videoInterests);
}
).collect(Collectors.toList());
return videoDTOList;
}

//백오피스용 관리자 영상 올리기
public void createVideo(VideoRequest.CreateDTO createDTO, User user) {
if ( user.getRole() != Role.ADMIN ) {
throw new Exception401("관리자만 가능합니다.");
}

Video video = Video.builder()
.videoUrl(createDTO.getVideoUrl())
.videoEndTime(createDTO.getVideoEndTime())
.videoStartTime(createDTO.getVideoStartTime())
.videoThumbnailUrl(createDTO.getVideoThumbnailUrl())
.videoTitleEng(createDTO.getVideoTitleEng())
.videoTitleKorean(createDTO.getVideoTitleKorean())
.build();

VideoInterest videoInterest = VideoInterest.builder()
.video(video)
.interest(createDTO.getVideoInterest())
.build();

videoJPARepository.save(video);
videoInterestJPARepository.save(videoInterest);

for (VideoRequest.CreateDTO.SubtitleCreateDTO subtitleDTO : createDTO.getSubtitleCreateDTOList()) {
Subtitle subtitle = Subtitle.builder()
.video(video)
.korStartTime(subtitleDTO.getKorStartTime())
.korEndTime(subtitleDTO.getKorEndTime())
.korSubtitleContent(subtitleDTO.getKorSubtitleContent())
.engStartTime(subtitleDTO.getEngStartTime())
.engEndTime(subtitleDTO.getEngEndTime())
.engSubtitleContent(subtitleDTO.getEngSubtitleContent())
.build();
subtitleJPARepository.save(subtitle);
}
}
}
Loading

0 comments on commit 1bef9ec

Please sign in to comment.