Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Member - Video 간 릴레이션 설정 #25

Merged
merged 19 commits into from
Mar 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
37d9184
Member - Video 도메인 객체 내 연관 관계 매핑 작업 수행
One-armed-boy Feb 28, 2024
52a06d4
연관 관계 매핑 외래키 칼럼을 명확히 하기 위한 칼럼 명 수정 작업
One-armed-boy Feb 28, 2024
6f02b2a
테스트용 h2 내 FK 제약이 자동으로 생성되지 않도록 하기 위한 수정
One-armed-boy Feb 29, 2024
efc06cd
Spring Security의 SecurityContext에서 유저 이메일을 손쉽게 뽑아내기 위한 헬퍼 클래스 작성
One-armed-boy Feb 29, 2024
79f8a61
Member - Video 연관 관계로 인한 Video Upload 컨텍스트에서 사용되는 Dto 수정 작업
One-armed-boy Feb 29, 2024
7554be6
VideoController 내 사용 Dto 수정
One-armed-boy Feb 29, 2024
f299ab7
VideoServiceTest를 Member - Video 연관 관계에 맞게 수정
One-armed-boy Feb 29, 2024
775f460
VideoServiceTest 내 메서드로 작성되어 있던 signup 메서드를 더 범용적으로 활용하기 위해 TestHelpe…
One-armed-boy Feb 29, 2024
681b62d
Video.setMember 로직에 대해 null 인자에 대한 예외 처리 반영
One-armed-boy Feb 29, 2024
438a7cb
TestHelperTest 작성
One-armed-boy Feb 29, 2024
fa77325
TestHelperTest 내 클린업 로직 추가
One-armed-boy Feb 29, 2024
34aaa54
TestHelper.clearTables 로직 내부에서 엔티티 간 의존성 방향 때문에 전체 삭제 시 문제가 되던 부분을 삭제…
One-armed-boy Feb 29, 2024
6609faa
CreateVideoCommand 적용
One-armed-boy Mar 1, 2024
0391d89
Video - Member 연관 관계로 인해 Video가 생성되는 컨텍스트에서 필요한 추가적인 Member 관련 작업을 수행…
One-armed-boy Mar 1, 2024
3407f83
Dto 내 Nullable한 Member 값에 대한 처리 수행
One-armed-boy Mar 1, 2024
91cf61f
Dto 수정에 따른 TestCode 수정
One-armed-boy Mar 1, 2024
7be9fbd
실제 DB 스키마와 로직 레벨의 엔티티 매핑이 잘못되어 있던 부분을 수정 (Video 테이블 description col n…
One-armed-boy Mar 1, 2024
3a93043
잘못된 SQL 수정
One-armed-boy Mar 1, 2024
08eb6c8
기존 실수를 신규 마이그레이션 파일을 추가하여 해결하기보다 실수한 부분을 바로잡는 방식으로 해결
One-armed-boy Mar 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions src/main/java/com/stream/controller/UploadController.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,34 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.stream.domain.video.dto.UploadVideoDto;
import com.stream.controller.dto.upload.UploadVideoRequest;
import com.stream.domain.video.dto.upload.UploadVideoCommand;
import com.stream.facade.UploadFacade;
import com.stream.security.SecurityContextHelper;

import jakarta.validation.Valid;

@RestController
public class UploadController {
private final UploadFacade uploadFacade;
private final SecurityContextHelper securityContextHelper;

@Autowired
public UploadController(UploadFacade uploadFacade) {
public UploadController(UploadFacade uploadFacade, SecurityContextHelper securityContextHelper) {
this.uploadFacade = uploadFacade;
this.securityContextHelper = securityContextHelper;
}

@PostMapping(path = "/videos/upload")
public ResponseEntity uploadVideo(@Valid @RequestPart(value = "videoMetadata") UploadVideoDto videoMetadata,
public ResponseEntity uploadVideo(@Valid @RequestPart(value = "videoMetadata") UploadVideoRequest request,
@RequestPart(value = "videoFile") MultipartFile videoFile) {
uploadFacade.uploadVideoSync(videoMetadata, videoFile);
var member = securityContextHelper.getMember();
uploadFacade.uploadVideoSync(UploadVideoCommand.builder()
.fileName(request.getFileName())
.extension(request.getExtension())
.description(request.getDescription())
.member(member)
.build(), videoFile);
return ResponseEntity.ok().build();
}
}
4 changes: 1 addition & 3 deletions src/main/java/com/stream/controller/VideoController.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@ public VideoController(VideoService videoService) {
@GetMapping(path = "/videos")
public ResponseEntity<ListVideoResponse> listVideo() {
return ResponseEntity.ok()
.body(ListVideoResponse.builder()
.videos(videoService.listVideo())
.build());
.body(ListVideoResponse.create(videoService.listVideo()));
}

@GetMapping(path = "/videos", params = "id")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.stream.domain.video.dto;
package com.stream.controller.dto.upload;

import jakarta.validation.constraints.NotNull;
import lombok.Builder;
Expand All @@ -7,15 +7,15 @@

@Getter
@ToString
public class UploadVideoDto {
public class UploadVideoRequest {
@NotNull(message = "확장자를 제외한 파일명을 입력해주세요. (ex. ~)")
private String fileName;
@NotNull(message = "확장자를 입력해주세요. (ex. MOV)")
private String extension;
private String description;

@Builder
public UploadVideoDto(String fileName, String extension, String description) {
public UploadVideoRequest(String fileName, String extension, String description) {
this.fileName = fileName;
this.extension = extension;
this.description = description;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,31 @@ public class GetVideoResponse {
private long size;
private String description;
private Date createdAt;
private String member;

@Builder
public GetVideoResponse(long id, String fileTag, String extension, long size, String description, Date createdAt) {
public GetVideoResponse(long id, String fileTag, String extension, String member, long size, String description,
Date createdAt) {
this.id = id;
this.fileTag = fileTag;
this.extension = extension;
this.size = size;
this.description = description;
this.createdAt = createdAt;
this.member = member;
}

public static GetVideoResponse convertDtoToResponse(VideoDto videoDto) {
var member = videoDto.getMember();
var memberEmail = member != null ? member.getEmail() : null;
return GetVideoResponse.builder()
.id(videoDto.getId())
.fileTag(videoDto.getFileTag())
.extension(videoDto.getExtension())
.size(videoDto.getSize())
.description(videoDto.getDescription())
.createdAt(videoDto.getCreatedAt())
.member(memberEmail)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,63 @@
package com.stream.controller.dto.video;

import java.util.Date;
import java.util.List;

import com.stream.domain.video.dto.VideoDto;

import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Getter
@ToString
@NoArgsConstructor
@EqualsAndHashCode
public class ListVideoResponse {
private List<VideoDto> videos;
private List<Element> videos;

@Builder
public ListVideoResponse(List<VideoDto> videos) {
private ListVideoResponse(List<Element> videos) {
this.videos = videos;
}

public static ListVideoResponse create(List<VideoDto> videos) {
return new ListVideoResponse(videos.stream().map(videoDto -> {
var member = videoDto.getMember();
var memberEmail = member != null ? member.getEmail() : null;
return Element.builder()
.id(videoDto.getId())
.fileTag(
videoDto.getFileTag())
.extension(videoDto.getExtension())
.size(videoDto.getSize())
.member(memberEmail)
.createdAt(videoDto.getCreatedAt())
.build();
}).toList());
}

@Getter
@ToString
@NoArgsConstructor
@EqualsAndHashCode
public static class Element {
private long id;
private String fileTag;
private String extension;
private long size;
private Date createdAt;
private String member;

@Builder
public Element(long id, String fileTag, String extension, String member, long size, Date createdAt) {
this.id = id;
this.fileTag = fileTag;
this.extension = extension;
this.size = size;
this.createdAt = createdAt;
this.member = member;
}
}
}
13 changes: 12 additions & 1 deletion src/main/java/com/stream/domain/member/Member.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
package com.stream.domain.member;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.annotations.CreationTimestamp;

import com.stream.domain.role.Role;
import com.stream.domain.video.Video;

import jakarta.persistence.Column;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.Entity;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
Expand All @@ -26,7 +33,7 @@
@Getter
public class Member {
@Id
@Column(name = "id", nullable = false, updatable = false)
@Column(name = "member_id", nullable = false, updatable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

Expand All @@ -37,6 +44,7 @@ public class Member {
private String password;

@ManyToOne
@JoinColumn(name = "role_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
private Role role;

@CreationTimestamp
Expand All @@ -48,6 +56,9 @@ public class Member {
@Column(name = "last_login_at")
private Date lastLoginAt;

@OneToMany(mappedBy = "member")
private List<Video> videoList = new ArrayList<>();

@Builder
public Member(long id, String email, String password, Role role) {
this.id = id;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/stream/domain/role/Role.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
@Getter
public class Role {
@Id
@Column(name = "id", nullable = false, updatable = false)
@Column(name = "role_id", nullable = false, updatable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

Expand Down
27 changes: 25 additions & 2 deletions src/main/java/com/stream/domain/video/Video.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,17 @@
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import com.stream.domain.member.Member;

import jakarta.persistence.Column;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.Entity;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
Expand All @@ -24,7 +30,7 @@
@Getter
public class Video {
@Id
@Column(name = "id", nullable = false, updatable = false)
@Column(name = "video_id", nullable = false, updatable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

Expand Down Expand Up @@ -53,13 +59,30 @@ public class Video {
@Column(name = "updated_at", nullable = false)
private Date updatedAt;

@ManyToOne
@JoinColumn(name = "member_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
private Member member;

@Builder
public Video(long id, String fileTag, String extension, String path, long size, String description) {
public Video(long id, String fileTag, String extension, String path, long size, String description, Member member) {
this.id = id;
this.fileTag = fileTag;
this.extension = extension;
this.path = path;
this.size = size;
this.description = description;
this.setMember(member);
}

public void setMember(Member member) {
if (this.member != null) {
this.member.getVideoList().remove(this);
}
this.member = member;
if (member == null) {
return;
}
this.member.getVideoList().add(this);
}
}

22 changes: 19 additions & 3 deletions src/main/java/com/stream/domain/video/VideoService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.stream.domain.member.Member;
import com.stream.domain.member.MemberService;
import com.stream.domain.video.dto.CreateVideoCommand;
import com.stream.domain.video.dto.VideoDto;
import com.stream.domain.video.exception.VideoNotFoundException;

Expand All @@ -14,9 +17,12 @@
public class VideoService {
private final VideoRepository videoRepository;

private final MemberService memberService;

@Autowired
public VideoService(VideoRepository videoRepository) {
public VideoService(VideoRepository videoRepository, MemberService memberService) {
this.videoRepository = videoRepository;
this.memberService = memberService;
}

public List<VideoDto> listVideo() {
Expand All @@ -41,7 +47,17 @@ private Video getVideoById(long id) {
}

@Transactional
public List<Video> createVideo(Video... video) {
return videoRepository.saveAll(List.of(video));
public Video createVideo(CreateVideoCommand command) {
var email = command.getMemberEmail();
Member member =
email == null ? null : memberService.getMemberByEmail(email);
return videoRepository.save(Video.builder()
.member(member)
.fileTag(command.getFileTag())
.extension(command.getExtension())
.path(command.getPath())
.size(command.getSize())
.description(command.getDescription())
.build());
}
}
27 changes: 27 additions & 0 deletions src/main/java/com/stream/domain/video/dto/CreateVideoCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.stream.domain.video.dto;

import lombok.Builder;
import lombok.Getter;
import lombok.ToString;

@Getter
@ToString
public class CreateVideoCommand {
private String fileTag;
private String extension;
private String path;
private long size;
private String description;
private String memberEmail;

@Builder
public CreateVideoCommand(String fileTag, String extension, String path, long size, String description,
String memberEmail) {
this.fileTag = fileTag;
this.extension = extension;
this.path = path;
this.size = size;
this.description = description;
this.memberEmail = memberEmail;
}
}
Loading
Loading