diff --git a/src/main/java/com/daramg/server/composer/application/ComposerService.java b/src/main/java/com/daramg/server/composer/application/ComposerService.java index 759b83a..0439aac 100644 --- a/src/main/java/com/daramg/server/composer/application/ComposerService.java +++ b/src/main/java/com/daramg/server/composer/application/ComposerService.java @@ -6,6 +6,7 @@ import com.daramg.server.composer.domain.Composer; import com.daramg.server.composer.domain.ComposerLike; import com.daramg.server.composer.dto.ComposerCreateDto; +import com.daramg.server.composer.dto.ComposerUpdateDto; import com.daramg.server.composer.dto.ComposerLikeResponseDto; import com.daramg.server.composer.repository.ComposerLikeRepository; import com.daramg.server.composer.repository.ComposerRepository; @@ -55,6 +56,17 @@ public void createComposer(ComposerCreateDto dto, User user) { * @param user 요청한 유저 (인증 객체) * @return 좋아요 생성 시 {@code true}, 취소 시 {@code false}를 담은 DTO */ + @Transactional + public void updateComposer(Long composerId, ComposerUpdateDto dto, User user) { + if (user.getId() != 5L) { + throw new BusinessException(CommonErrorStatus.FORBIDDEN); + } + Composer composer = entityUtils.getEntity(composerId, Composer.class); + composer.update(dto.getKoreanName(), dto.getEnglishName(), dto.getNativeName(), + dto.getGender(), dto.getNationality(), dto.getBirthYear(), dto.getDeathYear(), + dto.getBio(), dto.getEra(), dto.getContinent()); + } + @Transactional public void deleteComposer(Long composerId, User user) { if (user.getId() != 5L) { diff --git a/src/main/java/com/daramg/server/composer/domain/Composer.java b/src/main/java/com/daramg/server/composer/domain/Composer.java index 62f48f5..f0a0515 100644 --- a/src/main/java/com/daramg/server/composer/domain/Composer.java +++ b/src/main/java/com/daramg/server/composer/domain/Composer.java @@ -47,6 +47,20 @@ public class Composer extends BaseEntity { @Column(name = "continent") private Continent continent; + public void update(String koreanName, String englishName, String nativeName, Gender gender, + String nationality, Short birthYear, Short deathYear, String bio, Era era, Continent continent) { + this.koreanName = koreanName; + this.englishName = englishName; + this.nativeName = nativeName; + this.gender = gender; + this.nationality = nationality; + this.birthYear = birthYear; + this.deathYear = deathYear; + this.bio = bio; + this.era = era; + this.continent = continent; + } + @Builder private Composer(@NonNull String koreanName, @NonNull String englishName, String nativeName, @NonNull Gender gender, String nationality, diff --git a/src/main/java/com/daramg/server/composer/dto/ComposerUpdateDto.kt b/src/main/java/com/daramg/server/composer/dto/ComposerUpdateDto.kt new file mode 100644 index 0000000..d759f52 --- /dev/null +++ b/src/main/java/com/daramg/server/composer/dto/ComposerUpdateDto.kt @@ -0,0 +1,20 @@ +package com.daramg.server.composer.dto + +import com.daramg.server.composer.domain.Continent +import com.daramg.server.composer.domain.Era +import com.daramg.server.composer.domain.Gender +import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.NotNull + +data class ComposerUpdateDto( + @get:NotBlank val koreanName: String, + @get:NotBlank val englishName: String, + val nativeName: String? = null, + @get:NotNull val gender: Gender, + @get:NotBlank val nationality: String, + @get:NotNull val birthYear: Short, + @get:NotNull val deathYear: Short, + @get:NotBlank val bio: String, + @get:NotNull val era: Era, + @get:NotNull val continent: Continent, +) diff --git a/src/main/java/com/daramg/server/composer/presentation/ComposerController.java b/src/main/java/com/daramg/server/composer/presentation/ComposerController.java index e78e137..59ccc74 100644 --- a/src/main/java/com/daramg/server/composer/presentation/ComposerController.java +++ b/src/main/java/com/daramg/server/composer/presentation/ComposerController.java @@ -2,6 +2,7 @@ import com.daramg.server.composer.application.ComposerService; import com.daramg.server.composer.dto.ComposerCreateDto; +import com.daramg.server.composer.dto.ComposerUpdateDto; import com.daramg.server.composer.dto.ComposerLikeResponseDto; import com.daramg.server.user.domain.User; import jakarta.validation.Valid; @@ -23,6 +24,12 @@ public void createComposer(@Valid @RequestBody ComposerCreateDto dto, User user) composerService.createComposer(dto, user); } + @PutMapping("/{composerId}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void updateComposer(@PathVariable Long composerId, @Valid @RequestBody ComposerUpdateDto dto, User user) { + composerService.updateComposer(composerId, dto, user); + } + @DeleteMapping("/{composerId}") @ResponseStatus(HttpStatus.NO_CONTENT) public void deleteComposer(@PathVariable Long composerId, User user) { diff --git a/src/test/java/com/daramg/server/composer/presentation/ComposerControllerTest.java b/src/test/java/com/daramg/server/composer/presentation/ComposerControllerTest.java index 32354c1..6e02112 100644 --- a/src/test/java/com/daramg/server/composer/presentation/ComposerControllerTest.java +++ b/src/test/java/com/daramg/server/composer/presentation/ComposerControllerTest.java @@ -20,6 +20,7 @@ import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest(controllers = ComposerController.class) @@ -77,6 +78,60 @@ public class ComposerControllerTest extends ControllerTestSupport { )); } + @Test + void 작곡가를_수정한다() throws Exception { + // given + Long composerId = 1L; + Map requestBody = Map.of( + "koreanName", "베토벤", + "englishName", "Ludwig van Beethoven", + "gender", "MALE", + "nationality", "독일", + "birthYear", 1770, + "deathYear", 1827, + "bio", "독일의 작곡가", + "era", "CLASSICAL", + "continent", "EUROPE" + ); + Cookie cookie = new Cookie(COOKIE_NAME, "access_token"); + + // when + ResultActions result = mockMvc.perform(put("/composers/{composerId}", composerId) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody)) + .cookie(cookie) + ); + + // then + result.andExpect(status().isNoContent()) + .andDo(restDocsHandler.document( + resource(ResourceSnippetParameters.builder() + .tag("Composer API") + .summary("작곡가 수정") + .description("관리자가 작곡가 정보를 수정합니다.") + .pathParameters( + parameterWithName("composerId").description("수정할 작곡가 ID") + ) + .requestFields( + fieldWithPath("koreanName").type(JsonFieldType.STRING).description("한국어 이름"), + fieldWithPath("englishName").type(JsonFieldType.STRING).description("영어 이름"), + fieldWithPath("nativeName").type(JsonFieldType.STRING).description("원어 이름").optional(), + fieldWithPath("gender").type(JsonFieldType.STRING).description("성별 (MALE / FEMALE / UNKNOWN)"), + fieldWithPath("nationality").type(JsonFieldType.STRING).description("국적"), + fieldWithPath("birthYear").type(JsonFieldType.NUMBER).description("출생 연도"), + fieldWithPath("deathYear").type(JsonFieldType.NUMBER).description("사망 연도"), + fieldWithPath("bio").type(JsonFieldType.STRING).description("소개"), + fieldWithPath("era").type(JsonFieldType.STRING).description("시대 (MEDIEVAL_RENAISSANCE / BAROQUE / CLASSICAL / ROMANTIC / MODERN_CONTEMPORARY)"), + fieldWithPath("continent").type(JsonFieldType.STRING).description("대륙 (ASIA / NORTH_AMERICA / EUROPE / SOUTH_AMERICA / AFRICA_OCEANIA)") + ) + .build() + ), + requestCookies( + cookieWithName(COOKIE_NAME).description("유저의 토큰") + ) + )); + } + @Test void 작곡가를_삭제한다() throws Exception { // given