Skip to content

Commit

Permalink
✨ Feature: 일기 생성 테스트 케이스 작성 및 유효성 검사 추가 (#51)
Browse files Browse the repository at this point in the history
* ✅ Test: DiaryCommandServiceTest 작성

* ✨ Feature: DiaryCommandService 유효성 검사 추가

* ♻️ Refactor: 패키지 구조 통일

* ✅ Test: DiaryControllerTest 작성

* ✨ Feature: DiaryCreateRequest 유효성 검사 추가

* 💡 Update: SpringEnvironmentHelper 주석 해제
  • Loading branch information
ahnsugyeong authored Apr 23, 2024
1 parent 09e027d commit aa01001
Show file tree
Hide file tree
Showing 62 changed files with 390 additions and 140 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ out/
/.nb-gradle/

### QueryDSL ###
/src/main/generated/
moodoodle-domain/src/main/generated/

### submodule ###
moodoodle-api/src/main/resources/*.yml
Expand Down
1 change: 1 addition & 0 deletions moodoodle-api/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ dependencies {
// test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.security:spring-security-test'

// validation
implementation 'org.springframework.boot:spring-boot-starter-validation'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
package zzangdol.moodoodleapi;
package zzangdol;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;
import zzangdol.config.DomainConfig;
import zzangdol.config.InfrastructureConfig;
import zzangdol.feign.config.FeignConfig;

@Import({DomainConfig.class, InfrastructureConfig.class, FeignConfig.class})
@SpringBootApplication
public class MoodoodleApiApplication {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package zzangdol.moodoodleapi.auth.business;
package zzangdol.auth.business;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import zzangdol.moodoodleapi.auth.implement.AuthService;
import zzangdol.moodoodleapi.auth.implement.EmailVerificationTokenService;
import zzangdol.moodoodleapi.auth.implement.VerificationCodeService;
import zzangdol.moodoodleapi.auth.presentation.dto.request.EmailVerificationRequest;
import zzangdol.moodoodleapi.auth.presentation.dto.request.SignInRequest;
import zzangdol.moodoodleapi.auth.presentation.dto.request.SignUpRequest;
import zzangdol.moodoodleapi.auth.presentation.dto.response.EmailVerificationTokenResponse;
import zzangdol.moodoodleapi.jwt.JwtResponse;
import zzangdol.moodoodleapi.jwt.JwtService;
import zzangdol.auth.implement.AuthService;
import zzangdol.auth.implement.EmailVerificationTokenService;
import zzangdol.auth.implement.VerificationCodeService;
import zzangdol.auth.presentation.dto.request.EmailVerificationRequest;
import zzangdol.auth.presentation.dto.request.SignInRequest;
import zzangdol.auth.presentation.dto.request.SignUpRequest;
import zzangdol.auth.presentation.dto.response.EmailVerificationTokenResponse;
import zzangdol.jwt.JwtResponse;
import zzangdol.jwt.JwtService;
import zzangdol.moodoodlecommon.exception.custom.UserCredentialsException;
import zzangdol.moodoodlecommon.response.status.ErrorStatus;
import zzangdol.response.status.ErrorStatus;
import zzangdol.ses.service.AwsSesService;
import zzangdol.user.domain.User;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package zzangdol.moodoodleapi.auth.implement;
package zzangdol.auth.implement;

import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import zzangdol.moodoodleapi.auth.presentation.dto.request.SignInRequest;
import zzangdol.moodoodleapi.auth.presentation.dto.request.SignUpRequest;
import zzangdol.moodoodleapi.jwt.JwtResponse;
import zzangdol.moodoodleapi.jwt.JwtService;
import zzangdol.auth.presentation.dto.request.SignInRequest;
import zzangdol.auth.presentation.dto.request.SignUpRequest;
import zzangdol.jwt.JwtResponse;
import zzangdol.jwt.JwtService;
import zzangdol.moodoodlecommon.exception.custom.UserCredentialsException;
import zzangdol.moodoodlecommon.response.status.ErrorStatus;
import zzangdol.response.status.ErrorStatus;
import zzangdol.user.dao.UserRepository;
import zzangdol.user.domain.AuthProvider;
import zzangdol.user.domain.Role;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package zzangdol.moodoodleapi.auth.implement;
package zzangdol.auth.implement;

import java.security.SecureRandom;
import java.util.Base64;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import zzangdol.moodoodleapi.auth.presentation.dto.response.EmailVerificationTokenResponse;
import zzangdol.auth.presentation.dto.response.EmailVerificationTokenResponse;
import zzangdol.moodoodlecommon.exception.custom.InvalidTokenException;
import zzangdol.redis.dao.EmailVerificationTokenRepository;
import zzangdol.redis.domain.EmailVerificationToken;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package zzangdol.moodoodleapi.auth.implement;
package zzangdol.auth.implement;

import java.util.concurrent.ThreadLocalRandom;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import zzangdol.moodoodlecommon.exception.custom.VerificationCodeException;
import zzangdol.moodoodlecommon.response.status.ErrorStatus;
import zzangdol.response.status.ErrorStatus;
import zzangdol.redis.dao.VerificationCodeRepository;
import zzangdol.redis.domain.VerificationCode;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.auth.presentation;
package zzangdol.auth.presentation;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
Expand All @@ -11,15 +11,15 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import zzangdol.moodoodleapi.auth.business.AuthFacade;
import zzangdol.moodoodleapi.auth.presentation.dto.request.EmailVerificationRequest;
import zzangdol.moodoodleapi.auth.presentation.dto.request.SignInRequest;
import zzangdol.moodoodleapi.auth.presentation.dto.request.SignUpRequest;
import zzangdol.moodoodleapi.auth.presentation.dto.response.EmailVerificationTokenResponse;
import zzangdol.moodoodleapi.global.annotation.ApiErrorCodeExample;
import zzangdol.moodoodleapi.jwt.JwtResponse;
import zzangdol.moodoodlecommon.response.ResponseDto;
import zzangdol.moodoodlecommon.response.status.ErrorStatus;
import zzangdol.auth.business.AuthFacade;
import zzangdol.auth.presentation.dto.request.EmailVerificationRequest;
import zzangdol.auth.presentation.dto.request.SignInRequest;
import zzangdol.auth.presentation.dto.request.SignUpRequest;
import zzangdol.auth.presentation.dto.response.EmailVerificationTokenResponse;
import zzangdol.global.annotation.ApiErrorCodeExample;
import zzangdol.jwt.JwtResponse;
import zzangdol.response.ResponseDto;
import zzangdol.response.status.ErrorStatus;

@RequiredArgsConstructor
@ApiResponse(responseCode = "2000", description = "성공")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.auth.presentation.dto.request;
package zzangdol.auth.presentation.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.auth.presentation.dto.request;
package zzangdol.auth.presentation.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.auth.presentation.dto.request;
package zzangdol.auth.presentation.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import java.time.LocalTime;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.auth.presentation.dto.response;
package zzangdol.auth.presentation.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package zzangdol.moodoodleapi.diary.business;
package zzangdol.diary.business;

import java.util.ArrayList;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import zzangdol.emotion.domain.Emotion;
import zzangdol.moodoodleapi.diary.implement.DiaryCommandService;
import zzangdol.moodoodleapi.diary.implement.DiaryQueryService;
import zzangdol.moodoodleapi.diary.implement.ImageColorAnalyzer;
import zzangdol.moodoodleapi.diary.presentation.dto.request.DiaryCreateRequest;
import zzangdol.moodoodleapi.diary.presentation.dto.request.DiaryUpdateRequest;
import zzangdol.moodoodleapi.diary.presentation.dto.response.DiaryListResponse;
import zzangdol.moodoodleapi.diary.presentation.dto.response.DiaryResponse;
import zzangdol.diary.implement.DiaryCommandService;
import zzangdol.diary.implement.DiaryQueryService;
import zzangdol.diary.implement.ImageColorAnalyzer;
import zzangdol.diary.presentation.dto.request.DiaryCreateRequest;
import zzangdol.diary.presentation.dto.request.DiaryUpdateRequest;
import zzangdol.diary.presentation.dto.response.DiaryListResponse;
import zzangdol.diary.presentation.dto.response.DiaryResponse;
import zzangdol.user.domain.User;

@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package zzangdol.moodoodleapi.diary.business;
package zzangdol.diary.business;

import java.util.List;
import java.util.stream.Collectors;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import zzangdol.diary.domain.Diary;
import zzangdol.moodoodleapi.diary.presentation.dto.response.DiaryListResponse;
import zzangdol.moodoodleapi.diary.presentation.dto.response.DiaryResponse;
import zzangdol.diary.presentation.dto.response.DiaryListResponse;
import zzangdol.diary.presentation.dto.response.DiaryResponse;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DiaryMapper {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package zzangdol.moodoodleapi.diary.implement;
package zzangdol.diary.implement;

import java.util.List;
import zzangdol.diary.domain.Diary;
import zzangdol.emotion.domain.Emotion;
import zzangdol.moodoodleapi.diary.presentation.dto.request.DiaryCreateRequest;
import zzangdol.moodoodleapi.diary.presentation.dto.request.DiaryUpdateRequest;
import zzangdol.diary.presentation.dto.request.DiaryCreateRequest;
import zzangdol.diary.presentation.dto.request.DiaryUpdateRequest;
import zzangdol.user.domain.User;

public interface DiaryCommandService {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package zzangdol.moodoodleapi.diary.implement;
package zzangdol.diary.implement;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -9,8 +11,10 @@
import zzangdol.diary.domain.DiaryEmotion;
import zzangdol.diary.domain.Painting;
import zzangdol.emotion.domain.Emotion;
import zzangdol.moodoodleapi.diary.presentation.dto.request.DiaryCreateRequest;
import zzangdol.moodoodleapi.diary.presentation.dto.request.DiaryUpdateRequest;
import zzangdol.diary.presentation.dto.request.DiaryCreateRequest;
import zzangdol.diary.presentation.dto.request.DiaryUpdateRequest;
import zzangdol.moodoodlecommon.exception.custom.DiaryDateOutOfBoundsException;
import zzangdol.moodoodlecommon.exception.custom.DiaryDuplicateDateException;
import zzangdol.moodoodlecommon.exception.custom.DiaryNotFoundException;
import zzangdol.user.domain.User;

Expand All @@ -24,11 +28,25 @@ public class DiaryCommandServiceImpl implements DiaryCommandService {
@Override
public Diary createDiary(User user, DiaryCreateRequest request, String color,
List<Emotion> emotions) {
validateDiaryDate(request.getDate());
checkDiaryDuplication(user, request.getDate());
Painting painting = buildPainting(request, color);
Diary diary = buildDiary(user, request, emotions, painting);
return diaryRepository.save(diary);
}

private void checkDiaryDuplication(User user, LocalDateTime date) {
if (diaryRepository.existsByDateAndUserId(date, user.getId())) {
throw DiaryDuplicateDateException.EXCEPTION;
}
}

private void validateDiaryDate(LocalDateTime date) {
if (date.toLocalDate().isAfter(LocalDate.now())) {
throw DiaryDateOutOfBoundsException.EXCEPTION;
}
}

private Diary buildDiary(User user, DiaryCreateRequest request, List<Emotion> emotions, Painting painting) {
Diary diary = Diary.builder()
.date(request.getDate())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.diary.implement;
package zzangdol.diary.implement;

import java.util.List;
import zzangdol.diary.domain.Diary;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.diary.implement;
package zzangdol.diary.implement;

import java.util.List;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.diary.implement;
package zzangdol.diary.implement;

import java.awt.image.BufferedImage;
import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package zzangdol.moodoodleapi.diary.presentation;
package zzangdol.diary.presentation;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -13,15 +14,15 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import zzangdol.moodoodleapi.diary.business.DiaryFacade;
import zzangdol.moodoodleapi.diary.presentation.dto.request.DiaryCreateRequest;
import zzangdol.moodoodleapi.diary.presentation.dto.request.DiaryUpdateRequest;
import zzangdol.moodoodleapi.diary.presentation.dto.response.DiaryResponse;
import zzangdol.moodoodleapi.diary.presentation.dto.response.DiaryListResponse;
import zzangdol.moodoodleapi.global.annotation.ApiErrorCodeExample;
import zzangdol.moodoodleapi.global.annotation.AuthUser;
import zzangdol.moodoodlecommon.response.ResponseDto;
import zzangdol.moodoodlecommon.response.status.ErrorStatus;
import zzangdol.diary.business.DiaryFacade;
import zzangdol.diary.presentation.dto.request.DiaryCreateRequest;
import zzangdol.diary.presentation.dto.request.DiaryUpdateRequest;
import zzangdol.diary.presentation.dto.response.DiaryResponse;
import zzangdol.diary.presentation.dto.response.DiaryListResponse;
import zzangdol.global.annotation.ApiErrorCodeExample;
import zzangdol.global.annotation.AuthUser;
import zzangdol.response.ResponseDto;
import zzangdol.response.status.ErrorStatus;
import zzangdol.user.domain.User;

@RequiredArgsConstructor
Expand All @@ -41,8 +42,9 @@ public class DiaryController {
description = "새로운 일기를 생성합니다."
)
@PostMapping
public ResponseDto<Long> createDiary(@AuthUser User user, @RequestBody DiaryCreateRequest request) {
return ResponseDto.onSuccess(diaryFacade.createDiary(user, request));
public ResponseDto<Long> createDiary(@AuthUser User user, @Valid @RequestBody DiaryCreateRequest request) {
Long diary = diaryFacade.createDiary(user, request);
return ResponseDto.onSuccess(diary);
}

@ApiErrorCodeExample({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package zzangdol.moodoodleapi.diary.presentation.dto.request;
package zzangdol.diary.presentation.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand All @@ -13,10 +15,12 @@
@AllArgsConstructor
public class DiaryCreateRequest {

@Schema(example = "2024-04-21T21:10")
@Schema(example = "2024-04-21T21:10", type = "string")
@NotNull(message = "date는 필수값입니다.")
private LocalDateTime date;

@Schema(example = "오늘은 오랜만에 친구들과 놀이공원에 다녀왔다. 정말 신나는 하루였다. 집에 돌아오는 길에는 조금 허전하고 아쉬운 마음도 들었지만, 오늘 하루 친구들과 함께 할 수 있어서 정말 행복했다.")
@NotEmpty(message = "content는 필수값입니다.")
private String content;

@Schema(example = "https://github.com/ahnsugyeong/ahnsugyeong/assets/88311377/5913c88f-ecde-495c-8c36-71a43e1c8a8d")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.diary.presentation.dto.request;
package zzangdol.diary.presentation.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import java.time.LocalDateTime;
Expand All @@ -13,7 +13,7 @@
@AllArgsConstructor
public class DiaryUpdateRequest {

@Schema(example = "2024-04-20T21:10")
@Schema(example = "2024-04-20T21:10", type = "string")
private LocalDateTime date;

@Schema(example = "오늘은 오랜만에 친구들과 놀이공원에 다녀왔다. 츄러스도 먹고 정말 신나는 하루였다. 집에 돌아오는 길에는 조금 허전하고 아쉬운 마음도 들었지만, 오늘 하루 친구들과 함께 할 수 있어서 정말 행복했다.")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.diary.presentation.dto.response;
package zzangdol.diary.presentation.dto.response;

import java.util.List;
import lombok.AllArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zzangdol.moodoodleapi.diary.presentation.dto.response;
package zzangdol.diary.presentation.dto.response;

import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package zzangdol.moodoodleapi.global;
package zzangdol.global;

import io.swagger.v3.oas.annotations.Hidden;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import zzangdol.moodoodlecommon.response.ResponseDto;
import zzangdol.response.ResponseDto;

@Hidden
@RestController
Expand Down
Loading

0 comments on commit aa01001

Please sign in to comment.