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
Binary file modified junyong/.DS_Store
Binary file not shown.
3 changes: 2 additions & 1 deletion junyong/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ out/
._.DS_Store
**/.DS_Store
**/._.DS_Store
src/main/generated
src/main/generated
application.yml
17 changes: 17 additions & 0 deletions junyong/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,23 @@ dependencies {
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0' // swagger

testImplementation 'org.springframework.boot:spring-boot-starter-test'

// security
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'

// jwt
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

//oauth2
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

// thymleaf
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE'

}

sourceSets {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package umc.spring.domain.member.converter;

import umc.spring.domain.member.web.dto.LoginDto;

public class LoginConverter {

public static LoginDto.LoginResultDto toLoginResultDto(Long memberId, String accessToken) {
return LoginDto.LoginResultDto.builder()
.memberId(memberId)
.accessToken(accessToken)
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,25 @@ public static Member toMember(MemberRequestDTO.JoinDto request) {
Gender gender = null;

switch (request.getGender()) {
case 1:
case "1":
gender = Gender.MALE;
break;
case 2:
case "2":
gender = Gender.FEMALE;
break;
case 3:
case "3":
gender = Gender.NONE;
break;
}

return Member.builder()
.address(request.getAddress())
.email(request.getEmail())
.password(request.getPassword())
.specAddress(request.getSpecAddress())
.gender(gender)
.name(request.getName())
.email("tempEmail@gmail.com")
.email(request.getEmail())
.birth(request.getBirth())
.locationAgree(false)
.marketingAgree(false)
Expand All @@ -47,8 +49,16 @@ public static Member toMember(MemberRequestDTO.JoinDto request) {
.reviewNoticeList(new ArrayList<>())
.memberMissionList(new ArrayList<>())
.memberPreferList(new ArrayList<>())
.role(request.getRole())
.build();
}

public static MemberResponseDTO.MemberInfoDto toMemberInfoDto(Member member) {
return MemberResponseDTO.MemberInfoDto.builder()
.name(member.getName())
.email(member.getEmail())
.gender(member.getGender().name())
.build();
}

}
18 changes: 17 additions & 1 deletion junyong/src/main/java/umc/spring/domain/member/data/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import umc.spring.domain.member.data.enums.Role;
import umc.spring.domain.member.data.mapping.MemberMission;
import umc.spring.domain.member.data.mapping.MemberPrefer;
import umc.spring.domain.notice.data.EventNotice;
Expand Down Expand Up @@ -55,7 +56,7 @@ public class Member extends BaseEntity {
@Column(nullable = false, length = 10)
private String birth;

@Column(nullable = true, length = 50)
@Column(nullable = false, length = 50, unique = true)
private String email;

@ColumnDefault("0") // ์ ์ˆ˜ ๊ธฐ๋ณธ๊ฐ’ 0
Expand All @@ -70,6 +71,12 @@ public class Member extends BaseEntity {
@Column(nullable = false)
private Boolean marketingAgree;

@Column(nullable = false)
private String password;

@Enumerated(EnumType.STRING)
private Role role;

// ๋งคํ•‘
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<MemberPrefer> memberPreferList = new ArrayList<>();
Expand All @@ -86,4 +93,13 @@ public class Member extends BaseEntity {
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<MemberMission> memberMissionList = new ArrayList<>();

public void encodePassword(String password) {
this.password = password;
}

public Member update(String name) {
this.name = name;
return this;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package umc.spring.domain.member.data.enums;

public enum Role {
ADMIN, USER
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@
import org.springframework.data.jpa.repository.JpaRepository;
import umc.spring.domain.member.data.Member;

public interface MemberRepository extends JpaRepository<Member, Long> {
import java.util.List;
import java.util.Optional;

public interface MemberRepository extends JpaRepository<Member, Long> {

Optional<Member> findByEmail(String email);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package umc.spring.domain.member.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import umc.spring.global.common.config.security.jwt.JwtTokenProvider;

@Slf4j
@Service
@RequiredArgsConstructor
public class LoginService {

private final JwtTokenProvider jwtTokenProvider;

public void socialLogin(String code, String registrationId) {
System.out.println("code = " + code);
System.out.println("registrationId = " + registrationId);
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package umc.spring.domain.member.service;

import umc.spring.domain.member.data.Member;
import umc.spring.domain.member.web.dto.LoginDto;
import umc.spring.domain.member.web.dto.MemberRequestDTO;
import umc.spring.domain.member.web.dto.MemberResponseDTO;

Expand All @@ -10,4 +11,6 @@ public interface MemberCommandService {

MemberResponseDTO.CompleteDto completeMission(Long memberMissionId, String confirmNumber);

LoginDto.LoginResultDto loginMember(LoginDto.LoginRequestDto request);

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package umc.spring.domain.member.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import umc.spring.domain.member.converter.LoginConverter;
import umc.spring.domain.member.converter.MemberConverter;
import umc.spring.domain.member.converter.MemberMissionConverter;
import umc.spring.domain.member.converter.MemberPreferConverter;
Expand All @@ -13,36 +18,44 @@
import umc.spring.domain.member.repository.foodCategory.FoodCategoryRepository;
import umc.spring.domain.member.repository.member.MemberRepository;
import umc.spring.domain.member.repository.memberMission.MemberMissionRepository;
import umc.spring.domain.member.web.dto.LoginDto;
import umc.spring.domain.member.web.dto.MemberRequestDTO;
import umc.spring.domain.member.web.dto.MemberResponseDTO;
import umc.spring.domain.mission.data.enums.MissionStatus;
import umc.spring.global.common.apiPayload.code.status.ErrorStatus;
import umc.spring.global.common.apiPayload.exception.handler.ErrorHandler;
import umc.spring.global.common.apiPayload.exception.handler.FoodCategoryHandler;
import umc.spring.global.common.config.security.jwt.JwtTokenProvider;

import java.time.LocalDate;
import java.util.Collections;
import java.util.List;

@Slf4j
@Service
@RequiredArgsConstructor
public class MemberCommandServiceImpl implements MemberCommandService {

private final MemberRepository memberRepository;
private final FoodCategoryRepository foodCategoryRepository;
private final MemberMissionRepository memberMissionRepository;
private final PasswordEncoder passwordEncoder;
private final JwtTokenProvider jwtTokenProvider;

@Override
@Transactional
public Member joinMember(MemberRequestDTO.JoinDto request) {
Member member = MemberConverter.toMember(request);
member.encodePassword(passwordEncoder.encode(request.getPassword()));
List<FoodCategory> foodCategoryList = request.getPreferCategory().stream()
.map(category -> {
return foodCategoryRepository.findById(category).orElseThrow(() -> new FoodCategoryHandler(ErrorStatus.FOOD_CATEGORY_NOT_FOUND));
return foodCategoryRepository.findById(Long.parseLong(category)).orElseThrow(() -> new FoodCategoryHandler(ErrorStatus.FOOD_CATEGORY_NOT_FOUND));
}).toList();

List<MemberPrefer> memberPreferList = MemberPreferConverter.toMemberPreferList(foodCategoryList);
memberPreferList.forEach( memberPrefer -> memberPrefer.setMember(member));

log.info("member save");
return memberRepository.save(member); // ๋ฉค๋ฒ„ ๋ฐ˜ํ™˜
}

Expand Down Expand Up @@ -72,4 +85,26 @@ public MemberResponseDTO.CompleteDto completeMission(Long memberMissionId, Strin
return MemberMissionConverter.toCompleteDto(memberMission);
}

@Override
public LoginDto.LoginResultDto loginMember(LoginDto.LoginRequestDto request) {
Member member = memberRepository.findByEmail(request.getEmail())
.orElseThrow(() -> new ErrorHandler(ErrorStatus.MEMBER_NOT_FOUND));

if(!passwordEncoder.matches(request.getPassword(), member.getPassword())) {
throw new ErrorHandler(ErrorStatus.INVALID_PASSWORD);
}

Authentication authenticationToken = new UsernamePasswordAuthenticationToken(
member.getEmail(), null,
Collections.singleton(() -> member.getRole().name())
);

String accessToken = jwtTokenProvider.generateToken(authenticationToken);

return LoginConverter.toLoginResultDto(
member.getId(),
accessToken
);
}

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package umc.spring.domain.member.service;

import jakarta.servlet.http.HttpServletRequest;
import umc.spring.domain.member.web.dto.MemberResponseDTO;
import umc.spring.domain.mission.data.enums.MissionStatus;

public interface MemberQueryService {
MemberResponseDTO.MissionListDto getMissions(MissionStatus status, Integer page);
MemberResponseDTO.MemberInfoDto getMemberInfo(HttpServletRequest request);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package umc.spring.domain.member.service;

import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import umc.spring.domain.member.converter.MemberConverter;
import umc.spring.domain.member.converter.MemberMissionConverter;
import umc.spring.domain.member.data.Member;
import umc.spring.domain.member.data.mapping.MemberMission;
Expand All @@ -13,6 +17,7 @@
import umc.spring.domain.mission.data.enums.MissionStatus;
import umc.spring.global.common.apiPayload.code.status.ErrorStatus;
import umc.spring.global.common.apiPayload.exception.handler.ErrorHandler;
import umc.spring.global.common.config.security.jwt.JwtTokenProvider;


@Service
Expand All @@ -21,6 +26,7 @@ public class MemberQueryServiceImpl implements MemberQueryService {

private final MemberRepository memberRepository;
private final MemberMissionRepository memberMissionRepository;
private final JwtTokenProvider jwtTokenProvider;

@Override
public MemberResponseDTO.MissionListDto getMissions(MissionStatus status, Integer page) {
Expand All @@ -33,4 +39,15 @@ public MemberResponseDTO.MissionListDto getMissions(MissionStatus status, Intege
}
return MemberMissionConverter.toMissionListDto(memberMissionList);
}

@Override
@Transactional(readOnly = true)
public MemberResponseDTO.MemberInfoDto getMemberInfo(HttpServletRequest request) {
Authentication authentication = jwtTokenProvider.extractAuthentication(request);
String email = authentication.getName();

Member member = memberRepository.findByEmail(email)
.orElseThrow(() -> new ErrorHandler(ErrorStatus.MEMBER_NOT_FOUND));
return MemberConverter.toMemberInfoDto(member);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

@Component
@RequiredArgsConstructor
public class CategoriesExistValidator implements ConstraintValidator<ExistCategories, List<Long>> {
public class CategoriesExistValidator implements ConstraintValidator<ExistCategories, List<String>> {

private final FoodCategoryQueryService foodCategoryQueryService;

Expand All @@ -22,9 +22,9 @@ public void initialize(ExistCategories constraintAnnotation) {
}

@Override
public boolean isValid(List<Long> values, ConstraintValidatorContext context) {
public boolean isValid(List<String> values, ConstraintValidatorContext context) {
boolean isValid = values.stream() // ์˜ฌ๋ฐ”๋ฅธ ์นดํ…Œ๊ณ ๋ฆฌ์ธ์ง€ ์กฐํšŒ
.allMatch(foodCategoryQueryService::isExistCategory);
.allMatch(categoryId -> foodCategoryQueryService.isExistCategory(Long.parseLong(categoryId)));

if(!isValid) {
context.disableDefaultConstraintViolation();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package umc.spring.domain.member.web.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import umc.spring.domain.member.service.LoginService;

@Slf4j
@RestController
@RequestMapping("/login")
@RequiredArgsConstructor
public class LoginController {

private final LoginService loginService;

@GetMapping("/oauth/code/{registrationId}")
public void googleLogin(@RequestParam String code, @PathVariable String registrationId) {
log.info("hello1");
loginService.socialLogin(code, registrationId);
}

}
Loading