Skip to content

Commit 4c3dabe

Browse files
authored
Merge pull request #98 from classic-daramg/feat/updateComposer
[feat] ์ž‘๊ณก๊ฐ€ ์ˆ˜์ • API ์ถ”๊ฐ€
2 parents a8fa55b + 2502f7a commit 4c3dabe

5 files changed

Lines changed: 108 additions & 0 deletions

File tree

โ€Žsrc/main/java/com/daramg/server/composer/application/ComposerService.javaโ€Ž

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.daramg.server.composer.domain.Composer;
77
import com.daramg.server.composer.domain.ComposerLike;
88
import com.daramg.server.composer.dto.ComposerCreateDto;
9+
import com.daramg.server.composer.dto.ComposerUpdateDto;
910
import com.daramg.server.composer.dto.ComposerLikeResponseDto;
1011
import com.daramg.server.composer.repository.ComposerLikeRepository;
1112
import com.daramg.server.composer.repository.ComposerRepository;
@@ -55,6 +56,17 @@ public void createComposer(ComposerCreateDto dto, User user) {
5556
* @param user ์š”์ฒญํ•œ ์œ ์ € (์ธ์ฆ ๊ฐ์ฒด)
5657
* @return ์ข‹์•„์š” ์ƒ์„ฑ ์‹œ {@code true}, ์ทจ์†Œ ์‹œ {@code false}๋ฅผ ๋‹ด์€ DTO
5758
*/
59+
@Transactional
60+
public void updateComposer(Long composerId, ComposerUpdateDto dto, User user) {
61+
if (user.getId() != 5L) {
62+
throw new BusinessException(CommonErrorStatus.FORBIDDEN);
63+
}
64+
Composer composer = entityUtils.getEntity(composerId, Composer.class);
65+
composer.update(dto.getKoreanName(), dto.getEnglishName(), dto.getNativeName(),
66+
dto.getGender(), dto.getNationality(), dto.getBirthYear(), dto.getDeathYear(),
67+
dto.getBio(), dto.getEra(), dto.getContinent());
68+
}
69+
5870
@Transactional
5971
public void deleteComposer(Long composerId, User user) {
6072
if (user.getId() != 5L) {

โ€Žsrc/main/java/com/daramg/server/composer/domain/Composer.javaโ€Ž

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,20 @@ public class Composer extends BaseEntity<Composer> {
4747
@Column(name = "continent")
4848
private Continent continent;
4949

50+
public void update(String koreanName, String englishName, String nativeName, Gender gender,
51+
String nationality, Short birthYear, Short deathYear, String bio, Era era, Continent continent) {
52+
this.koreanName = koreanName;
53+
this.englishName = englishName;
54+
this.nativeName = nativeName;
55+
this.gender = gender;
56+
this.nationality = nationality;
57+
this.birthYear = birthYear;
58+
this.deathYear = deathYear;
59+
this.bio = bio;
60+
this.era = era;
61+
this.continent = continent;
62+
}
63+
5064
@Builder
5165
private Composer(@NonNull String koreanName, @NonNull String englishName,
5266
String nativeName, @NonNull Gender gender, String nationality,
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.daramg.server.composer.dto
2+
3+
import com.daramg.server.composer.domain.Continent
4+
import com.daramg.server.composer.domain.Era
5+
import com.daramg.server.composer.domain.Gender
6+
import jakarta.validation.constraints.NotBlank
7+
import jakarta.validation.constraints.NotNull
8+
9+
data class ComposerUpdateDto(
10+
@get:NotBlank val koreanName: String,
11+
@get:NotBlank val englishName: String,
12+
val nativeName: String? = null,
13+
@get:NotNull val gender: Gender,
14+
@get:NotBlank val nationality: String,
15+
@get:NotNull val birthYear: Short,
16+
@get:NotNull val deathYear: Short,
17+
@get:NotBlank val bio: String,
18+
@get:NotNull val era: Era,
19+
@get:NotNull val continent: Continent,
20+
)

โ€Žsrc/main/java/com/daramg/server/composer/presentation/ComposerController.javaโ€Ž

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.daramg.server.composer.application.ComposerService;
44
import com.daramg.server.composer.dto.ComposerCreateDto;
5+
import com.daramg.server.composer.dto.ComposerUpdateDto;
56
import com.daramg.server.composer.dto.ComposerLikeResponseDto;
67
import com.daramg.server.user.domain.User;
78
import jakarta.validation.Valid;
@@ -23,6 +24,12 @@ public void createComposer(@Valid @RequestBody ComposerCreateDto dto, User user)
2324
composerService.createComposer(dto, user);
2425
}
2526

27+
@PutMapping("/{composerId}")
28+
@ResponseStatus(HttpStatus.NO_CONTENT)
29+
public void updateComposer(@PathVariable Long composerId, @Valid @RequestBody ComposerUpdateDto dto, User user) {
30+
composerService.updateComposer(composerId, dto, user);
31+
}
32+
2633
@DeleteMapping("/{composerId}")
2734
@ResponseStatus(HttpStatus.NO_CONTENT)
2835
public void deleteComposer(@PathVariable Long composerId, User user) {

โ€Žsrc/test/java/com/daramg/server/composer/presentation/ComposerControllerTest.javaโ€Ž

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
2121
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
2222
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
23+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
2324
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
2425

2526
@WebMvcTest(controllers = ComposerController.class)
@@ -77,6 +78,60 @@ public class ComposerControllerTest extends ControllerTestSupport {
7778
));
7879
}
7980

81+
@Test
82+
void ์ž‘๊ณก๊ฐ€๋ฅผ_์ˆ˜์ •ํ•œ๋‹ค() throws Exception {
83+
// given
84+
Long composerId = 1L;
85+
Map<String, Object> requestBody = Map.of(
86+
"koreanName", "๋ฒ ํ† ๋ฒค",
87+
"englishName", "Ludwig van Beethoven",
88+
"gender", "MALE",
89+
"nationality", "๋…์ผ",
90+
"birthYear", 1770,
91+
"deathYear", 1827,
92+
"bio", "๋…์ผ์˜ ์ž‘๊ณก๊ฐ€",
93+
"era", "CLASSICAL",
94+
"continent", "EUROPE"
95+
);
96+
Cookie cookie = new Cookie(COOKIE_NAME, "access_token");
97+
98+
// when
99+
ResultActions result = mockMvc.perform(put("/composers/{composerId}", composerId)
100+
.contentType(MediaType.APPLICATION_JSON)
101+
.content(objectMapper.writeValueAsString(requestBody))
102+
.cookie(cookie)
103+
);
104+
105+
// then
106+
result.andExpect(status().isNoContent())
107+
.andDo(restDocsHandler.document(
108+
resource(ResourceSnippetParameters.builder()
109+
.tag("Composer API")
110+
.summary("์ž‘๊ณก๊ฐ€ ์ˆ˜์ •")
111+
.description("๊ด€๋ฆฌ์ž๊ฐ€ ์ž‘๊ณก๊ฐ€ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.")
112+
.pathParameters(
113+
parameterWithName("composerId").description("์ˆ˜์ •ํ•  ์ž‘๊ณก๊ฐ€ ID")
114+
)
115+
.requestFields(
116+
fieldWithPath("koreanName").type(JsonFieldType.STRING).description("ํ•œ๊ตญ์–ด ์ด๋ฆ„"),
117+
fieldWithPath("englishName").type(JsonFieldType.STRING).description("์˜์–ด ์ด๋ฆ„"),
118+
fieldWithPath("nativeName").type(JsonFieldType.STRING).description("์›์–ด ์ด๋ฆ„").optional(),
119+
fieldWithPath("gender").type(JsonFieldType.STRING).description("์„ฑ๋ณ„ (MALE / FEMALE / UNKNOWN)"),
120+
fieldWithPath("nationality").type(JsonFieldType.STRING).description("๊ตญ์ "),
121+
fieldWithPath("birthYear").type(JsonFieldType.NUMBER).description("์ถœ์ƒ ์—ฐ๋„"),
122+
fieldWithPath("deathYear").type(JsonFieldType.NUMBER).description("์‚ฌ๋ง ์—ฐ๋„"),
123+
fieldWithPath("bio").type(JsonFieldType.STRING).description("์†Œ๊ฐœ"),
124+
fieldWithPath("era").type(JsonFieldType.STRING).description("์‹œ๋Œ€ (MEDIEVAL_RENAISSANCE / BAROQUE / CLASSICAL / ROMANTIC / MODERN_CONTEMPORARY)"),
125+
fieldWithPath("continent").type(JsonFieldType.STRING).description("๋Œ€๋ฅ™ (ASIA / NORTH_AMERICA / EUROPE / SOUTH_AMERICA / AFRICA_OCEANIA)")
126+
)
127+
.build()
128+
),
129+
requestCookies(
130+
cookieWithName(COOKIE_NAME).description("์œ ์ €์˜ ํ† ํฐ")
131+
)
132+
));
133+
}
134+
80135
@Test
81136
void ์ž‘๊ณก๊ฐ€๋ฅผ_์‚ญ์ œํ•œ๋‹ค() throws Exception {
82137
// given

0 commit comments

Comments
ย (0)