diff --git a/src/main/java/com/daramg/server/auth/config/SecurityConfig.java b/src/main/java/com/daramg/server/auth/config/SecurityConfig.java
index 269b065..8d5db56 100644
--- a/src/main/java/com/daramg/server/auth/config/SecurityConfig.java
+++ b/src/main/java/com/daramg/server/auth/config/SecurityConfig.java
@@ -48,7 +48,7 @@ SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.requestMatchers("/auth/signup").permitAll()
.requestMatchers("/auth/login").permitAll()
.requestMatchers(HttpMethod.PUT, "/auth/password-reset").permitAll()
- .requestMatchers("/composers").permitAll()
+ .requestMatchers(HttpMethod.GET, "/composers").permitAll()
.requestMatchers(HttpMethod.GET, "/posts/**").permitAll()
.requestMatchers("/users/check-nickname").permitAll()
.requestMatchers("/composers/{composerId}/posts").permitAll()
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 56aa7e6..1be6ca9 100644
--- a/src/main/java/com/daramg/server/composer/application/ComposerService.java
+++ b/src/main/java/com/daramg/server/composer/application/ComposerService.java
@@ -1,10 +1,14 @@
package com.daramg.server.composer.application;
import com.daramg.server.common.application.EntityUtils;
+import com.daramg.server.common.exception.BusinessException;
+import com.daramg.server.common.exception.CommonErrorStatus;
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.ComposerLikeResponseDto;
import com.daramg.server.composer.repository.ComposerLikeRepository;
+import com.daramg.server.composer.repository.ComposerRepository;
import com.daramg.server.user.domain.User;
import lombok.RequiredArgsConstructor;
import org.springframework.dao.DataIntegrityViolationException;
@@ -16,8 +20,29 @@
public class ComposerService {
private final ComposerLikeRepository composerLikeRepository;
+ private final ComposerRepository composerRepository;
private final EntityUtils entityUtils;
+ @Transactional
+ public void createComposer(ComposerCreateDto dto, User user) {
+ if (user.getId() != 1L) {
+ throw new BusinessException(CommonErrorStatus.FORBIDDEN);
+ }
+ Composer composer = Composer.builder()
+ .koreanName(dto.getKoreanName())
+ .englishName(dto.getEnglishName())
+ .nativeName(dto.getNativeName())
+ .gender(dto.getGender())
+ .nationality(dto.getNationality())
+ .birthYear(dto.getBirthYear())
+ .deathYear(dto.getDeathYear())
+ .bio(dto.getBio())
+ .era(dto.getEra())
+ .continent(dto.getContinent())
+ .build();
+ composerRepository.save(composer);
+ }
+
/**
* 작곡가 좋아요 상태를 토글(Toggle)합니다.
*
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 8f98436..62f48f5 100644
--- a/src/main/java/com/daramg/server/composer/domain/Composer.java
+++ b/src/main/java/com/daramg/server/composer/domain/Composer.java
@@ -50,7 +50,7 @@ public class Composer extends BaseEntity {
@Builder
private Composer(@NonNull String koreanName, @NonNull String englishName,
String nativeName, @NonNull Gender gender, String nationality,
- Short birthYear, Short deathYear, Era era, Continent continent) {
+ Short birthYear, Short deathYear, String bio, Era era, Continent continent) {
this.koreanName = koreanName;
this.englishName = englishName;
this.nativeName = nativeName;
@@ -58,6 +58,7 @@ private Composer(@NonNull String koreanName, @NonNull String englishName,
this.nationality = nationality;
this.birthYear = birthYear;
this.deathYear = deathYear;
+ this.bio = bio;
this.era = era;
this.continent = continent;
}
diff --git a/src/main/java/com/daramg/server/composer/dto/ComposerCreateDto.kt b/src/main/java/com/daramg/server/composer/dto/ComposerCreateDto.kt
new file mode 100644
index 0000000..c2679b8
--- /dev/null
+++ b/src/main/java/com/daramg/server/composer/dto/ComposerCreateDto.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 ComposerCreateDto(
+ @get:NotBlank val koreanName: String,
+ @get:NotBlank val englishName: String,
+ val nativeName: String? = null,
+ @get:NotNull val gender: Gender,
+ val nationality: String? = null,
+ val birthYear: Short? = null,
+ val deathYear: Short? = null,
+ val bio: String? = null,
+ val era: Era? = null,
+ val continent: Continent? = null,
+)
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 f58e461..4fecdb8 100644
--- a/src/main/java/com/daramg/server/composer/presentation/ComposerController.java
+++ b/src/main/java/com/daramg/server/composer/presentation/ComposerController.java
@@ -1,14 +1,14 @@
package com.daramg.server.composer.presentation;
import com.daramg.server.composer.application.ComposerService;
+import com.daramg.server.composer.dto.ComposerCreateDto;
import com.daramg.server.composer.dto.ComposerLikeResponseDto;
import com.daramg.server.user.domain.User;
+import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
@RestController
@RequiredArgsConstructor
@@ -17,6 +17,12 @@ public class ComposerController {
private final ComposerService composerService;
+ @PostMapping
+ @ResponseStatus(HttpStatus.CREATED)
+ public void createComposer(@Valid @RequestBody ComposerCreateDto dto, User user) {
+ composerService.createComposer(dto, user);
+ }
+
@PostMapping("/{composerId}/like")
public ResponseEntity toggleComposerLike(@PathVariable Long composerId, User user) {
ComposerLikeResponseDto response = composerService.toggleLike(composerId, user);