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
6 changes: 6 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ dependencies {
// Security
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'

// Jwt
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'
implementation 'org.springframework.boot:spring-boot-configuration-processor'
}

tasks.named('test') {
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/umc/domain/home/controller/HomeController.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package umc.domain.home.controller;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import umc.domain.home.dto.HomeResDTO;
import umc.domain.home.service.HomeService;
import umc.domain.member.exception.code.MemberSuccessCode;
import umc.global.apiPayload.ApiResponse;
import umc.global.security.entity.AuthMember;

@RestController
@Validated
Expand All @@ -19,12 +20,12 @@ public class HomeController {
private final HomeService homeService;

//홈 화면
@GetMapping("/v1/home/{memberId}")
@GetMapping("/v1/home")
public ApiResponse<HomeResDTO.HomeDTO> getHome(
@RequestParam(name = "region") @NotBlank String region,
@PathVariable @NotNull Long memberId
@AuthenticationPrincipal AuthMember member
){
return ApiResponse.onSuccess(MemberSuccessCode.HOME_VIEW_SUCCESS, homeService.getHome(memberId, region));
return ApiResponse.onSuccess(MemberSuccessCode.HOME_VIEW_SUCCESS, homeService.getHome(member, region));
}

}
16 changes: 5 additions & 11 deletions src/main/java/umc/domain/home/service/HomeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,42 +6,36 @@
import umc.domain.home.converter.HomeConverter;
import umc.domain.home.dto.HomeResDTO;
import umc.domain.member.entity.Member;
import umc.domain.member.exception.MemberException;
import umc.domain.member.exception.code.MemberErrorCode;
import umc.domain.member.repository.MemberRepository;

import umc.domain.mission.entity.Mission;
import umc.domain.mission.repository.MemberMissionRepository;
import umc.domain.mission.repository.MissionRepository;
import umc.domain.store.entity.Region;
import umc.domain.store.exception.StoreException;
import umc.domain.store.exception.code.RegionErrorCode;
import umc.domain.store.repository.RegionRepository;
import umc.domain.store.repository.StoreRepository;
import umc.global.security.entity.AuthMember;

import java.util.List;

@AllArgsConstructor
@Service
public class HomeService {

private final MemberRepository memberRepository;
private final MissionRepository missionRepository;
private final StoreRepository storeRepository;
private final RegionRepository regionRepository;
private final MemberMissionRepository memberMissionRepository;

@Transactional(readOnly = true)
public HomeResDTO.HomeDTO getHome(Long memberId, String region) {
Member member = memberRepository.findById(memberId).orElseThrow(
()->new MemberException(MemberErrorCode.MEMBER_NOT_FOUND)
);
public HomeResDTO.HomeDTO getHome(AuthMember authMember, String region) {
Member member = authMember.getMember();

Region r = regionRepository.findByName(region).orElseThrow(
()-> new StoreException(RegionErrorCode.REGION_NOT_FOUND)
);

Integer missionCount = missionRepository.countByRegion(r);
Integer missionSuccessCount = memberMissionRepository.countCompletedMissionsByRegion(memberId, r);
Integer missionSuccessCount = memberMissionRepository.countCompletedMissionsByRegion(member.getId(), r);
List<Mission> unstartedMissionList = missionRepository.findUnstartedMissions(r);

Integer currentPoint = member.getPoint();
Expand Down
22 changes: 16 additions & 6 deletions src/main/java/umc/domain/member/controller/MemberController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import umc.domain.member.dto.MemberReqDTO;
import umc.domain.member.dto.MemberResDTO;
Expand All @@ -10,6 +11,7 @@
import umc.global.apiPayload.ApiResponse;
import umc.global.apiPayload.code.BaseSuccessCode;
import umc.global.apiPayload.code.GeneralSuccessCode;
import umc.global.security.entity.AuthMember;

@RestController
@RequiredArgsConstructor
Expand All @@ -20,18 +22,18 @@ public class MemberController {
//마이 페이지
@PostMapping("/v1/members/me")
public ApiResponse<MemberResDTO.MyPageResDTO> getInfo(
@RequestBody @Valid MemberReqDTO.MyPageReqDTO dto
){
@AuthenticationPrincipal AuthMember member
){
BaseSuccessCode code = MemberSuccessCode.MEMBER_SUCCESS;
return ApiResponse.onSuccess(code, memberService.getInfo(dto));
return ApiResponse.onSuccess(code, memberService.getInfo(member));
}

//보유 포인트 조회
@GetMapping("/v1/members/me/points/{memberId}")
@GetMapping("/v1/members/me/points")
public ApiResponse<MemberResDTO.PointResDTO> getPoint(
@RequestParam(name = "memberId") @Valid Long id
@AuthenticationPrincipal AuthMember member
){
return ApiResponse.onSuccess(GeneralSuccessCode.OK, memberService.getPoint(id));
return ApiResponse.onSuccess(GeneralSuccessCode.OK, memberService.getPoint(member));
}

//회원 가입
Expand All @@ -41,4 +43,12 @@ public ApiResponse<MemberResDTO.SignUpRes> signup(
){
return ApiResponse.onSuccess(MemberSuccessCode.CREATED, memberService.signUp(dto));
}

//로그인
@PostMapping("v1/auth/members/login")
public ApiResponse<MemberResDTO.LoginRes> login(
@RequestBody @Valid MemberReqDTO.LoginReq dto
){
return ApiResponse.onSuccess(MemberSuccessCode.MEMBER_SUCCESS, memberService.login(dto));
}
}
29 changes: 19 additions & 10 deletions src/main/java/umc/domain/member/dto/MemberReqDTO.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
package umc.domain.member.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Past;
import jakarta.validation.constraints.*;
import umc.domain.member.enums.Gender;

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

public class MemberReqDTO {

public record MyPageReqDTO(
@NotNull
Long id
){}
// id를 body로 받아서 조회 할 떄 사용
// public record MyPageReqDTO(
// @NotNull
// Long id
// ){}

public record SignUpReq(
List<Long> agreedTermsIds,
@NotBlank
@Email
String email,
@NotBlank
String password,
@NotBlank
String name,
@NotNull
Expand All @@ -26,11 +29,17 @@ public record SignUpReq(
LocalDate birth,
@NotBlank
String address,
@NotEmpty
List<Long> agreedTermsIds,
List<Long> userFood,
String phoneNumber
){}

public record LoginReq(
@NotBlank
@Email
String email,
@NotBlank
String password,
String phoneNumber
String password
){}
}
6 changes: 6 additions & 0 deletions src/main/java/umc/domain/member/dto/MemberResDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,10 @@ public record SignUpRes(
Long memberId,
LocalDateTime createdAt
){}

//로그인
@Builder
public record LoginRes(
String accessToken
){}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import java.util.List;

public interface TermRepository extends JpaRepository<Term, Long> {
List<Term> findAllByRequired(boolean isRequired);
List<Term> findAllByIsRequired(boolean isRequired);

@Query("""
select t.id
Expand Down
51 changes: 37 additions & 14 deletions src/main/java/umc/domain/member/service/MemberService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -20,6 +24,8 @@
import umc.domain.member.exception.code.MemberErrorCode;
import umc.domain.member.exception.code.TermErrorCode;
import umc.domain.member.repository.*;
import umc.global.security.entity.AuthMember;
import umc.global.security.util.JwtUtil;

import java.util.List;

Expand All @@ -33,24 +39,17 @@ public class MemberService {
private final MemberTermRepository memberTermRepository;
private final FoodRepository foodRepository;
private final MemberFoodRepository memberFoodRepository;
private final AuthenticationManager authenticationManager;
private final JwtUtil jwtUtil;

@Transactional(readOnly = true)
public MemberResDTO.MyPageResDTO getInfo(MemberReqDTO.MyPageReqDTO dto) {
Long memberId = dto.id();
Member member = memberRepository.findById(memberId).orElseThrow(
()->new MemberException(MemberErrorCode.MEMBER_NOT_FOUND)
);

return MemberConverter.toGetInfo(member);
public MemberResDTO.MyPageResDTO getInfo(AuthMember member) {
return MemberConverter.toGetInfo(member.getMember());
}

@Transactional(readOnly = true)
public MemberResDTO.PointResDTO getPoint(Long id) {
Member member = memberRepository.findById(id).orElseThrow(
()->new MemberException(MemberErrorCode.MEMBER_NOT_FOUND)
);

return MemberConverter.toGetPoint(member);
public MemberResDTO.PointResDTO getPoint(AuthMember member) {
return MemberConverter.toGetPoint(member.getMember());
}

@Transactional
Expand All @@ -73,7 +72,7 @@ public MemberResDTO.SignUpRes signUp(MemberReqDTO.@Valid SignUpReq dto) {
}

//필수 정책 id 목록
List<Long> requiredTermId = termRepository.findAllByRequired(true)
List<Long> requiredTermId = termRepository.findAllByIsRequired(true)
.stream()
.map(Term::getId)
.toList();
Expand Down Expand Up @@ -128,4 +127,28 @@ public MemberResDTO.SignUpRes signUp(MemberReqDTO.@Valid SignUpReq dto) {

return MemberConverter.toSignUpRes(savedMember);
}

public MemberResDTO.LoginRes login(MemberReqDTO.@Valid LoginReq dto) {
try{

//인증 과정을 authenticationManager에게 넘김
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
dto.email(),
dto.password()
)
);

AuthMember authMember = (AuthMember) authentication.getPrincipal();

String token = jwtUtil.createAccessToken(authMember);

return MemberResDTO.LoginRes.builder()
.accessToken(token)
.build();

} catch (AuthenticationException e){
throw new MemberException(MemberErrorCode.MEMBER_NOT_FOUND);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import umc.domain.mission.dto.MissionReqDTO;
Expand All @@ -11,6 +12,7 @@
import umc.domain.mission.service.MissionService;
import umc.global.apiPayload.ApiResponse;
import umc.global.dto.PageResDTO;
import umc.global.security.entity.AuthMember;

@RestController
@RequiredArgsConstructor
Expand All @@ -19,18 +21,18 @@ public class MissionController {

private final MissionService missionService;

@GetMapping("/v1/missions/me/{memberId}")
@GetMapping("/v1/missions/me")
public ApiResponse<PageResDTO.Pagination<MissionResDTO.MissionDTO>> getMissions(
@AuthenticationPrincipal AuthMember member,
@RequestParam boolean isCompleted,
@RequestParam Integer pageSize,
@RequestParam Integer pageNumber,
@RequestParam(required = false) String sort,
@PathVariable Long memberId
@RequestParam(required = false) String sort
){
return ApiResponse.onSuccess(MissionSuccessCode.MISSION_LIST_GET_SUCCESS, missionService.getMissions(memberId, isCompleted, pageSize, pageNumber, sort));
return ApiResponse.onSuccess(MissionSuccessCode.MISSION_LIST_GET_SUCCESS, missionService.getMissions(member, isCompleted, pageSize, pageNumber, sort));
}

@PatchMapping("/v1/missions/{missionId}")
@PatchMapping("/v1/missions")
public ApiResponse<MissionResDTO.MissionDTO> updateMission(
@PathVariable @NotNull Long missionId,
@RequestBody @Valid MissionReqDTO.MissionStatusUpdate req
Expand Down
7 changes: 3 additions & 4 deletions src/main/java/umc/domain/mission/service/MissionService.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import umc.domain.mission.entity.mapping.MemberMission;
import umc.domain.mission.repository.MemberMissionRepository;
import umc.global.dto.PageResDTO;
import umc.global.security.entity.AuthMember;


@Service
Expand All @@ -26,7 +27,7 @@ public class MissionService {

@Transactional(readOnly = true)
public PageResDTO.Pagination<MissionResDTO.MissionDTO> getMissions(
Long memberId,
AuthMember authMember,
boolean isCompleted,
Integer pageSize,
Integer pageNumber,
Expand All @@ -42,9 +43,7 @@ public PageResDTO.Pagination<MissionResDTO.MissionDTO> getMissions(

PageRequest pageRequest = PageRequest.of(pageNumber, pageSize, sortInfo);

Member member = memberRepository.findById(memberId).orElseThrow(
()->new MemberException(MemberErrorCode.MEMBER_NOT_FOUND)
);
Member member = authMember.getMember();

Page<MemberMission> missionList = memberMissionRepository.findAllByMemberAndIsCompleted(member, isCompleted, pageRequest);

Expand Down
Loading