Skip to content
Open
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
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.withins.api.auth.auth2;

import com.withins.core.user.entity.OrgUser;
import com.withins.core.user.entity.FormUser;
import com.withins.core.user.entity.User;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -37,7 +37,7 @@ public String getUsername() {
@Override
public String getPassword() {
return switch (user) {
case OrgUser orgUser -> orgUser.getPassword();
case FormUser formUser -> formUser.getPassword();
default -> null;
};
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.withins.api.controller;

import com.withins.core.signup.RequestSignup;
import com.withins.core.signup.ResponseSignup;
import com.withins.core.user.service.SignupService;
import com.withins.core.user.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

//@RestController
//@RequestMapping("/api/v1/signup")
//@RequiredArgsConstructor
//public class SignupController {
//
// private final UserService userService;
// private final SignupService signupService;
//
// @GetMapping("/exists/username")
// public ResponseEntity<Boolean> existsUsername(@RequestParam String username) {
// boolean exists = userService.readByUsername(username).isPresent();
// return ResponseEntity.ok(exists);
// }
//
// @GetMapping("/exists/email")
// public ResponseEntity<Boolean> existsEmail(@RequestParam String email) {
// boolean exists = userService.readByEmail(email).isPresent();
// return ResponseEntity.ok(exists);
// }
//
// @PostMapping
// public ResponseEntity<ResponseSignup> signup(@Validated @RequestBody RequestSignup requestSignup, BindingResult result) {
// if (result.hasErrors()) {
// return ResponseEntity.badRequest().body(ResponseSignup.error(result));
// }
// ResponseSignup signup = signupService.signup(requestSignup);
// return ResponseEntity.ok(signup);
// }
//
//}
2 changes: 1 addition & 1 deletion withins_server/config
1 change: 1 addition & 0 deletions withins_server/core/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
dependencies {
implementation("org.springframework:spring-context")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-validation")
runtimeOnly("mysql:mysql-connector-java:${project.property('mysqlVersion')}")

implementation("com.querydsl:querydsl-jpa:${project.property('querydslVersion')}:jakarta")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.withins.core.signup;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
public class RequestSignup {

@NotBlank(message = "사용자명을 입력해주세요.")
@Size(min = 4, max = 20, message = "4 ~ 20자의 영문,숫자만 사용가능합니다.")
@Pattern(regexp = "^[a-zA-Z0-9]+$", message = "4 ~ 20자의 영문,숫자만 사용가능합니다.")
private String username;

@NotBlank(message = "비밀번호를 입력해주세요.")
@Size(min = 8, message = "8자리 이상 영문 대소문자, 숫자, 특수문자를 조합해주세요.")
@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]).+$",
message = "8자리 이상 영문 대소문자, 숫자, 특수문자를 조합해주세요.")
private String password;

@NotBlank(message = "이메일을 입력해주세요.")
@Email(message = "올바른 이메일 형식이 아닙니다.")
private String email;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.withins.core.signup;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

import java.util.Collections;
import java.util.Map;
import java.util.stream.Collectors;

@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ResponseSignup {

private final String result;
private final String message;
private final Map<String, String> errors;

public static ResponseSignup error(BindingResult result) {
return new ResponseSignup(
"ERROR",
"검증에 실패했습니다.",
result.getFieldErrors().stream().collect(Collectors.toMap(
FieldError::getField,
FieldError::getDefaultMessage,
(existing, replacement) -> replacement
))
);
}
public static ResponseSignup error(Map<String, String> result) {
return new ResponseSignup(
"ERROR",
"검증에 실패했습니다.",
result
);
}

public static ResponseSignup ok() {
return new ResponseSignup("OK", "검증 성공", Collections.emptyMap());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.withins.core.user.component;

import com.withins.core.signup.RequestSignup;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class SignupAuthenticator {

private final Map<String, SignupHolder> requestSignupMap = new ConcurrentHashMap<>();
private static final int EXPIRATION_TIME = 60 * 60; // 1시간

public String registry(RequestSignup requestSignup) {
String uuid = UUID.randomUUID().toString();
requestSignupMap.put(uuid, SignupHolder.of(requestSignup));
return uuid;
}

private void clearExpired() {
Date date = new Date();

}

@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
private static class SignupHolder {
private final Date expiration;
private final RequestSignup requestSignup;

static SignupHolder of(RequestSignup signup) {
return new SignupHolder(
new Date(System.currentTimeMillis() + EXPIRATION_TIME),
signup
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.withins.core.exception.EntityNotFoundException;
import com.withins.core.user.entity.User;
import com.withins.core.user.repository.FormUserRepository;
import com.withins.core.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -15,10 +16,14 @@
public class UserReader {

private final UserRepository userRepository;
private final FormUserRepository formUserRepository;

public Optional<User> readByUsername(final String username) {
return userRepository.findByUsername(username);
}
public Optional<User> readByEmail(final String email) {
return formUserRepository.findByEmail(email);
}

public User read(final Long userId) {
log.debug("유저 조회 실행 - id={}", userId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,18 @@


@Entity
@DiscriminatorValue("org")
@DiscriminatorValue("form")
@SuperBuilder
@Getter
@NoArgsConstructor
public final class OrgUser extends User {
public final class FormUser extends User {

private String password;
private String email;

@Override
protected String getDiscriminatorValue() {
return "org";
return "form";
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.withins.core.user.repository;

import com.withins.core.user.entity.FormUser;
import com.withins.core.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface FormUserRepository extends JpaRepository<FormUser, Long> {

Optional<User> findByEmail(String email);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.withins.core.user.component.UserReader;
import com.withins.core.user.dto.UserAuthToken;
import com.withins.core.user.entity.OrgUser;
import com.withins.core.user.entity.FormUser;
import com.withins.core.user.entity.SocialUser;
import com.withins.core.user.entity.User;
import lombok.RequiredArgsConstructor;
Expand All @@ -25,7 +25,7 @@ public UserAuthToken getUserAuthToken(Long userId) {

private String getProvider(User user) {
return switch (user) {
case OrgUser orgUser -> "LOCAL";
case FormUser formUser -> "LOCAL";
case SocialUser socialUser -> socialUser.getProvider().name();
default -> throw new IllegalStateException("Unexpected value: " + user);
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.withins.core.user.service;

import com.withins.core.signup.RequestSignup;
import com.withins.core.signup.ResponseSignup;
import com.withins.core.user.component.UserReader;
import com.withins.core.user.component.UserWriter;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
@RequiredArgsConstructor
public class SignupService {

private final UserReader userReader;
private final UserWriter userWriter;

public ResponseSignup signup(RequestSignup requestSignup) {
Map<String, String> errors = validate(requestSignup);
if (!errors.isEmpty()) {
return ResponseSignup.error(errors);
}
return null;
}

private Map<String, String> validate(RequestSignup requestSignup) {
Map<String, String> errors = new HashMap<>();
boolean isUsernameExists = userReader.readByUsername(requestSignup.getUsername()).isPresent();
if (isUsernameExists) {
errors.put("username", "이미 사용중인 아이디입니다.");
}
boolean isEmailExists = userReader.readByEmail(requestSignup.getEmail()).isPresent();
if (isEmailExists) {
errors.put("email", "이미 등록된 이메일입니다.");
}
return errors;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ public User saveOrGet(final String username, Supplier<? extends User> orElseGet)
public Optional<User> readByUsername(final String username) {
return userReader.readByUsername(username);
}
public Optional<User> readByEmail(final String email) {
return userReader.readByEmail(email);
}

public UserInfoResponse readUserInfo(Long memberId) {
User user = userReader.read(memberId);
Expand Down
Loading