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

Feature/24 : 관리자 글귀 수정 API #30

Merged
merged 4 commits into from
Jan 30, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
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
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package com.nexters.dailyphrase.admin.business;

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.nexters.dailyphrase.admin.presentation.dto.AdminRequestDTO;
import com.nexters.dailyphrase.admin.presentation.dto.AdminResponseDTO;
import com.nexters.dailyphrase.phrase.domain.Phrase;
import com.nexters.dailyphrase.phrase.implement.PhraseCommandService;
import com.nexters.dailyphrase.phrase.implement.PhraseQueryService;
import com.nexters.dailyphrase.phraseimage.domain.PhraseImage;
import com.nexters.dailyphrase.phraseimage.implement.PhraseImageCommandService;
import org.springframework.stereotype.Component;

import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

@Component
@RequiredArgsConstructor
public class AdminFacade {
Expand All @@ -22,18 +25,39 @@ public class AdminFacade {
public AdminResponseDTO.AddPhrase addPhrase(final AdminRequestDTO.AddPhrase request) {

final Phrase phrase = adminMapper.toPhrase(request);
final PhraseImage phraseImage= adminMapper.toPhraseImage(request);
final PhraseImage phraseImage = adminMapper.toPhraseImage(request);

Phrase savedPhrase=phraseCommandService.create(phrase);
Phrase savedPhrase = phraseCommandService.create(phrase);
phraseImage.setPhrase(savedPhrase);
phraseImageCommandService.create(phraseImage);

return adminMapper.toAddPhrase(savedPhrase);
}

@Transactional
public AdminResponseDTO.AdminPhraseDetail getAdminPhraseDetail(final Long id) {
Phrase phrase = phraseQueryService.findById(id);
return adminMapper.toAdminPhraseDetail(phrase);
}



@Transactional
public AdminResponseDTO.ModifyPhrase modifyPhrase(
final Long id, final AdminRequestDTO.ModifyPhrase request) {

final Phrase requestedPhrase = adminMapper.toPhrase(request);
final PhraseImage requestedPhraseImage = adminMapper.toPhraseImage(request);

Phrase updatedPhrase = phraseQueryService.findById(id);
updatedPhrase.setTitle(requestedPhrase.getTitle());
updatedPhrase.setContent(requestedPhrase.getContent());

PhraseImage updatedPhraseImage = updatedPhrase.getPhraseImage();
updatedPhraseImage.setImageRatio(requestedPhraseImage.getImageRatio());
updatedPhraseImage.setFileName(requestedPhraseImage.getFileName());
updatedPhrase.setPhraseImage(updatedPhraseImage);

return adminMapper.toModifyPhrase(updatedPhrase);
}

}
Original file line number Diff line number Diff line change
@@ -1,28 +1,26 @@
package com.nexters.dailyphrase.admin.business;

import java.util.Optional;

import org.springframework.stereotype.Component;

import com.nexters.dailyphrase.admin.presentation.dto.AdminRequestDTO;
import com.nexters.dailyphrase.admin.presentation.dto.AdminResponseDTO;
import com.nexters.dailyphrase.phrase.domain.Phrase;
import com.nexters.dailyphrase.phraseimage.domain.PhraseImage;
import org.springframework.stereotype.Component;

@Component
public class AdminMapper {

public Phrase toPhrase(AdminRequestDTO.AddPhrase request) {
return Phrase.builder()
.title(request.getTitle())
.content(request.getContent())
.build();
return Phrase.builder().title(request.getTitle()).content(request.getContent()).build();
}

public PhraseImage toPhraseImage(AdminRequestDTO.AddPhrase request) {
return PhraseImage.builder()
.fileName(request.getFileName())
.imageRatio(request.getImageRatio())
.build();

}

public AdminResponseDTO.AddPhrase toAddPhrase(Phrase savedPhrase) {
Expand All @@ -34,14 +32,35 @@ public AdminResponseDTO.AddPhrase toAddPhrase(Phrase savedPhrase) {

public AdminResponseDTO.AdminPhraseDetail toAdminPhraseDetail(Phrase phrase) {
String imageUrl =
Optional.ofNullable(phrase.getPhraseImage())
.map(PhraseImage::getUrl)
.orElse("");
Optional.ofNullable(phrase.getPhraseImage()).map(PhraseImage::getUrl).orElse("");

return AdminResponseDTO.AdminPhraseDetail.builder()
.title(phrase.getTitle())
.imageUrl(imageUrl)
.content(phrase.getContent())
.build();
}

public Phrase toPhrase(AdminRequestDTO.ModifyPhrase request) {
return Phrase.builder().title(request.getTitle()).content(request.getContent()).build();
}

public PhraseImage toPhraseImage(AdminRequestDTO.ModifyPhrase request) {
return PhraseImage.builder()
.fileName(request.getFileName())
.imageRatio(request.getImageRatio())
.build();
}


public AdminResponseDTO.ModifyPhrase toModifyPhrase(Phrase updatedPhrase) {
return AdminResponseDTO.ModifyPhrase.builder()
.id(updatedPhrase.getId())
.updatedAt(updatedPhrase.getUpdatedAt())
.createdAt(updatedPhrase.getCreatedAt())
.title(updatedPhrase.getTitle())
.imageUrl(updatedPhrase.getPhraseImage().getUrl())
.content(updatedPhrase.getContent())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@

@Service
@RequiredArgsConstructor
public class AdminCommandService { }
public class AdminCommandService {}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public CommonResponse<AdminResponseDTO.AddPhrase> addPhrase(@RequestBody final A
@PatchMapping("/phrases/{id}")
public CommonResponse<AdminResponseDTO.ModifyPhrase> modifyPhrase(
@PathVariable Long id, @RequestBody final AdminRequestDTO.ModifyPhrase request) {
return null;
return CommonResponse.onSuccess(adminFacade.modifyPhrase(id, request));
}

@DeleteMapping("/phrases/{id}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@ public static class AddPhrase {
private String content;
private String fileName;
private String imageRatio;

}


@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class ModifyPhrase {
private String field;
private String title;
private String content;
private String fileName;
private String imageRatio;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,12 @@ public static class AdminPhraseDetail {
@NoArgsConstructor
@AllArgsConstructor
public static class ModifyPhrase {
private String field;
private Long id;
private LocalDateTime updatedAt;
private LocalDateTime createdAt;
private String title;
private String imageUrl;
private String content;
}

@Builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,12 @@ public class Phrase extends BaseDateTimeEntity {
public void setPhraseImage(PhraseImage phraseImage) {
this.phraseImage = phraseImage;
}

public void setTitle(String title) {
this.title = title;
}

public void setContent(String content) {
this.content = content;
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.nexters.dailyphrase.phrase.implement;

import com.nexters.dailyphrase.phrase.domain.Phrase;
import org.springframework.stereotype.Service;

import com.nexters.dailyphrase.phrase.domain.Phrase;
import com.nexters.dailyphrase.phrase.domain.repository.PhraseRepository;

import lombok.RequiredArgsConstructor;
Expand All @@ -17,8 +17,7 @@ public void increaseViewCountById(final Long phraseId) {
}

public Phrase create(final Phrase phrase) {

return phraseRepository.save(phrase);

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,12 @@ public void setPhrase(Phrase phrase) {
phrase.setPhraseImage(this);
}
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public void setImageRatio(String imageRatio) {
this.imageRatio = imageRatio;
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package com.nexters.dailyphrase.phraseimage.implement;

import com.nexters.dailyphrase.phrase.domain.Phrase;
import com.nexters.dailyphrase.phraseimage.domain.PhraseImage;
import com.nexters.dailyphrase.phraseimage.domain.repository.PhraseImageRepository;
import org.springframework.stereotype.Service;

import com.nexters.dailyphrase.phrase.domain.repository.PhraseRepository;
import com.nexters.dailyphrase.phraseimage.domain.PhraseImage;
import com.nexters.dailyphrase.phraseimage.domain.repository.PhraseImageRepository;

import lombok.RequiredArgsConstructor;

Expand All @@ -14,10 +12,8 @@
public class PhraseImageCommandService {
private final PhraseImageRepository phraseImageRepository;


public void create(final PhraseImage phraseImage) {

phraseImageRepository.save(phraseImage);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public void setup() {

@Test
@DisplayName("글귀 등록 로직을 테스트합니다.")
void 글귀_등록() throws Exception {
Long 글귀_등록() throws Exception {
// given
String testTitle = "test title";
String testContent = "test content";
Expand All @@ -61,6 +61,7 @@ public void setup() {
assertEquals(testTitle, findItem.get().getTitle());
assertEquals(testFileName, findItem.get().getPhraseImage().getFileName());
assertEquals(testImageRatio, findItem.get().getPhraseImage().getImageRatio());
return phraseId;
}

@Test
Expand All @@ -84,6 +85,43 @@ public void setup() {
assertEquals(testContent, adminPhraseDetail.getContent());
System.out.println("image url은 return하기만 합니다 imageurl=" + adminPhraseDetail.getImageUrl());
}
@Test
@DisplayName("글귀 수정 로직을 테스트합니다.")
void 글귀_수정() throws Exception {
// given

long phraseId = 글귀_등록();

String testTitle = "modify_title";
String testContent = "modify_content";
String testFileName = "modify_fileName";
String testImageRatio = "modify_ratio";

String jsonRequest = toJsonString(testTitle, testContent, testFileName, testImageRatio);

// when & then
MvcResult result =
mockMvc.perform(
MockMvcRequestBuilders.patch("/api/admin/phrases/{id}", phraseId)
.contentType(MediaType.APPLICATION_JSON)
.content(jsonRequest))
.andExpect(status().isOk())
.andExpect(jsonPath("$.isSuccess").value("true"))
.andExpect(jsonPath("$.result.title").value(testTitle))
.andExpect(jsonPath("$.result.content").value(testContent))
.andReturn();

String responseBody = result.getResponse().getContentAsString();
JSONObject jsonObject = new JSONObject(responseBody);

String imageUrl = jsonObject.getJSONObject("result").getString("imageUrl");
String updatedAt = jsonObject.getJSONObject("result").getString("updatedAt");
String createdAt = jsonObject.getJSONObject("result").getString("createdAt");

System.out.println("image url은 return하기만 합니다 imageurl=" + imageUrl);
System.out.println("updatedAt은 return하기만 합니다 updatedAt=" + updatedAt);
System.out.println("createdAt은 return하기만 합니다 createdAt=" + createdAt);
}

@DisplayName("테스트용 글귀 등록 공통 로직")
private long phraseCreation(
Expand Down