feat(user-service): 엔티티 양식 변경, userDetailService 구현

- User 엔티티 abstract로 변경
- UserService UserDetailService 구현
This commit is contained in:
bum12ark
2022-02-15 16:16:51 +09:00
parent 07f1e48c58
commit 285ca1cd25
8 changed files with 92 additions and 7 deletions

View File

@@ -12,7 +12,7 @@ public class CustomerDto extends UserDto {
}
@Builder
public CustomerDto(Long id, String password, String name, String phoneNumber) {
super(id, password, name, phoneNumber);
public CustomerDto(Long id, String email, String password, String name, String phoneNumber, String dtype) {
super(id, email, password, name, phoneNumber, dtype);
}
}

View File

@@ -0,0 +1,16 @@
package com.justpickup.userservice.domain.user.dto;
import lombok.Builder;
import lombok.Getter;
@Getter
public class StoreOwnerDto extends UserDto {
private String businessNumber;
@Builder
public StoreOwnerDto(Long id, String email, String password, String name,
String phoneNumber, String dtype, String businessNumber) {
super(id, email, password, name, phoneNumber, dtype);
this.businessNumber = businessNumber;
}
}

View File

@@ -1,15 +1,16 @@
package com.justpickup.userservice.domain.user.dto;
import com.justpickup.userservice.domain.user.entity.Customer;
import lombok.Builder;
import lombok.Getter;
@Getter
public class UserDto {
public abstract class UserDto {
private Long id;
private String email;
private String password;
private String name;
private String phoneNumber;
private String dtype;
// == 생성 메소드 == //
public UserDto(Customer customer) {
@@ -19,10 +20,12 @@ public class UserDto {
this.phoneNumber = customer.getPhoneNumber();
}
public UserDto(Long id, String password, String name, String phoneNumber) {
public UserDto(Long id, String email, String password, String name, String phoneNumber, String dtype) {
this.id = id;
this.email = email;
this.password = password;
this.name = name;
this.phoneNumber = phoneNumber;
this.dtype = dtype;
}
}

View File

@@ -1,5 +1,6 @@
package com.justpickup.userservice.domain.user.entity;
import com.justpickup.userservice.domain.user.dto.StoreOwnerDto;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
@@ -12,4 +13,9 @@ import javax.persistence.Table;
@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED)
public class StoreOwner extends User {
private String businessNumber;
public StoreOwner(String email, String password, String name, String phoneNumber, String businessNumber) {
super(email, password, name, phoneNumber);
this.businessNumber = businessNumber;
}
}

View File

@@ -12,15 +12,27 @@ import javax.persistence.*;
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE")
@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User extends BaseEntity {
public abstract class User extends BaseEntity {
@Id @GeneratedValue
@Column(name = "user_id")
private Long id;
private String email;
private String password;
private String name;
private String phoneNumber;
@Column(insertable = false, updatable = false)
private String dtype;
public User(String email, String password, String name, String phoneNumber) {
this.email = email;
this.password = password;
this.name = name;
this.phoneNumber = phoneNumber;
}
}

View File

@@ -0,0 +1,10 @@
package com.justpickup.userservice.domain.user.repository;
import com.justpickup.userservice.domain.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String username);
}

View File

@@ -1,7 +1,10 @@
package com.justpickup.userservice.domain.user.service;
import com.justpickup.userservice.domain.user.dto.CustomerDto;
import com.justpickup.userservice.domain.user.dto.StoreOwnerDto;
import com.justpickup.userservice.domain.user.entity.StoreOwner;
public interface UserService {
CustomerDto findCustomerByUserId(Long userId);
StoreOwner saveStoreOwner(StoreOwnerDto storeOwnerDto);
}

View File

@@ -1,21 +1,45 @@
package com.justpickup.userservice.domain.user.service;
import com.justpickup.userservice.domain.user.dto.CustomerDto;
import com.justpickup.userservice.domain.user.dto.StoreOwnerDto;
import com.justpickup.userservice.domain.user.entity.Customer;
import com.justpickup.userservice.domain.user.entity.StoreOwner;
import com.justpickup.userservice.domain.user.entity.User;
import com.justpickup.userservice.domain.user.exception.NotExistUserException;
import com.justpickup.userservice.domain.user.repository.CustomerRepository;
import com.justpickup.userservice.domain.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collection;
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Slf4j
public class UserServiceImpl implements UserService {
public class UserServiceImpl implements UserService, UserDetailsService {
private final CustomerRepository customerRepository;
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByEmail(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found in the database"));
Collection<SimpleGrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority(user.getDtype()));
return new org.springframework.security.core.userdetails.User(user.getId().toString(), user.getPassword(), authorities);
}
@Override
public CustomerDto findCustomerByUserId(Long userId) {
@@ -24,4 +48,15 @@ public class UserServiceImpl implements UserService {
return new CustomerDto(customer);
}
@Override
@Transactional
public StoreOwner saveStoreOwner(StoreOwnerDto storeOwnerDto) {
String encode = passwordEncoder.encode(storeOwnerDto.getPassword());
StoreOwner storeOwner = new StoreOwner(storeOwnerDto.getEmail(), encode, storeOwnerDto.getName(),
storeOwnerDto.getPhoneNumber(), storeOwnerDto.getBusinessNumber());
return userRepository.save(storeOwner);
}
}