Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/deploy-to-dev-ec2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ jobs:
GOOGLE_GENAI_API_KEY="${{ secrets.GOOGLE_GENAI_API_KEY }}" \
FIREBASE_ADMIN_KEY="${{ secrets.FIREBASE_ADMIN_KEY }}" \
ADMIN_PAGE_PASSWORD="${{ secrets.ADMIN_PAGE_PASSWORD }}" \
DEV_TEST_ACCOUNT_PASSWORD="${{ secrets.DEV_TEST_ACCOUNT_PASSWORD }}" \
nohup java -jar "$JAR_PATH" \
--spring.profiles.active=dev > app.log 2>&1 &

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.devkor.ifive.nadab.domain.test.api;

import com.devkor.ifive.nadab.domain.dailyreport.api.dto.response.DailyReportResponse;
import com.devkor.ifive.nadab.domain.test.api.dto.request.CreateTestUserRequest;
import com.devkor.ifive.nadab.domain.test.api.dto.request.PromptTestDailyReportRequest;
import com.devkor.ifive.nadab.domain.test.api.dto.request.TestDailyReportRequest;
import com.devkor.ifive.nadab.domain.dailyreport.api.dto.response.CreateDailyReportResponse;
import com.devkor.ifive.nadab.domain.test.api.dto.response.CreateTestUserResponse;
import com.devkor.ifive.nadab.domain.test.api.dto.response.TestDailyReportResponse;
import com.devkor.ifive.nadab.domain.test.application.TestReportService;
import com.devkor.ifive.nadab.domain.test.application.TestUserService;
import com.devkor.ifive.nadab.global.core.response.ApiResponseDto;
import com.devkor.ifive.nadab.global.core.response.ApiResponseEntity;
import com.devkor.ifive.nadab.global.security.principal.UserPrincipal;
Expand Down Expand Up @@ -33,6 +36,17 @@
public class TestController {

private final TestReportService testReportService;
private final TestUserService testUserService;

@Hidden
@PostMapping("/users")
@PermitAll
public ResponseEntity<ApiResponseDto<CreateTestUserResponse>> createTestUser(
@Valid @RequestBody CreateTestUserRequest request
) {
CreateTestUserResponse response = testUserService.createTestUser(request);
return ApiResponseEntity.ok(response);
}

@PostMapping("/generate/daily-report")
@PermitAll
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.devkor.ifive.nadab.domain.test.api.dto.request;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

public record CreateTestUserRequest(
@NotBlank(message = "email is required")
@Email(message = "email format is invalid")
String email,

@NotBlank(message = "nickname is required")
@Size(min = 2, max = 10, message = "nickname must be between 2 and 10 characters")
String nickname
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.devkor.ifive.nadab.domain.test.api.dto.response;

public record CreateTestUserResponse(
Long userId,
String email,
String nickname,
String signupStatus
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.devkor.ifive.nadab.domain.test.application;

import com.devkor.ifive.nadab.domain.terms.application.TermsCommandService;
import com.devkor.ifive.nadab.domain.test.api.dto.request.CreateTestUserRequest;
import com.devkor.ifive.nadab.domain.test.api.dto.response.CreateTestUserResponse;
import com.devkor.ifive.nadab.domain.user.core.entity.SignupStatusType;
import com.devkor.ifive.nadab.domain.user.core.entity.User;
import com.devkor.ifive.nadab.domain.user.core.repository.UserRepository;
import com.devkor.ifive.nadab.domain.user.core.service.UserProfileUpdateService;
import com.devkor.ifive.nadab.domain.wallet.core.entity.UserWallet;
import com.devkor.ifive.nadab.domain.wallet.core.repository.UserWalletRepository;
import com.devkor.ifive.nadab.global.core.response.ErrorCode;
import com.devkor.ifive.nadab.global.exception.BadRequestException;
import com.devkor.ifive.nadab.global.exception.ConflictException;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Profile({"local", "dev"})
@Service
@Transactional
@RequiredArgsConstructor
public class TestUserService {

private final UserRepository userRepository;
private final UserWalletRepository userWalletRepository;
private final UserProfileUpdateService userProfileUpdateService;
private final TermsCommandService termsCommandService;
private final PasswordEncoder passwordEncoder;

@Value("${test.account.password:}")
private String testUserPassword;

public CreateTestUserResponse createTestUser(CreateTestUserRequest request) {
if (testUserPassword == null || testUserPassword.isBlank()) {
throw new BadRequestException(ErrorCode.TEST_USER_PASSWORD_NOT_CONFIGURED);
}
if (userRepository.existsByEmail(request.email())) {
throw new ConflictException(ErrorCode.EMAIL_ALREADY_EXISTS);
}

String passwordHash = passwordEncoder.encode(testUserPassword);
User user = User.createUser(request.email(), passwordHash);
userRepository.save(user);

userProfileUpdateService.updateNickname(user, request.nickname());
user.updateSignupStatus(SignupStatusType.COMPLETED);

userWalletRepository.save(UserWallet.create(user));
termsCommandService.saveConsents(user.getId(), true, true, true, false);

return new CreateTestUserResponse(
user.getId(),
user.getEmail(),
user.getNickname(),
user.getSignupStatus().name()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public enum ErrorCode {
USER_NOT_FOUND(HttpStatus.NOT_FOUND, "사용자를 찾을 수 없습니다"),
EMAIL_ALREADY_EXISTS(HttpStatus.CONFLICT, "이미 사용 중인 이메일입니다"),
FILE_STORAGE_NOT_FOUND(HttpStatus.NOT_FOUND, "스토리지에서 해당 파일을 찾을 수 없습니다"), // S3 등 스토리지에 실제 파일 객체가 없는 경우
TEST_USER_PASSWORD_NOT_CONFIGURED(HttpStatus.BAD_REQUEST, "테스트 계정 비밀번호가 설정되지 않았습니다"),

// ==================== AUTH (인증) ====================
// 400 Bad Request
Expand Down
6 changes: 5 additions & 1 deletion src/main/resources/application-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ profile-image:
env: dev
base-url: ${PROFILE_IMAGE_BASE_URL}

test:
account:
password: ${DEV_TEST_ACCOUNT_PASSWORD:}

app:
cookie:
secure: true
Expand All @@ -60,4 +64,4 @@ cors:
- ${FRONTEND_DEV_URL}
- ${FRONTEND_DEV_URL_2}
- ${SWAGGER_ORIGIN_PUBLIC_IP}
- ${SWAGGER_ORIGIN_DOMAIN}
- ${SWAGGER_ORIGIN_DOMAIN}
Loading