Skip to content

Commit

Permalink
스트리밍 서비스 - 동영상, 광고 조회수, 동영상 중단
Browse files Browse the repository at this point in the history
  • Loading branch information
chobeebee committed Jul 1, 2024
1 parent 1eb5e9b commit e2d4a49
Show file tree
Hide file tree
Showing 14 changed files with 194 additions and 89 deletions.
18 changes: 11 additions & 7 deletions src/main/java/com/sparta/binplay/controller/VideoController.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package com.sparta.binplay.controller;

import com.sparta.binplay.dto.request.VideoRequestDto;
import com.sparta.binplay.dto.response.StreamResponseDto;
import com.sparta.binplay.dto.response.VideoAdResponseDto;
import com.sparta.binplay.dto.response.VideoResponseDto;
import com.sparta.binplay.entity.CustomOAuth2User;
import com.sparta.binplay.entity.Videos;
import com.sparta.binplay.service.StreamService;
import com.sparta.binplay.service.VideoAdService;
import com.sparta.binplay.service.VideoService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
Expand All @@ -18,7 +22,9 @@
@RequestMapping("/videos")
public class VideoController {
private final VideoService videoService;

private final VideoAdService videoAdService;
private final StreamService streamService;

//모든 비디오 조회 (필요없지 않나)
@GetMapping
public ResponseEntity<List<Videos>> getAllVideos() {
Expand Down Expand Up @@ -62,15 +68,13 @@ public ResponseEntity<VideoResponseDto> videoPlay(@PathVariable("video-id") Long

//비디오 중단
@PostMapping("/play/{video-id}/stop") //레스풀
public ResponseEntity<?> videoStop(@PathVariable("video-id") Long videoId, @RequestBody int stopTime, @AuthenticationPrincipal CustomOAuth2User user) {
videoService.stopPosition(videoId, stopTime, user.getUsername());
return ResponseEntity.ok().body("");
public ResponseEntity<StreamResponseDto> videoStop(@PathVariable("video-id") Long videoId, @RequestBody int stopTime, @AuthenticationPrincipal CustomOAuth2User user) {
return ResponseEntity.ok().body(streamService.stopPosition(videoId, stopTime, user.getUsername()));
}

//광고 시청
@PostMapping("/play/ads/{ad-id}")
public ResponseEntity<?> viewAd(@PathVariable("ad-id") Long adId, @RequestBody Long videoId) {
videoService.updateAdCount(adId, videoId);
return ResponseEntity.ok().body("");
public ResponseEntity<VideoAdResponseDto> viewAd(@PathVariable("ad-id") Long adId, @RequestBody Long videoId) {
return ResponseEntity.ok().body(videoAdService.updateAdCount(adId, videoId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@

@Getter
public class StreamRequestDto {
private Long viewingTime;
private Integer pausedAt;
private int viewingTime;
private int pausedAt;
private Users user;
private Videos video;

public StreamRequestDto(Long viewingTime, Integer pausedAt, Users user, Videos video) {
public StreamRequestDto(int viewingTime, int pausedAt, Users user, Videos video) {
this.viewingTime = viewingTime;
this.pausedAt = pausedAt;
this.user = user;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sparta.binplay.dto.request;

import com.sparta.binplay.entity.Ads;
import com.sparta.binplay.entity.Videos;
import lombok.Getter;

@Getter
public class VideoAdRequestDto {
private Long adViews;
private Videos video;
private Ads ad;
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
package com.sparta.binplay.dto.request;

import jakarta.validation.constraints.NotBlank;
import lombok.Getter;

@Getter
public class VideoRequestDto {
@NotBlank(message = "동영상 제목은 필수입니다.")
private String title;
private String description;
private long videoLength;

public VideoRequestDto(String title, String description, long videoLength) {
this.title = title;
this.description = description;
this.videoLength = videoLength;
}
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,28 @@
package com.sparta.binplay.dto.response;

import com.sparta.binplay.entity.Streams;
import lombok.Getter;
import lombok.*;

import java.time.LocalDateTime;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class StreamResponseDto {
private Long streamId;
private Long viewingTime;
private Integer pausedAt;
private int viewingTime;
private int pausedAt;
private LocalDateTime createAt;
private LocalDateTime modifiedAt;


public StreamResponseDto(Streams stream) {
this.streamId = stream.getStreamId();
this.viewingTime = stream.getViewingTime();
this.pausedAt = stream.getPausedAt();
this.createAt = stream.getCreatedAt();
this.modifiedAt = stream.getUpdatedAt();
public static StreamResponseDto from(Streams stream) {
return StreamResponseDto.builder()
.streamId(stream.getStreamId())
.viewingTime(stream.getViewingTime())
.pausedAt(stream.getPausedAt())
.createAt(stream.getCreatedAt())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.sparta.binplay.dto.response;

import com.sparta.binplay.entity.VideoAd;
import lombok.*;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class VideoAdResponseDto {
private Long videoAdId;
private Long adViews;

public static VideoAdResponseDto from(VideoAd videoAd) {
return VideoAdResponseDto.builder()
.videoAdId(videoAd.getVideoAdId())
.adViews(videoAd.getAdViews())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ public class VideoResponseDto {
private LocalDateTime createdAt;
private LocalDateTime updatedAt;

public VideoResponseDto(Videos video) {
}

public static VideoResponseDto from(Videos video) {
return VideoResponseDto.builder()
.videoId(video.getVideoId())
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/com/sparta/binplay/entity/Streams.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ public class Streams extends Timestamped {
private Long streamId;

@Column(name = "viewing_time")
private Long viewingTime;
private int viewingTime;

@Column(name = "paused_at")
private Integer pausedAt;
private int pausedAt;

@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
Expand All @@ -45,7 +45,7 @@ public void updatePause(int stopTime) {
}

public void updateViewingTime(int stopTime) {
this.viewingTime += (long) stopTime;
this.viewingTime += stopTime;
}

}
42 changes: 28 additions & 14 deletions src/main/java/com/sparta/binplay/entity/Videos.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,20 @@

import com.sparta.binplay.dto.request.VideoRequestDto;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;

@Entity
@Getter
@Setter
//@Setter
@Table(name = "videos")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Videos extends Timestamped {
@Id
@Column(name = "video_id")
Expand All @@ -33,6 +38,13 @@ public class Videos extends Timestamped {
@JoinColumn(name = "user_id", nullable = false)
private Users user;

@OneToMany(mappedBy = "video", cascade = CascadeType.PERSIST,orphanRemoval = true)
private List<Streams> streams;

@OneToMany(mappedBy = "video", cascade = CascadeType.PERSIST,orphanRemoval = true)
private List<VideoAd> videoAd;


public Videos(String title, String description, long videoLength) {
this.title = title;
this.description = description;
Expand All @@ -42,23 +54,25 @@ public Videos(String title, String description, long videoLength) {
}

public static Videos of(Users user, VideoRequestDto videoRequestDto) {
Videos videos = new Videos();
videos.setUser(user);
videos.setTitle(videoRequestDto.getTitle());
videos.setDescription(videoRequestDto.getDescription());
videos.setVideoLength(videoRequestDto.getVideoLength());
return videos;
return Videos.builder()
.user(user)
.title(videoRequestDto.getTitle())
.description(videoRequestDto.getDescription())
.videoLength(videoRequestDto.getVideoLength())
.build();
}

public void update(VideoRequestDto videoRequestDto) {
this.title = videoRequestDto.getTitle();
this.description = videoRequestDto.getDescription();
this.videoLength = videoRequestDto.getVideoLength();
}

public void viewUp() {
this.views++;
}
//
// @OneToMany(mappedBy = "videos", cascade = CascadeType.ALL, orphanRemoval = true)
// private List<Streams> streams;
//
// @OneToMany(mappedBy = "videos", cascade = CascadeType.ALL, orphanRemoval = true)
// private List<VideoAd> videoAd;


//
// @OneToMany(mappedBy = "videos", cascade = CascadeType.ALL, orphanRemoval = true)
// private List<Statistics> statistics;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
import java.util.Optional;

public interface StreamRepository extends JpaRepository<Streams, Long> {
Optional<Streams> findByUsersAndVideos(Users users, Videos videos);
Optional<Streams> findByUserAndVideo(Users user, Videos video);
//Optional<Streams> findByUserIdAndVideoId(Long userId, Long videoId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
import java.util.Optional;

public interface VideoAdRepository extends JpaRepository<VideoAd, Long> {
Optional<VideoAd> findByVideosAndAds(Videos videos, Ads ads);
Optional<VideoAd> findByVideoAndAd(Videos video, Ads ad);
}
36 changes: 36 additions & 0 deletions src/main/java/com/sparta/binplay/service/StreamService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.sparta.binplay.service;

import com.sparta.binplay.dto.response.StreamResponseDto;
import com.sparta.binplay.entity.Streams;
import com.sparta.binplay.entity.Users;
import com.sparta.binplay.entity.Videos;
import com.sparta.binplay.repository.StreamRepository;
import com.sparta.binplay.repository.UserRepository;
import com.sparta.binplay.repository.VideoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class StreamService {
private final StreamRepository streamRepository;
private final VideoRepository videoRepository;
private final UserRepository userRepository;

// 비디오 중단 시점 업데이트
public StreamResponseDto stopPosition(Long videoId, int stopTime, String username) {
Videos video = videoRepository.findById(videoId).orElseThrow(() -> new RuntimeException("비디오를 찾을 수 없음"));
Users user = userRepository.findByUsername(username).orElseThrow(() -> new RuntimeException("회원을 찾을 수 없음"));
Streams streams = streamRepository.findByUserAndVideo(user, video).orElse(Streams.builder()
.user(user)
.video(video)
.build());

streams.updatePause(stopTime);
streams.updateViewingTime(stopTime);

streamRepository.save(streams);

return StreamResponseDto.from(streams);
}
}
34 changes: 34 additions & 0 deletions src/main/java/com/sparta/binplay/service/VideoAdService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.sparta.binplay.service;

import com.sparta.binplay.dto.response.VideoAdResponseDto;
import com.sparta.binplay.entity.Ads;
import com.sparta.binplay.entity.VideoAd;
import com.sparta.binplay.entity.Videos;
import com.sparta.binplay.repository.AdRepository;
import com.sparta.binplay.repository.VideoAdRepository;
import com.sparta.binplay.repository.VideoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class VideoAdService {
private final VideoAdRepository videoAdRepository;
private final VideoRepository videoRepository;
private final AdRepository adRepository;

// 특정 광고 재생 횟수 업데이트
public VideoAdResponseDto updateAdCount(Long adId, Long videoId) {
Ads ad = adRepository.findById(adId).orElseThrow(() -> new RuntimeException("광고를 찾을 수 없음"));
Videos video = videoRepository.findById(videoId).orElseThrow(() -> new RuntimeException("비디오를 찾을 수 없음"));
VideoAd videoAd = videoAdRepository.findByVideoAndAd(video, ad).orElse(VideoAd.builder() //joincolumn 고칠것!!!
.ad(ad)
.video(video)
.build());

videoAd.countAd();
videoAdRepository.save(videoAd);

return VideoAdResponseDto.from(videoAd);
}
}
Loading

0 comments on commit e2d4a49

Please sign in to comment.