Skip to content

Commit d41fa64

Browse files
authored
feat: 개발용 테스트 계정 생성 API 추가 (#177)
* feat: 개발용 테스트 계정 생성 API 추가 * ci(infra): dev 배포 환경변수에 테스트 계정 비밀번호 추가
1 parent 87265f9 commit d41fa64

7 files changed

Lines changed: 108 additions & 1 deletion

File tree

.github/workflows/deploy-to-dev-ec2.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ jobs:
148148
GOOGLE_GENAI_API_KEY="${{ secrets.GOOGLE_GENAI_API_KEY }}" \
149149
FIREBASE_ADMIN_KEY="${{ secrets.FIREBASE_ADMIN_KEY }}" \
150150
ADMIN_PAGE_PASSWORD="${{ secrets.ADMIN_PAGE_PASSWORD }}" \
151+
DEV_TEST_ACCOUNT_PASSWORD="${{ secrets.DEV_TEST_ACCOUNT_PASSWORD }}" \
151152
nohup java -jar "$JAR_PATH" \
152153
--spring.profiles.active=dev > app.log 2>&1 &
153154

src/main/java/com/devkor/ifive/nadab/domain/test/api/TestController.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.devkor.ifive.nadab.domain.test.api;
22

33
import com.devkor.ifive.nadab.domain.dailyreport.api.dto.response.DailyReportResponse;
4+
import com.devkor.ifive.nadab.domain.test.api.dto.request.CreateTestUserRequest;
45
import com.devkor.ifive.nadab.domain.test.api.dto.request.PromptTestDailyReportRequest;
56
import com.devkor.ifive.nadab.domain.test.api.dto.request.TestDailyReportRequest;
67
import com.devkor.ifive.nadab.domain.dailyreport.api.dto.response.CreateDailyReportResponse;
8+
import com.devkor.ifive.nadab.domain.test.api.dto.response.CreateTestUserResponse;
79
import com.devkor.ifive.nadab.domain.test.api.dto.response.TestDailyReportResponse;
810
import com.devkor.ifive.nadab.domain.test.application.TestReportService;
11+
import com.devkor.ifive.nadab.domain.test.application.TestUserService;
912
import com.devkor.ifive.nadab.global.core.response.ApiResponseDto;
1013
import com.devkor.ifive.nadab.global.core.response.ApiResponseEntity;
1114
import com.devkor.ifive.nadab.global.security.principal.UserPrincipal;
@@ -33,6 +36,17 @@
3336
public class TestController {
3437

3538
private final TestReportService testReportService;
39+
private final TestUserService testUserService;
40+
41+
@Hidden
42+
@PostMapping("/users")
43+
@PermitAll
44+
public ResponseEntity<ApiResponseDto<CreateTestUserResponse>> createTestUser(
45+
@Valid @RequestBody CreateTestUserRequest request
46+
) {
47+
CreateTestUserResponse response = testUserService.createTestUser(request);
48+
return ApiResponseEntity.ok(response);
49+
}
3650

3751
@PostMapping("/generate/daily-report")
3852
@PermitAll
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.devkor.ifive.nadab.domain.test.api.dto.request;
2+
3+
import jakarta.validation.constraints.Email;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.Size;
6+
7+
public record CreateTestUserRequest(
8+
@NotBlank(message = "email is required")
9+
@Email(message = "email format is invalid")
10+
String email,
11+
12+
@NotBlank(message = "nickname is required")
13+
@Size(min = 2, max = 10, message = "nickname must be between 2 and 10 characters")
14+
String nickname
15+
) {
16+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.devkor.ifive.nadab.domain.test.api.dto.response;
2+
3+
public record CreateTestUserResponse(
4+
Long userId,
5+
String email,
6+
String nickname,
7+
String signupStatus
8+
) {
9+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.devkor.ifive.nadab.domain.test.application;
2+
3+
import com.devkor.ifive.nadab.domain.terms.application.TermsCommandService;
4+
import com.devkor.ifive.nadab.domain.test.api.dto.request.CreateTestUserRequest;
5+
import com.devkor.ifive.nadab.domain.test.api.dto.response.CreateTestUserResponse;
6+
import com.devkor.ifive.nadab.domain.user.core.entity.SignupStatusType;
7+
import com.devkor.ifive.nadab.domain.user.core.entity.User;
8+
import com.devkor.ifive.nadab.domain.user.core.repository.UserRepository;
9+
import com.devkor.ifive.nadab.domain.user.core.service.UserProfileUpdateService;
10+
import com.devkor.ifive.nadab.domain.wallet.core.entity.UserWallet;
11+
import com.devkor.ifive.nadab.domain.wallet.core.repository.UserWalletRepository;
12+
import com.devkor.ifive.nadab.global.core.response.ErrorCode;
13+
import com.devkor.ifive.nadab.global.exception.BadRequestException;
14+
import com.devkor.ifive.nadab.global.exception.ConflictException;
15+
import lombok.RequiredArgsConstructor;
16+
import org.springframework.beans.factory.annotation.Value;
17+
import org.springframework.context.annotation.Profile;
18+
import org.springframework.security.crypto.password.PasswordEncoder;
19+
import org.springframework.stereotype.Service;
20+
import org.springframework.transaction.annotation.Transactional;
21+
22+
@Profile({"local", "dev"})
23+
@Service
24+
@Transactional
25+
@RequiredArgsConstructor
26+
public class TestUserService {
27+
28+
private final UserRepository userRepository;
29+
private final UserWalletRepository userWalletRepository;
30+
private final UserProfileUpdateService userProfileUpdateService;
31+
private final TermsCommandService termsCommandService;
32+
private final PasswordEncoder passwordEncoder;
33+
34+
@Value("${test.account.password:}")
35+
private String testUserPassword;
36+
37+
public CreateTestUserResponse createTestUser(CreateTestUserRequest request) {
38+
if (testUserPassword == null || testUserPassword.isBlank()) {
39+
throw new BadRequestException(ErrorCode.TEST_USER_PASSWORD_NOT_CONFIGURED);
40+
}
41+
if (userRepository.existsByEmail(request.email())) {
42+
throw new ConflictException(ErrorCode.EMAIL_ALREADY_EXISTS);
43+
}
44+
45+
String passwordHash = passwordEncoder.encode(testUserPassword);
46+
User user = User.createUser(request.email(), passwordHash);
47+
userRepository.save(user);
48+
49+
userProfileUpdateService.updateNickname(user, request.nickname());
50+
user.updateSignupStatus(SignupStatusType.COMPLETED);
51+
52+
userWalletRepository.save(UserWallet.create(user));
53+
termsCommandService.saveConsents(user.getId(), true, true, true, false);
54+
55+
return new CreateTestUserResponse(
56+
user.getId(),
57+
user.getEmail(),
58+
user.getNickname(),
59+
user.getSignupStatus().name()
60+
);
61+
}
62+
}

src/main/java/com/devkor/ifive/nadab/global/core/response/ErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public enum ErrorCode {
1414
USER_NOT_FOUND(HttpStatus.NOT_FOUND, "사용자를 찾을 수 없습니다"),
1515
EMAIL_ALREADY_EXISTS(HttpStatus.CONFLICT, "이미 사용 중인 이메일입니다"),
1616
FILE_STORAGE_NOT_FOUND(HttpStatus.NOT_FOUND, "스토리지에서 해당 파일을 찾을 수 없습니다"), // S3 등 스토리지에 실제 파일 객체가 없는 경우
17+
TEST_USER_PASSWORD_NOT_CONFIGURED(HttpStatus.BAD_REQUEST, "테스트 계정 비밀번호가 설정되지 않았습니다"),
1718

1819
// ==================== AUTH (인증) ====================
1920
// 400 Bad Request

src/main/resources/application-dev.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ profile-image:
4848
env: dev
4949
base-url: ${PROFILE_IMAGE_BASE_URL}
5050

51+
test:
52+
account:
53+
password: ${DEV_TEST_ACCOUNT_PASSWORD:}
54+
5155
app:
5256
cookie:
5357
secure: true
@@ -60,4 +64,4 @@ cors:
6064
- ${FRONTEND_DEV_URL}
6165
- ${FRONTEND_DEV_URL_2}
6266
- ${SWAGGER_ORIGIN_PUBLIC_IP}
63-
- ${SWAGGER_ORIGIN_DOMAIN}
67+
- ${SWAGGER_ORIGIN_DOMAIN}

0 commit comments

Comments
 (0)