Skip to content

Commit

Permalink
feat: TalkRoom 이미지 저장 URL 기능 추가 및 테스트 코드 작성 (#61)
Browse files Browse the repository at this point in the history
  • Loading branch information
AHNYUNKI committed Apr 4, 2024
1 parent ecd0aff commit 4a4239c
Show file tree
Hide file tree
Showing 13 changed files with 307 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,16 @@ public class TalkRoomCreateRequest {
@NotEmpty(message = "참가 조건은 1개 이상 체크해야합니다.")
private List<String> readingStatus = new ArrayList<>();

private List<String> imageUrls = new ArrayList<>();

@Builder
private TalkRoomCreateRequest(String bookIsbn, String title, String content, List<String> readingStatus) {
private TalkRoomCreateRequest(String bookIsbn, String title, String content, List<String> readingStatus,
List<String> imageUrls) {
this.bookIsbn = bookIsbn;
this.title = title;
this.content = content;
this.readingStatus = readingStatus;
this.imageUrls = imageUrls;
}

public TalkRoomCreateServiceRequest toServiceRequest() {
Expand All @@ -43,6 +47,7 @@ public TalkRoomCreateServiceRequest toServiceRequest() {
.title(title)
.content(content)
.readingStatus(readingStatus)
.imageUrls(imageUrls)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,19 @@ public class TalkRoomEditRequest {
@NotEmpty(message = "참가 조건은 1개 이상 체크해야합니다.")
private List<String> readingStatus = new ArrayList<>();

private List<String> newImage = new ArrayList<>();

private List<String> removeImage = new ArrayList<>();

@Builder
private TalkRoomEditRequest(Long id, String title, String content, List<String> readingStatus) {
private TalkRoomEditRequest(Long id, String title, String content, List<String> readingStatus,
List<String> newImage, List<String> removeImage) {
this.id = id;
this.title = title;
this.content = content;
this.readingStatus = readingStatus;
this.newImage = newImage;
this.removeImage = removeImage;
}

public TalkRoomEditServiceRequest toServiceRequest() {
Expand All @@ -38,6 +45,8 @@ public TalkRoomEditServiceRequest toServiceRequest() {
.title(title)
.content(content)
.readingStatus(readingStatus)
.newImage(newImage)
.removeImage(removeImage)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import com.jisungin.domain.talkroom.TalkRoomRole;
import com.jisungin.domain.talkroom.repository.TalkRoomRepository;
import com.jisungin.domain.talkroom.repository.TalkRoomRoleRepository;
import com.jisungin.domain.talkroomimage.TalkRoomImage;
import com.jisungin.domain.talkroomimage.repository.TalkRoomImageRepository;
import com.jisungin.domain.user.User;
import com.jisungin.domain.user.repository.UserRepository;
import com.jisungin.exception.BusinessException;
Expand All @@ -35,6 +37,7 @@ public class TalkRoomService {
private final BookRepository bookRepository;
private final UserRepository userRepository;
private final CommentRepository commentRepository;
private final TalkRoomImageRepository talkRoomImageRepository;

@Transactional
public TalkRoomResponse createTalkRoom(TalkRoomCreateServiceRequest request, AuthContext authContext) {
Expand All @@ -52,12 +55,27 @@ public TalkRoomResponse createTalkRoom(TalkRoomCreateServiceRequest request, Aut
readingStatus.stream().map(status -> TalkRoomRole.roleCreate(talkRoom, status))
.forEach(talkRoomRoleRepository::save);

return TalkRoomResponse.of(user.getName(), talkRoom.getTitle(), talkRoom.getContent(), readingStatus,
TalkRoomResponse response = TalkRoomResponse.of(user.getName(), talkRoom.getTitle(),
talkRoom.getContent(), readingStatus,
book.getImageUrl(), book.getTitle());

if (request.getImageUrls() != null && !request.getImageUrls().isEmpty()) {
request.getImageUrls().stream()
.map(url -> TalkRoomImage.createImages(talkRoom, url))
.forEach(talkRoomImageRepository::save);

List<String> imageUrls = talkRoomImageRepository.findByTalkRoomIdWithImageUrl(
talkRoom.getId());

response.addTalkRoomImages(imageUrls);
}

return response;
}

public PageResponse<TalkRoomFindAllResponse> findAllTalkRoom(SearchServiceRequest search) {
return talkRoomRepository.findAllTalkRoom(search);
return talkRoomRepository.findAllTalkRoom(search.getOffset(), search.getSize(), search.getOrder(),
search.getQuery());
}

public TalkRoomFindOneResponse findOneTalkRoom(Long talkRoomId) {
Expand Down Expand Up @@ -87,8 +105,24 @@ public TalkRoomResponse editTalkRoom(TalkRoomEditServiceRequest request, AuthCon
readingStatus.stream().map(status -> TalkRoomRole.roleCreate(talkRoom, status))
.forEach(talkRoomRoleRepository::save);

return TalkRoomResponse.of(user.getName(), talkRoom.getTitle(), talkRoom.getContent(), readingStatus,
if (request.getNewImage() != null && !request.getNewImage().isEmpty()) {
request.getNewImage().stream().map(url -> TalkRoomImage.createImages(talkRoom, url))
.forEach(talkRoomImageRepository::save);
}

if (request.getRemoveImage() != null && !request.getRemoveImage().isEmpty()) {
request.getRemoveImage().stream().map(s -> talkRoomImageRepository.findByTalkRoomAndImageUrl(talkRoom, s))
.forEach(talkRoomImageRepository::deleteAll);
}

TalkRoomResponse response = TalkRoomResponse.of(user.getName(), talkRoom.getTitle(),
talkRoom.getContent(), readingStatus,
talkRoom.getBook().getImageUrl(), talkRoom.getBook().getTitle());

List<String> images = talkRoomImageRepository.findByTalkRoomIdWithImageUrl(talkRoom.getId());
response.addTalkRoomImages(images);

return response;
}

@Transactional
Expand All @@ -105,6 +139,10 @@ public void deleteTalkRoom(Long talkRoomId, AuthContext authContext) {

commentRepository.findByTalkRoom(talkRoom).ifPresent(commentRepository::delete);

List<TalkRoomImage> images = talkRoomImageRepository.findByTalkRoom(talkRoom);
if (images != null) {
talkRoomImageRepository.deleteAll(images);
}
talkRoomRoleRepository.deleteAllByTalkRoom(talkRoom);
talkRoomRepository.delete(talkRoom);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,16 @@ public class TalkRoomCreateServiceRequest {

private List<String> readingStatus;

private List<String> imageUrls;

@Builder
private TalkRoomCreateServiceRequest(String bookIsbn, String title, String content, List<String> readingStatus) {
private TalkRoomCreateServiceRequest(String bookIsbn, String title, String content, List<String> readingStatus,
List<String> imageUrls) {
this.bookIsbn = bookIsbn;
this.title = title;
this.content = content;
this.readingStatus = readingStatus;
this.imageUrls = imageUrls;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import java.util.ArrayList;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -22,12 +23,19 @@ public class TalkRoomEditServiceRequest {
@NotEmpty(message = "참가 조건은 1개 이상 체크해야합니다.")
private List<String> readingStatus;

private List<String> newImage = new ArrayList<>();

private List<String> removeImage = new ArrayList<>();

@Builder
private TalkRoomEditServiceRequest(Long id, String title, String content, List<String> readingStatus) {
private TalkRoomEditServiceRequest(Long id, String title, String content, List<String> readingStatus,
List<String> newImage, List<String> removeImage) {
this.id = id;
this.title = title;
this.content = content;
this.readingStatus = readingStatus;
this.newImage = newImage;
this.removeImage = removeImage;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class TalkRoomResponse {
private String content;
private List<ReadingStatus> readingStatuses;
private String bookImage;
private List<String> imageUrls;

@Builder
@QueryProjection
Expand All @@ -43,4 +44,8 @@ public static TalkRoomResponse of(String userName, String title, String content,
.build();
}

public void addTalkRoomImages(List<String> imageUrls) {
this.imageUrls = imageUrls;
}

}
47 changes: 47 additions & 0 deletions src/main/java/com/jisungin/domain/talkroomimage/TalkRoomImage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.jisungin.domain.talkroomimage;

import com.jisungin.domain.talkroom.TalkRoom;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class TalkRoomImage {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "image_url")
private String imageUrl;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "talk_room_id")
private TalkRoom talkRoom;

@Builder
private TalkRoomImage(Long id, String imageUrl, TalkRoom talkRoom) {
this.id = id;
this.imageUrl = imageUrl;
this.talkRoom = talkRoom;
}

public static TalkRoomImage createImages(TalkRoom talkRoom, String imageUrl) {
return TalkRoomImage.builder()
.talkRoom(talkRoom)
.imageUrl(imageUrl)
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.jisungin.domain.talkroomimage.repository;

import com.jisungin.domain.talkroom.TalkRoom;
import com.jisungin.domain.talkroomimage.TalkRoomImage;
import io.lettuce.core.dynamic.annotation.Param;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

public interface TalkRoomImageRepository extends JpaRepository<TalkRoomImage, Long> {
List<TalkRoomImage> findByTalkRoom(TalkRoom talkRoom);

@Query(
"select ti.imageUrl from TalkRoomImage ti where ti.talkRoom.id = :talkRoomId"
)
List<String> findByTalkRoomIdWithImageUrl(@Param("talkRoomId") Long talkRoomId);

List<TalkRoomImage> findByTalkRoomAndImageUrl(TalkRoom talkRoom, String image);

}
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,20 @@ void editTalkRoomWithEmptyReadingStatus() throws Exception {
.andExpect(jsonPath("$.message").value("참가 조건은 1개 이상 체크해야합니다."));
}

@Test
@DisplayName("사용자가 토크방을 10개씩 조회할 수 있다.")
void getTalkRooms() throws Exception {
// when // then
mockMvc.perform(get("/v1/talk-rooms?page=1&size=10&order=recent")
.contentType(APPLICATION_JSON)
)
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value("200"))
.andExpect(jsonPath("$.status").value("OK"))
.andExpect(jsonPath("$.message").value("OK"));
}

@Test
@DisplayName("사용자가 토크방을 조회 했을 때 페이지를 -1 값을 보내면 첫 번째 페이지가 조회 되어야 한다.")
void getTalkRoomWithMinus() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.jisungin.domain.talkroom.TalkRoomRole;
import com.jisungin.domain.talkroom.repository.TalkRoomRepository;
import com.jisungin.domain.talkroom.repository.TalkRoomRoleRepository;
import com.jisungin.domain.talkroomimage.repository.TalkRoomImageRepository;
import com.jisungin.domain.user.User;
import com.jisungin.domain.user.repository.UserRepository;
import com.jisungin.exception.BusinessException;
Expand Down Expand Up @@ -50,12 +51,16 @@ class CommentServiceTest extends ServiceTestSupport {
@Autowired
CommentRepository commentRepository;

@Autowired
TalkRoomImageRepository talkRoomImageRepository;

@Autowired
AuthContext authContext;

@AfterEach
void tearDown() {
commentRepository.deleteAllInBatch();
talkRoomImageRepository.deleteAllInBatch();
talkRoomRoleRepository.deleteAllInBatch();
talkRoomRepository.deleteAllInBatch();
userRepository.deleteAllInBatch();
Expand Down
Loading

0 comments on commit 4a4239c

Please sign in to comment.