Skip to content

Commit

Permalink
feature(#45): 유저 아이디 찾기 기능 추가
Browse files Browse the repository at this point in the history
- 테스트 코드 아직 작성하지 않았습니다.
- "이름, 생년월일" 을 통해 유저 아이디 찾기를 진행합니다.
- "생년월일"이 아이디 찾기에서 사용되기 때문에, 회원가입시 "생년월일" 데이터를 필수적으로 넘겨야 하는 식으로 변경하였습니다.
  • Loading branch information
memoer committed Aug 3, 2022
1 parent d53c376 commit 42a4550
Show file tree
Hide file tree
Showing 31 changed files with 138 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
import com.airjnc.user.domain.UserEntity;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.response.UserDTO;
import java.time.LocalDate;
import javax.annotation.processing.Generated;
import org.springframework.stereotype.Component;

@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2022-07-26T18:22:14+0900",
date = "2022-07-29T19:30:31+0900",
comments = "version: 1.5.2.Final, compiler: javac, environment: Java 11.0.10 (AdoptOpenJDK)"
)
@Component
Expand Down Expand Up @@ -46,6 +47,9 @@ public UserEntity createDTOToUserEntity(CreateDTO createDTO) {
userEntity.password( createDTO.getPassword() );
userEntity.name( createDTO.getName() );
userEntity.gender( createDTO.getGender() );
if ( createDTO.getBirthDate() != null ) {
userEntity.birthDate( LocalDate.parse( createDTO.getBirthDate() ) );
}

return userEntity.build();
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/airjnc/common/advice/ExceptionAdvice.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.MessageSource;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
Expand Down Expand Up @@ -45,7 +45,7 @@ public ErrorResponse handleDefaultException(DefaultException ex) {
}

// 400 - Bean Validation, BAD REQUEST
@ExceptionHandler({MethodArgumentNotValidException.class, BadRequestException.class})
@ExceptionHandler({BindException.class, BadRequestException.class})
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse handleBadRequestException(Exception ex) {
return ErrorResponseFactory.create(ex, messageSource);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.airjnc.common.exception;


import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import com.airjnc.common.util.factory.ErrorsFactory;
import org.springframework.validation.Errors;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.airjnc.common.exception;

import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import com.airjnc.common.util.factory.ErrorsFactory;
import org.springframework.validation.Errors;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.airjnc.common.exception;


import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import com.airjnc.common.util.factory.ErrorsFactory;
import org.springframework.validation.Errors;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.airjnc.common.exception;


import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import com.airjnc.common.util.factory.ErrorsFactory;
import org.springframework.validation.Errors;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.airjnc.common.exception;


import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import com.airjnc.common.util.factory.ErrorsFactory;
import org.springframework.validation.Errors;

Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/airjnc/common/util/CommonRegex.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.airjnc.common.util;

public interface CommonRegex {

String localDate = "\\d{4}-\\d{2}-\\d{2}";
}
5 changes: 0 additions & 5 deletions src/main/java/com/airjnc/common/util/constant/SessionKey.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.airjnc.common.util.constant;
package com.airjnc.common.util.enumerate;

public enum ErrorCode {
INTERNAL,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.airjnc.common.util.enumerate;

public enum SessionKey {
USER,
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.airjnc.common.util.factory;

import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;

Expand Down
9 changes: 8 additions & 1 deletion src/main/java/com/airjnc/user/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@
import com.airjnc.common.annotation.CheckAuth;
import com.airjnc.common.annotation.CurrentUserId;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.request.FindEmailDTO;
import com.airjnc.user.dto.response.UserDTO;
import com.airjnc.user.service.UserService;
import com.airjnc.user.service.UserStateService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand All @@ -25,6 +28,11 @@ public class UserController {

private final UserStateService userStateService;

@GetMapping("/findEmail")
public String findEmail(@Validated @ModelAttribute FindEmailDTO findEmailDTO) {
return userService.findEmail(findEmailDTO);
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public UserDTO create(@RequestBody @Validated CreateDTO createDTO) {
Expand All @@ -33,7 +41,6 @@ public UserDTO create(@RequestBody @Validated CreateDTO createDTO) {
return userDTO;
}


@DeleteMapping("/me")
@ResponseStatus(HttpStatus.NO_CONTENT)
@CheckAuth
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/airjnc/user/dao/UserRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@

import com.airjnc.user.domain.UserEntity;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.request.FindEmailDTO;

public interface UserRepository {

UserEntity findById(Long id);

UserEntity findByEmail(String email);

String getEmail(FindEmailDTO findEmailDTO);

UserEntity save(CreateDTO createDTO);


void remove(Long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.airjnc.user.dao.mapper.UserMapper;
import com.airjnc.user.domain.UserEntity;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.request.FindEmailDTO;
import com.airjnc.user.util.UserModelMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
Expand All @@ -30,6 +31,11 @@ public UserEntity findByEmail(String email) {
return userMapper.findByEmail(email).orElseThrow(NotFoundException::new);
}

@Override
public String getEmail(FindEmailDTO findEmailDTO) {
return userMapper.getEmail(findEmailDTO).orElseThrow(NotFoundException::new);
}

@Override
public UserEntity save(CreateDTO createDTO) {
int affect = userMapper.save(createDTO);
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/airjnc/user/dao/mapper/UserMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.airjnc.user.domain.UserEntity;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.request.FindEmailDTO;
import java.util.Optional;
import org.apache.ibatis.annotations.Mapper;

Expand All @@ -12,6 +13,8 @@ public interface UserMapper {

Optional<UserEntity> findByEmail(String email);

Optional<String> getEmail(FindEmailDTO findEmailDTO);

int save(CreateDTO createDTO);

int remove(Long id);
Expand Down
13 changes: 10 additions & 3 deletions src/main/java/com/airjnc/user/dto/request/CreateDTO.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.airjnc.user.dto.request;

import com.airjnc.common.util.BCryptHashEncrypter;
import com.airjnc.common.util.CommonRegex;
import com.airjnc.user.domain.Gender;
import com.airjnc.user.util.Regex;
import com.airjnc.user.util.UserRegex;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
Expand All @@ -28,16 +29,22 @@ public class CreateDTO {
private Gender gender;

@NotNull
@Pattern(regexp = Regex.Password.format)
@Pattern(regexp = UserRegex.password)
private String password;

@NotNull
@Pattern(regexp = CommonRegex.localDate)
private String birthDate;

@Builder
public CreateDTO(Long id, String email, String password, String name, Gender gender) {
public CreateDTO(Long id, String email, String password, String name, Gender gender,
String birthDate) {
this.id = id;
this.email = email;
this.password = password;
this.name = name;
this.gender = gender;
this.birthDate = birthDate;
}

public void changePasswordToHash() {
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/airjnc/user/dto/request/FindEmailDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.airjnc.user.dto.request;

import com.airjnc.common.util.CommonRegex;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class FindEmailDTO {

@NotNull
private final String name;

@Pattern(regexp = CommonRegex.localDate)
private final String birthDate;
}
4 changes: 2 additions & 2 deletions src/main/java/com/airjnc/user/dto/request/LogInDTO.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.airjnc.user.dto.request;

import com.airjnc.user.util.Regex;
import com.airjnc.user.util.UserRegex;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
Expand All @@ -18,7 +18,7 @@ public class LogInDTO {
private String email;

@NotNull
@Pattern(regexp = Regex.Password.format)
@Pattern(regexp = UserRegex.password)
private String password;

@Builder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.airjnc.user.service;

import com.airjnc.common.util.constant.SessionKey;
import com.airjnc.common.util.enumerate.SessionKey;
import javax.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/airjnc/user/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.airjnc.user.dao.UserRepository;
import com.airjnc.user.domain.UserEntity;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.request.FindEmailDTO;
import com.airjnc.user.dto.response.UserDTO;
import com.airjnc.user.util.UserModelMapper;
import lombok.RequiredArgsConstructor;
Expand All @@ -28,4 +29,8 @@ public UserDTO create(CreateDTO createDTO) {
public void remove(Long id) {
userRepository.remove(id);
}

public String findEmail(FindEmailDTO findEmailDTO) {
return userRepository.getEmail(findEmailDTO);
}
}
10 changes: 0 additions & 10 deletions src/main/java/com/airjnc/user/util/Regex.java

This file was deleted.

7 changes: 7 additions & 0 deletions src/main/java/com/airjnc/user/util/UserRegex.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.airjnc.user.util;

public interface UserRegex {

String password = "^(?=.*[0-9])(?=.*[a-z])(?=.*[@#!~$%^&-+=()])(?=\\S+$).{8,16}$";
}

2 changes: 0 additions & 2 deletions src/main/resources/application-local.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,3 @@ spring.datasource.password=q1w2e3
logging.level.org.springframework.jdbc=debug
# MessageSource
spring.messages.basename=errors
# Session
session.expire=86400
2 changes: 1 addition & 1 deletion src/main/resources/messages/errors.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ Pattern.password=\uC601\uC5B4 \uC18C\uBB38\uC790, \uC22B\uC790, \uD2B9\uC218\uBB
### Mine
UserCheckService.emailIsDuplicated=\uC774\uBBF8 \uC874\uC7AC\uD558\uB294 \uC774\uBA54\uC77C\uC785\uB2C8\uB2E4.
UserCheckService.passwordIsNotMatch=\uBE44\uBC00\uBC88\uD638\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
CommonCheckService.isNotMatch=actual: {0}, but expected: {1}
CommonInternalCheckService.isNotMatch=actual: {0}, but expected: {1}
51 changes: 29 additions & 22 deletions src/main/resources/mybatis/mapper/user.xml
Original file line number Diff line number Diff line change
@@ -1,25 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.airjnc.user.dao.mapper.UserMapper">
<select id="findById" resultType="UserEntity">
SELECT *
FROM user
WHERE id = #{id}
AND deleted_at IS NULL;
</select>
<select id="findByEmail" resultType="UserEntity">
SELECT *
FROM user
WHERE email = #{email};
</select>
<insert id="save" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (email, password, name, gender)
VALUES (#{email}, #{password}, #{name}, #{gender});
</insert>
<delete id="remove">
UPDATE user
set deleted_at = now()
WHERE id = #{id}
AND deleted_at IS NULL
</delete>
<delete id="remove">
UPDATE user
set deleted_at = now()
WHERE id = #{id}
AND deleted_at IS NULL
</delete>
<insert id="save" keyProperty="id" useGeneratedKeys="true">
INSERT INTO user (email, password, name, gender)
VALUES (#{email}, #{password}, #{name}, #{gender});
</insert>
<select id="getEmail" resultType="String">
SELECT email
FROM user
WHERE name = #{name}
AND birthdate = ${birthDate};
</select>
<select id="findById" resultType="UserEntity">
SELECT *
FROM user
WHERE id = #{id}
AND deleted_at IS NULL;
</select>
<select id="findByEmail" resultType="UserEntity">
SELECT *
FROM user
WHERE email = #{email};
</select>
</mapper>
Loading

0 comments on commit 42a4550

Please sign in to comment.