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
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
implementation "com.amazonaws:aws-java-sdk-s3:1.12.395"

// Redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@
import servnow.servnow.api.dto.login.UserChangePwRequest;
import servnow.servnow.api.user.dto.request.CertificationNumberRequest;
import servnow.servnow.api.user.dto.request.EmailDuplicateRequest;
import servnow.servnow.api.user.service.EmailService;
import servnow.servnow.api.user.service.EmailQueryService;
import servnow.servnow.api.user.service.UserCommandService;
import servnow.servnow.api.user.service.UserQueryService;
import servnow.servnow.common.code.CommonSuccessCode;
import servnow.servnow.common.code.LoginErrorCode;
import servnow.servnow.common.code.UserErrorCode;
import servnow.servnow.domain.user.model.User;
import servnow.servnow.domain.user.model.enums.Platform;
import servnow.servnow.domain.user.repository.UserInfoRepository;
import servnow.servnow.domain.user.repository.UserRepository;

import java.util.Optional;
Expand All @@ -29,6 +28,7 @@ public class FindController {
private final UserCommandService userCommandService;
private final UserQueryService userQueryService;
private final UserRepository userRepository;
private final EmailQueryService emailQueryService;

String serialId = null;
Boolean check = false;
Expand Down Expand Up @@ -61,7 +61,9 @@ public ServnowResponse<String> sendEmailNumber(@RequestBody EmailDuplicateReques

@PostMapping("/find/email/certification")
public ServnowResponse<Object> CertificationNumber(@RequestBody CertificationNumberRequest request) {
if (request.certificationNumber().equals(EmailService.ePw)) {
boolean isVallid = emailQueryService.verifyCode(request.email(), request.certificationNumber());

if (isVallid) {
check = true;
return ServnowResponse.success(CommonSuccessCode.OK, serialId);
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package servnow.servnow.api.auth.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
Expand All @@ -15,15 +14,13 @@
import servnow.servnow.api.user.dto.request.CertificationNumberRequest;
import servnow.servnow.api.user.dto.request.EmailDuplicateRequest;
import servnow.servnow.api.user.dto.request.SerialIdDuplicateRequest;
import servnow.servnow.api.user.service.EmailService;
import servnow.servnow.api.user.service.EmailCommandService;
import servnow.servnow.api.user.service.EmailQueryService;
import servnow.servnow.api.user.service.UserQueryService;
import servnow.servnow.auth.UserId;
import servnow.servnow.auth.jwt.Token;
import servnow.servnow.common.code.CommonSuccessCode;
import servnow.servnow.common.code.UserErrorCode;

import java.io.IOException;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1")
Expand All @@ -32,6 +29,8 @@ public class LoginController {
private final KakaoService kakaoService;
private final LoginService loginService;
private final UserQueryService userQueryService;
private final EmailQueryService emailQueryService;
private final EmailCommandService emailCommandService;

// 카카오 로그인
@PostMapping("/auth/kakao")
Expand Down Expand Up @@ -59,7 +58,7 @@ public ServnowResponse<UserLoginResponse> login(@RequestBody UserLoginRequest re
@PostMapping("/auth/join")
public ServnowResponse<String> join(@RequestBody UserJoinRequest request) throws Exception {
if (request.email() != null && !request.email().isEmpty() &&
request.certificationNumber() != null && request.certificationNumber().equals(EmailService.ePw)) {
request.certificationNumber() != null && emailQueryService.verifyCode(request.email(), request.certificationNumber())) {
loginService.join(request);
return ServnowResponse.success(CommonSuccessCode.OK, "회원가입이 완료되었습니다.");
} else {
Expand All @@ -70,13 +69,15 @@ public ServnowResponse<String> join(@RequestBody UserJoinRequest request) throws
// 회원가입 - 이메일 인증
@PostMapping("/auth/join/identity-verification")
public ServnowResponse<Void> identityVerification(@RequestBody EmailDuplicateRequest request) throws Exception {
return userQueryService.identityVerification(request.email());
emailCommandService.sendVerificationEmail(request.email());
return ServnowResponse.success(CommonSuccessCode.OK);
}

// 회원가입 - 인증 번호 확인
@PostMapping("/auth/join/certification")
public ServnowResponse<Object> CertificationNumber(@RequestBody CertificationNumberRequest request) {
if (request.certificationNumber().equals(EmailService.ePw)) {
boolean isVerified = emailQueryService.verifyCode(request.email(), request.certificationNumber());
if (isVerified) {
return ServnowResponse.success(CommonSuccessCode.OK);
} else {
return ServnowResponse.fail(UserErrorCode.CERTIFICATION_NUMBER_MISMATCH);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package servnow.servnow.api.auth.service;

import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import servnow.servnow.api.dto.ServnowResponse;
import servnow.servnow.api.user.service.EmailService;
import servnow.servnow.api.user.service.EmailCommandService;
import servnow.servnow.common.code.CommonSuccessCode;
import servnow.servnow.common.code.LoginErrorCode;
import servnow.servnow.common.code.UserErrorCode;
Expand All @@ -23,8 +21,8 @@ public class FindInfoService {

private final UserRepository userRepository;
private final UserInfoRepository userInfoRepository;
private final EmailService emailService;
private final PasswordEncoder passwordEncoder;
private final EmailCommandService emailCommandService;

/**
* 이메일 존재 여부 확인
Expand All @@ -33,7 +31,7 @@ public String checkEmail(String email) throws Exception {
Optional<UserInfo> userInfo = userInfoRepository.findByEmail(email);

if (userInfo.isPresent()) {
String confirm = emailService.sendSimpleMessage(email);
String confirm = emailCommandService.sendVerificationEmail(email);
String serialId = userInfo.get().getUser().getSerialId();

if (confirm.isEmpty()) {
Expand Down
33 changes: 33 additions & 0 deletions src/main/java/servnow/servnow/api/config/RedisConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package servnow.servnow.api.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

@Value("${spring.data.redis.host}")
private String redisHost;

@Value("${spring.data.redis.port}")
private int redisPort;

@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}

@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
import servnow.servnow.api.user.dto.response.MySurveyResponse;
import servnow.servnow.api.survey.service.SurveyQueryService;
import servnow.servnow.api.user.dto.response.UserPointGetResponse;
import servnow.servnow.api.user.service.EmailService;
import servnow.servnow.api.user.service.EmailCommandService;
import servnow.servnow.api.user.service.EmailQueryService;
import servnow.servnow.api.user.service.UserCommandService;
import servnow.servnow.api.user.service.UserQueryService;
import servnow.servnow.auth.UserId;
Expand All @@ -46,17 +47,18 @@ public class UserController {
private final ResultQueryService resultQueryService;
private final ResultCommandService resultCommandService;
private final SurveyQueryService surveyQueryService;

private final EmailCommandService emailCommandService;
private final EmailQueryService emailQueryService;


// 아직 유저 정보를 넘기는 방식이 정해지지 않아서 UserQueryService에서 userId값을 고정하여 테스트 함
@GetMapping("/users/me")
public ServnowResponse<MyPageResponse> getMyPage(@Parameter (hidden = true) @UserId final Long userId) {
public ServnowResponse<MyPageResponse> getMyPage(@Parameter(hidden = true) @UserId final Long userId) {
return ServnowResponse.success(CommonSuccessCode.OK, userQueryService.getMyPage(userId));
}

@GetMapping("/users/me/info")
public ServnowResponse<EditProfilePageResponse> getEditProfilePage(@Parameter (hidden = true) @UserId final Long userId) {
public ServnowResponse<EditProfilePageResponse> getEditProfilePage(@Parameter(hidden = true) @UserId final Long userId) {
return ServnowResponse.success(CommonSuccessCode.OK, userQueryService.getEditProfilePage(userId));
}

Expand All @@ -67,12 +69,17 @@ public ServnowResponse<Boolean> getSerialIdDuplicate(@RequestBody SerialIdDuplic

@PostMapping("/users/me/info/identity-verification")
public ServnowResponse<Void> identityVerification(@RequestBody EmailDuplicateRequest request) throws Exception {
return userQueryService.identityVerification(request.email());
if (userQueryService.emailDuplicate(request.email())) {
return ServnowResponse.fail(UserErrorCode.EMAIL_DUPLICATE);
}
emailCommandService.sendVerificationEmail(request.email());
return ServnowResponse.success(CommonSuccessCode.OK);
}

@PostMapping("/users/me/info/certification")
public ServnowResponse<Object> CertificationNumber(@RequestBody CertificationNumberRequest request) {
if (request.certificationNumber().equals(EmailService.ePw)) {
boolean isValid = emailQueryService.verifyCode(request.email(), request.certificationNumber());
if (isValid) {
return ServnowResponse.success(CommonSuccessCode.OK);
} else {
return ServnowResponse.fail(UserErrorCode.CERTIFICATION_NUMBER_MISMATCH);
Expand All @@ -87,57 +94,69 @@ public ServnowResponse<UpdateProfileUrlRequest> updateProfile(@RequestParam("fil


@PatchMapping("/users/me/info/save")
public ServnowResponse<SaveEditProfilePageRequest> profileSave(@Parameter (hidden = true) @UserId final Long userId, @RequestBody final SaveEditProfilePageRequest request) {
public ServnowResponse<SaveEditProfilePageRequest> profileSave(@Parameter(hidden = true) @UserId final Long userId, @RequestBody final SaveEditProfilePageRequest request) {
// 이메일이 변경되었고, 인증번호가 있는 경우
if (request.email() != null && !request.email().isEmpty() &&
request.certificationNumber() != null && request.certificationNumber().equals(EmailService.ePw)) {
userCommandService.profileSave(userId, request);
return ServnowResponse.success(CommonSuccessCode.OK);
} else if ((request.certificationNumber() == null) || request.certificationNumber().isEmpty()) {
// 인증번호 없이 아이디 또는 비밀번호만 변경하려는 경우
userCommandService.profileSave(userId, request);
return ServnowResponse.success(CommonSuccessCode.OK);
} else {
System.out.println("Controller out");
return ServnowResponse.fail(UserErrorCode.CERTIFICATION_NUMBER_MISMATCH);
if (request.email() != null && !request.email().isEmpty()) {
if (request.certificationNumber() != null && !request.certificationNumber().isEmpty()) {
boolean isValid = emailQueryService.verifyCode(request.email(), request.certificationNumber());

if (!isValid) {
return ServnowResponse.fail(UserErrorCode.CERTIFICATION_NUMBER_MISMATCH);
}
userCommandService.profileSave(userId, request);
return ServnowResponse.success(CommonSuccessCode.OK);
} else {
// 이메일 변경, 인증번호가 없는 경우
return ServnowResponse.fail(UserErrorCode.CERTIFICATION_NUMBER_REQUIRED);
}
}
// 이메일이 변경되지 않은 경우
userCommandService.profileSave(userId, request);
return ServnowResponse.success(CommonSuccessCode.OK);
}

@GetMapping("/users/me/survey/{id}")
public ServnowResponse<MySurveysResultResponse> getMySurveysResult(@Parameter (hidden = true) @UserId final Long userId, @PathVariable(name = "id") long surveyId) {
public ServnowResponse<MySurveysResultResponse> getMySurveysResult(
@Parameter(hidden = true) @UserId final Long userId, @PathVariable(name = "id") long surveyId) {
MySurveysResultResponse result = resultQueryService.getMySurveysResult(surveyId);
return ServnowResponse.success(CommonSuccessCode.OK, result);
}

// 나의 닫ㅂ변
@GetMapping("/users/me/survey/{id}/answer")
public ServnowResponse<UserSurveyAnswerResultResponse> getMyAnswersResult(@Parameter (hidden = true) @UserId final Long userId, @PathVariable(name = "id") long surveyId) {
public ServnowResponse<UserSurveyAnswerResultResponse> getMyAnswersResult(
@Parameter(hidden = true) @UserId final Long userId, @PathVariable(name = "id") long surveyId) {
UserSurveyAnswerResultResponse result = resultQueryService.getMyAnswerResult(surveyId, userId);
return ServnowResponse.success(CommonSuccessCode.OK, result);
}


@PostMapping("/users/me/survey/{id}/memo")
public ServnowResponse<Object> saveInsightMemo(@Parameter (hidden = true) @UserId final Long userId, @PathVariable(name = "id") long surveyId, @RequestBody final MySurveysResultMemoRequest request) {
public ServnowResponse<Object> saveInsightMemo(@Parameter(hidden = true) @UserId final Long userId,
@PathVariable(name = "id") long surveyId, @RequestBody final MySurveysResultMemoRequest request) {
resultCommandService.saveInsightMemo(surveyId, request);
return ServnowResponse.success(CommonSuccessCode.OK);
}

@GetMapping("/users/me/survey/{id}/memo/list")
public ServnowResponse<MySurveysResultMemoResponse> getInsightMemo(@Parameter (hidden = true) @UserId final Long userId, @PathVariable(name = "id") long surveyId) {
public ServnowResponse<MySurveysResultMemoResponse> getInsightMemo(
@Parameter(hidden = true) @UserId final Long userId, @PathVariable(name = "id") long surveyId) {
MySurveysResultMemoResponse result = resultQueryService.getInsightMemo(surveyId);
return ServnowResponse.success(CommonSuccessCode.OK, result);
}

@GetMapping("/users/me/survey") // sort=newest, sort=oldest, sort=participants
public ServnowResponse<List<MySurveyResponse>> getMySurveys(@Parameter (hidden = true) @UserId final Long userId, @RequestParam(value = "sort", required = false, defaultValue = "newest") String sort) {
public ServnowResponse<List<MySurveyResponse>> getMySurveys(
@Parameter(hidden = true) @UserId final Long userId,
@RequestParam(value = "sort", required = false, defaultValue = "newest") String sort) {
List<MySurveyResponse> surveys = surveyQueryService.getMySurveys(userId, sort);
return ServnowResponse.success(CommonSuccessCode.OK, surveys);
}

@GetMapping("/users/me/survey/join")
public ServnowResponse<List<MySurveyResponse>> getJoinSurveys(@Parameter(hidden = true) @UserId final Long userId,
@RequestParam(value = "sort", required = false, defaultValue = "newest") String sort) {
public ServnowResponse<List<MySurveyResponse>> getJoinSurveys(
@Parameter(hidden = true) @UserId final Long userId,
@RequestParam(value = "sort", required = false, defaultValue = "newest") String sort) {
List<MySurveyResponse> surveys = resultQueryService.getJoinSurveys(userId, sort);
return ServnowResponse.success(CommonSuccessCode.OK, surveys);
}
Expand All @@ -153,8 +172,9 @@ public ServnowResponse<Void> deleteSurveyMemo(@PathVariable(name = "id") Long id
return ServnowResponse.success(CommonSuccessCode.OK);
}

@PatchMapping ("/users/me/survey/memo")
public ServnowResponse<Void> updateSurveyMemos(@RequestBody SurveyResultMemosPatchRequest surveyResultMemosPatchRequest) {
@PatchMapping("/users/me/survey/memo")
public ServnowResponse<Void> updateSurveyMemos(@RequestBody SurveyResultMemosPatchRequest
surveyResultMemosPatchRequest) {
resultCommandService.updateSurveyMemos(surveyResultMemosPatchRequest);
return ServnowResponse.success(CommonSuccessCode.OK);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package servnow.servnow.api.user.dto.request;

public record CertificationNumberRequest(
String email,
String certificationNumber
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package servnow.servnow.api.user.service;

import org.springframework.stereotype.Component;
import java.util.Random;

@Component
public class EmailCodeGenerator {

private static final String CHAR_POOL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

public String generateCode() {
StringBuilder code = new StringBuilder();
Random rnd = new Random();

for (int i = 0; i < 8; i++) {
code.append(CHAR_POOL.charAt(rnd.nextInt(CHAR_POOL.length())));
}

return code.toString();
}
}
Loading