diff --git a/src/main/java/com/petlog/diary/controller/DiaryController.java b/src/main/java/com/petlog/diary/controller/DiaryController.java index 591c1de..73c76da 100644 --- a/src/main/java/com/petlog/diary/controller/DiaryController.java +++ b/src/main/java/com/petlog/diary/controller/DiaryController.java @@ -1,10 +1,13 @@ package com.petlog.diary.controller; +import com.petlog.auth.resolver.Authenticated; import com.petlog.common.response.ApiResponse; import com.petlog.diary.controller.dto.request.CreateDiaryRequestDto; import com.petlog.diary.controller.dto.request.UpdateDiaryRequestDto; import com.petlog.diary.controller.dto.response.GetAllDiaryResponseDto; import com.petlog.diary.controller.dto.response.GetDiaryResponseDto; +import com.petlog.diary.service.DiaryService; +import com.petlog.diary.service.dto.CreateDiaryDto; import com.petlog.diary.service.dto.GetDailyDiaryDto; import com.petlog.diary.service.dto.GetDiaryInfoDto; import com.petlog.docs.DiaryControllerDocs; @@ -33,11 +36,22 @@ @RestController public class DiaryController implements DiaryControllerDocs { + private final DiaryService diaryService; + @PostMapping public ResponseEntity> createDiary( + @Authenticated final Long memberId, @PathVariable final Long groupId, @RequestBody final CreateDiaryRequestDto request ) { + final CreateDiaryDto dto = new CreateDiaryDto( + request.title(), + request.content(), + request.images(), + request.writtenAt() + ); + diaryService.createDiary(memberId, groupId, dto); + return ResponseEntity.ok( ApiResponse.success(CREATE_DIARY) ); diff --git a/src/main/java/com/petlog/diary/controller/dto/request/CreateDiaryRequestDto.java b/src/main/java/com/petlog/diary/controller/dto/request/CreateDiaryRequestDto.java index 4447b52..4796f19 100644 --- a/src/main/java/com/petlog/diary/controller/dto/request/CreateDiaryRequestDto.java +++ b/src/main/java/com/petlog/diary/controller/dto/request/CreateDiaryRequestDto.java @@ -1,6 +1,8 @@ package com.petlog.diary.controller.dto.request; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; import java.util.List; @@ -16,6 +18,8 @@ public record CreateDiaryRequestDto( @Schema(description = "0~6장") List images, + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd") + @DateTimeFormat(pattern = "yyyy.MM.dd") LocalDate writtenAt ) { diff --git a/src/main/java/com/petlog/diary/service/DiaryService.java b/src/main/java/com/petlog/diary/service/DiaryService.java new file mode 100644 index 0000000..b6ab88f --- /dev/null +++ b/src/main/java/com/petlog/diary/service/DiaryService.java @@ -0,0 +1,65 @@ +package com.petlog.diary.service; + +import com.petlog.diary.entity.Diary; +import com.petlog.diary.entity.DiaryImage; +import com.petlog.diary.repository.DiaryImageRepository; +import com.petlog.diary.repository.DiaryRepository; +import com.petlog.diary.service.dto.CreateDiaryDto; +import com.petlog.member.entity.Member; +import com.petlog.member.repository.MemberRepository; +import com.petlog.petgroup.entity.PetGroup; +import com.petlog.petgroup.entity.PetGroupMember; +import com.petlog.petgroup.repository.PetGroupMemberRepository; +import com.petlog.petgroup.repository.PetGroupRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@RequiredArgsConstructor +@Service +public class DiaryService { + + private final DiaryRepository diaryRepository; + private final DiaryImageRepository diaryImageRepository; + private final MemberRepository memberRepository; + private final PetGroupRepository petGroupRepository; + private final PetGroupMemberRepository petGroupMemberRepository; + + @Transactional + public void createDiary(final Long memberId, final Long groupId, final CreateDiaryDto dto) { + final Member member = getMember(memberId); + final PetGroup petGroup = getPetGroup(groupId); + getPetGroupMember(member, petGroup); + + final Diary diary = new Diary( + petGroup, + member, + dto.title(), + dto.content(), + dto.writtenAt() + ); + diaryRepository.save(diary); + + final List images = dto.images().stream() + .map(img -> new DiaryImage(diary, img)) + .toList(); + diaryImageRepository.saveAll(images); + } + + private Member getMember(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 회원입니다.")); + } + + private PetGroup getPetGroup(final Long groupId) { + return petGroupRepository.findById(groupId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 그룹입니다.")); + } + + private PetGroupMember getPetGroupMember(final Member member, final PetGroup petGroup) { + return petGroupMemberRepository.findByMemberAndPetGroup(member, petGroup) + .orElseThrow(() -> new IllegalArgumentException("그룹에 존재하지 않는 회원입니다.")); + } +} diff --git a/src/main/java/com/petlog/diary/service/dto/CreateDiaryDto.java b/src/main/java/com/petlog/diary/service/dto/CreateDiaryDto.java new file mode 100644 index 0000000..18a88e9 --- /dev/null +++ b/src/main/java/com/petlog/diary/service/dto/CreateDiaryDto.java @@ -0,0 +1,14 @@ +package com.petlog.diary.service.dto; + +import java.time.LocalDate; +import java.util.List; + +public record CreateDiaryDto( + + String title, + String content, + List images, + LocalDate writtenAt + +) { +} diff --git a/src/main/java/com/petlog/docs/DiaryControllerDocs.java b/src/main/java/com/petlog/docs/DiaryControllerDocs.java index 241ac5d..c054676 100644 --- a/src/main/java/com/petlog/docs/DiaryControllerDocs.java +++ b/src/main/java/com/petlog/docs/DiaryControllerDocs.java @@ -1,5 +1,6 @@ package com.petlog.docs; +import com.petlog.auth.resolver.Authenticated; import com.petlog.common.response.ApiResponse; import com.petlog.diary.controller.dto.request.CreateDiaryRequestDto; import com.petlog.diary.controller.dto.request.UpdateDiaryRequestDto; @@ -16,7 +17,7 @@ public interface DiaryControllerDocs { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "일기 생성에 성공하였습니다.") @Operation(summary = "일기 생성 API") - ResponseEntity> createDiary(@PathVariable final Long groupId, @RequestBody final CreateDiaryRequestDto request); + ResponseEntity> createDiary(@Authenticated final Long memberId, @PathVariable final Long groupId, @RequestBody final CreateDiaryRequestDto request); @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "일기 전체 조회에 성공하였습니다.") @Operation(summary = "일기 전체 조회 API")