From 710213ccf2e5dd654b853f9bd3a2ac5a793eb347 Mon Sep 17 00:00:00 2001 From: subin Date: Mon, 8 Jul 2024 14:22:55 +0900 Subject: [PATCH] =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=ED=9B=84=20=EA=B4=91=EA=B3=A0=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?,=20=EC=8A=A4=ED=8A=B8=EB=A6=BC=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../binplay/controller/VideoController.java | 5 +- .../binplay/dto/request/AdViewRequestDto.java | 19 +++++++ .../binplay/dto/request/StreamRequestDto.java | 12 ++--- .../binplay/dto/request/VideoRequestDto.java | 4 +- .../dto/response/AdViewResponseDto.java | 25 +++++++++ .../dto/response/StreamResponseDto.java | 5 +- .../com/sparta/binplay/entity/AdViews.java | 53 +++++++++++++++++++ .../java/com/sparta/binplay/entity/Ads.java | 13 ++++- .../com/sparta/binplay/entity/Streams.java | 43 +++++++++++---- .../java/com/sparta/binplay/entity/Users.java | 23 ++------ .../com/sparta/binplay/entity/Videos.java | 4 +- .../binplay/repository/AdViewRepository.java | 7 +++ .../sparta/binplay/service/AdViewService.java | 34 ++++++++++++ .../sparta/binplay/service/StreamService.java | 33 ++++++++++++ .../sparta/binplay/service/VideoService.java | 39 -------------- 15 files changed, 229 insertions(+), 90 deletions(-) create mode 100644 src/main/java/com/sparta/binplay/dto/request/AdViewRequestDto.java create mode 100644 src/main/java/com/sparta/binplay/dto/response/AdViewResponseDto.java create mode 100644 src/main/java/com/sparta/binplay/entity/AdViews.java create mode 100644 src/main/java/com/sparta/binplay/repository/AdViewRepository.java create mode 100644 src/main/java/com/sparta/binplay/service/AdViewService.java diff --git a/src/main/java/com/sparta/binplay/controller/VideoController.java b/src/main/java/com/sparta/binplay/controller/VideoController.java index 7ed2fae..a922fa8 100644 --- a/src/main/java/com/sparta/binplay/controller/VideoController.java +++ b/src/main/java/com/sparta/binplay/controller/VideoController.java @@ -6,7 +6,6 @@ import com.sparta.binplay.dto.response.StreamResponseDto; import com.sparta.binplay.dto.response.VideoResponseDto; import com.sparta.binplay.entity.CustomOAuth2User; -import com.sparta.binplay.entity.Videos; import com.sparta.binplay.service.AdViewService; import com.sparta.binplay.service.StreamService; import com.sparta.binplay.service.VideoAdService; @@ -29,11 +28,11 @@ public class VideoController { private final AdViewService adViewService; //모든 비디오 조회 (필요없지 않나) - @GetMapping + /*@GetMapping public ResponseEntity> getAllVideos() { List videos = videoService.findAllVideos(); return ResponseEntity.ok(videos); - } + }*/ // my비디오 리스트 조회 @GetMapping("/my") diff --git a/src/main/java/com/sparta/binplay/dto/request/AdViewRequestDto.java b/src/main/java/com/sparta/binplay/dto/request/AdViewRequestDto.java new file mode 100644 index 0000000..7ac8a5b --- /dev/null +++ b/src/main/java/com/sparta/binplay/dto/request/AdViewRequestDto.java @@ -0,0 +1,19 @@ +package com.sparta.binplay.dto.request; + +import com.sparta.binplay.entity.VideoAd; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; + +@Getter +public class AdViewRequestDto { + private LocalDate createdAt; + private VideoAd videoAd; + + @Builder + public AdViewRequestDto(LocalDate createdAt, VideoAd videoAd) { + this.createdAt = createdAt; + this.videoAd = videoAd; + } +} diff --git a/src/main/java/com/sparta/binplay/dto/request/StreamRequestDto.java b/src/main/java/com/sparta/binplay/dto/request/StreamRequestDto.java index 89b0dc7..a596d8e 100644 --- a/src/main/java/com/sparta/binplay/dto/request/StreamRequestDto.java +++ b/src/main/java/com/sparta/binplay/dto/request/StreamRequestDto.java @@ -1,21 +1,15 @@ package com.sparta.binplay.dto.request; -import com.sparta.binplay.entity.Users; -import com.sparta.binplay.entity.Videos; import lombok.Getter; @Getter public class StreamRequestDto { - private int viewingTime; + private int playTime; private int pausedAt; - private Users user; - private Videos video; - public StreamRequestDto(int viewingTime, int pausedAt, Users user, Videos video) { - this.viewingTime = viewingTime; + public StreamRequestDto(int viewingTime) { + this.playTime = viewingTime; this.pausedAt = pausedAt; - this.user = user; - this.video = video; } } diff --git a/src/main/java/com/sparta/binplay/dto/request/VideoRequestDto.java b/src/main/java/com/sparta/binplay/dto/request/VideoRequestDto.java index 9843f13..8520b12 100644 --- a/src/main/java/com/sparta/binplay/dto/request/VideoRequestDto.java +++ b/src/main/java/com/sparta/binplay/dto/request/VideoRequestDto.java @@ -9,9 +9,9 @@ public class VideoRequestDto { private Long videoId; private String title; private String description; - private long videoLength; + private int videoLength; - public VideoRequestDto(Long videoId, String title, String description, long videoLength) { + public VideoRequestDto(Long videoId, String title, String description, int videoLength) { this.videoId = videoId; this.title = title; this.description = description; diff --git a/src/main/java/com/sparta/binplay/dto/response/AdViewResponseDto.java b/src/main/java/com/sparta/binplay/dto/response/AdViewResponseDto.java new file mode 100644 index 0000000..7699b75 --- /dev/null +++ b/src/main/java/com/sparta/binplay/dto/response/AdViewResponseDto.java @@ -0,0 +1,25 @@ +package com.sparta.binplay.dto.response; + +import com.sparta.binplay.entity.AdViews; +import lombok.*; + +import java.time.LocalDate; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AdViewResponseDto { + private Long adViewId; + private LocalDate createdAt; + private Long videoAdId; + + public static AdViewResponseDto from(AdViews adView) { + return AdViewResponseDto.builder() + .adViewId(adView.getAdViewId()) + .createdAt(adView.getCreatedAt()) + .videoAdId(adView.getVideoAd().getVideoAdId()) // VideoAd 객체의 ID만 포함 + .build(); + } +} diff --git a/src/main/java/com/sparta/binplay/dto/response/StreamResponseDto.java b/src/main/java/com/sparta/binplay/dto/response/StreamResponseDto.java index 24304fc..7195402 100644 --- a/src/main/java/com/sparta/binplay/dto/response/StreamResponseDto.java +++ b/src/main/java/com/sparta/binplay/dto/response/StreamResponseDto.java @@ -12,15 +12,14 @@ @Builder public class StreamResponseDto { private Long streamId; - private int viewingTime; + private int playTime; private int pausedAt; private LocalDateTime createAt; - private LocalDateTime modifiedAt; public static StreamResponseDto from(Streams stream) { return StreamResponseDto.builder() .streamId(stream.getStreamId()) - .viewingTime(stream.getViewingTime()) + .playTime(stream.getPlayTime()) .pausedAt(stream.getPausedAt()) .createAt(stream.getCreatedAt()) .build(); diff --git a/src/main/java/com/sparta/binplay/entity/AdViews.java b/src/main/java/com/sparta/binplay/entity/AdViews.java new file mode 100644 index 0000000..c7cf73f --- /dev/null +++ b/src/main/java/com/sparta/binplay/entity/AdViews.java @@ -0,0 +1,53 @@ +package com.sparta.binplay.entity; + +import com.sparta.binplay.dto.request.AdViewRequestDto; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; + +import java.time.LocalDate; +import java.util.Set; + +@Entity +@Getter +@Table(name="ad_views") +@NoArgsConstructor +@Builder +@AllArgsConstructor +public class AdViews { + + @Id + @Column(name="ad_view_id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long adViewId; + + @CreationTimestamp + @Column(name = "created_at", updatable = false, nullable = false) + private LocalDate createdAt; + + @ManyToOne + @JoinColumn(name = "video_ad_id") + private VideoAd videoAd; + + @OneToMany(mappedBy = "adView") + private Set statisticsAds; + + @OneToMany(mappedBy = "adView") + private Set paymentsAds; + + public AdViews(LocalDate createdAt, VideoAd videoAd) { + this.createdAt = createdAt; + this.videoAd = videoAd; + } + + public static AdViews of(AdViewRequestDto adViewRequestDto) { + return AdViews.builder() + .createdAt(adViewRequestDto.getCreatedAt()) + .videoAd(adViewRequestDto.getVideoAd()) + .build(); + } + +} diff --git a/src/main/java/com/sparta/binplay/entity/Ads.java b/src/main/java/com/sparta/binplay/entity/Ads.java index 8a08f42..400eb84 100644 --- a/src/main/java/com/sparta/binplay/entity/Ads.java +++ b/src/main/java/com/sparta/binplay/entity/Ads.java @@ -3,14 +3,25 @@ import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; + +import java.time.LocalDate; +import java.util.Set; @Entity @Getter @Table(name="ads") @NoArgsConstructor -public class Ads extends Timestamped{ +public class Ads { @Id @Column(name = "ad_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long adId; + + @CreationTimestamp + @Column(name = "created_at", updatable = false, nullable = false) + private LocalDate createdAt; + + @OneToMany(mappedBy = "ad") + private Set videoAds; } diff --git a/src/main/java/com/sparta/binplay/entity/Streams.java b/src/main/java/com/sparta/binplay/entity/Streams.java index 19b7ae9..18c42b1 100644 --- a/src/main/java/com/sparta/binplay/entity/Streams.java +++ b/src/main/java/com/sparta/binplay/entity/Streams.java @@ -6,6 +6,10 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; @Entity @Getter @@ -13,31 +17,43 @@ @AllArgsConstructor @NoArgsConstructor @Builder -public class Streams extends Timestamped { +@EntityListeners(AuditingEntityListener.class) +public class Streams { @Id @Column(name = "stream_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long streamId; - @Column(name = "viewing_time") - private int viewingTime; + @Column(name = "play_time") + private int playTime; @Column(name = "paused_at") private int pausedAt; + @CreatedDate + @Column(name="created_at", updatable = false) + private LocalDateTime createdAt; + @ManyToOne - @JoinColumn(name = "user_id", nullable = false) + @JoinColumn(name = "user_id") private Users user; @ManyToOne - @JoinColumn(name = "video_id", nullable = false) + @JoinColumn(name = "video_id") private Videos video; public Streams(StreamRequestDto streamRequestDto) { - this.viewingTime = streamRequestDto.getViewingTime(); + this.playTime = streamRequestDto.getPlayTime(); this.pausedAt = streamRequestDto.getPausedAt(); - this.user = streamRequestDto.getUser(); - this.video = streamRequestDto.getVideo(); + } + + public static Streams of(Users user, Videos video, StreamRequestDto streamRequestDto) { + return Streams.builder() + .user(user) + .video(video) + .playTime(streamRequestDto.getPlayTime()) + .pausedAt(streamRequestDto.getPausedAt()) + .build(); } public void updatePause(int stopTime) { @@ -46,12 +62,17 @@ public void updatePause(int stopTime) { public void updateViewingTime(int stopTime) { - this.viewingTime+= (stopTime - this.viewingTime); + if(video.getVideoLength() < playTime + stopTime) { + this.playTime = video.getVideoLength(); + return; + } + this.playTime += stopTime; //영상을 끝까지 봤다면 영상 처음으로 돌림 - if(this.viewingTime == video.getVideoLength()) { - this.viewingTime = 0; + if(this.playTime == video.getVideoLength()) { + this.playTime = 0; } } + } diff --git a/src/main/java/com/sparta/binplay/entity/Users.java b/src/main/java/com/sparta/binplay/entity/Users.java index a727c28..5b4a421 100644 --- a/src/main/java/com/sparta/binplay/entity/Users.java +++ b/src/main/java/com/sparta/binplay/entity/Users.java @@ -44,6 +44,9 @@ public class Users extends Timestamped{ @OneToMany(mappedBy = "user") private List videos; + @OneToMany(mappedBy = "user") + private List streams; + public Users(UserRequestDto requestDto) { this.email = requestDto.getEmail(); this.password = requestDto.getPassword(); @@ -52,24 +55,4 @@ public Users(UserRequestDto requestDto) { this.role = requestDto.getRole(); this.isActive = requestDto.isActive(); } - - public Users toEntity() { - return Users.builder() - .email(email) - .password(password) - .username(username) - .grade(grade) - .role(role) - .isActive(isActive) - .build(); - } - - public void update(UserRequestDto requestDto) { - this.email = requestDto.getEmail(); - this.password = requestDto.getPassword(); - this.name = requestDto.getName(); - this.grade = requestDto.getGrade(); - this.role = requestDto.getRole(); - this.isActive = requestDto.isActive(); - } } diff --git a/src/main/java/com/sparta/binplay/entity/Videos.java b/src/main/java/com/sparta/binplay/entity/Videos.java index 9ef3d8b..1c6e2ff 100644 --- a/src/main/java/com/sparta/binplay/entity/Videos.java +++ b/src/main/java/com/sparta/binplay/entity/Videos.java @@ -33,7 +33,7 @@ public class Videos extends Timestamped { private long views; @Column(name = "video_length", nullable = false) - private long videoLength; + private int videoLength; @ManyToOne @JoinColumn(name = "user_id", nullable = false) @@ -55,7 +55,7 @@ public class Videos extends Timestamped { @OneToMany(mappedBy = "video") private List paymentsVideo = new ArrayList<>(); - public Videos(String title, String description, long videoLength) { + public Videos(String title, String description, int videoLength) { this.title = title; this.description = description; this.videoLength = videoLength; diff --git a/src/main/java/com/sparta/binplay/repository/AdViewRepository.java b/src/main/java/com/sparta/binplay/repository/AdViewRepository.java new file mode 100644 index 0000000..0b6ce25 --- /dev/null +++ b/src/main/java/com/sparta/binplay/repository/AdViewRepository.java @@ -0,0 +1,7 @@ +package com.sparta.binplay.repository; + +import com.sparta.binplay.entity.AdViews; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AdViewRepository extends JpaRepository { +} diff --git a/src/main/java/com/sparta/binplay/service/AdViewService.java b/src/main/java/com/sparta/binplay/service/AdViewService.java new file mode 100644 index 0000000..e32d44e --- /dev/null +++ b/src/main/java/com/sparta/binplay/service/AdViewService.java @@ -0,0 +1,34 @@ +package com.sparta.binplay.service; + +import com.sparta.binplay.dto.response.AdViewResponseDto; +import com.sparta.binplay.entity.AdViews; +import com.sparta.binplay.entity.VideoAd; +import com.sparta.binplay.repository.AdViewRepository; +import com.sparta.binplay.repository.VideoAdRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AdViewService { + private final AdViewRepository adViewRepository; + private final VideoAdRepository videoAdRepository; + + public AdViewResponseDto saveAdView(Long videoAdId) { + // 비디오 광고를 videoAdId로 조회하고, 존재하지 않으면 예외를 던집니다. + VideoAd videoAd = videoAdRepository.findById(videoAdId) + .orElseThrow(() -> new RuntimeException("비디오 광고를 찾을 수 없음")); + + // 새로운 AdViews 객체를 생성합니다. + AdViews adView = AdViews.builder() + .videoAd(videoAd) + .build(); + + // 생성된 AdViews 객체를 저장합니다. + AdViews savedAdView = adViewRepository.save(adView); + + // 저장된 AdViews 객체를 AdViewResponseDto로 변환하여 반환합니다. + return AdViewResponseDto.from(savedAdView); + } + +} diff --git a/src/main/java/com/sparta/binplay/service/StreamService.java b/src/main/java/com/sparta/binplay/service/StreamService.java index 219a304..44dd291 100644 --- a/src/main/java/com/sparta/binplay/service/StreamService.java +++ b/src/main/java/com/sparta/binplay/service/StreamService.java @@ -1,6 +1,8 @@ package com.sparta.binplay.service; +import com.sparta.binplay.dto.request.StreamRequestDto; import com.sparta.binplay.dto.response.StreamResponseDto; +import com.sparta.binplay.entity.CustomOAuth2User; import com.sparta.binplay.entity.Streams; import com.sparta.binplay.entity.Users; import com.sparta.binplay.entity.Videos; @@ -8,7 +10,10 @@ import com.sparta.binplay.repository.UserRepository; import com.sparta.binplay.repository.VideoRepository; import lombok.RequiredArgsConstructor; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -17,6 +22,24 @@ public class StreamService { private final VideoRepository videoRepository; private final UserRepository userRepository; + private Users getAuthenticatedUser() throws Exception { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + CustomOAuth2User customUserDetails = (CustomOAuth2User) authentication.getPrincipal(); + String username = customUserDetails.getUsername(); + return getByUsername(username); + } + + // 비디오 재생 내역 + @Transactional + public StreamResponseDto play(Long videoId, String username, StreamRequestDto streamRequestDto) { + + Videos videos = getVideos(videoId); + Users user = getByUsername(username); + Streams streams = streamRepository.save(Streams.of(user, videos, streamRequestDto)); + + return StreamResponseDto.from(streams); + } + // 비디오 중단 시점 업데이트 public StreamResponseDto stopPosition(Long videoId, int stopTime, String username) { Videos video = videoRepository.findById(videoId).orElseThrow(() -> new RuntimeException("비디오를 찾을 수 없음")); @@ -33,4 +56,14 @@ public StreamResponseDto stopPosition(Long videoId, int stopTime, String usernam return StreamResponseDto.from(streams); } + + //회원 찾기 + private Users getByUsername(String username) { + return userRepository.findByUsername(username).orElseThrow(() -> new RuntimeException("회원을 찾을 수 없음")); + } + + //비디오 찾기 + private Videos getVideos(Long videoId) { + return videoRepository.findById(videoId).orElseThrow(() -> new RuntimeException("비디오를 찾을 수 없음")); + } } diff --git a/src/main/java/com/sparta/binplay/service/VideoService.java b/src/main/java/com/sparta/binplay/service/VideoService.java index a8fc7b3..fb8de8b 100644 --- a/src/main/java/com/sparta/binplay/service/VideoService.java +++ b/src/main/java/com/sparta/binplay/service/VideoService.java @@ -70,45 +70,6 @@ public VideoResponseDto createVideo(VideoRequestDto videoRequestDto) throws Exce return VideoResponseDto.from(saveVideo); } - /*@Transactional - public void matchAd(VideoRequestDto videoRequestDto) throws Exception { - Users user = getAuthenticatedUser(); - Videos savedVideo = videoRepository.save(Videos.of(user, videoRequestDto)); - - // 광고 개수 계산 및 저장 - int numberOfAds = (int) (savedVideo.getVideoLength() / (5 * 60)); // 5분마다 1개의 광고 (5분 = 300초) - List adsList = adRepository.findAll(); - - Random random = new Random(); - - for (int i = 0; i < numberOfAds; i++) { - int randomAdIndex = random.nextInt(adsList.size()); - Ads ad = adsList.get(randomAdIndex); - - // VideoAdRequestDto 생성 - VideoAdRequestDto videoAdRequestDto = VideoAdRequestDto.builder() - .ad(ad) - .viewCount(0) - .video(savedVideo) - .statIs(false) - .build(); - - // VideoAd 생성 및 저장 - VideoAd videoAd = VideoAd.of(videoAdRequestDto); - VideoAd savedVideoAd = videoAdRepository.save(videoAd); - - // AdViewsRequestDto 생성 - AdViewRequestDto adViewsRequestDto = AdViewRequestDto.builder() - .createdAt(LocalDate.now()) // 예시로 현재 날짜 사용 - .videoAd(savedVideoAd) - .build(); - - // AdViews 생성 및 저장 - AdViews adView = AdViews.of(adViewsRequestDto); - AdViews saveAdView = adViewRepository.save(adView); - } - }*/ - //비디오 조회 public List getVideoList() throws Exception { Users user = getAuthenticatedUser();